核心代码:

         #region JoinWork_IntersectMax
private void CreateNewFields_IntersectMax(IFeatureClass destFeatureClass,IFeatureClass sourceFeatureClass)
{
List<IField> fieldList = new List<IField>();
foreach (var item in this.chkField.CheckedItems)
{
IField field=sourceFeatureClass.Fields.get_Field( sourceFeatureClass.Fields.FindField(item.ToString()));
fieldList.Add(field);
}
string[] fieldArray = Utils.FieldUtils.GetFieldsNameArray(destFeatureClass);
foreach (IField field in fieldList)
{
if (!fieldArray.Contains(field.Name))
{
Utils.FieldUtils.CreateField(destFeatureClass, field.Type, field.Name, "Source_"+ field.Name, field.Length, field.Precision, field.Scale);
}
}
}
private void GetFieldIndex(IFeatureClass destFeatureClass, IFeatureClass sourceFeatureClass, out List<int> destCLSFieldIDList, out List<int> sourceCLSFieldIDList)
{
List<int> destIdList = new List<int>();
List<int> sourceIdList = new List<int>();
foreach (var item in this.chkField.CheckedItems)
{
destIdList.Add( destFeatureClass.Fields.FindField(item.ToString()));
sourceIdList.Add( sourceFeatureClass.Fields.FindField(item.ToString()));
}
destCLSFieldIDList = destIdList;
sourceCLSFieldIDList = sourceIdList;
} private void JoinWork_IntersectMax(IFeatureClass featureClassD, IFeatureClass featureClassS)
{
IFeatureCursor featureCursorD = null;
IFeatureCursor featureCursorD_S = null;
try
{
int index = ;
int count = featureClassD.FeatureCount(null);
Utils.UserArcMapProgressbar userArcMapProgressbar = new UserArcMapProgressbar(m_hookHelper);
userArcMapProgressbar.SetProgressbar(,count, ); //create Fields
CreateNewFields_IntersectMax(featureClassD, featureClassS);
//get link field id list
List<int> destCLSFieldIdList;
List<int> sourceCLSFieldIdList;
GetFieldIndex(featureClassD, featureClassS, out destCLSFieldIdList, out sourceCLSFieldIdList); Utils.UserWorkspace.FeatureWorkspace featureWorkspace = new Utils.UserWorkspace.FeatureWorkspace(featureClassD);
featureWorkspace.StartEdit(false); featureCursorD = featureClassD.Update(null, true);
IFeature featureD = featureCursorD.NextFeature();
while (featureD != null)
{
userArcMapProgressbar.Position = index;
userArcMapProgressbar.Message = $"空间连接_相交,取重叠面积最大者_已处理:{index}/{count}";
userArcMapProgressbar.Step();
ISpatialFilter spatialFilterD_S = Utils.FilterUtils.SpatialFilter(featureD.Shape, esriSpatialRelEnum.esriSpatialRelIntersects);
featureCursorD_S = featureClassS.Search(spatialFilterD_S, true);
IFeature featureS = featureCursorD_S.NextFeature();
Dictionary<int, double> feature_Area = new Dictionary<int, double>();
while (featureS != null)
{
ITopologicalOperator topologicalOperatorD_S = featureD.Shape as ITopologicalOperator;
IGeometry geometryD_S = topologicalOperatorD_S.Intersect(featureS.Shape, esriGeometryDimension.esriGeometry2Dimension);
if (!feature_Area.ContainsKey(featureS.OID))
feature_Area.Add(featureS.OID, (geometryD_S as IArea).Area);
featureS = featureCursorD_S.NextFeature();
}
if (feature_Area.Count > )
{
IFeature featureGoal;
var matches = feature_Area.Where(item => item.Value == feature_Area.Values.Max());
featureGoal = featureClassS.GetFeature(matches.First().Key);
for (int i = ; i < sourceCLSFieldIdList.Count; i++)
{
featureD.set_Value(destCLSFieldIdList[i], featureGoal.get_Value(sourceCLSFieldIdList[i]));
}
featureCursorD.UpdateFeature(featureD);
}
featureD = featureCursorD.NextFeature();
index++;
}
userArcMapProgressbar.Hide();
featureWorkspace.StopEdit(true);
}
catch (Exception exp)
{
ErrorForm err = new ErrorForm(exp.Message + "\r\n" + exp.StackTrace);
err.Show();
}
finally
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureCursorD);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureCursorD_S);
}
}
#endregion

