美文网首页
arcgis engine 连接WMS、WMTS服务及注意事项

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

作者: 一位热爱文学的程序员 | 来源:发表于2019-11-15 22:03 被阅读0次

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

## arcgis engine 连接WMS服务:

```csharp

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服务:

```csharp

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服务会将所有图层全部加上去,如下代码是帮助大家加入自己目标图层,进行一个过滤。

```csharp

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会有报错提示,同时你能确定是不是你传递参数的问题。

好了,今天就到这里了,希望我的文章能切实帮到大家。我深刻明白编程这一路不容,只希望我的努力能给大家带来若许微光,仅此而已。加油!多多支持我一下哦,点个赞嘛,嘿嘿。

相关文章

网友评论

      本文标题:arcgis engine 连接WMS、WMTS服务及注意事项

      本文链接:https://www.haomeiwen.com/subject/ntkeictx.html