Отримайте всі точки полілінії


11

У мене є кілька об'єктів полілінійної функції в python. Тепер я хочу отримати всі точки поліліній.

Наприклад, якщо полілінія має [0,0]кінцеву точку початку [5,5]. Результат: [1,1];[2,2];[3,3];[4,4];[5,5].

Я хочу знайти всі цілі точки на цьому рядку, включаючи кінцеві точки. Для прямої лінії це мертве просто, але якщо в полілінії є типи геометрії кривої Бейзера, кругової дуги, еліптичної дуги, то як я можу це зробити?

Редагувати:

Я можу використовувати лише ті інструменти, які доступні на всіх рівнях ліцензій ArcGIS. Наприклад, ArcGIS Basic.


2
Взагалі ви не часто отримуєте приємні «цілі» точки. Це працює у вашому прикладі, але не часто в реальному житті. Зазвичай ви просто отримуєте місця для вершин, тож у вашому випадку ви отримаєте [0,0] та [5,5]. "Проміжні" точки можна "припустити". Не знаєте, як це зробити в python, але кілька інструментів дозволять вам створити точковий файл вершин з рядка.
Даррен Коуп

Відповіді:


18

Я знаю, що це старе, але я шукав те саме, що у мене немає ArcInfo для інструментів FeatureVerticesToPoints . Після використання рішення курсору пошуку я пішов вперед, щоб спростити код і виявив, що за допомогою NumPy масивів у модулі доступу до даних може бути створений простий і дуже швидкий сценарій. Я використовую це як інструмент сценарію.

Примітка. Ключ - explode_to_pointsпараметр вarcpy.da.FeatureClassToNumPyArray

Тут посилання на розташування сховища ArcGIS: Клас Feature to Points

# Feature Class to Points
# 
# Paul Smith (2012) paul@neoncs.com.au

# Imports
import arcpy
import numpy

#Inputs from user parameters
InFc  = arcpy.GetParameterAsText(0) # input feature class
OutFc = arcpy.GetParameterAsText(1) # output feature class

# Spatial reference of input feature class
SR = arcpy.Describe(InFc).spatialReference

# Create NumPy array from input feature class
array = arcpy.da.FeatureClassToNumPyArray(InFc,["SHAPE@XY"], spatial_reference=SR, explode_to_points=True)

# Check array and Exit if no features found
if array.size == 0:
    arcpy.AddError(InFc + " has no features.")

# Create a new points feature class
else:
    arcpy.da.NumPyArrayToFeatureClass(array, OutFc, ['SHAPE@XY'], SR)

Ласкаво просимо на GIS.se Пол :) +1 за добре округлений та кращий за середній перший внесок, з кодом для завантаження. Дякую! Деякі поради щодо редагування: виберіть текст, вбудований текст або блок, а потім ctrl-kзастосуйте форматування коду (те саме для bстарого та iталічного тексту). За умовами ми, як правило, уникаємо балакучих бітів, таких як "привіт", "дякую", "ура". Вони маються на увазі як завжди присутні, і допомагають підкріпити ідею, що це місце відрізняється від звичайних форумів та електронних листів. Ласкаво просимо на борт.
matt wilkie

У цьому рядку кодового масиву = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", space_reference = SR, explode_to_points = True)
Tristan Forward

4

Як я зрозумів, вам потрібно збільшити кількість вершин для своїх полілінійних особливостей. А також перетворити всі сегменти "Крива Бейзера, кругова дуга, еліптична дуга" на кілька лінійних сегментів.

Для цього завдання в ArcGIS можна використовувати інструмент Densify (Редагування) в ArcToolbox.

Тоді ви можете конвертувати вершини ваших поліліній у точкові функції, як було запропоновано Дарреном Коупом та ілюстрацією21.

Якщо ви віддаєте перевагу робити це в ArcMap, подивіться на Створення нових точок уздовж рядка довідкової теми.


3

На полілініях та полігонах слід працювати:

import arcpy

infc = r"D:\Projects\GDBs\slowbutter.gdb\fc"

desc = arcpy.Describe(infc)
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor(infc)
for row in rows:
    # Create the geometry object
    feat = row.getValue(shapefieldname)
    print "Feature %i: " % row.getValue(desc.OIDFieldName)
    partnum = 0
    # Step through each part of the feature
    for part in feat:
        print "Part %i: " % partnum
        part_list = []
        for pnt in feat.getPart(partnum):
            if pnt:
                # Add to list
                part_list.append([pnt.X, pnt.Y])
            else:
                # If pnt is None, this represents an interior ring
                print "Interior Ring:"
        partnum += 1  
        print part_list

Для деяких даних про дороги Великобританії я отримую це; вкладений список пар X, Y для кожної вершини, що складається з полілінії:

Feature 7: 
Part 0: 
[[-0.48053999999996222, 51.482510000000048], [-0.48032999999992398, 
51.482609000000082], [-0.48026999999996178, 51.48273800000004], 
[-0.48043999999993048, 51.482891000000052], [-0.48065999999994347, 51.482948000000079],
[-0.48123999999995704, 51.483009000000038]]

Я бачив це на сторінці ESRI. Але якщо уважно вивчити їх опис, цей код повертає лише кінцеві точки, а не точки між ними
користувач

2
@crucifiedsoul - Так, це варіант цього зразка ESRI , але він дає пару X, Y всіх точок, а не лише кінцевих точок. Це те, що ти хочеш, правильно?
Чад Купер

Я не розумію. Єдине , що змінюється ви замінюєте print pnt.X, pnt.Yз part_list.append([pnt.X, pnt.Y]). І ви це друкуєте в кінці циклу. Як ваш код може отримати всі точки рядка, але код ESRI - ні?
користувач

Метод опису для мене не працював. Мені довелося просто вказати моє поле форми - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk

1

Як запропонував Даррен Коуп, перетворення шару в точкові вершини може бути здійснено за допомогою інструмента « Вершини функції» в «Точки ».

Ось фрагмент коду python:

# import system modules 
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inFeatures = "majorrds.shp"
outFeatureClass = "c:/output/output.gdb/majorrds_midpt"

# Execute FeatureVerticesToPoints
arcpy.FeatureVerticesToPoints_management(inFeatures, outFeatureClass, "MID")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.