(十)ArcGIS Server之开发SOE(中)

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); 
    

5. 本博客代码下载地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值