ArcMap में बहुभुज कोने के निर्देशांक निकालना?


25

मुझे भौगोलिक WGS 1984 में ArcMap 10 में लोड एक फीचर क्लास में लगभग एक दर्जन बहुभुज मिले हैं।

मैं उस सुविधा वर्ग में प्रत्येक बहुभुज के प्रत्येक शीर्ष से जुड़े निर्देशांक आसानी से कैसे प्राप्त कर सकता हूं?

आदर्श रूप से मैं चाहूंगा कि वे स्प्रेडशीट प्रारूप में अच्छी तरह से सारणीबद्ध हों।

जवाबों:


31

ArcToolbox के भीतर पॉइंट वर्ज़न टू फ़ीचर वर्टिकल्स का उपयोग करें या यदि आपके पास उन्नत लाइसेंस नहीं है तो आप ET GeoWizard (फ्री टूल) से पॉलीगॉन टू पॉइंट टूल का उपयोग कर सकते हैं । अंत में, ArcMap में प्रत्येक शीर्ष के लिए XY मान उत्पन्न करने के लिए XY निर्देशांक उपकरण का उपयोग करें और एक स्प्रेडशीट उत्पन्न करने के लिए 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

यह एक और तरीका है इसे एक डा। खोज का उपयोग करते हुए। खोजकर्ता :

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 से मैं प्रत्येक पॉइंट / वर्टिस
BERA

महान, यह मुझे इसे थोड़ा बेहतर समझने में मदद करता है। तो क्यों एक सरणी में एक सरणी है और न केवल अंकों की एक सरणी है? क्या पहली सरणी में कुछ और है? क्या array1.getObject (1) आपको देगा?
रेक्स

ऐसा इसलिए है क्योंकि आपको "पंक्ति [1] .getPart ()" में सभी भाग मिलते हैं, इसलिए, आपका पहला सरणी एक मल्टीपार्ट सुविधा के विभिन्न भागों है। यदि आपके पास मल्टीपार्ट सुविधा है, तो आपके पास array1.getObject (0) से परे कुछ ही होगा?
रेक्स

3

भू-विज़ार्ड उपकरण फ़्रोन स्पैटियल तकनीकों का प्रयास करें। इसमें कई मुफ्त उपकरण हैं जो आप चाहते हैं कि कर सकते हैं। बहुभुज निर्देशांक प्राप्त करने का प्रयास करें। या बहुभुज से अंक तक

एट जियो-विजार्ड्स


2

निम्नलिखित पायथन लिपि (जिसके लिए आर्कगिस 10.1 या बाद के संस्करण की आवश्यकता होती है) arcpy.daएक इनपुट के रूप में एक आकृति ले जाने के लिए उपयोग करती है। .shp में मौजूद प्रत्येक बहुभुज में प्रत्येक शीर्ष के लिए एक प्रविष्टि के साथ एक स्प्रेडशीट का निर्माण करती है (और मेरा मानना ​​है कि यह निचले स्तर के आर्कगिस लाइसेंस के लिए काम करता है)। । ऑब्जेक्ट और सीक्वेंस आईडी के बिंदुओं को एक विशिष्ट बहुभुज में एक विशिष्ट स्थिति में वापस टाई है।

इस पोस्ट में H / t से @PaulSmith: टूल में विकल्प पर प्रकाश डालने के लिए एक पॉलीलाइन के सभी बिंदु प्राप्त करेंexplode_to_pointsarcpy.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)

पहले पायथन लिपि वही करती है जो हाफी ने मांगी थी! यह बहुत तेजी से काम करता है! धन्यवाद अनुदान Humphries!
अरिसा

1

इसलिए मैंने समाधान अभी तक पूरा नहीं किया है, लेकिन ऐसा लगता है कि आप इस उपकरण का उपयोग कर सकते हैं:

रूपांतरण> JSON> JSON की विशेषताएं।

यह आपकी शेपफाइल (मेरे मामले में 81 बहुभुज) को JSON फाइल में बदल देगा। आप इसे देखने के लिए एक टेक्स्ट एडिटर के साथ इसे खोल सकते हैं, वास्तव में, प्रत्येक पॉलीगॉन के लिए सभी कोने सूचीबद्ध हैं।

इसके अलावा, पायथन मानक पुस्तकालय (इंपोर्ट जोंस) जौन वस्तुओं को शब्दकोशों के रूप में मानता है। फिर आप अपने शब्दकोशों के माध्यम से एक सीएसवी फ़ाइल में शीर्ष मान (और आप चाहते हैं कि किसी भी अन्य विशेषताओं) लिखने के लिए लूप कर सकते हैं। अगर मुझे यह काम करने के लिए मिलता है तो मैं वापस आऊंगा और सोलन पोस्ट करूंगा।


0

मुझे बस पॉलिन और बहुभुज के लिए x और y सह-निर्देशांक की आवश्यकता थी। मैंने टूलबॉक्स -> डेटा प्रबंधन उपकरण -> सुविधाएँ -> फ़ीचर टू पॉइंट का उपयोग किया। इसने एक बिंदु आकार फ़ाइल बनाई, फिर मैंने XY को-ऑर्डिनेट्स बनाने के लिए समान फीचर्स मेनू से XY निर्देशांक का उपयोग किया। तब मैंने आकार विशेषता तालिका से जानकारी को एक्सेल शीट में निकाला। इससे मेरी समस्या हल हो गई, निश्चित नहीं कि आप उसी की तलाश में हैं।


क्या यह आपको केवल एक अंक (X, Y) प्रति पॉलीलाइन / बहुभुज नहीं देगा जब प्रश्न प्रत्येक पॉलीलाइन / बहुभुज में प्रत्येक शीर्ष के लिए एक बिंदु (X, Y) के लिए पूछ रहा हो?
पॉलीगियो

-2

यहाँ एक काम के आसपास हताश समय में है:

  • फीचर-क्लास या शेपफाइल का संपादन शुरू करें
  • बहुभुज सुविधा का चयन करें और 'कार्यक्षेत्र संपादित करें' पर राइट-क्लिक करें
  • किसी एक कोने पर राइट-क्लिक करें और 'स्केच गुण' चुनें
  • एक मक्खी बाहर सूचीबद्ध कोने के निर्देशांक के साथ दिखाई देगा
  • समन्वय सूची का स्क्रीन-शॉट लें
  • अपने पसंदीदा फोटो / चित्र संपादक में स्क्रीन-शॉट पेस्ट करें और एक jpeg / png / bmp आदि के रूप में सहेजें
  • Google 'नि: शुल्क ऑनलाइन OCR' परिणामों में से एक को चुनें (कुछ दूसरों की तुलना में बेहतर हैं)
  • समन्वय स्क्रीन शॉट की अपनी फ़ाइल अपलोड करें और कनवर्ट करें
  • अपना आउटपुट फ़ाइल प्रकार चुनें (txt, Excel आदि)
  • कुछ OCR कन्वर्टर्स बकवास के रूप में परिणाम की जाँच करें !!!
  • बिंदु डेटासेट बनाने के लिए Arcmap में Add X, Y डेटा का उपयोग करें।

यह विधि छोटे डेटासेट के लिए ठीक है लेकिन ओसीआर कन्वर्टर्स पर निर्भरता / सीमाएं मुख्य चिंता का विषय हैं। सावधानी से प्रयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.