• ArcGis相接面补节点c#


    相接(Touch)面执行切割后 新面与原相接面会缺少公共节点。

     1  private void AddPointToTouchesPolygon(IFeatureCursor newFeatureCursor, IFeatureClass featureClass)
     2         {
     3             IFeature newFeature = newFeatureCursor.NextFeature();
     4             while (newFeature != null)
     5             {
     6                 IPointCollection pointCollectionNewFeature = newFeature.Shape as IPointCollection;
     7                 for (int i = 0; i < pointCollectionNewFeature.PointCount-1; i++)
     8                 {
     9                     ITopologicalOperator pTopologicalOperator = pointCollectionNewFeature.Point[i] as IGeometry as ITopologicalOperator;
    10                     IGeometry pGeometryPointBuffer = pTopologicalOperator.Buffer(0.001);
    11                     ISpatialFilter spatialFilter0 = Utils.FilterUtils.SpatialFilter(pGeometryPointBuffer, esriSpatialRelEnum.esriSpatialRelIntersects);
    12                     IFeatureCursor featureCursor0 = featureClass.Update(spatialFilter0, false);
    13                     IFeature feature0 = featureCursor0.NextFeature();
    14                     while (feature0 != null)
    15                     {
    16                         IPointCollection pointCollection1 = feature0.Shape as IPointCollection;
    17                         IPoint pointTemp = new PointClass();
    18                         int count = 0;
    19                         for (int k = 0; k < pointCollection1.PointCount-1; k++)
    20                         {
    21                             pointCollection1.QueryPoint(k, pointTemp);
    22                             if (Math.Abs(pointTemp.X - pointCollectionNewFeature.Point[i].X) < 0.001 && Math.Abs(pointTemp.Y - pointCollectionNewFeature.Point[i].Y) < 0.001)
    23                                 count++;
    24                         }
    25                         if (count == 0)
    26                         {
    27                             pointCollection1.AddPoint(pointCollectionNewFeature.Point[i]);
    28                             ITopologicalOperator topologicalOperator = feature0.Shape as ITopologicalOperator;
    29                             topologicalOperator.Simplify();
    30                             featureCursor0.UpdateFeature(feature0);
    31                             featureCursor0.Flush();
    32                         }
    33                         feature0 = featureCursor0.NextFeature();
    34                     }
    35                 }
    36                 newFeature = newFeatureCursor.NextFeature();
    37             }
    38         }

    该方法只适用于规则的多边形,欢迎提出改进意见、bug及其解决

    =============================================================================================================

    更新方法:

     1      private void AddPointToTouchesPolygon(IFeatureCursor newFeatureCursor, IFeatureClass featureClass)
     2         {
     3             IFeature newFeature = newFeatureCursor.NextFeature();
     4             IFeatureCursor featureCursor0 = null;
     5             try
     6             {
     7                 while (newFeature != null)
     8                 {
     9                     IPointCollection pointCollectionNewFeature = newFeature.Shape as IPointCollection;
    10                     for (int i = 0; i < pointCollectionNewFeature.PointCount - 1; i++)
    11                     {
    12                         ITopologicalOperator pTopologicalOperator = pointCollectionNewFeature.Point[i] as IGeometry as ITopologicalOperator;
    13                         IGeometry pGeometryPointBuffer = pTopologicalOperator.Buffer(0.001);
    14                         ISpatialFilter spatialFilter0 = Utils.FilterUtils.SpatialFilter(pGeometryPointBuffer, esriSpatialRelEnum.esriSpatialRelIntersects);
    15                         featureCursor0 = featureClass.Update(spatialFilter0, false);
    16                         IFeature adjoinFeature = featureCursor0.NextFeature();
    17                         while (adjoinFeature != null)
    18                         {
    19                             IPointCollection pointCollectionAdjoinFeature = adjoinFeature.Shape as IPointCollection;
    20                             IPointCollection pointCollectionAdjoinFeatureCpoy = adjoinFeature.ShapeCopy as IPointCollection;
    21                             int count = 0;
    22                             for (int k = 0; k < pointCollectionAdjoinFeature.PointCount - 1; k++)
    23                             {
    24                                 if (Math.Abs(pointCollectionAdjoinFeature.Point[k].X - pointCollectionNewFeature.Point[i].X) < 0.001 && Math.Abs(pointCollectionAdjoinFeature.Point[k].Y - pointCollectionNewFeature.Point[i].Y) < 0.001)
    25                                 {
    26                                     count++;
    27                                     break;
    28                                 }
    29                             }
    30                             if (count == 0)
    31                             {
    32                                 for (int j = 0; j < pointCollectionAdjoinFeatureCpoy.PointCount - 1; j++)
    33                                 {
    34                                     if(IsPointOnSegment(pointCollectionNewFeature.Point[i], pointCollectionAdjoinFeatureCpoy.Point[j], pointCollectionAdjoinFeatureCpoy.Point[j + 1]))
    35                                     {
    36                                         //before 在这个索引之前加
    37                                         pointCollectionAdjoinFeature.AddPoint(pointCollectionNewFeature.Point[i], j + 1, Type.Missing);
    38                                         break;
    39                                     }
    40                                 }
    41                                 ITopologicalOperator topologicalOperator = adjoinFeature.Shape as ITopologicalOperator;
    42                                 topologicalOperator.Simplify();
    43                                 featureCursor0.UpdateFeature(adjoinFeature);
    44                                 featureCursor0.Flush();
    45                             }
    46                             adjoinFeature = featureCursor0.NextFeature();
    47                         }
    48                     }
    49                     newFeature = newFeatureCursor.NextFeature();
    50                 }
    51             }
    52             catch (Exception exp)
    53             {
    54                 throw new Exception("添加公共节点时发生错误!" + "
    " + exp.Message + "
    " + exp.StackTrace);
    55             }
    56         }
  • 相关阅读:
    继承中的虚函数、纯虚函数、普通函数
    struct与class的区别
    boost::filesystem总结
    ASM: Active Shape Models--Their Training and Application
    基础知识:仿射变换、相似变换、等距变换等常见变换
    PDM:Training Models of Shape from Sets of Examples
    常见优化器
    深度学习基础(五)ResNet_Deep Residual Learning for Image Recognition
    深度学习基础(四) Dropout_Improving neural networks by preventing co-adaptation of feature detectors
    ios 各种变量和作用范围
  • 原文地址:https://www.cnblogs.com/yzhyingcool/p/11063758.html
Copyright © 2020-2023  润新知