แยกพิกัดของจุดยอดรูปหลายเหลี่ยมใน ArcMap?


25

ฉันมีรูปหลายเหลี่ยมหลายโหลในคลาสคุณลักษณะโหลดใน ArcMap 10 ทั้งหมดใน WGS ทางภูมิศาสตร์ 1984

ฉันจะรับพิกัดที่เกี่ยวข้องกับจุดยอดแต่ละจุดของรูปหลายเหลี่ยมในชั้นเรียนคุณลักษณะนั้นได้อย่างง่ายดายได้อย่างไร

เป็นการดีที่ฉันต้องการให้พวกเขาตารางอย่างดีในรูปแบบสเปรดชีต

คำตอบ:


31

ใช้เครื่องมือจุดยอดคุณลักษณะเพื่อจุดภายใน ArcToolbox หรือหากคุณไม่มีใบอนุญาตขั้นสูงคุณสามารถใช้เครื่องมือรูปหลายเหลี่ยมเพื่อจุดจากET GeoWizard (เครื่องมือฟรี) สุดท้ายใน ArcMap ใช้เครื่องมือเพิ่มพิกัด XYเพื่อสร้างค่า XY สำหรับแต่ละจุดสุดยอดและใช้Table to Excelเพื่อสร้างสเปรดชีต


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

8

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

ผลลัพธ์ใน ObjectID, X และ Y ซึ่งสามารถคัดลอกไปยัง 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
...

คำถามด่วนสิ่งที่เกิดขึ้นที่ส่วน 'array1.getObject (0) .getObject (จุดยอด)'?
เร็กซ์

@Rex ดูส่วนความช่วยเหลือสำหรับอาร์เรย์: pro.arcgis.com/en/pro-app/arcpy/classes/array.htm จาก Array ฉันดึงข้อมูลแต่ละจุด / จุดยอด: i67.tinypic.com/34gstig.jpg
BERA

เยี่ยมมากที่ช่วยให้ฉันเข้าใจดีขึ้นเล็กน้อย เหตุใดจึงมีอาเรย์ในอาเรย์และไม่ใช่เฉพาะอาเรย์ มีอะไรอีกบ้างในอาร์เรย์แรก? array1.getObject (1) ให้อะไรคุณ
เร็กซ์

เป็นเพราะคุณได้รับชิ้นส่วนทั้งหมดใน "row [1] .getPart ()" ดังนั้นอาร์เรย์แรกของคุณจึงเป็นส่วนต่าง ๆ ของคุณสมบัติหลายส่วน ดังนั้นคุณจะมีอะไรมากกว่า array1.getObject (0) ถ้าคุณมีคุณสมบัติหลายส่วน?
เร็กซ์

3

ลองใช้เครื่องมือช่วยสร้าง geo-fron Spatial technology มันมีเครื่องมือฟรีมากมายที่สามารถทำสิ่งที่คุณต้องการ ลองรับพิกัดรูปหลายเหลี่ยม หรือรูปหลายเหลี่ยมกับคะแนน

et geo-wizards


2

สคริปต์ไพ ธ อนต่อไปนี้ (ซึ่งต้องใช้ ArcGIS 10.1 หรือใหม่กว่า) ใช้arcpy.daเพื่อสร้างรูปร่างไฟล์เป็นอินพุตและสร้างสเปรดชีตที่มีรายการสำหรับแต่ละจุดสุดยอดในแต่ละรูปหลายเหลี่ยมในแต่ละรูปหลายเหลี่ยมที่มีอยู่ใน. shp (และฉันเชื่อว่า . วัตถุและรหัสลำดับผูกจุดกลับไปที่ตำแหน่งเฉพาะในรูปหลายเหลี่ยมที่เฉพาะเจาะจง

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)

สคริปต์ python แรกทำในสิ่งที่ hpy ร้องขอ! มันทำงานได้เร็วมาก! ขอขอบคุณ Humphries!
ArisA

1

