ArcMap에서 다각형 꼭짓점의 좌표를 추출 하시겠습니까?


25

지형도 WGS 1984의 ArcMap 10에로드 된 피쳐 클래스에 약 12 ​​개의 다각형이 있습니다.

해당 피쳐 클래스에서 각 다각형의 각 꼭짓점과 관련된 좌표를 쉽게 얻는 방법은 무엇입니까?

이상적으로는 스프레드 시트 형식으로 멋지게 정리하고 싶습니다.

답변:



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

@Rex는 Array : pro.arcgis.com/en/pro-app/arcpy/classes/array.htm에 대한 도움말 섹션을 참조하십시오 . 배열에서 나는 각 포인트 / 버텍스를
BERA

좋아, 내가 좀 더 잘 이해하는 데 도움이됩니다. 그렇다면 왜 점의 배열이 아닌 배열에 배열이 있습니까? 첫 번째 배열에 다른 것이 있습니까? array1.getObject (1)는 무엇을 줄 것입니까?
Rex

"row [1] .getPart ()"의 모든 부분을 가져 오기 때문입니다. 따라서 첫 번째 배열은 다중 부분 피처의 다른 부분입니다. 따라서 multipart 기능이있는 경우 array1.getObject (0) 이외의 것만 있습니까?
Rex

3

공간 기술인 지리 마법사 도구를 사용해보십시오. 원하는 것을 할 수있는 몇 가지 무료 도구가 있습니다. 다각형 좌표를 가져옵니다. 또는 점에 다각형

지오 마법사


2

다음 python 스크립트 (ArcGIS 10.1 이상이 필요)는 arcpy.dashapefile을 입력으로 사용하고 .shp에있는 각 다각형의 각 정점에 대한 항목이있는 스프레드 시트를 작성하는 데 활용 합니다 (저는 더 낮은 수준의 arcgis 라이센스로 작동한다고 생각합니다) . 객체와 시퀀스 ID는 점을 특정 다각형의 특정 위치에 다시 연결합니다.

이 게시물에서 H / t @PaulSmith : 도구 에서 옵션 을 강조하기 위해 폴리 라인의 모든 점을 가져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)

첫 번째 파이썬 스크립트는 hpy가 요청한 것을 수행합니다! 매우 빠르게 작동합니다! 그랜트 험프리스에게 감사합니다!
ArisA

1

아직 솔루션을 완료하지 않았지만이 도구를 사용할 수있는 것처럼 보입니다.

JSON으로 변환> JSON> 기능

그러면 shapefile (내 경우에는 81 다각형)이 JSON 파일로 변환됩니다. 텍스트 편집기로 이것을 열어서 실제로 모든 정점이 각 다각형에 대해 나열되어 있는지 확인할 수 있습니다.

또한 파이썬 표준 라이브러리 (import json)는 json 객체를 사전으로 취급합니다. 그런 다음 사전을 반복하여 정점 값 (및 원하는 다른 속성)을 csv 파일에 쓸 수 있습니다. 그것이 작동하게되면 돌아와서 soln을 게시 할 것입니다.


0

폴리 라인과 폴리곤에 대한 x와 y 좌표가 필요했습니다. ToolBox-> 데이터 관리 도구-> 기능-> Feature to Point를 사용했습니다. 이것은 점 모양 파일을 만든 다음 같은 기능 메뉴에서 XY 좌표 추가를 사용하여 XY 좌표를 생성했습니다. 그런 다음 도형 속성 테이블의 정보를 Excel 시트로 추출했습니다. 이것은 내 문제를 해결했지만, 당신이 같은 것을 찾고 있는지 확실하지 않습니다.


질문이 각 폴리 라인 / 폴리곤의 각 정점에 대해 하나의 포인트 (X, Y)를 요청할 때 폴리 라인 / 폴리곤 당 하나의 포인트 (X, Y) 만 제공하지 않습니까?
PolyGeo

-2

절망적 인 시간에 해결 방법이 있습니다.

  • 피쳐 클래스 또는 쉐이프 파일 편집을 시작하십시오.
  • 다각형 피처를 선택하고 마우스 오른쪽 버튼을 클릭하여 '정점 편집'
  • 꼭짓점 중 하나를 마우스 오른쪽 버튼으로 클릭하고 '스케치 속성'을 선택하십시오.
  • 나열된 정점의 좌표와 함께 플라이 아웃이 나타납니다.
  • 좌표 목록의 스크린 샷 찍기
  • 좋아하는 사진 / 사진 편집기에 스크린 샷을 붙여넣고 jpeg / png / bmp 등으로 저장하십시오.
  • Google '무료 온라인 OCR'결과에서 하나를 선택하십시오 (일부는 다른 것보다 낫습니다)
  • 좌표 스크린 샷 파일을 업로드하고 변환
  • 출력 파일 형식 (txt, Excel 등)을 선택하십시오.
  • 일부 OCR 변환기가 쓰레기이므로 결과를 확인하십시오 !!!
  • Arcmap에서 X, Y 데이터 추가를 사용하여 점 데이터 세트를 만듭니다.

이 방법은 소규모 데이터 세트에는 적합하지만 OCR 변환기의 종속성 / 제한이 주요 관심사입니다. 주의해서 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.