Витяг координат багатокутних вершин в ArcMap?


25

У моєму класі, завантаженому в ArcMap 10, є близько десятка полігонів, усі в географічній WGS 1984.

Як мені легко отримати координати, пов'язані з кожною вершиною кожного багатокутника в цьому класі функцій?

В ідеалі я хотів би, щоб вони були добре розставлені у форматі електронних таблиць.

Відповіді:


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

Це ще один спосіб зробити це за допомогою 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 (vertice)'?
Рекс

@Rex див. Розділ довідки для Array: pro.arcgis.com/en/pro-app/arcpy/classes/array.htm . З масиву я отримую
BERA,

Чудово, що допомагає мені зрозуміти це трохи краще. То чому ж у масиві є масив, а не просто масив точок? Чи є ще щось у першому масиві? Що б вам дав array1.getObject (1)?
Рекс

Це тому, що ви отримуєте всі частини в "рядок [1] ​​.getPart ()", тому ваш перший масив - це різні частини багаточастинної функції. Отже, у вас було б щось поза межами array1.getObject (0), якби у вас була функція з кількома частинами?
Рекс

3

Спробуйте інструменти гео-майстра з просторових технологій. У ньому є кілька безкоштовних інструментів, які можуть робити те, що ви хочете. Спробуйте отримати координати багатокутника. Або багатокутник до точок

та гео-чарівники


2

Наступний скрипт python (для якого потрібен 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! Це працює дуже швидко! Дякую Грант Хамфрі!
ArisA

1

Тому я ще не допрацював рішення, але, схоже, ви можете використовувати цей інструмент:

Перетворення> JSON> Особливості в JSON.

Це перетворить ваш файл форми (у моєму випадку 81 полігон) у файл JSON. Ви можете відкрити це за допомогою текстового редактора, щоб побачити, що дійсно всі вершини перераховані для кожного багатокутника.

Крім того, стандартна бібліотека python (import json) розглядає об'єкти json як словники. Потім ви можете просто провести цикл через свої словники, щоб записати значення вершин (та будь-які інші атрибути, які ви хочете) у файл csv. Якщо я змушу його працювати, я повернусь та відправлю soln.


0

Мені просто потрібні координати x і y для Полілінії та Полігону. Я використовував ToolBox -> Інструменти управління даними -> Особливості -> Функція для точки. Це створило файл форми точки, тоді я використовував додавання координат XY з того самого меню функцій для створення координат XY. Потім я витягнув інформацію з таблиці атрибутів форм на аркуші excel. Це вирішило мою проблему, не впевнений, чи шукаєте ви те саме.


Хіба це не дасть вам лише одну точку (X, Y) на полілінію / багатокутник, коли питання задає одну точку (X, Y) для кожної вершини в кожному полілінії / багатокутнику?
PolyGeo

-2

Ось обхід у відчайдушні часи:

  • Почніть редагувати клас функції або файл форми
  • Виберіть функцію багатокутника та клацніть правою кнопкою миші, щоб "Редагувати вершини".
  • Клацніть правою кнопкою миші одну з вершин і виберіть "Властивості ескізу".
  • З’явиться виліт із координатами перелічених вершин
  • Зробіть знімок екрана координатного списку
  • Вставте знімок екрана в улюблений редактор фотографій / зображень і збережіть його як jpeg / png / bmp тощо
  • Google "Безкоштовний онлайн-відеомагнітофон" Виберіть один із результатів (деякі кращі за інші)
  • Завантажте свій файл знімка екрана координат та конвертуйте
  • Виберіть тип вихідного файлу (txt, Excel тощо)
  • Перевірте результати, оскільки деякі перетворювачі OCR - сміття !!!
  • Використовуйте дані X, Y в Arcmap для створення набору точок.

Цей спосіб добре для невеликих наборів даних, але основна проблема викликає залежність / обмеження перетворювачів OCR. Використовуйте обережно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.