ArcGis面要素空间连接,取相交面积最大者 C#

Posted yzhyingcool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArcGis面要素空间连接,取相交面积最大者 C#相关的知识,希望对你有一定的参考价值。

核心代码:

  1         #region JoinWork_IntersectMax
  2         private void CreateNewFields_IntersectMax(IFeatureClass destFeatureClass,IFeatureClass sourceFeatureClass)
  3         
  4             List<IField> fieldList = new List<IField>();
  5             foreach (var item in this.chkField.CheckedItems)
  6             
  7                 IField field=sourceFeatureClass.Fields.get_Field( sourceFeatureClass.Fields.FindField(item.ToString()));
  8                 fieldList.Add(field);
  9             
 10             string[] fieldArray = Utils.FieldUtils.GetFieldsNameArray(destFeatureClass);
 11             foreach (IField field in fieldList)
 12             
 13                 if (!fieldArray.Contains(field.Name))
 14                 
 15                     Utils.FieldUtils.CreateField(destFeatureClass, field.Type, field.Name, "Source_"+ field.Name, field.Length, field.Precision, field.Scale);
 16                 
 17             
 18         
 19         private void GetFieldIndex(IFeatureClass destFeatureClass, IFeatureClass sourceFeatureClass, out List<int> destCLSFieldIDList, out  List<int> sourceCLSFieldIDList)
 20         
 21             List<int> destIdList = new List<int>();
 22             List<int> sourceIdList = new List<int>();
 23             foreach (var item in this.chkField.CheckedItems)
 24             
 25                 destIdList.Add( destFeatureClass.Fields.FindField(item.ToString()));
 26                 sourceIdList.Add( sourceFeatureClass.Fields.FindField(item.ToString()));
 27             
 28             destCLSFieldIDList = destIdList;
 29             sourceCLSFieldIDList = sourceIdList;
 30         
 31 
 32         private void  JoinWork_IntersectMax(IFeatureClass featureClassD, IFeatureClass featureClassS)
 33         
 34             IFeatureCursor featureCursorD = null;
 35             IFeatureCursor featureCursorD_S = null;
 36             try
 37             
 38                 int index = 1;
 39                 int count = featureClassD.FeatureCount(null);
 40                 Utils.UserArcMapProgressbar userArcMapProgressbar = new UserArcMapProgressbar(m_hookHelper);
 41                 userArcMapProgressbar.SetProgressbar(1,count, 1);
 42 
 43                 //create Fields
 44                 CreateNewFields_IntersectMax(featureClassD, featureClassS);
 45                 //get link field id list
 46                 List<int> destCLSFieldIdList;
 47                 List<int> sourceCLSFieldIdList;
 48                 GetFieldIndex(featureClassD, featureClassS, out destCLSFieldIdList, out sourceCLSFieldIdList);
 49 
 50                 Utils.UserWorkspace.FeatureWorkspace featureWorkspace = new Utils.UserWorkspace.FeatureWorkspace(featureClassD);
 51                 featureWorkspace.StartEdit(false);
 52 
 53                 featureCursorD = featureClassD.Update(null, true);
 54                 IFeature featureD = featureCursorD.NextFeature();
 55                 while (featureD != null)
 56                 
 57                     userArcMapProgressbar.Position = index;
 58                     userArcMapProgressbar.Message = $"空间连接_相交,取重叠面积最大者_已处理:index/count";
 59                     userArcMapProgressbar.Step();
 60                     ISpatialFilter spatialFilterD_S = Utils.FilterUtils.SpatialFilter(featureD.Shape, esriSpatialRelEnum.esriSpatialRelIntersects);
 61                     featureCursorD_S = featureClassS.Search(spatialFilterD_S, true);
 62                     IFeature featureS = featureCursorD_S.NextFeature();
 63                     Dictionary<int, double> feature_Area = new Dictionary<int, double>();
 64                     while (featureS != null)
 65                     
 66                         ITopologicalOperator topologicalOperatorD_S = featureD.Shape as ITopologicalOperator;
 67                         IGeometry geometryD_S = topologicalOperatorD_S.Intersect(featureS.Shape, esriGeometryDimension.esriGeometry2Dimension);
 68                         if (!feature_Area.ContainsKey(featureS.OID))
 69                             feature_Area.Add(featureS.OID, (geometryD_S as IArea).Area);
 70                         featureS = featureCursorD_S.NextFeature();
 71                     
 72                     if (feature_Area.Count > 0)
 73                     
 74                         IFeature featureGoal;
 75                         var matches = feature_Area.Where(item => item.Value == feature_Area.Values.Max());
 76                         featureGoal = featureClassS.GetFeature(matches.First().Key);
 77                         for (int i = 0; i < sourceCLSFieldIdList.Count; i++)
 78                         
 79                             featureD.set_Value(destCLSFieldIdList[i], featureGoal.get_Value(sourceCLSFieldIdList[i]));
 80                         
 81                         featureCursorD.UpdateFeature(featureD);
 82                     
 83                     featureD = featureCursorD.NextFeature();
 84                     index++;
 85                 
 86                 userArcMapProgressbar.Hide();
 87                 featureWorkspace.StopEdit(true);
 88             
 89             catch (Exception exp)
 90             
 91                 ErrorForm err = new ErrorForm(exp.Message + "\r\n" + exp.StackTrace);
 92                 err.Show();
 93             
 94             finally
 95             
 96                 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureCursorD);
 97                 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureCursorD_S);
 98             
 99         
100         #endregion

 

以上是关于ArcGis面要素空间连接,取相交面积最大者 C#的主要内容,如果未能解决你的问题,请参考以下文章

gis怎么算两个面相交的占比

ArcGis Python脚本——将细碎小面合并到相邻的面积最大的面

arcgis中如何获取平行线与面要素的交集

ARCGIS中怎样选择出两个面图层中形状完全相同的要素(不是相交的要素)

ArcGIS微课1000例0005:空间连接(Spatial Join)

ArcGIS微课1000例0005:空间连接(Spatial Join)