Trích xuất tọa độ của các đỉnh đa giác trong ArcMap?


25

Tôi đã có khoảng một tá đa giác trong một lớp tính năng được tải trong ArcMap 10, tất cả trong WGS 1984 theo địa lý.

Làm cách nào để tôi dễ dàng có được các tọa độ được liên kết với từng đỉnh của mỗi đa giác trong lớp đối tượng đó?

Lý tưởng nhất là tôi muốn chúng được lập bảng độc đáo ở định dạng bảng tính.

Câu trả lời:



12

Điều này hoạt động với giấy phép ArcGIS tiêu chuẩn:

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

Đây là một cách khác để làm điều đó bằng cách sử dụng da.SearchCoder :

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

Kết quả là ObjectID, X và Y có thể được sao chép sang 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
...

Câu hỏi nhanh, điều gì đang xảy ra ở phần 'mảng1.getObject (0) .getObject (đỉnh)'?
Rex

@Rex xem phần trợ giúp cho Mảng: pro.arcgis.com/en/pro-app/arcpy/groupes/array.htmlm . Từ Mảng tôi tìm nạp từng Điểm / đỉnh
BERA

Tuyệt vời, điều đó giúp tôi hiểu nó tốt hơn một chút. Vậy tại sao có một mảng trong một mảng chứ không chỉ là một mảng các điểm? Có bất cứ điều gì khác trong mảng đầu tiên? Mảng1.getObject (1) sẽ cung cấp cho bạn những gì?
Rex

Đó là bởi vì bạn nhận được tất cả các phần trong "hàng [1] .getPart ()", do đó, mảng đầu tiên của bạn là các phần khác nhau của tính năng nhiều phần. Vì vậy, bạn sẽ chỉ có một cái gì đó ngoài mảng1.getObject (0) nếu bạn có một tính năng nhiều phần?
Rex

3

Hãy thử các công cụ thuật sĩ địa lý từ các công nghệ không gian. Nó có một số công cụ miễn phí có thể làm những gì bạn muốn. Hãy thử tọa độ đa giác. Hoặc đa giác cho điểm

et thuật sĩ địa lý


2

Tập lệnh python sau (yêu cầu ArcGIS 10.1 trở lên) sử dụng arcpy.dađể lấy shapefile làm đầu vào và tạo bảng tính với một mục nhập cho mỗi đỉnh trong mỗi đa giác có trong .shp (và tôi tin rằng nó hoạt động với giấy phép arcgis cấp thấp hơn) . Id của đối tượng và chuỗi liên kết các điểm trở lại một vị trí cụ thể trong một đa giác cụ thể.

H / t đến @PaulSmith trong bài đăng này: Nhận tất cả các điểm của một đa tuyến để làm nổi bật explode_to_pointstùy chọn trong arcpy.da.FeatureClassToNumPyArraycông cụ

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)

Tôi cũng đã viết một tập lệnh giải quyết cụ thể các yêu cầu của: Chèn tọa độ đỉnh trong đa giác được đánh dấu là trùng lặp với câu hỏi này, đoạn mã dưới đây:

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)

Kịch bản python đầu tiên làm những gì hpy yêu cầu! Nó hoạt động rất nhanh! Cảm ơn Grant Humphries!
ArisA

1

Vì vậy, tôi chưa hoàn thành giải pháp, nhưng có vẻ như bạn có thể sử dụng công cụ này:

Chuyển đổi> JSON> Các tính năng thành JSON.

Điều này sẽ chuyển đổi shapefile của bạn (trong trường hợp của tôi là 81 đa giác) thành tệp JSON. Bạn có thể mở cái này bằng một trình soạn thảo văn bản để thấy rằng, thực sự, tất cả các đỉnh được liệt kê cho mỗi đa giác.

Hơn nữa, thư viện chuẩn python (import json) coi các đối tượng json là từ điển. Sau đó, bạn có thể chỉ cần lặp qua các từ điển của mình để ghi các giá trị đỉnh (và bất kỳ thuộc tính nào khác bạn muốn) vào tệp csv. Nếu tôi làm cho nó hoạt động, tôi sẽ quay lại và đăng bài.


0

Tôi chỉ cần tọa độ x và y cho Đa tuyến và Đa giác. Tôi đã sử dụng ToolBox -> Công cụ quản lý dữ liệu -> Tính năng -> Tính năng cho điểm. Điều này tạo ra một tệp hình dạng điểm, sau đó tôi đã sử dụng thêm tọa độ XY từ cùng một menu Tính năng để tạo tọa độ XY. Sau đó, tôi trích xuất thông tin từ bảng thuộc tính hình dạng vào một bảng excel. Điều này đã giải quyết vấn đề của tôi, không chắc chắn nếu bạn đang tìm kiếm tương tự.


Điều này sẽ không chỉ cung cấp cho bạn một điểm (X, Y) cho mỗi đa giác / đa giác khi câu hỏi yêu cầu một điểm (X, Y) cho mỗi đỉnh trong mỗi đa giác / đa giác?
PolyGeo

-2

Đây là một công việc trong thời gian tuyệt vọng:

  • Bắt đầu chỉnh sửa lớp tính năng hoặc shapefile
  • Chọn tính năng đa giác và nhấp chuột phải vào 'Chỉnh sửa Vertice'
  • Nhấp chuột phải vào một trong các đỉnh và chọn 'Thuộc tính phác thảo'
  • Một đường bay sẽ xuất hiện với tọa độ của các đỉnh được liệt kê
  • Chụp ảnh màn hình danh sách tọa độ
  • Dán ảnh chụp màn hình vào trình chỉnh sửa ảnh / ảnh yêu thích của bạn và lưu dưới dạng jpeg / png / bmp, v.v.
  • Google 'OCR trực tuyến miễn phí' Chọn một trong số các kết quả (một số tốt hơn các kết quả khác)
  • Tải lên tệp của bạn về ảnh chụp màn hình tọa độ và chuyển đổi
  • Chọn loại tệp đầu ra của bạn (txt, Excel, v.v.)
  • Kiểm tra kết quả vì một số bộ chuyển đổi OCR là rác !!!
  • Sử dụng dữ liệu thêm X, Y trong Arcmap để tạo bộ dữ liệu điểm.

Phương pháp này phù hợp với các bộ dữ liệu nhỏ nhưng sự phụ thuộc / giới hạn đối với các bộ chuyển đổi OCR là mối quan tâm chính. Sử dụng cẩn thận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.