核心代码:

         #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. 简单了解Redis

    redis是什么 redis是一种支持key-value等多种数据结构的存储系统,可用于缓存,事件发布,消息队列等场景,支持多种数据类型 string.hash.list.set.zset.而且基于内 ...

  2. USACO 2014 US Open Odometer /// 枚举

    题目大意: 给定区间 l r 求区间包含多少个数 它们各个位的数只有一个不一样 注意 多个位但多个数为0单个数为x的情况 这种情况只有 x000 即把单个数放在首位才是正确的 同样注意 多个位但单个数 ...

  3. bzoj4550 小奇的博弈

    我看出了是个 Nimk 问题.... dp我明白意思,我也会推组合数.... 但是...神tm统计答案啊...蒟蒻不会~

  4. shell 脚本文件类型.sh ,变量

    1. shell脚本编程的基本过程 (1)建立shell文件,以 .sh 结尾的文件 (2)赋予shell文件执行权限,chmod 0777 文件名 (3)执行shell文件, ./ 文件名 或者ba ...

  5. 【学术篇】The Xuanku Inversion Magic学习笔记

    退役之前写的 然后因为退役就咕咕咕了... 后来发现数学考试能用的到个鬼就发布出来了QwQ 主要是方便自己没登录的时候查阅... 显然子集什么的是没有学会的QwQ 所以学OI的话不要看本文!!!!!& ...

  6. 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest E:Black or White

    这道题可以比较容易看出是线性DP.设dp[i]代表把前i个格子刷成目标状态的最小步数. 写出状态转移方程 dp[i]=min( dp[j]+calc(j+1,i) ) (i-j<=k) calc ...

  7. androidstudio 2.3.3 jni过程汇总(2):2、使用so文件

    2.使用so文件 1.在java文件中System.loadLibrary加载包,并且引入native方法. 2.在app/src/main/下新建jniLibs文件夹,将so包带arm文件夹形式导入 ...

  8. thymeleaf onclick方法向js方法传递参数

    如下图 这个错误并不影响 请放心使用

  9. jQuery, js 验证两次输了密码的一相同

    <div class="form-group"> <label class="col-sm-2 control-label font"> ...

  10. 【LeetCode 13】罗马数字转整数

    题目链接 [题解] 就是上一题反过来的过程. 因为有说一般情况下后面的罗马数字是小于前面的罗马数字的. 如果前面的罗马数字小于后面的罗马数字了. 说明出现了4,9,40,90这些特殊情况. 那么就得判 ...