Извлечение координат вершин многоугольника в ArcMap?

25

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

Как мне легко получить координаты, связанные с каждой вершиной каждого многоугольника в этом классе пространственных объектов?

В идеале я хотел бы, чтобы они были хорошо табулированы в формате электронных таблиц.

HPY
источник

Ответы:

31

Используйте инструмент Вершины объектов в точках в ArcToolbox или, если у вас нет лицензии Advanced, вы можете использовать инструмент Polygon to Point из ET GeoWizard (бесплатный инструмент). Наконец, в ArcMap используйте инструмент Add XY Coordinates , чтобы сгенерировать значение XY для каждой вершины, и используйте Table to Excel, чтобы сгенерировать электронную таблицу.

artwork21
источник
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

Существует пример набора инструментов, который включает в себя скрипт Python Write Features To Text File, который:

Записывает координаты объекта в текстовый файл.

Примечание :

Технически, инструменты в наборе инструментов Samples устарели. Они по-прежнему устанавливаются вместе с ArcGIS, поэтому все существующие инструменты сценариев или моделей, разработанные до 10, продолжают работать.

Ян
источник
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
...
BERA
источник
Быстрый вопрос, что происходит в части 'array1.getObject (0) .getObject (vertice)'?
Рекс
@Rex см. Раздел справки для Array: pro.arcgis.com/en/pro-app/arcpy/classes/array.htm . Из массива я выборка каждой точки / Vertice: i67.tinypic.com/34gstig.jpg
Бер
Отлично, это помогает мне понять это немного лучше. Так почему же в массиве есть массив, а не просто массив точек? Есть ли что-нибудь еще в первом массиве? Что даст вам array1.getObject (1)?
Рекс
Это потому, что вы получаете все части в «row [1] .getPart ()», поэтому ваш первый массив - это разные части многокомпонентного объекта. Таким образом, у вас есть что-то, кроме array1.getObject (0), если у вас есть многокомпонентная функция?
Рекс
3

Попробуйте инструменты гео-мастера из пространственных технологий. Он имеет несколько бесплатных инструментов, которые могут делать то, что вы хотите. Попробуйте получить координаты многоугольника. Или полигон в точках

и гео-волшебники

Брэд Несом
источник
2

Следующий скрипт Python (для которого требуется ArcGIS 10.1 или более поздняя версия) использует arcpy.daдля получения шейп-файла в качестве входных данных и создания электронной таблицы с записью для каждой вершины в каждом многоугольнике, присутствующем в .shp (и я считаю, что он работает с лицензиями Arcgis более низкого уровня) , Идентификаторы объекта и последовательности связывают точки с определенной позицией в определенном многоугольнике.

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.

NLB
источник
0

Мне просто нужны координаты x и y для полилинии и многоугольника. Я использовал ToolBox -> Инструменты управления данными -> Функции -> Feature to Point. Это создало файл формы точки, затем я использовал добавить координаты XY из того же меню «Функции» для генерации координат XY. Затем я извлек информацию из таблицы атрибутов фигур в таблицу Excel. Это решило мою проблему, не уверен, если вы ищете то же самое.

Shashikiran
источник
Разве это не даст вам только одну точку (X, Y) на полилинию / многоугольник, когда вопрос задает одну точку (X, Y) для каждой вершины в каждой полилинии / многоугольнике?
PolyGeo
-2

Вот обходной путь в отчаянные времена:

  • Начать редактирование класса объектов или шейп-файла
  • Выберите объект многоугольника и щелкните правой кнопкой мыши «Изменить вершины».
  • Щелкните правой кнопкой мыши одну из вершин и выберите «Свойства эскиза».
  • Появится всплывающее окно с указанием координат вершин
  • Сделайте скриншот списка координат
  • Вставьте снимок экрана в ваш любимый редактор фотографий и изображений и сохраните его в формате JPEG / PNG / BMP и т. Д.
  • Google 'Free OCR' Выберите один из результатов (некоторые лучше, чем другие)
  • Загрузите свой файл координат снимка экрана и конвертируйте
  • Выберите тип выходного файла (TXT, Excel и т. Д.)
  • Проверьте результаты, так как некоторые конвертеры OCR являются мусором !!!
  • Используйте данные X, Y в Arcmap для создания набора точечных данных.

Этот метод подходит для небольших наборов данных, но основная проблема заключается в зависимости / ограничениях преобразователей OCR. Используйте с осторожностью.

Майк
источник