理想情况下,我希望它们以电子表格格式很好地制成表格。
#1 楼
使用ArcToolbox中的“要素到点”工具,或者如果您没有高级许可证,则可以使用ET GeoWizard中的“多边形到点”工具(免费工具)。最后,在ArcMap中,使用“添加XY坐标”工具为每个顶点生成XY值,并使用“表格到Excel”生成电子表格。#2 楼
这适用于标准ArcGIS许可:desc = arcpy.Describe(fcl)
shapefieldname = desc.ShapeFieldName
gebieden = arcpy.UpdateCursor(fcl)
for gebied in gebieden:
polygoon = gebied.getValue(shapefieldname)
for punten in polygoon:
for punt in punten:
print punt.X, punt.Y
#3 楼
有一个示例工具箱,其中包含将要素写入文本文件python脚本:将要素坐标写入文本文件。
注意:
从技术上讲,“样本”工具箱中的工具已被弃用。
它们仍与ArcGIS一起安装,因此您以前开发的任何现有脚本或
模型工具10继续工作。
#4 楼
这是使用da.SearchCursor的另一种方法:import arcpy
fc=r'C:\TEST.gdb\polygons123'
with arcpy.da.SearchCursor(fc,['OID@','SHAPE@']) as cursor:
for row in cursor:
array1=row[1].getPart()
for vertice in range(row[1].pointCount):
pnt=array1.getObject(0).getObject(vertice)
print row[0],pnt.X,pnt.Y
得到ObjectID,X和Y,可以将其复制到Excel中:
...
1 537505.894287 6731069.60889
1 537533.516296 6731078.20947
1 537555.316528 6731082.53589
1 537562.501892 6731085.47913
1 537589.395081 6731070.52991
1 537617.062683 6731058.29651
2 537379.569519 6729746.16272
2 537384.81311 6729746.06012
2 537396.085327 6729748.62311
2 537404.065674 6729752.75311
2 537425.145325 6729773.72931
2 537429.842102 6729777.07129
2 537442.971313 6729780.10651
2 537450.27533 6729780.51611
...
#5 楼
尝试使用空间技术的地理向导工具。它有几个免费工具可以满足您的需求。尝试获取多边形坐标。
#6 楼
以下python脚本(需要ArcGIS 10.1或更高版本)利用arcpy.da
将shapefile用作输入,并创建一个电子表格,其中包含.shp中每个多边形中每个顶点的条目(我相信它适用于较低级别的arcgis许可证) )。对象和序列ID将点绑定到特定多边形中的特定位置。 本文的@PaulSmith的H / t:获取折线的所有点,以突出显示
explode_to_points
工具中的arcpy.da.FeatureClassToNumPyArray
选项。 import os
import csv
import arcpy
from os import path
from arcpy import da
from arcpy import env
env.overwriteOutput = True
env.workspace = '/folder/containing/your/shp/here'
polygon_shp = path.join(env.workspace, 'your_shapefile_name.shp')
vertex_csv_path = 'your/csv/path/here/poly_vertex.csv'
def getPolygonCoordinates(fc):
"""For each polygon geometry in a shapefile get the sequence number and
and coordinates of each vertex and tie it to the OID of its corresponding
polygon"""
vtx_dict = {}
s_fields = ['OID@', 'Shape@XY']
pt_array = da.FeatureClassToNumPyArray(polygon_shp, s_fields,
explode_to_points=True)
for oid, xy in pt_array:
xy_tup = tuple(xy)
if oid not in vtx_dict:
vtx_dict[oid] = [xy_tup]
# this clause ensures that the first/last point which is listed
# twice only appears in the list once
elif xy_tup not in vtx_dict[oid]:
vtx_dict[oid].append(xy_tup)
vtx_sheet = []
for oid, vtx_list in vtx_dict.iteritems():
for i, vtx in enumerate(vtx_list):
vtx_sheet.append((oid, i, vtx[0], vtx[1]))
writeVerticesToCsv(vtx_sheet)
def writeVerticesToCsv(vtx_sheet):
"""Write polygon vertex information to csv"""
header = (
'oid', 'sequence_id',
'x_coordinate', 'y_coordinate')
with open(vertex_csv_path, 'wb') as vtx_csv:
vtx_writer = csv.writer(vtx_csv)
vtx_writer.writerow(header)
for row in vtx_sheet:
vtx_writer.writerow(row)
getPolygonCoordinates(polygon_shp)
我还编写了一个脚本,专门满足以下要求:在多边形中插入顶点坐标,该坐标被标记为与此重复问题,该代码如下:
import os
import arcpy
from os import path
from arcpy import da
from arcpy import env
from arcpy import management
env.overwriteOutput = True
env.workspace = '/folder/containing/your/shp/here'
polygon_shp = path.join(env.workspace, 'your_shapefile_name.shp')
file_gdb = 'your/file/gdb/path/here/temp.gdb'
def addVerticesAsAttributes(fc):
"""Add the x,y coordinates of vertices as attributes to corresponding
features. The coordinates will be in the order the appear in the geometry"""
polygon_copy = createGdbFcCopy(fc)
vtx_dict = {}
s_fields = ['OID@', 'Shape@XY']
pt_array = da.FeatureClassToNumPyArray(polygon_copy, s_fields,
explode_to_points=True)
for oid, xy in pt_array:
xy_tup = tuple(xy)
if oid not in vtx_dict:
vtx_dict[oid] = [xy_tup]
# this clause ensures that the first/last point which is listed
# twice only appears in the list once
elif xy_tup not in vtx_dict[oid]:
vtx_dict[oid].append(xy_tup)
# find that largest number of points that exist within a polygon to determine
# the number of fields that need to be added to the shapefile
max_vertices = 0
for vtx_list in vtx_dict.values():
if len(vtx_list) > max_vertices:
max_vertices = len(vtx_list)
xy_fields = addXyFields(polygon_copy, max_vertices)
u_fields = ['OID@'] + xy_fields
with da.UpdateCursor(polygon_copy, u_fields) as cursor:
oid_ix = cursor.fields.index('OID@')
for row in cursor:
xy_ix = oid_ix + 1
for vtx in vtx_dict[row[oid_ix]]:
for coord in vtx:
row[xy_ix] = coord
xy_ix += 1
cursor.updateRow(row)
def createGdbFcCopy(fc):
"""Create copy of the input shapefile as a file geodatabase feature class,
because a huge number of fields may be added to the fc this preferable to shp"""
if not arcpy.Exists(file_gdb):
management.CreateFileGDB(path.dirname(file_gdb),
path.basename(file_gdb))
polygon_copy = path.join(file_gdb, 'polygon_shp_copy')
management.CopyFeatures(polygon_shp, polygon_copy)
return polygon_copy
def addXyFields(fc, vtx_count):
"""Add fields to the feature class that will hold the x, y coordinates for each
vertex, the number of fields is twice the number of most vertices in any polygon"""
field_list = []
f_type = 'DOUBLE'
for i in range(1, vtx_count+1):
f_names = ['x{0}'.format(i), 'y{0}'.format(i)]
for fn in f_names:
management.AddField(fc, fn, f_type)
field_list.extend(f_names)
return field_list
addVerticesAsAttributes(polygon_shp)
评论
第一个python脚本完成了hpy的要求!它运作非常快!谢谢格兰特·汉弗莱斯!
– ArisA
17年12月15日在8:11
#7 楼
因此,我尚未完成解决方案,但是看起来您可以使用此工具:转换> JSON>要素到JSON。
这将转换您的shapefile (在我的情况下为81个多边形)转换为JSON文件。您可以使用文本编辑器打开它,以查看确实为每个多边形列出了所有顶点。
此外,python标准库(导入json)将json对象视为字典。然后,您可以简单地遍历字典以将顶点值(以及所需的任何其他属性)写入csv文件。如果我可以使用,我会回去并发布解决方案。
#8 楼
我只需要折线和多边形的x和y坐标。我使用了ToolBox-> Data Management工具-> Feature-> Feature to Point。这创建了一个点形状文件,然后我使用了来自同一“功能”菜单的XY坐标来生成XY坐标。然后,我从形状属性表中提取信息到Excel工作表中。这解决了我的问题,不确定是否要查找相同的内容。评论
当问题要求每个折线/多边形中的每个顶点一个点(X,Y)时,这是否只会给您每个折线/多边形一个点(X,Y)?
– PolyGeo♦
16年8月31日在6:51
#9 楼
这是在绝望的时候的解决方法:开始编辑要素类或shapefile
选择多边形要素并右键单击以“编辑顶点”
右键单击其中一个顶点,然后选择“草图属性”
将弹出,列出列出的顶点的坐标
截取坐标列表的屏幕截图
粘贴截屏到您喜欢的照片/图片编辑器中,并
另存为jpeg / png / bmp等
Google'免费在线OCR'从结果中选择一个(某些结果比其他结果更好)
上传您的坐标屏幕截图文件并进行转换
选择输出文件类型(txt,Excel等)
检查结果,因为某些OCR转换器是垃圾!!!
使用Arcmap中的添加X,Y数据创建点数据集。
此方法适用于小型数据集,但主要关注的是OCR转换器的相关性/限制。请谨慎使用。
评论
快速问题,“ array1.getObject(0).getObject(vertice)”部分发生了什么?
–雷克斯
18年4月24日在20:37
@Rex请参阅Array的帮助部分:pro.arcgis.com/en/pro-app/arcpy/classes/array.htm。我从数组中获取每个点/顶点:i67.tinypic.com/34gstig.jpg
– Bera
18-4-25在5:15
太好了,这有助于我更好地理解它。那么,为什么在数组中存在一个数组,而不仅仅是点数组?第一个数组中还有其他内容吗? array1.getObject(1)给您什么?
–雷克斯
18年4月25日在17:27
这是因为所有部分都在“ row [1] .getPart()”中,因此,您的第一个数组是多部分功能的不同部分。因此,如果您具有多部分功能,那么您将只有array1.getObject(0)以外的东西?
–雷克斯
18年4月25日在17:34