ArcGis面要素空间连接,取相交面积最大者 C#的更多相关文章

  1. 简述ArcGIS的空间连接(Spatial Join)与字段映射(Field Map)操作

    插个广告,制作ArcGIS的Tool工具学习下面的教程就对了:零基础学习Python制作ArcGIS自定义工具 牢骚一下 在使用ArcMap进行空间连接操作的时候,往往会有两种特殊需求,其一是连接重叠 ...

  2. 建议入门-用ArcMap进行空间查询与空间连接

    1.打开arcmap并导入数据(如本图导入美国地图(usa.mxd)): 2.空间查询操作,在地图上的某片区域点击右键,得到下图,点击identify,此时我在阿拉斯加上面点击的 地图会闪现一下被查询 ...

  3. 将位图导入为ArcGIS面要素

    本文根据笔者经验,介绍一种从位图图像导入ArcGIS称为要素的方法.这种方法适用于从现有出版物图片中获取地理信息的情况. 首先要说明的是,从位图导入要素是非常非常不精确的方式,如果有其它数据来源,那么 ...

  4. ArcGIS Engine中空间参照(地理坐标)相关方法总结转

    ArcGIS Engine中空间参照(地理坐标)相关方法总结 来自:http://blog.csdn.net/u011170962/article/details/38776101 1.创建空间参考 ...

  5. ArcGIS Engine中空间参照(地理坐标)相关方法总结

    转自原文 ArcGIS Engine中空间参照(地理坐标)相关方法总结 1.创建空间参考 /// <summary> /// 根据prj文件创建空间参考 /// </summary& ...

  6. hdu3060Area2(任意多边形相交面积)

    链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...

  7. I - Intersection HDU - 5120(圆环相交面积)

    Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...

  8. Gym 100952J&&2015 HIAST Collegiate Programming Contest J. Polygons Intersection【计算几何求解两个凸多边形的相交面积板子题】

    J. Polygons Intersection time limit per test:2 seconds memory limit per test:64 megabytes input:stan ...

  9. hdu 3264 09 宁波 现场 E - Open-air shopping malls 计算几何 二分 圆相交面积 难度:1

    Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...

随机推荐

  1. Java内部类类型

    可以在类中的任何位置定义内部类,并在其中编写Java语句.有三种类型的内部类. 内部类的类型取决于位置和声明的方式. 成员内部类 局部内部类 匿名内部类 成员内部类 成员内部类在类中声明的方式与声明成 ...

  2. Python中xlrd、xlwt、win32com模块对xls文件的读写操作

    # -*- coding: utf-8 -*- #xlrd和xlwt只支持xls文件读写,openpyxl只支持xlsx文件的读写操作 import xlrd import xlwt import w ...

  3. ACM_ICPC_Team

    题目: There are a number of people who will be attending ACM-ICPC World Finals. Each of them may be we ...

  4. csdn加入暂时会话功能

    版权声明:本文为博主原创文章.若要转载请注明出处! ^_^ https://blog.csdn.net/u010892841/article/details/25334153             ...

  5. linux学习总结--linux100day(day1)

    写在前面:我是一名在学习linux的小学生,最近在学习python时,我的老师推荐了github上的一本教材“python100day”,100day里面的内容由浅入深,且都具备详细的例子,对于我这个 ...

  6. batch normlization (BN)的讲解

    1. https://zhuanlan.zhihu.com/p/54073204(简单理解) 2. https://zhuanlan.zhihu.com/p/34879333 (有举例说明,但是不太理 ...

  7. java笔试手写算法面试题大全含答案

    1.统计一篇英文文章单词个数.public class WordCounting {public static void main(String[] args) {try(FileReader fr ...

  8. php高版本安装ecshop错误解决方法

    1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in F:\ ...

  9. React笔记03——React实现TodoList

    1 什么是JSX语法? 原生JS中,要向页面中挂载html标签,标签一定是被引号''包起来的:document.getElementById('root').append('<div>he ...

  10. C循环

    C 循环 有的时候,可能需要多次执行同一块代码.一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了允许更为复杂的执行路径的多种控制结构. 循环语句允许 ...