Видобуток кількості вершин у кожному багатокутнику?


14

У мене є ArcGIS Desktop 10.2, і моє завдання полягає в тому, як витягти вершини числа в кожному багатокутнику для всіх таких функцій:

введіть тут опис зображення

введіть тут опис зображення

введіть тут опис зображення

У моєму класі функцій є багато посилок, і я хочу отримати окрему кількість вершин для всіх функцій окремо, тоді я хочу відобразити координати XY для всіх вершин.

для отримання додаткової інформації я просто хочу перетворити вершини для кожного багатокутника і відобразити номер кожної вершини, починаючи з 1 числа, тому, якщо у мене є багатокутник, і він має 4 вершини, хочу перетворити багатокутник у вершини, я покажу кількість вершин, як це (1,2,3,4,5), то відображаючи xy для кожної вершини, я думаю, що справжній ідентифікатор виклику, як перетворити весь многокутник у вершини і зробити кожне число вершин, починаючи з 1 числа.


Виходячи з редагування, чи хочете, щоб кожна функція мала унікальний ідентифікатор (1 .... n) для функції та координати XY? Ви б хотіли, щоб один стовпчик / поле містило всю цю інформацію для цілей маркування, наприклад [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Аарон

так, якщо не помилка, один поданий має ідентифікатор для кількості вершин кожного багатокутника (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9) тощо, то я думаю про xy може бути просто, якщо ми зателефонуємо додати інструмент xy з arctoolbox
GIS Man

Відповіді:


5

Код нижче поєднує інші відповіді та додає трохи нумерації вершин. результати

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

Окуляри позначаються у порядку чертежу. Остання точка (під першою) не матиме мітки і її можна буде видалити, вибравши всі точки, які мають нульові або унікальні значення "DRAW_ORDER", якщо не потрібні для реконструкції. Запит на визначення може бути використаний для видалення точок, що перекриваються, з відображення.

Дані XY є, але я залишу це на вашому маркуванні / відображенні бажань. Дивіться відповідь Аарона про додавання поля XY для маркування.

Я також грав з FeatureClass для нумерування масиву, але я закінчив це першим.


дякую @ gm70560, я стежив за вашими змінними коду і зберігаю його як .py, але коли я хочу його виконати, з'являється повідомлення про помилку: "Вказана назва поля не існує в таблиці", тож що я можу зробити ?
GIS Man

ось екран друку з мого ПК, я просто встановив цільовий шлях до класу функцій та шлях для виведення нового класу функцій у вашому коді, якщо ви можете зробити керівництво щодо використання свого коду, imageshack.com/i/ fvsozep
GIS Man

Це поле не додало (?). Що сталося далі в результатах? У мене є чат, щоб скинути всі результати. Залиште коментар, щоб я міг перевірити номер.
gm70560

22

Найпростіший спосіб зробити це - додати нове ціле поле до таблиці атрибутів шару посилок. Потім запустіть калькулятор поля із таким виразом:

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCountПовертає загальне число вершин у цій функції. Однак перша вершина кожної частини повторюється в кінці, щоб закрити функцію. Щоб вирішити це, віднімайте одну вершину для кожної частини, використовуючи -!Shape!.partCount.

Зауважте, що для роботи цього виразу вам доведеться використовувати аналізатор Python.

Польовий калькулятор


це дійсно круто, але не надасть XY для кожної з цих вершин. Здається, що відповідь буде використовувати обидва відповіді (тобто також @ Аарона), щоб отримати всю запитувану інформацію.
Roland

@Roland Ви маєте рацію ... Я пропустив частину питання про вершини XY. У такому випадку вам доведеться використовувати SearchCursorметод у відповіді Аарона або такий інструмент для геообробки, як Feature Vertices To Points (хоча для цього інструменту потрібна ліцензія ArcGIS for Desktop Advanced).
dmahr

велике спасибо , 4,5 на кожну вершину, не рахуючи всіх вершин в одному номері, справжній виклик, як відобразити номер для кожної вершини, починаючи з 1 числа для кожної посилки.
GIS Man

12

dmahr забезпечив хороше рішення для підрахунку вершин. Для непрограмного способу позначення кожної точки за допомогою координат XY спробуйте виконати наступний робочий процес:

  1. Позначте вершини точкам
  2. Додайте два нові поля (тип: подвійний) у новій точці FC "X", "Y"
  3. Обчисліть геометрію. Клацніть правою кнопкою миші поле> Обчислити геометрію ...> X Координат точки (повторити для поля Y)
  4. Додати ще одне поле "XY" (тип: Текст)
  5. Обчисліть поле "XY" у польовому калькуляторі, де XY =

    str (! x!) + "," + str (! y!)

  6. Особливості мітки. Клацніть шар правою кнопкою миші> Мітки> Поле мітки: XY

Це дає такі результати:

введіть тут опис зображення

Ви також можете виконати ці дії з допомогою програмно explode_to_pointsза допомогою пошуку курсора (як початок).

Деконструюйте функцію на її окремі точки або вершини. Якщо для параметра explode_to_points встановлено значення True, багатофункціональна функція з п'ятьма точками, наприклад, представлена ​​п'ятьма рядками.

(Значення за замовчуванням - хибне)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

Мабуть, знадобиться який-небудь процес обробки або скористатися відповіддю @ dmahr, щоб отримати підсумкове підсумкове число вершин.
Roland

4

Якщо ви не хочете обчислювати нове поле і просто хочете дуже швидко повернути кількість вершин на шар назад (для цілей узагальнення, наприклад, під час викриття наборів даних в Інтернеті), то можна створити спеціальний інструмент сценарію всередині панель інструментів або виставити код як надбудову Python.

Спеціальний код інструмента сценарію:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Код надбудови Python (виберіть шар у TOC для підрахунку вершин):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.