文章目录
- 1. 引言
- 2.首先发布我们的地图服务。
- 3.编写代码扩展地图服务
- 3.1创建一个SOE程序,取名为MyGNServer
- 3.2 因为我们扩展MapServer,修改SOE扩展的类型
- 3.3 查看关键函数代码
- 3.4 修改Rest资源对应的函数(我们将图层中的几何网络图层名称显示出来)
- 3.5 修改Rest操作对应的函数(这里才是核心代码,注意:在这里我们获得了AO对象,很关键)
- 3.6 将SOE文件注册到ArcGIS Server
- 3.7 将SOE和地图服务绑定
- 3.调试SOE程序
- 3.1 首先在我们程序代码中添加断点(注意我断点的位置)
- 3.2 将SOC添加到进程调试
- 3.3 访问http://localhost:6080/arcgis/rest/services/Test/MyGNServer/MapServer/exts/MyGNServer(注意断点进入的地方)
- 3.4 运行代码,查看网页(注意`RootResHandler`是什么时候运行的)
- 3.5 运行`SearchGN`方法(注意进入的断点,我们获得了INetWork对象(AO对象),SampleOperHandler是什么时候运行的?)
- 3.6 运行结果
- 3.7 假设我们输入的名称不对
- 4. SOE开发注意的地方
- 5. 本博客代码下载地址
1. 引言
在上一篇博客中主要了解了什么是SOE,然后我们创建了一个简单的SOE程序,但是那个程序几乎没什么价值,因为功能实现太简单了。在真实的项目中,用到SOE开发,必然是遇到了技术难题,需要借助AO扩展地图服务的功能。如果借助AO实现一些复杂的功能,我们必然要获得一些AO对象。在本篇博客中,将以一个小demo,来介绍如何在SOE中获得AO对象。
2.首先发布我们的地图服务。
- 为了下一篇博客做铺垫,我们发布一个地图服务(此服务可以进行几何网络分析)
- 将该图层发布为地图服务
- 发布成功
3.编写代码扩展地图服务
在本实例中先不实现复杂的功能,我们首先实现一个简单的功能:前台传入一个图层名称,然后SOE程序判断地图服务中几何网络图层的名称是否和我们传入的名称相同(注意这里是网络图层。)
3.1创建一个SOE程序,取名为MyGNServer
3.2 因为我们扩展MapServer,修改SOE扩展的类型
3.3 查看关键函数代码
private RestResource CreateRestSchema()
{
RestResource rootRes = new RestResource(soe_name, false, RootResHandler);
//创建一个操作,然后判断是否存在名称为GNName的网络图层
RestOperation sampleOper = new RestOperation("SearchGN",
new string[] { "GNName"},
new string[] { "json" },
SampleOperHandler);
rootRes.operations.Add(sampleOper);
return rootRes;
}
3.4 修改Rest资源对应的函数(我们将图层中的几何网络图层名称显示出来)
private byte[] RootResHandler(NameValueCollection boundVariables, string outputFormat, string requestProperties, out string responseProperties)
{
responseProperties = null;
mapServer = (IMapServer3)serverObjectHelper.ServerObject;
pMapServerDataAcc = serverObjectHelper.ServerObject as IMapServerDataAccess;
INetworkClass pNetWork = null;
//这里直接写死了,按理说应该是循环查找
pNetWork = pMapServerDataAcc.GetDataSource(mapServer.DefaultMapName, 0) as INetworkClass;
JsonObject result = new JsonObject();
result.AddString("几何网络的名称为:", pNetWork.AliasName);
return Encoding.UTF8.GetBytes(result.ToJson());
}
3.5 修改Rest操作对应的函数(这里才是核心代码,注意:在这里我们获得了AO对象,很关键)
private byte[] SampleOperHandler(NameValueCollection boundVariables,
JsonObject operationInput,
string outputFormat,
string requestProperties,
out string responseProperties)
{
responseProperties = null;
string parm = null;
bool found = operationInput.TryGetString("GNName", out parm);
mapServer = (IMapServer3)serverObjectHelper.ServerObject;
pMapServerDataAcc = serverObjectHelper.ServerObject as IMapServerDataAccess;
INetworkClass pNetWork = null;
//这里直接写死了,按理说应该是循环查找,注意这里是几何网络,也就是获得了INetworkClass对象
pNetWork = pMapServerDataAcc.GetDataSource(mapServer.DefaultMapName, 0) as INetworkClass;
JsonObject result = new JsonObject();
//判断用户输入的和地图服务是否对应
if (pNetWork.AliasName == parm) {
result.AddBoolean("用户传入的名称", true);
}
else{
result.AddBoolean("用户传入的名称", false);
}
return Encoding.UTF8.GetBytes(result.ToJson());
}
3.6 将SOE文件注册到ArcGIS Server
3.7 将SOE和地图服务绑定
3.调试SOE程序
3.1 首先在我们程序代码中添加断点(注意我断点的位置)
3.2 将SOC添加到进程调试
- 点击VS的调试按钮,点击附加到进程
- 将ArcSOC添加到进程(所有的ArcSOC进程)
3.3 访问http://localhost:6080/arcgis/rest/services/Test/MyGNServer/MapServer/exts/MyGNServer(注意断点进入的地方)
3.4 运行代码,查看网页(注意RootResHandler
是什么时候运行的)
3.5 运行SearchGN
方法(注意进入的断点,我们获得了INetWork对象(AO对象),SampleOperHandler是什么时候运行的?)
3.6 运行结果
3.7 假设我们输入的名称不对
4. SOE开发注意的地方
- 自从ArcGIS 10.1之后,发布的地图服务都是基于msd文档的。所以ArcGIS10.1(包括10.1版本)在SOE中是无法获得IMap,ILayer对象的。既然无法获得IMap,ILayer对象,那么10.1之前的SOE代码(只要用到IMap对象,或者用到ILayer对象)是完全无法使用的。通俗点说,就是淘汰了。
- 在10.1版本以后的SOE开发过程中,如果想要获得要素类对象,或者说要素类中的数据,需要通过
IMapServerDataAccess
接口,该接口有两个方法GetDataSource()
和GetDisplayDateSource()
,第一个方法主要获取表,要素类,栅格数据。 但是在地图文档中我们有的数据是和其他数据有关联的的比如join操作,那么通过第二个方法我们不但可以获取源表的数据,还可以获取目的表的数据。 - ArcGIS10.0 版本发布的地图服务是基于mxd文档的,下面的代码在ArcGIS 10.0是可以运行的,但是在10.1之后代码是不可以运行的.(一定要记住在10.1之后,是不可能获得IMap对象的)
IMapServer mapServer = (IMapServer3)serverObjectHelper.ServerObject;
IMapServerObjects3 pMSO = mapServer as IMapServerObjects3;
IMap map = pMSO.get_Map(mapServer.DefaultMapName);