ArcMapでポリゴン頂点の座標を抽出しますか?


25

ArcMap 10に読み込まれたフィーチャクラスには約12個のポリゴンがあり、すべて地理WGS 1984にあります。

そのフィーチャクラスの各ポリゴンの各頂点に関連付けられた座標を簡単に取得するにはどうすればよいですか?

理想的には、スプレッドシート形式でうまく表にしたいです。

回答:



12

これは、標準の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


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

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
...

簡単な質問、「array1.getObject(0).getObject(vertice)」の部分で何が起こっているのですか?
レックス

:配列のためのヘルプセクションを参照@Rex pro.arcgis.com/en/pro-app/arcpy/classes/array.htmを。:配列から私は、各ポイント/頂点フェッチi67.tinypic.com/34gstig.jpg
BERA

素晴らしい、それは私がそれをもう少しよく理解するのを助けます。それでは、ポイントの配列だけでなく、配列内に配列があるのはなぜですか?最初の配列には他に何かありますか?array1.getObject(1)は何を提供しますか?
レックス

これは、「row [1] .getPart()」ですべてのパーツを取得するためです。したがって、最初の配列はマルチパーツフィーチャのさまざまなパーツです。マルチパート機能がある場合、array1.getObject(0)を超えるものしかありませんか?
レックス

3

Spatialテクノロジーのジオウィザードツールをお試しください。必要なことを実行できるいくつかの無料ツールがあります。ポリゴンの座標を取得してみてください。またはポリゴンからポイント

et geo-wizards


2

次の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)

最初のpythonスクリプトはhpyが要求したことを行います!非常に高速に動作します!Grant Humphriesに感謝します!
アリス

1

そのため、まだ解決策は完了していませんが、このツールを使用できるようです。

変換> JSON>機能からJSONへ。

これにより、シェープファイル(私の場合は81個のポリゴン)がJSONファイルに変換されます。これをテキストエディタで開いて、実際に各ポリゴンのすべての頂点がリストされていることを確認できます。

さらに、Python標準ライブラリ(jsonのインポート)は、jsonオブジェクトを辞書として扱います。次に、辞書をループして頂点値(およびその他の必要な属性)をcsvファイルに書き込むだけです。動作するようになったら、戻ってソルンを投稿します。


0

ポリラインとポリゴンのx座標とy座標が必要でした。ToolBox-> Data Management tools-> Features-> Feature to Pointを使用しました。これによりポイントシェイプファイルが作成され、同じ機能メニューからXY座標を追加してXY座標を生成しました。次に、形状属性テーブルからExcelシートに情報を抽出しました。これで私の問題は解決しました。同じものを探しているかどうかはわかりません。


これは、質問が各ポリライン/ポリゴンの各頂点に1つのポイント(X、Y)を求めているときに、ポリライン/ポリゴンごとに1つのポイント(X、Y)を与えるだけではありませんか?
PolyGeo

-2

絶望的な時代の回避策は次のとおりです。

  • フィーチャクラスまたはシェープファイルの編集を開始します
  • ポリゴンフィーチャを選択し、右クリックして[頂点の編集]を選択します
  • 頂点の1つを右クリックし、[スケッチプロパティ]を選択します
  • 頂点の座標が一覧表示されたフライアウトが表示されます
  • 座標リストのスクリーンショットを撮ります
  • スクリーンショットをお気に入りの写真/画像エディターに貼り付けて、jpeg / png / bmpなどとして保存します
  • Google「無料オンラインOCR」結果から1つを選択します(他のものより優れているものもあります)
  • 座標のスクリーンショットのファイルをアップロードして変換します
  • 出力ファイルの種類(txt、Excelなど)を選択します
  • 一部のOCRコンバーターはゴミであるため、結果を確認してください!!!
  • ArcmapでX、Yデータを追加して、ポイントデータセットを作成します。

この方法は、小さなデータセットでは問題ありませんが、OCRコンバーターへの依存性/制限が主な関心事です。注意して使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.