ดังนั้นฉันยังไม่ได้แก้ปัญหา แต่ดูเหมือนว่าคุณสามารถใช้เครื่องมือนี้:

การแปลง> JSON> คุณสมบัติเป็น JSON

สิ่งนี้จะแปลงรูปร่างไฟล์ของคุณ (ในกรณีของฉัน 81 รูปหลายเหลี่ยม) เป็นไฟล์ JSON คุณสามารถเปิดสิ่งนี้ได้ด้วยโปรแกรมแก้ไขข้อความเพื่อดูว่าจุดยอดทั้งหมดอยู่ในรายการรูปหลายเหลี่ยมแต่ละอัน

นอกจากนี้ไพ ธ อนไลบรารีมาตรฐาน (import json) ยังใช้กับวัตถุ json เป็นพจนานุกรม จากนั้นคุณสามารถวนรอบพจนานุกรมของคุณเพื่อเขียนค่าจุดสุดยอด (และแอตทริบิวต์อื่น ๆ ที่คุณต้องการ) ไปยังไฟล์ csv ถ้าฉันไปทำงานฉันจะกลับมา & โพสต์ซอล


0

ฉันต้องการพิกัด x และ y สำหรับ Polyline และ Polygon ฉันใช้กล่องเครื่องมือ -> เครื่องมือการจัดการข้อมูล -> คุณสมบัติ -> คุณสมบัติที่จะชี้ สิ่งนี้สร้างไฟล์รูปร่างจุดจากนั้นฉันใช้เพิ่มพิกัด XY จากเมนูคุณสมบัติเดียวกันเพื่อสร้างพิกัด XY จากนั้นฉันก็ดึงข้อมูลจากตารางคุณลักษณะรูปร่างลงในแผ่นงาน Excel วิธีนี้แก้ไขปัญหาของฉันไม่แน่ใจว่าคุณกำลังมองหาสิ่งเดียวกัน


สิ่งนี้จะไม่ให้คุณเพียงจุดเดียว (X, Y) ต่อรูปหลายเหลี่ยม / รูปหลายเหลี่ยมเมื่อคำถามถามจุดหนึ่ง (X, Y) สำหรับจุดสุดยอดแต่ละจุดในรูปหลายเหลี่ยม / รูปหลายเหลี่ยมแต่ละรูป?
PolyGeo

-2

นี่คือการแก้ไขในช่วงเวลาที่สิ้นหวัง:

  • เริ่มแก้ไขฟีเจอร์คลาสหรือ shapefile
  • เลือกคุณสมบัติรูปหลายเหลี่ยมและคลิกขวาเพื่อ 'แก้ไขจุดยอด'
  • คลิกขวาที่หนึ่งในจุดยอดและเลือก 'คุณสมบัติของร่าง'
  • การบินออกจะปรากฏขึ้นพร้อมพิกัดของจุดยอดที่ระบุไว้
  • ถ่ายภาพหน้าจอของรายการพิกัด
  • วางภาพหน้าจอลงในโปรแกรมแก้ไขภาพ / รูปภาพที่คุณชื่นชอบและบันทึกเป็น jpeg / png / bmp ฯลฯ
  • 'ฟรีออนไลน์ OCR' ของ Google เลือกหนึ่งรายการจากผลลัพธ์ (บางอันดีกว่าอย่างอื่น)
  • อัปโหลดไฟล์ภาพหน้าจอพิกัดและแปลง
  • เลือกประเภทไฟล์ที่ส่งออกของคุณ (txt, Excel ฯลฯ )
  • ตรวจสอบผลลัพธ์เนื่องจากตัวแปลง OCR บางตัวเป็นขยะ !!!
  • ใช้ข้อมูลเพิ่ม X, Y ใน Arcmap เพื่อสร้างชุดข้อมูลแบบจุด

วิธีนี้ใช้ได้สำหรับชุดข้อมูลขนาดเล็ก แต่การพึ่งพา / ข้อ จำกัด ของตัวแปลง OCR เป็นปัญหาหลัก ใช้ด้วยความระมัดระวัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.