ArcGIS Engine基础(29)之加载arcgis server切片地图服务

第一种方法(ArcGIS 地图服务):

        直接调用arcgis server rest服务地址。

        以IMapServerRESTLayer接口直接调用arcgis server rest服务,rest形式的切片服务一样可以加载。但如果是通过矢量范围面先进行切片后发布成地图服务,然后把影像切片缓存拷贝到该矢量地图服务的缓存下时,使用该方式无法读取到切片缓存图层,只能获取到矢量范围面图层。

IMapServerRESTLayer pRestLayer = new MapServerRESTLayerClass();
pRestLayer.Connect("http://localhost:6080/arcgis/rest/services/JX2021Y04IMG/MapServer");
ILayer pLayer = pRestLayer as ILayer;

第二种方法(wmts服务):

        以OGC的wmts标准方式进行加载。

格式url示例:http://localhost:6080/arcgis/rest/services/JX2021Y02IMG/MapServer/WMTS/1.0.0/WMTSCapabilities.xml

        private ILayer OpenWMTS(string pURL)
        {
            ILayer layer = null;
            ESRI.ArcGIS.esriSystem.IPropertySet pPropertyset = new ESRI.ArcGIS.esriSystem.PropertySetClass();
            pPropertyset.SetProperty("url", pURL);
            IWMTSConnectionFactory pWMTSFac = new WMTSConnectionFactoryClass();
            IWMTSConnection pWMTS = pWMTSFac.Open(pPropertyset, 0, null);
            IWMTSConnectionName pWmtsConnectionName = pWMTS.FullName as IWMTSConnectionName;

            //下面的也可以
            //IWMSConnectionName pWmsConnectionName = new WMSConnectionNameClass();
            //pWmsConnectionName.ConnectionProperties = pPropertyset;
            ILayerFactory pLayerFactory = new WMTSLayerFactoryClass();
            if (pLayerFactory.get_CanCreate(pWmtsConnectionName))
            {
                IEnumLayer pEnumLayer = pLayerFactory.Create(pWmtsConnectionName);
                pEnumLayer.Reset();
                ILayer pLayer = pEnumLayer.Next();
                while (pLayer != null)
                {
                    layer = pLayer;
                    if (pLayer is IWMTSLayer)
                    {
                        //IWMTSLayer pWmsMapLayer = pLayer as IWMTSLayer;
                        layer = pLayer;
                        break;
                    }
                    pLayer = pEnumLayer.Next();
                }
            }
            return layer;
        }

第三种方法(ArcGIS 地图服务):

        使用IAGSServerConnection连接到server目录,获取所有服务,循环遍历,根据服务名称连接到指定的服务图层。

serverBaseUrl:http://localhost:6080/arcgis/rest/services

serviceName:JX2021Y02IMG

        /// <summary>
        /// 加载地图服务
        /// </summary>
        /// <param name="serverName">服务器名称</param>
        /// <param name="serviceName">地图服务名称</param>
        /// <param name="pIsLAN">是否为局域网</param>
        /// <returns>返回图层</returns>
        public ILayer LoadMapservice(string serverBaseUrl, string serviceName,bool pIsLAN=false)
        {
            IMapServer m_mapServer = null;
            IMapServerLayer layer = null;

            ESRI.ArcGIS.esriSystem.IPropertySet propertySet = new ESRI.ArcGIS.esriSystem.PropertySet();
            if (pIsLAN)
            {
                propertySet.SetProperty("machine", serverBaseUrl);
            }
            else
            {
                propertySet.SetProperty("url", serverBaseUrl);
            }
            
           
            IAGSServerConnectionFactory agsServerConnectionFactory = new AGSServerConnectionFactory();
            IAGSServerConnection agsServerConnection = agsServerConnectionFactory.Open(propertySet, 0);

            IAGSEnumServerObjectName agsEnumServerObjectName = agsServerConnection.ServerObjectNames;
            agsEnumServerObjectName.Reset();

            ESRI.ArcGIS.esriSystem.IName serverObjectName;
            IAGSServerObject agsServerObject = null;
            IAGSServerObjectName agsServerObjectName = agsEnumServerObjectName.Next();
            while ((agsServerObjectName != null))
            {
                // Search for the MapServer Server Object
                if (agsServerObjectName.Type.ToUpper() == "MAPSERVER" && agsServerObjectName.Name == serviceName)
                {
                    serverObjectName = agsServerObjectName as ESRI.ArcGIS.esriSystem.IName;
                    agsServerObject = serverObjectName.Open() as IAGSServerObject;
                    if (agsServerObject as IMapServer != null)
                    {
                        m_mapServer = agsServerObject as IMapServer;
                        break;
                    }
                }
                agsServerObjectName = agsEnumServerObjectName.Next();
            }

            // If we got both of them, exit out
            if (m_mapServer != null)
            {
                layer = new MapServerLayerClass();
                layer.ServerConnect(agsServerObjectName, m_mapServer.DefaultMapName);
            }
            if (layer != null)
            {
                return (layer as ILayer);
            }
            else
            {
                return null;
            }
        }