将IPoint变量转换为IGeometry

时间:2016-07-06 18:44:35

标签: c# arcmap arcobjects

我在ArcMap工作。我有一个要素类图层(折线),其中包含点。对于每个点,我想将其转换/转换为几何,并将其放在单独的图层属性表中;在形状字段列下。

我还尝试在表格中的形状字段列上进行其他计算(例如点之间的距离),并且我收到错误消息“尝试对空几何体进行操作”。这让我相信我没有正确地将值插入表中。此外,它让我相信我没有正确投射或正确创建IGeometry变量。

此外,当我尝试查看属性表时,它会在“形状”字段列中显示PointZM,但是,在查看地图时,我无法在Arcmap中看到任何点。我的代码如下。

IFeatureLayer _SelectedLayer = MultiItemList._CapturedFeatureLayer;
IFeatureClass _SelectedFeatClass = _SelectedLayer.FeatureClass;

IDataset _SelectedFeatureDataset = (IDataset)_SelectedFeatClass;
IWorkspace _SelectedWorkspace = (IWorkspace)_SelectedFeatureDataset.Workspace;
string _SelectedPath = _SelectedWorkspace.PathName;

IFeature _mySelectedFeature = _SelectedFeatClass.GetFeature(0);
IGeometry _theGeometry = _mySelectedFeature.Shape as IGeometry;      

IPolyline _PolyLine = (IPolyline)_theGeometry;                
IPointCollection _pointsCollection = (IPointCollection)_PolyLine;

if (_pointsCollection.PointCount>=2)            
{
   IEnumVertex2 _enumVertex = _pointsCollection.EnumVertices as IEnumVertex2;
   IPoint _queryVertex = new PointClass();  
   _enumVertex.Reset();                                                         
   IPoint _outVertex;                                                    
   int partIndex;
   int vertexIndex;
   _enumVertex.Next(out _outVertex, out partIndex, out vertexIndex);

   while (_outVertex != null)
   {
     ITable LeveePointsTable = (ITable)LeveePoints_featureClass;
     int ShapeIndex = LeveePointsTasble.FindField("Shape");
     IRow LeveePointsRow = LeveePointsTable.CreateRow();

     // trying to cast IPoint to IGeometry
     IGeomerty _myPoints = (Igeometry)_outVertex

     LeveePointsRow.set_Value(ShapeIndex, _MyPoints);
   }
}

非常感谢有关此主题的任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:0)

我会做以下事情:

  1. 尝试直接从IPointCollection对象获取几何体,如下所示:

    for (int i = 0; i < pointCollection.PointCount; i++)
    {
        var p = pointCollection.get_Point(i);
    }
    
  2. 使用IFeature界面将几何体应用于shape属性:

    ((IFeature)row).Shape = p;
    
  3. BTW:如果要在要素类中创建要素,为什么不使用IFeatureIFeatureClass界面,而不是ITableIRow?由于名称取决于数据库类型,因此直接使用“Shape”字符串来获取形状字段存在很多问题。

答案 1 :(得分:0)

您的代码中有一些我不会在评论中提及的内容,以便于阅读它们。

首先,您应该明确兑现搜索字段的结果。建议不要在循环内执行此操作。

然而 - 这是第二点 - 您不需要搜索形状字段,您可以简单地从要素类中获取几何字段 - 无需强制转换为ITable

第三个你的循环永远不会终止,因为你对_outVertex的引用总是一样的。我假设您希望使用_enumVertex.Next(out _outVertex, out partIndex, out vertexIndex)来获取集合中的下一个顶点。

第四,你不需要转换为IGeometry,因为IPoint已经继承该接口。因此,实现后者的所有内容也应该隐含地实现前一个接口。

第五个也是最后一个,您可以直接访问并迭代IPointCollection,而无需转换为IEnumVertex

因此,在说完之后,您的代码可以简化为:

for(int i = 0; i < _pointsCollection.PointCount && _pointsCollection.PointCount >= 2; i++)
{
    IFeature newFeature = LeveePoints_featureClass.CreateFeature();
    // further attributes on the feature

    newFeature.Shape = _pointsCollection.get_Point(i);
}

无论如何,我怀疑所有这些实际上解决你的问题,因为更新不会自动镜像到视图中 - 在你的情况下是ArcMap - 因为它们是内部缓存的,以避免在每次更新后大规模重绘整个屏幕。要从现金中提取这些更新,您可以使用IActiveView.PartialRefresh