我有ArcGIS Desktop 10.2,而我的难题是如何为所有像这样的要素提取每个多边形中的数字顶点:
我的要素类中有很多地块,我想分别提取所有要素的顶点数量,然后要显示所有顶点的XY坐标。
有关更多信息,我只想转换每个多边形的顶点并显示从1个数字开始的每个顶点的数量,所以如果我有多边形并且它有4个顶点,则想将多边形转换为顶点,我会显示这样的顶点数(1,2,3,4,5),然后为每个顶点显示xy,我认为真正的挑战ID为,如何将所有多边形转换为顶点,并使每个顶点的数量从1个数字开始。
我有ArcGIS Desktop 10.2,而我的难题是如何为所有像这样的要素提取每个多边形中的数字顶点:
我的要素类中有很多地块,我想分别提取所有要素的顶点数量,然后要显示所有顶点的XY坐标。
有关更多信息,我只想转换每个多边形的顶点并显示从1个数字开始的每个顶点的数量,所以如果我有多边形并且它有4个顶点,则想将多边形转换为顶点,我会显示这样的顶点数(1,2,3,4,5),然后为每个顶点显示xy,我认为真正的挑战ID为,如何将所有多边形转换为顶点,并使每个顶点的数量从1个数字开始。
Answers:
下面的代码结合了其他答案,并在顶点上加了一些编号。
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数组,但是我首先完成了这一步。
最简单的方法是在宗地图层的属性表中添加一个新的整数字段。然后,使用以下表达式运行字段计算器:
!Shape!.pointCount-!Shape!.partCount
在!Shape!.pointCount
返回的功能顶点的总数。但是,最后会重复每个部分的第一个顶点,以关闭特征。要处理此问题,请使用为每个零件减去一个顶点-!Shape!.partCount
。
请注意,您必须使用Python解析器才能使此表达式起作用。
SearchCursor
Aaron的答案中的方法或地理处理工具(如要素顶点到点)(尽管此工具需要ArcGIS for Desktop Advanced许可证)。
dmahr提供了一个计算顶点的好方法。对于以非编程方式用XY坐标标记每个点的方法,请尝试以下工作流程:
在字段计算器中计算“ XY”字段,其中XY =
str(!x!)+“,” + str(!y!)
标签功能。右键单击层>标签>标签字段: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})
如果不想计算一个新字段,而只是想快速地获取每层的顶点数(出于一般化的目的,例如在网络上公开数据集时),则可以在工具箱或将代码公开为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)