Çokgen köşelerinin koordinatlarının ArcMap?


25

Tüm coğrafi WGS 1984'te ArcMap 10'da yüklenen bir özellik sınıfında bir düzine poligon var.

Bu özellik sınıfındaki her çokgenin her bir tepe noktasıyla ilişkili koordinatları kolayca nasıl alabilirim?

İdeal olarak, elektronik tablo biçiminde güzel bir şekilde tablolaştırılmasını istiyorum.

Yanıtlar:



12

Bu, standart bir ArcGIS lisansı ile çalışır:

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

Bu da.SearchCursor kullanarak yapmak için başka bir yoldur :

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'e kopyalanabilen ObjectID, X ve Y ile sonuçlanan:

...
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
...

Hızlı soru, 'array1.getObject (0) .getObject (vertice)' bölümünde neler oluyor?
Rex,

@Rex, Array için yardım bölümüne bakın: pro.arcgis.com/en/pro-app/arcpy/classes/array.htm . Diziden her Noktayı / vertice'yi getiriyorum
BERA

Harika, bu biraz daha iyi anlamama yardımcı oluyor. Peki neden bir dizide bir dizi var, sadece bir dizi nokta değil? İlk dizide başka bir şey var mı? Array1.getObject (1) size ne verecekti?
Rex,

Bunun nedeni tüm parçaları "row [1] .getPart ()" de almanızdır, bu nedenle, ilk diziniz çok parçalı özelliğin farklı parçalarıdır. Yani eğer multipart özelliği olsaydı sadece array1.getObject (0) 'ın ötesinde bir şey olurdu?
Rex,

3

Mekansal teknolojilerden gelen jeo-sihirbaz araçlarını deneyin. İstediğinizi yapabilen birkaç ücretsiz araca sahiptir. Get polygon koordinatlarını dene. Veya noktalara çokgen

ve coğrafi sihirbazlar


2

Aşağıdaki python betiği (ArcGIS 10.1 veya daha yenisini gerektirir) kullanır arcpy.da girdi olarak bir şekil dosyası almak ve .shp'ta bulunan her poligondaki her köşe için bir giriş içeren bir elektronik tablo oluşturmak için kullanılır (ve bunun daha düşük seviyeli arcgis lisanslarıyla çalıştığına inanıyorum) . Nesne ve dizi kimliği, noktaları belirli bir çokgende belirli bir konuma geri bağlar.

H / ton'a @PaulSmith bu yazı: çoklu çizgi tüm noktalarını alın vurgulamak için explode_to_pointsseçeneği arcpy.da.FeatureClassToNumPyArrayaracı

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)

Ayrıca, özellikle aşağıdakilerin gereksinimlerini karşılayan bir komut dosyası yazdım: Bu soruna kopya olarak işaretlenen çokgene sahip köşe koordinatlarını ekleyin , bu kod aşağıdadır:

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)

İlk python betiği, hpy'nin istediğini yapar! Çok hızlı çalışıyor! Teşekkürler Grant Humphries!
ArisA

1

Bu yüzden çözümü henüz tamamlamadım, ancak bu aracı kullanabileceksiniz gibi görünüyor:

Dönüşüm> JSON> JSON'a Özellikler.

Bu, şekil dosyalarınızı (benim durumumda 81 poligon) bir JSON dosyasına dönüştürecektir. Bunu, aslında her köşenin tüm köşelerin listelendiğini görmek için bir metin düzenleyicisiyle açabilirsiniz.

Ayrıca, python standart kütüphanesi (import json), json nesnelerine sözlükler gibi davranır. Daha sonra, köşe değerlerini (ve istediğiniz diğer özellikleri) bir csv dosyasına yazmak için sözlüklerinizde kolayca dolaşabilirsiniz. İşe yararsa, geri geleceğim ve yazıyı göndereceğim.


0

Sadece Polyline ve Polygon için x ve y koordinatlarına ihtiyacım vardı. Araç Kutusu'nu -> Veri Yönetimi araçlarını -> Özellikler -> Noktadan Noktaya özelliği kullandım. Bu bir nokta şekli dosyası oluşturdu, sonra aynı Özellikler menüsünden XY koordinatlarını oluşturmak için XY koordinatlarını kullandım. Sonra şekiller öznitelik tablosundaki bilgiyi bir excel sayfasına aldım. Bu benim sorunumu çözdü, aynı şeyi aradığınızdan emin değilim.


Bu soru, her bir çoklu çizgi / poligondaki her tepe noktası için bir nokta (X, Y) istediğinde, her çoklu çizgide / poligonda size yalnızca bir puan (X, Y) vermez mi?
PolyGeo

-2

İşte çaresiz zamanlarda bir uğraş:

  • Özellik sınıfını veya şekil dosyasını düzenlemeye başlayın
  • Çokgen özelliğini seçin ve 'Vertices Düzenle' için sağ tıklayın
  • Köşelerden birine sağ tıklayın ve 'Çizim Özellikleri'ni seçin
  • Listelenen köşelerin koordinatlarıyla bir uçuş simgesi görünecektir
  • Koordinat listesinin ekran görüntüsünü alın
  • Ekran görüntüsünü favori fotoğraf / resim düzenleyicinize yapıştırın ve bir jpeg / png / bmp etc olarak kaydedin
  • Google 'Ücretsiz çevrimiçi OCR' Sonuçlardan birini seçin (bazıları diğerlerinden daha iyidir)
  • Koordinat ekran görüntüsünü dosyanızı yükleyin ve dönüştürün
  • Çıktı dosya türünüzü seçin (txt, Excel etc)
  • Bazı OCR dönüştürücülerinin çöp olduğu gibi sonuçları kontrol edin !!!
  • Nokta veri kümesi oluşturmak için Arcmap'te X, Y verilerini kullanın.

Bu yöntem küçük veri kümeleri için tamamdır, ancak OCR dönüştürücülere bağımlılık / sınırlamalar asıl meseledir. Dikkatle kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.