SuperMap(服务)- ArcGis(展现)兼容开发



由于项目的GIS展示部分将依据不同的客户分别使用ArcGisSuperMap两种地图平台,而目前系统框架采用的是ArcGis展现方式,为了降低现有系统有关Gis部分的代码修改量,并且解决兼容SuperMap平台的问题,现初步起草两种平台兼容的解决方案。

总体思路是:系统依旧采用ArcGis平台对地图进行前台展现与空间数据分析,后台通过判断地图服务是基于SuperMap的还是基于ArcGis的来进行不同处理。若是基于ArcGis的,则依照系统现有思路,无需对代码进行修改;若是基于SuperMap的,则先进行转换,使之可以适用于ArcGis平台的,然后再按照ArcGis的方式进行处理。

一、设计流程

SuperMap(服务)- ArcGis(展现)兼容开发_第1张图片

二、SuperMap相关内容

如果是基于SuperMap平台开发的话,那么只需要配置一个Url即可完成展现和空间分析查询;如果是基于ArcGis平台开发的话,必须要配置两个Url。因为地图REST服务的Url不符合WMS标准,不能够被ArcGis所调用加载。而发布的WMS服务是可以被ArcGis方式所调用并显示在前台。

SuperMap(服务)- ArcGis(展现)兼容开发_第2张图片

如上图所示,蓝色部分是REST服务地址,可进行查询分析等功能实现,红色部分是符合WMS标准的两个版本号的SuperMap服务,仅限于展示图层(虽然形式上看是三套服务,但它们的数据源都是一个)。

三、关键代码

 1. 地图加载

        //Attributes specific for WMS
            //skipgetcapabilities:是否跳过最初的请求得到的能力。如果设置为true, skipgetcapabilities网站主办WMS服务不提供跨域策略文件,你没有一个代理页面。[参数可选]
            //version:版本使用时,要求WMS地图。允许的值是1.1.0,1.1.1或1.3.0。 [参数可选]
            //wkid:覆盖发送到WMS服务器WKID。仅在需要的WMS服务器不理解你的地图的wkid。
            //Layers:(个人理解)设置要显示的子图层索引号
            WmsLayer layer = new WmsLayer()
            {
                ID = "wmsLayer",
                Url = "http://192.168.0.156:8090/iserver/services/map-superMapGongZuoKongJian/wms111/世界地图",
                SkipGetCapabilities = false,
                Layers = new string[1] { "0" },
                Version = "1.1.1",
                Opacity = 0.7
            };
            this.mapObj.Layers.Add(layer);

 2. 地图要素从ArcGis格式转为SuperMap格式

GeoRegion geoRegion = new GeoRegion();
    Point2DCollection p2Collection = null;
    if (pGeometry != null){
        ESRI.ArcGIS.Client.Geometry.Polygon gon = pGeometry as ESRI.ArcGIS.Client.Geometry.Polygon;
        foreach (ESRI.ArcGIS.Client.Geometry.PointCollection pCollection in gon.Rings){
            p2Collection = new Point2DCollection();
            foreach (MapPoint mp in pCollection){
                p2Collection.Add(new Point2D(mp.X, mp.Y));
            }
            geoRegion.Parts.Add(p2Collection);
        }
    }

3. 地图要素从SuperMap格式转为ArcGis格式

Graphic pGraphic = CreateGraphic(pFeature);
    if (pFeature != null) {
        GeoRegion GeoRegion = pFeature.Geometry as GeoRegion;
        if (GeoRegion != null) {
            Polygon pPolygon = new Polygon();
            foreach (Point2DCollection item in GeoRegion.Parts) {
                PointCollection pointColl = new PointCollection();
                foreach (Point2D point in item)
                    pointColl.Add(new MapPoint(point.X, point.Y, new SpatialReference(4326)));
                pPolygon.Rings.Add(pointColl);
            }
            pGraphic.Geometry = pPolygon;
        }
    }

4. 基于SuperMap格式的地图查询分析

QueryByGeometryParameters parameter = new QueryByGeometryParameters {
        FilterParameters = new List() {             
            new FilterParameter() {
                Name = "三四级河流@super数据源",                          
            }
        },
        Geometry = geoRegion,
        SpatialQueryMode = SpatialQueryMode.INTERSECT,
        //设置是返回查询结果资源(false)还是返回查询结果记录集(true)
        ReturnContent = true
    };
    //与服务器交互
    QueryByGeometryService service = new QueryByGeometryService("http://192.168.0.156:8090/iserver/services/map-superMapGongZuoKongJian/rest/maps/河流地图");
    service.ProcessAsync(parameter);
    service.ProcessCompleted += service_ProcessCompleted;
    service.Failed += service_Failed;






你可能感兴趣的:(GIS)