arcgis engine 连接WMS、WMTS服务及注意事项

arcgis engine 二次开发需要连接GIS服务,arcgis engine 提供了类似的接口。

arcgis engine 连接WMS服务:

try
            {
                IPropertySet pPropertyset = new PropertySetClass();
                pPropertyset.SetProperty("url", pURL);//
                IWMSConnectionFactory pWmsFac = new WMSConnectionFactory();
                IWMSConnection pWmsC = pWmsFac.Open(pPropertyset, 0, null);
                IWMSConnectionName pWmsConnectionName = pWmsC.FullName as IWMSConnectionName;

                ILayerFactory pLayerFactory = new EngineWMSMapLayerFactoryClass();
                IGroupLayer pGroupLayer = new GroupLayerClass();
                if (pLayerFactory.get_CanCreate(pWmsConnectionName))
                {
                    IEnumLayer pEnumLayer = pLayerFactory.Create(pWmsConnectionName);
                    pEnumLayer.Reset();
                    ILayer pLayer = pEnumLayer.Next();
                    while (pLayer != null)
                    {
                        if (pLayer is IWMSMapLayer)
                        {
                            pGroupLayer.Name = "服务库";
                            pGroupLayer.Add(pLayer);
                        }
                        pLayer = pEnumLayer.Next();
                    }
                }
                return pGroupLayer as ILayer;
            }
            catch (Exception ex)
            {
                MessageBox.Show("添加失败! " + ex.Message);
                return null;
            }

arcgis engine 连接WMTS服务:

IPropertySet pPropertyset = new PropertySetClass();
pPropertyset.SetProperty(url, http://t0.tianditu.com/vec_c/wmts);    
IWMTSConnectionFactory pWMTSConnectionfactory = new WMTSConnectionFactory();
IWMTSConnection pWMTSConnection = pWMTSConnectionfactory.Open(pPropertyset, 0, null);
IWMTSLayer pWMTSLayer = new WMTSLayer();
IName pName = pWMTSConnection.FullName;
pWMTSLayer.Connect(pName);
            
axMapControl1.AddLayer(pWMTSLayer as ILayer);
axMapControl1.Refresh();

给大家个小礼物就是大家实际开发中肯定有类似的需求,比如加载wms服务到图层上,但是wms服务会将所有图层全部加上去,如下代码是帮助大家加入自己目标图层,进行一个过滤。

 try { 
            IPropertySet pPropertyset = new PropertySetClass();
            pPropertyset.SetProperty("url", pURL);

            IWMSConnectionName pWmsConnectionName = new WMSConnectionNameClass();

            pWmsConnectionName.ConnectionProperties = pPropertyset;

            ILayerFactory pLayerFactory = new EngineWMSMapLayerFactoryClass();

            IWMSGroupLayer pWmsMapLayer = new WMSMapLayerClass();

            IDataLayer pDataLayer = pWmsMapLayer as IDataLayer;

            pDataLayer.Connect(pWmsConnectionName as IName);

            IWMSServiceDescription pWmsServiceDesc = pWmsMapLayer.WMSServiceDescription;


            for (int i = 0; i < pWmsServiceDesc.LayerDescriptionCount; i++)
            {
                IWMSLayerDescription pWmsLayerDesc = pWmsServiceDesc.get_LayerDescription(i);

                ILayer pNewLayer = null;

                if (pWmsLayerDesc.LayerDescriptionCount == 0)
                {
                    IWMSLayer pWmsLayer = pWmsMapLayer.CreateWMSLayer(pWmsLayerDesc);

                    pNewLayer = pWmsLayer as ILayer;

                }
                else
                {
                    IWMSGroupLayer pWmsGroupLayer = pWmsMapLayer.CreateWMSGroupLayers(pWmsLayerDesc);

                    for (int j = 0; j < pWmsGroupLayer.Count; j++)
                    {
                        ILayer layer = pWmsGroupLayer.get_Layer(j);

                        if (layer.Name == layerName)
                        {
                            pWmsMapLayer.Clear();
                            pWmsMapLayer.InsertLayer(layer, 0);
                            layer.Visible = true;
                            break;
                        }

                    }

                }

            }
            ILayer pLayer = pWmsMapLayer as ILayer;
            pLayer.Name = "UninphoServer Web Map Service";
            pLayer.Visible = true;
            return pLayer;
            }
            catch (Exception ex)
            {
                MessageBox.Show("wms服务链接错误! "+ex.Message);
                return null;
            }

重点来了,大家如果按照上述代码安排程序,应该问题不大。但是有时候大家会遇到一个很恶心的问题,此问题会报出com组件问题。至于com组件问题,是我arcgis engine最恶心的问题,首先这个问题,如果百度的话,大多数经验贴会告诉你是因为参数问题。其实也确实如此,但是参数错误的范围其实也很广,很难具体定位到那。
针对连接gis服务器这一块一般在 pDataLayer.Connect(pWmsConnectionName as IName);报错,其实很难一下锁定到原因,这边给一个看似无用确非常有用的办法。即为在arcgis map里面测试连接下,你代码传入的url,首先arcgis map会有报错提示,同时你能确定是不是你传递参数的问题。
好了,今天就到这里了,希望我的文章能切实帮到大家。我深刻明白编程这一路不容,只希望我的努力能给大家带来若许微光,仅此而已。加油!多多支持我一下哦,点个赞嘛,嘿嘿。

发布了14 篇原创文章 · 获赞 15 · 访问量 333

猜你喜欢

转载自blog.csdn.net/weixin_42970847/article/details/103092631