我在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);
}
}
非常感谢有关此主题的任何帮助。提前谢谢。
答案 0 :(得分:0)
我会做以下事情:
尝试直接从IPointCollection对象获取几何体,如下所示:
for (int i = 0; i < pointCollection.PointCount; i++)
{
var p = pointCollection.get_Point(i);
}
使用IFeature
界面将几何体应用于shape属性:
((IFeature)row).Shape = p;
BTW:如果要在要素类中创建要素,为什么不使用IFeature
和IFeatureClass
界面,而不是ITable
和IRow
?由于名称取决于数据库类型,因此直接使用“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
。