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#的主要内容,如果未能解决你的问题,请参考以下文章
ArcGis Python脚本——将细碎小面合并到相邻的面积最大的面
ARCGIS中怎样选择出两个面图层中形状完全相同的要素(不是相交的要素)