Получить все точки полилинии

11

У меня есть несколько объектов полилинии в Python. Теперь я хочу получить все точки полилиний.

Например, если полилиния имеет [0,0]конечную точку начальной точки [5,5]. Результат: [1,1];[2,2];[3,3];[4,4];[5,5].

Я хочу найти все целые точки на этой линии, включая конечные точки. Для прямой это очень просто, но если полилиния имеет типы геометрии Beizer Curve, Circular Arc, Elliptic Arc, то как я могу это сделать?

РЕДАКТИРОВАТЬ:

Я могу использовать только те инструменты, которые доступны на всех уровнях лицензии ArcGIS. Например, ArcGIS Basic.

пользователь
источник
2
В общем, вы не будете часто получать хорошие «целые» баллы. Это работает в вашем примере, но не часто в реальной жизни. Обычно вы просто получаете местоположения для вершин, поэтому в вашем случае вы получите [0,0] и [5,5]. «Промежуточные» точки могут быть «допущены». Не уверен, как это сделать в python, но несколько инструментов позволят вам создать точечный файл вершин из линии.
Даррен Коуп

Ответы:

18

Я знаю, что это старый, но я искал то же самое, поскольку у меня нет ArcInfo для инструментов FeatureVerticesToPoints . После использования вышеуказанного решения для поиска курсора я пошел дальше, чтобы упростить код, и обнаружил, что с помощью массивов NumPy в модуле доступа к данным можно создать простой и очень быстрый скрипт. Я использую это как инструмент скрипта.

Примечание: ключ является explode_to_pointsпараметром вarcpy.da.FeatureClassToNumPyArray

Вот ссылка на ArcGIS Repository Location: класс объектов в точках

# 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 Paul :) +1 за хорошо округленный и лучше среднего первого взноса с кодом для загрузки. Спасибо! Некоторые советы по редактированию: выберите текст, встроенный или блок, а затем ctrl-kприменить форматирование кода (то же самое для bстарого и iталического). По соглашению мы стараемся избегать таких разговоров, как «привет», «спасибо», «ура». Они подразумеваются как присутствующие всегда, и помогают укрепить идею, что это место отличается от обычных форумов и электронной почты. Добро пожаловать на борт.
Мэтт Уилки
Вам нужно поместить заполнитель для where_clause в этой строке массива кода = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "" ,atial_reference = SR, explode_to_points = True)
Tristan Forward
4

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

Для этой задачи в ArcGIS вы можете использовать инструмент Densify (Editing) в ArcToolbox.

Затем вы можете преобразовать вершины ваших полилиний в точечные объекты, как предложили Даррен Коуп и artwork21.

Если вы предпочитаете делать это в 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")
artwork21
источник