提取每个多边形中的顶点数量?


14

我有ArcGIS Desktop 10.2,而我的难题是如何为所有像这样的要素提取每个多边形中的数字顶点:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

我的要素类中有很多地块,我想分别提取所有要素的顶点数量,然后要显示所有顶点的XY坐标。

有关更多信息,我只想转换每个多边形的顶点并显示从1个数字开始的每个顶点的数量,所以如果我有多边形并且它有4个顶点,则想将多边形转换为顶点,我会显示这样的顶点数(1,2,3,4,5),然后为每个顶点显示xy,我认​​为真正的挑战ID为,如何将所有多边形转换为顶点,并使每个顶点的数量从1个数字开始。


根据您的编辑,您是否希望每个要素每个要素都有唯一的ID(1 .... n) XY坐标?您是否希望一个列/字段具有所有这些信息以用于标记,例如[1,942744.1234,924654.1234] [2,952744.1234,925654.1234] ...?
亚伦

是的,如果没有记错的话,每个场都有一个ID,用于表示每个多边形的顶点数量,例如(1,2,3,4),(1,2,3,4,5),(1,2,3,4 5,6,),(1,2,3,4,5,6,7,8,9)等,那么如果我们从arctoolbox中调用添加xy工具,我认为xy可能会很容易
GIS Man

Answers:


5

下面的代码结合了其他答案,并在顶点上加了一些编号。 结果

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

这些点按绘图顺序标记。最后一个点(在第一个点之下)将没有标签,可以通过选择所有具有Null值或唯一的“ DRAW_ORDER”值的点来删除(如果不需要重建的话)。定义查询可用于从显示中删除重叠点。

存在XY数据,但我将保留您的标签/显示需求。请参阅Aaron关于添加XY字段进行标记的答案。

我还尝试过将FeatureClass转换为numpy数组,但是我首先完成了这一步。


谢谢@ gm70560,我已经按照您的代码变量进行了操作,并将其另存为.py,但是当我要执行它时,会出现一条错误消息,“表中不存在指定的字段名”,所以我该怎么办?
GIS Man

这是我的PC上的打印屏幕,我只是在代码中设置了目标要素类路径以及输出新要素类的路径,如果可以为使用代码的方法提供指导,imageshack.com / i / fvsozep
GIS Man

它没有添加字段(?)。结果进一步发生了什么?我有一个聊天室来转储全部结果。发表评论,以便我检查房间。
gm70560

22

最简单的方法是在宗地图层的属性表中添加一个新的整数字段。然后,使用以下表达式运行字段计算器:

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCount返回的功能顶点的总数。但是,最后会重复每个部分的第一个顶点,以关闭特征。要处理此问题,请使用为每个零件减去一个顶点-!Shape!.partCount

请注意,您必须使用Python解析器才能使此表达式起作用。

现场计算器


这确实很酷,但不会为每个这些顶点提供XY。似乎答案是使用两个响应(即也使用@Aaron的响应)来获取所有请求的信息。
罗兰

@Roland你是对的...我错过了有关XY顶点的部分问题。在这种情况下,您将必须使用SearchCursorAaron的答案中的方法或地理处理工具(如要素顶点到点)(尽管此工具需要ArcGIS for Desktop Advanced许可证)。
dmahr 2014年

非常感谢@dmahr,我认为缺少一个步骤,当我计算值时,结果是顶点数的计数,因此,如果我有具有5个顶点的宗地要素类,我想像这样1,2,3显示它,每个顶点上有4,4,而不是将所有顶点都算在一个数字上,真正的挑战在于,如何为每个顶点显示数字,每个宗地的数字从1开始。
GIS Man

12

dmahr提供了一个计算顶点的好方法。对于以非编程方式用XY坐标标记每个点的方法,请尝试以下工作流程:

  1. 点的特征顶点
  2. 在新点FC“ X”,“ Y”中添加两个新字段(类型:double)
  3. 计算几何。右键单击字段>计算几何...>点的X坐标(重复Y字段)
  4. 添加另一个字段“ XY”(类型:文本)
  5. 在字段计算器中计算“ XY”字段,其中XY =

    str(!x!)+“,” + str(!y!)

  6. 标签功能。右键单击层>标签>标签字段:XY

这将产生以下结果:

在此处输入图片说明

您也可以使用搜索光标(作为开始)explode_to_points以编程方式执行这些操作。

将要素解构为其单个点或顶点。如果将explode_to_points设置为True,则由五行表示具有五个点的多点要素。

(默认值为False)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

似乎需要一些后期处理或使用@dmahr的答案来获得#个特征的每个特征的总和。
罗兰2014年

4

如果不想计算一个新字段,而只是想快速地获取每层的顶点数(出于一般化的目的,例如在网络上公开数据集时),则可以在工具箱或将代码公开为Python加载项。

自定义脚本工具代码:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Python附加代码(在TOC中选择一个层来计算顶点):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.