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会有报错提示,同时你能确定是不是你传递参数的问题。
好了,今天就到这里了,希望我的文章能切实帮到大家。我深刻明白编程这一路不容,只希望我的努力能给大家带来若许微光,仅此而已。加油!多多支持我一下哦,点个赞嘛,嘿嘿。
网友评论