Mengekstraksi koordinat titik poligon di ArcMap?

25

Saya memiliki sekitar selusin poligon dalam kelas fitur yang dimuat di ArcMap 10, semuanya dalam WGS geografis 1984.

Bagaimana saya dengan mudah mendapatkan koordinat yang terkait dengan setiap dhuwur setiap poligon dalam kelas fitur itu?

Idealnya saya ingin mereka ditabulasi dengan baik dalam format spreadsheet.

hpy
sumber

Jawaban:

12

Ini berfungsi dengan lisensi ArcGIS standar:

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
Bert H.
sumber
4

Ini adalah cara lain untuk melakukannya menggunakan 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

Menghasilkan ObjectID, X dan Y yang dapat disalin ke 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
...
BERA
sumber
Pertanyaan cepat, apa yang terjadi di bagian 'array1.getObject (0) .getObject (vertice)'?
Rex
@Rex lihat bagian bantuan untuk Array: pro.arcgis.com/en/pro-app/arcpy/classes/array.htm . Dari Array, saya mengambil masing-masing Poin / simpul
BERA
Bagus, itu membantu saya memahaminya sedikit lebih baik. Jadi mengapa ada array dalam array dan bukan hanya array poin? Apakah ada hal lain dalam array pertama? Apa yang akan diberikan array1.getObject (1)?
Rex
Itu karena Anda mendapatkan semua bagian dalam "baris [1] .getPart ()", oleh karena itu, array pertama Anda adalah bagian yang berbeda dari fitur multi bagian. Jadi Anda hanya akan memiliki sesuatu di luar array1.getObject (0) jika Anda memiliki fitur multi-bagian?
Rex
3

Coba alat geo-wizard dari teknologi Spatial. Ini memiliki beberapa alat gratis yang dapat melakukan apa yang Anda inginkan. Coba dapatkan koordinat poligon. Atau poligon ke titik

dan geo-penyihir

Brad Nesom
sumber
2

Skrip python berikut (yang membutuhkan ArcGIS 10.1 atau yang lebih baru) menggunakan arcpy.dauntuk mengambil shapefile sebagai input dan membuat spreadsheet dengan entri untuk setiap simpul di setiap poligon yang ada di .shp (dan saya percaya ini bekerja dengan lisensi arcgis level rendah) . Objek dan urutan id mengikat poin kembali ke posisi tertentu dalam poligon tertentu.

H / t ke @PaulSmith di pos ini: Dapatkan semua poin dari polyline untuk menyorot explode_to_pointsopsi dalam arcpy.da.FeatureClassToNumPyArrayalat

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)

Saya juga menulis skrip yang secara khusus membahas persyaratan: Masukkan titik koordinat dalam poligon yang ditandai sebagai duplikat untuk pertanyaan ini, kode di bawah ini:

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)
Berikan Humphries
sumber
Skrip python pertama melakukan apa yang diminta hpy! Ini bekerja sangat cepat! Terima kasih, Grant Humphries!
ArisA
1

Jadi saya belum menyelesaikan solusinya, tetapi sepertinya Anda dapat menggunakan alat ini:

Konversi> JSON> Fitur ke JSON.

Ini akan mengonversi shapefile Anda (dalam kasus saya 81 poligon) menjadi file JSON. Anda dapat membuka ini dengan editor teks untuk melihat bahwa, memang, semua simpul terdaftar untuk setiap poligon.

Selanjutnya, pustaka standar python (import json) memperlakukan objek json sebagai kamus. Anda kemudian dapat dengan mudah menelusuri kamus untuk menulis nilai vertex (dan atribut lain yang Anda inginkan) ke file csv. Jika saya mulai bekerja saya akan kembali & memposting soln.

nlb
sumber
0

Saya hanya perlu koordinat x dan y untuk Polyline dan Polygon. Saya menggunakan ToolBox -> Alat Manajemen Data -> Fitur -> Fitur untuk Point. Ini menciptakan file bentuk titik, kemudian saya menggunakan menambahkan koordinat XY dari menu Fitur yang sama untuk menghasilkan koordinat XY. Kemudian saya mengekstrak informasi dari tabel atribut bentuk ke lembar excel. Ini menyelesaikan masalah saya, tidak yakin apakah Anda mencari yang sama.

Shashikiran
sumber
Tidakkah ini hanya memberi Anda satu poin (X, Y) per polyline / poligon ketika pertanyaannya adalah meminta satu poin (X, Y) untuk setiap titik di setiap polyline / poligon?
PolyGeo
-2

Inilah solusi di masa sulit:

  • Mulai mengedit kelas fitur atau shapefile
  • Pilih fitur poligon dan klik kanan untuk 'Edit Vertices'
  • Klik kanan pada salah satu simpul dan pilih 'Sketsa Properti'
  • Sebuah fly-out akan muncul dengan koordinat dari simpul yang terdaftar
  • Ambil tangkapan layar dari daftar koordinat
  • Rekatkan tangkapan layar ke editor foto / gambar favorit Anda dan simpan sebagai jpeg / png / bmp dll
  • Google 'OCR online gratis' Pilih satu dari hasil (beberapa lebih baik daripada yang lain)
  • Unggah file tangkapan layar koordinat Anda dan konversi
  • Pilih jenis file output Anda (txt, Excel dll)
  • Periksa hasil karena beberapa konverter OCR adalah sampah !!!
  • Gunakan add X, data Y di Arcmap untuk membuat dataset titik.

Metode ini OK untuk dataset kecil tetapi ketergantungan / batasan pada konverter OCR adalah perhatian utama. Gunakan dengan hati-hati.

Mike
sumber