ArcGis面要素空间连接,取相交面积最大者 C#
标签:search string position try scale 代码 tostring cgi void
核心代码:
1 #region JoinWork_IntersectMax
2 private void CreateNewFields_IntersectMax(IFeatureClass destFeatureClass,IFeatureClass sourceFeatureClass)
3 {
4 List fieldList = new List();
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 Listint> destCLSFieldIDList, out Listint> sourceCLSFieldIDList)
20 {
21 Listint> destIdList = new Listint>();
22 Listint> sourceIdList = new Listint>();
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 Listint> destCLSFieldIdList;
47 Listint> 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 Dictionaryint, double> feature_Area = new Dictionaryint, 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 )
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#
标签:search string position try scale 代码 tostring cgi void
原文地址:https://www.cnblogs.com/yzhyingcool/p/11013145.html
评论