自定义引擎开发教程
一、 引擎之间的关系
SuperMap IS .NET 2008的服务引擎是基于.NET平台,通过SuperMap Object组件进行开发的。目前SuperMap IS .NET 2008提供的基于.NET的引擎组件包括了地图引擎(IMapEngine)、分析引擎(IAnalystEngine)、编辑引擎(IEditEngine)和坐标转换引擎(ICoordTransformationEngine)、自定义引擎(ICustomEngine)等。其中地图引擎是这些引擎的基础核心引擎,它实现了通用交互式电子地图的基本功能,而其他引擎则是通过继承和聚合的方式,重用地图引擎,获得地图引擎的所有功能,同时新增特色功能。用户自定义引擎可以直接继承并实现IEngine,同样也可以继承与聚合重用以上任何一种引擎,以重载接口的开发方式进行特色功能的实现,简化开发步骤。
二、 引擎的调用
2.1 引擎调用原理:
自定义引擎在开发过程中需要重载构造函数和CustomInvoke()方法,CustomInvoke()方法是引擎服务专门为自定义功能的实现提供的预留接口,自定义引擎可以在该方法中实现自定义功能。另外,自定义引擎中还有一个Identifier的属性,该属性是自定义引擎的标识,通过该标识,引擎管理器能够将请求准确的分配到相应的自定义引擎上进行处理。Identifier标识对于存在多个自定义引擎的情况来说是非常重要的,如果自定义引擎没有Identifier标识,那么引擎管理器将把自定义功能请求分配给第一个自定义引擎来处理。
2.2 引擎调用方法:
后台调用:
或者
其中, CustomInvoke为自定义引擎调用方法,该方法为重载方法,可采用两种参数,CustomParam和MapParam,两个参数都位于SuperMap.IS.Utility命名空间。两个参数区别在于CustomParam中包括Identifier属性,用来标记所需自定义引擎标识,根据标识调用对应自定义引擎。如果使用MapParam作为参数,系统将直接调用第一个自定义引擎来处理请求。自定义引擎调用命令通过CustomParams以组合字符串形式提交,组合形式可自定义,然后在自定义引擎中解析组合字符串。
脚本调用:
在脚本中只支持一种自定义引擎的调用方法,CustomInvoke的参数依次为,自定义字符串,引擎标识,操作完成回调函数,操作失败回调函数和用户自定义标识。
三、 引擎开发
3.1 新建解决方案和文件
首先需要新建解决方案,类型为Windows类库:
然后,添加Web窗体:
添加完成后,将类文件和窗体文件名称分别改为“DownLoadEngine.cs”和“DownLoadForm.aspx”,并将两个文件的命名空间同意改成“namespace SuperMap.IS.Samples
”。
3.2 添加控件和引用
首先,在工具栏中添加Object组件,SuperMap Control,如果需要使用Objects中的分析功能,则需要添加SuperAnalyst Control组件。
将组件拖放到Form窗体上,
这是组件依赖引用会被添加进来,这里需要将其删除:
然后,添加IS提供的DLL文件,位置在IS安装目录Bin文件夹下:
3.3 添加类文件代码
命名空间:
using AxSuperMapLib;
using SuperMap.IS.Utility;
using SuperMap.IS.EngineInterface;
using SuperMap.IS.Engines;
类定义 :
自定义引擎继承于SuperMap.IS.Engines.Engine基类,同时实现了SuperMap.IS.EngineInterface.ICustomEngine接口。
public class DownLoadEngine : Engine, ICustomEngine
{
private DownLoadEngineForm m_form;
}
重写Engine类方法和事件 ,重写Engine类的装载信息方法和引擎停止事件:
protected override bool LoadEngineInfo(string preferences, System.Collections.Hashtable engineSession)
{
if (!base.LoadEngineInfo(preferences, engineSession))
{
return false;
}
AxSuperWorkspace axSuperWorkspace = engineSession["workspace"] as AxSuperWorkspace;
if (m_form == null)
{
m_form = new DownLoadEngineForm(this);
}
m_form.SetWorkspace(axSuperWorkspace);
return true;
}
protected override void OnStopped()
{
m_form.Close();
m_form.Dispose();
m_form = null;
base.OnStopped();
}
重写ICustomEngine的CustomInvoke()方法,从而能够分别处理不同的客户端自定功能请求
public CustomResult CustomInvoke(CustomParam customParam)
{
CustomResult result = new CustomResult();
result.MapResult = CustomInvoke(customParam != null ? customParam.MapParam : null);
return result;
}
添加自定义标识
public string Identifier
{
get { return "DownLoad"; }
}
3.4 添加窗体文件代码
命名空间:
using AxSuperMapLib;
using SuperMapLib;
using SuperMap.IS.Utility;
using SuperMap.IS.EngineInterface;
using SuperMap.IS.AuxLib;
接口和容器说明:
首先声明引擎接口,用于引擎调用。然后对地图工作空间对象和SuperMap Control对象进行声明,引擎在处理过程中将通过它们进行相关的数据和业务处理。
private AxSuperWorkspace m_axSuperWorkspace;
private IEngine m_engine;
定义委托:
private delegate MapImage CustomInvokeDelegate(MapParam mapParam);
private CustomInvokeDelegate m_customInvokeDelegate;
重载构造函数:
public InterpolateEngineForm(IEngine engine)
{
InitializeComponent();
m_engine = engine;
// 委托
m_customInvokeDelegate = new CustomInvokeDelegate(this.CustomInvokeMethod);
}
设置工作空间:
public void SetWorkspace(AxSuperWorkspace axSuperWorkspace)
{
m_axSuperWorkspace = axSuperWorkspace;
if (this.InvokeRequired)
{
MethodInvoker mi = new MethodInvoker(SetWorkspaceInvoke);
this.Invoke(mi);
}
else
{
SetWorkspaceInvoke();
}
}
private void SetWorkspaceInvoke()
{
axSuperMap1.Disconnect();
axSuperMap1.Connect(m_axSuperWorkspace.CtlHandle);
//如果添加分析空间则需要在此连接工作空间
axSuperAnalyst1.Connect(m_axSuperWorkspace.CtlHandle);
}
重写MapImage CustomInvoke(MapParam mapParam)方法
public MapImage CustomInvoke(MapParam mapParam)
{
MapImage mapImage = (MapImage)this.Invoke(m_customInvokeDelegate, mapParam);
return mapImage;
}
重写CustomInvokeMethod方法,为自定义引擎方法主体,通过customParams获取组合字符串,并将返回值通过CustomResponse返回结果。
private MapImage CustomInvokeMethod(MapParam mapParam)
{
string customParams = mapParam.CustomParams;
MapImage mapImage = new MapImage();
mapImage.CustomResponse = "a";
mapImage.ReturnMapParam = mapParam;
return mapImage;
}
四、自定义引擎的配置
4.1 打开地图服务管理工具页面->地图引擎,选择添加自定义引擎,填写引擎名称以及完整引擎所在物理路径(如果将DLL文件拷贝到IS安装目录Bin文件夹下,填写DLL文件名即可):
五、自定义引擎调试
5.1 在工程属性页面中,选择调试选项卡,在启动外部调试程序中选择可以用于调试的引擎管理器,它在【SuperMap IS .NET安装目录】\Bin\中,名为SuperMap.IS.AppServer.exe的文件。
5.2 修改启动选项属性项。在命令行参数(Command line Arguments)中输入“-app”,这是启动管理器的方式。在工作目录(Working Directory)中输入管理器SuperMap.IS.AppServer.exe所在的路径,即【安装目录】\Bin。
5.3 保存属性页面并启动自定义引擎工程
5.4 点击启动服务,便可以进行调试。
v