DataOperateHelper.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. 
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using ESRI.ArcGIS.Carto;
  8. using ESRI.ArcGIS.Geodatabase;
  9. namespace GNetworkProcessTool
  10. {
  11. public class DataOperateHelper
  12. {
  13. /// <summary>
  14. /// 获取GDB工作空间通过GDB文件路径
  15. /// </summary>
  16. /// <param name="strGdbFilePath">GDB文件路径</param>
  17. /// <param name="pFeatureWorkspace">输出的工作空间</param>
  18. public static void GetWorkspaceFromGDBFile(string strGdbFilePath, out IFeatureWorkspace pFeatureWorkspace)
  19. {
  20. IWorkspaceFactory pWorkspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
  21. IWorkspace pWorkspace = null;
  22. try
  23. {
  24. pWorkspace = pWorkspaceFactory.OpenFromFile(strGdbFilePath, 0);
  25. }
  26. catch
  27. {
  28. throw new Exception("打开GDB失败:无效的GDB文件!");
  29. }
  30. pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
  31. System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspaceFactory);
  32. //System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspace);
  33. }
  34. /// <summary>
  35. /// 从要素集获得要素图层(排除几何网络关系图层)
  36. /// </summary>
  37. /// <param name="pFeatureWorkspace">工作空间</param>
  38. /// <param name="pFeatureDataset">要素集</param>
  39. /// <returns>图层名(去除前缀英文),要素类</图层名></returns>
  40. public static Dictionary<string, IFeatureClass> GetFeatureClassFromDataset(IFeatureWorkspace pFeatureWorkspace, IFeatureDataset pFeatureDataset)
  41. {
  42. Dictionary<string, IFeatureClass> DicFeatureClass = new Dictionary<string, IFeatureClass>();
  43. IEnumDataset pEnumDataset = pFeatureDataset.Subsets;
  44. pEnumDataset.Reset();
  45. IDataset pDataset = pEnumDataset.Next();
  46. IFeatureLayer pFeatureLayer = new FeatureLayerClass();
  47. while (pDataset != null)
  48. {
  49. if (pDataset.Type == esriDatasetType.esriDTFeatureClass && !pDataset.Name.Contains("_Net"))//排除几何网络关系图层
  50. {
  51. pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
  52. if (pDataset.Name.Contains("."))
  53. {
  54. pFeatureLayer.Name = pDataset.Name.Substring(pDataset.Name.LastIndexOf(".") + 1);//截取去除前缀
  55. }
  56. else
  57. {
  58. pFeatureLayer.Name = pDataset.Name;
  59. }
  60. DicFeatureClass.Add(pFeatureLayer.Name, pFeatureLayer.FeatureClass);
  61. }
  62. pDataset = pEnumDataset.Next();
  63. }
  64. System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumDataset);
  65. return DicFeatureClass;
  66. }
  67. /// <summary>
  68. /// 从要素集获得要素图层(排除几何网络关系图层和不需要的图层)
  69. /// </summary>
  70. /// <param name="pFeatureWorkspace">工作空间</param>
  71. /// <param name="pFeatureDataset">要素集</param>
  72. /// <param name="lstRemoveClass">不需要图层名称集合</param>
  73. /// <returns>图层名(去除前缀英文),要素类</returns>
  74. public static Dictionary<string, IFeatureClass> GetFeatureClassFromDataset(IFeatureWorkspace pFeatureWorkspace, IFeatureDataset pFeatureDataset, List<string> lstRemoveClass)
  75. {
  76. Dictionary<string, IFeatureClass> DicFeatureClass = new Dictionary<string, IFeatureClass>();
  77. IEnumDataset pEnumDataset = pFeatureDataset.Subsets;
  78. pEnumDataset.Reset();
  79. IDataset pDataset = pEnumDataset.Next();
  80. IFeatureLayer pFeatureLayer = new FeatureLayerClass();
  81. while (pDataset != null)
  82. {
  83. if ((pDataset.Type == esriDatasetType.esriDTFeatureClass && !pDataset.Name.Contains("_Net")) && !lstRemoveClass.Exists(p=>p == (pDataset.Name.Contains(".") ? pDataset.Name.Substring(pDataset.Name.LastIndexOf(".") + 1) : pDataset.Name)))//排除几何网络关系图层
  84. {
  85. pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
  86. if (pDataset.Name.Contains("."))
  87. {
  88. pFeatureLayer.Name = pDataset.Name.Substring(pDataset.Name.LastIndexOf(".") + 1);//截取去除前缀
  89. }
  90. else
  91. {
  92. pFeatureLayer.Name = pDataset.Name;
  93. }
  94. DicFeatureClass.Add(pFeatureLayer.Name, pFeatureLayer.FeatureClass);
  95. }
  96. pDataset = pEnumDataset.Next();
  97. }
  98. System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumDataset);
  99. return DicFeatureClass;
  100. }
  101. /// <summary>
  102. /// 获取要素个数通过要素类(游标)
  103. /// </summary>
  104. /// <param name="pFeatureclass">要素类</param>
  105. /// <returns>要素个数</returns>
  106. public static int GetFeatureCount(IFeatureClass pFeatureclass)
  107. {
  108. IFeatureCursor pFeatureCursor = pFeatureclass.Search(null, false);
  109. IFeature pFeature = pFeatureCursor.NextFeature();
  110. int pFeatureCount = 0;
  111. while (pFeature != null)
  112. {
  113. pFeatureCount++;
  114. pFeature = pFeatureCursor.NextFeature();
  115. }
  116. System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
  117. return pFeatureCount;
  118. }
  119. /// <summary>
  120. /// 获取要素个数通过要素类(转表)
  121. /// </summary>
  122. /// <param name="pFeatureclass">要素类</param>
  123. /// <param name="pQueryFilter">过滤条件</param>
  124. /// <returns>要素个数</returns>
  125. public static int GetFeatureCount(IFeatureClass pFeatureclass, IQueryFilter pQueryFilter)
  126. {
  127. return (pFeatureclass as ITable).RowCount(pQueryFilter);
  128. }
  129. }
  130. }