核心代码:

         #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. Pyhon 格式化输出的几种方式

    废话不多说,直接上代码 第一种格式化的输出方式,拼接我就不上了,不建议使用,数据多的时候自己都蒙圈 # -*- coding:utf-8 -*- # Author:覃振鸿 #格式化输出 name=in ...

  2. python学习之路,2018.8.9

    python学习之路,2018.8.9, 学习是一个长期坚持的过程,加油吧,少年!

  3. ElasticSearch中分词器组件配置详解

    首先要明确一点,ElasticSearch是基于Lucene的,它的很多基础性组件,都是由Apache Lucene提供的,而es则提供了更高层次的封装以及分布式方面的增强与扩展. 所以要想熟练的掌握 ...

  4. ionic3 emoj表情包插件 emoji-picker

    1.效果演示: 2.安装扩展包依赖 npm i @ionic-tools/emoji-picker --save 3.app.module.ts中导入插件 import { EmojiPickerMo ...

  5. npm install 时 提示err code EINTEGRITY报错

    1.报错截图如图: 2.报错缘由:因npm 版本问题导致 3.解决方法:升级npm版本(npm i -g npm),再重新npm install即可.

  6. Android ADB被占用 重启 ADB方法

    前言 ADB 是 android sdk里面的一个工具,这个工具可以用于操作管理 Android 模拟器 和 真实Andriod手机设备.列如 : 执行安装 删除 应用的操作 , 执行 模拟点击屏幕 ...

  7. Codeforces - 1139D - Steps to One (概率DP+莫比乌斯反演)

    蒟蒻数学渣呀,根本不会做. 解法是参考 https://blog.csdn.net/xs18952904/article/details/88785210 这位大佬的. 状态的设计和转移如上面博客一样 ...

  8. 【JDK1.8】Java HashMap实现细节

    底层是用数组实现的 /** * The table, initialized on first use, and resized as * necessary. When allocated, len ...

  9. vue项目从0开始记录

    1.安装vue-cli 2.通过脚手架进行项目的创建    4.配置第三方UI库快速开发(如ivew,element ui) 5.配置axios 库 一.安装vue-cli npm install - ...

  10. vue 插槽 slot

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...