C#基於ArcGIS Engine寫的要素圖層工具類
阿新 • • 發佈:2018-12-04
用於從MapControl中獲取可見圖層、獲取指定圖層名等:
using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using System.Collections.Generic; namespace XXXX { /// <summary> /// 圖層型別 /// </summary> public enum EnumFeatureLayerType { /// <summary> /// 所有 /// </summary> All, /// <summary> /// 點 /// </summary> Point, /// <summary> /// 線 /// </summary> Polyline, /// <summary> /// 面 /// </summary> Polygon } /// <summary> /// 圖層工具類 /// </summary> static class AELayerTool { /// <summary> /// 獲取可見要素圖層 /// </summary> /// <param name="pMapControl">地圖控制元件</param> /// <param name="eFeatureLayerType">型別</param> /// <returns></returns> public static List<IFeatureLayer> GetVisableFeatureLayer(IMapControl2 pMapControl, EnumFeatureLayerType eFeatureLayerType = EnumFeatureLayerType.All) { List<IFeatureLayer> lstFeatureLayer = null; GetVisableFeatureLayer(pMapControl, ref lstFeatureLayer); if (null != lstFeatureLayer && 0 < lstFeatureLayer.Count && EnumFeatureLayerType.All != eFeatureLayerType) { esriGeometryType eGeometryType = esriGeometryType.esriGeometryNull; if (EnumFeatureLayerType.Point == eFeatureLayerType) { eGeometryType = esriGeometryType.esriGeometryPoint; } else if (EnumFeatureLayerType.Polyline == eFeatureLayerType) { eGeometryType = esriGeometryType.esriGeometryPolyline; } else if (EnumFeatureLayerType.Polygon == eFeatureLayerType) { eGeometryType = esriGeometryType.esriGeometryPolygon; } var lstTempFeatureLayer = new List<IFeatureLayer>(); foreach (var pFeatureLayer in lstFeatureLayer) { if (esriFeatureType.esriFTSimple != pFeatureLayer.FeatureClass.FeatureType) continue; if (pFeatureLayer.FeatureClass.ShapeType != eGeometryType) continue; lstTempFeatureLayer.Add(pFeatureLayer); } lstFeatureLayer.Clear(); if (0 < lstTempFeatureLayer.Count) { lstFeatureLayer.AddRange(lstTempFeatureLayer); } } return lstFeatureLayer; } /// <summary> /// 獲取可見要素圖層 /// </summary> /// <param name="pMapControl">地圖控制元件</param> /// <returns>要素圖層</returns> public static void GetVisableFeatureLayer(IMapControl2 pMapControl, ref List<IFeatureLayer> lstFeatureLayer) { if (null == lstFeatureLayer) lstFeatureLayer = new List<IFeatureLayer>(); var layerCount = pMapControl.LayerCount; for (int i = 0; i < layerCount; i++) { var layer = pMapControl.Layer[i]; GetVisableFeatureLayer(layer, ref lstFeatureLayer); } } public static void GetVisableFeatureLayer(ILayer pLayer, ref List<IFeatureLayer> lstFeatureLayer) { if (null == lstFeatureLayer) lstFeatureLayer = new List<IFeatureLayer>(); if (pLayer is IFeatureLayer featureLayer) { if (featureLayer.Visible) lstFeatureLayer.Add(featureLayer); } else { if (pLayer is ICompositeLayer compositeLayer) { var nCount = compositeLayer.Count; for (int i = 0; i < nCount; i++) { GetVisableFeatureLayer(compositeLayer.Layer[i], ref lstFeatureLayer); } } } } public static string GetFeatureClassName(IFeatureLayer pFeatureLayer) { return GetFeatureClassName(pFeatureLayer.FeatureClass); } public static string GetFeatureClassName(IFeatureClass pFeatureClass) { return GetTableName(pFeatureClass); } public static string GetTableName(IFeatureClass pFeatureClass) { return GetTableName(pFeatureClass as ITable); } public static string GetTableName(ITable pTable) { var sUserFeatureClassName = (pTable as IDataset).Name; var nIndex = sUserFeatureClassName.IndexOf("."); if (nIndex > 0) sUserFeatureClassName = sUserFeatureClassName.Substring(nIndex + 1, sUserFeatureClassName.Length - nIndex - 1); return sUserFeatureClassName; } } }