回答:
ArcToolbox内のポイントにフィーチャの頂点ツールを使用するか、アドバンスライセンスがない場合は、ET GeoWizardのポリゴンにポイントツールを使用できます(無料ツール)。最後に、ArcMapでXY座標の追加ツールを使用して各頂点のXY値を生成し、Table to Excelを使用してスプレッドシートを生成します。
テキストファイルへの書き込み機能 pythonスクリプトを含むサンプルツールボックスがあります。
機能座標をテキストファイルに書き込みます。
注:
技術的には、サンプルツールボックスのツールは廃止されました。ArcGISと共にインストールされているため、10以前に開発した既存のスクリプトまたはモデルツールは引き続き動作します。
これは、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
ExcelにコピーできるObjectID、XおよびYが生成されます。
...
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
...
Spatialテクノロジーのジオウィザードツールをお試しください。必要なことを実行できるいくつかの無料ツールがあります。ポリゴンの座標を取得してみてください。またはポリゴンからポイント
次のPythonスクリプト(ArcGIS 10.1以降が必要)はarcpy.da
、シェープファイルを入力として使用し、.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)
ポリラインとポリゴンのx座標とy座標が必要でした。ToolBox-> Data Management tools-> Features-> Feature to Pointを使用しました。これによりポイントシェイプファイルが作成され、同じ機能メニューからXY座標を追加してXY座標を生成しました。次に、形状属性テーブルからExcelシートに情報を抽出しました。これで私の問題は解決しました。同じものを探しているかどうかはわかりません。
絶望的な時代の回避策は次のとおりです。
この方法は、小さなデータセットでは問題ありませんが、OCRコンバーターへの依存性/制限が主な関心事です。注意して使用してください。