Zbierz wszystkie punkty polilinii


11

Mam kilka obiektów funkcji polilinii w Pythonie. Teraz chcę zdobyć wszystkie punkty polilinii.

Na przykład, jeśli polilinia ma punkt początkowy punktu [0,0]początkowego [5,5]. Rezultat: [1,1];[2,2];[3,3];[4,4];[5,5].

Chcę znaleźć wszystkie liczby całkowite na tej linii, w tym punkty końcowe. W przypadku linii prostej jest to bardzo proste, ale jeśli polilinia ma geometrię typu Krzywa Beizera, Łuk kołowy, Łuk eliptyczny, to jak mogę to zrobić?

EDYTOWAĆ:

Mogę używać tylko tych narzędzi, które są dostępne na wszystkich poziomach licencji ArcGIS. Na przykład ArcGIS Basic.


2
Ogólnie rzecz biorąc, często nie dostajesz dobrych „liczb całkowitych”. Działa w twoim przykładzie, ale nie często w prawdziwym życiu. Zwykle dostajesz tylko lokalizacje wierzchołków, więc w twoim przypadku dostaniesz [0,0] i [5,5]. Punkty „pośrednie” można „założyć”. Nie wiem, jak to zrobić w Pythonie, ale kilka narzędzi pozwoli ci utworzyć plik punktów wierzchołków z linii.
Darren Cope

Odpowiedzi:


18

Wiem, że to stare, ale szukałem tego samego, ponieważ nie mam ArcInfo dla narzędzi FeatureVerticesToPoints . Po zastosowaniu powyższego rozwiązania dotyczącego kursora wyszukiwania poszedłem do przodu, aby uprościć kod i odkryłem, że przy użyciu tablic NumPy w module dostępu do danych można stworzyć prosty i bardzo szybki skrypt. Używam tego jako narzędzia skryptowego.

Uwaga: Kluczem jest explode_to_pointsparametr warcpy.da.FeatureClassToNumPyArray

Oto link do lokalizacji repozytorium ArcGIS: Klasa elementu do punktów

# 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)

Witamy na GIS.se Paul :) +1 za dobrze zaokrąglony i lepszy niż średnio pierwszy wkład, z kodem do uruchomienia. Dzięki! Kilka wskazówek dotyczących edycji: wybierz tekst, wstawkę lub blok, a następnie ctrl-kzastosuj formatowanie kodu (to samo dla bstarego i italic). Zgodnie z konwencją unikamy gadatliwych słów, takich jak „cześć”, „dzięki”, „na zdrowie”. Sugeruje się, że są one zawsze obecne i pomagają wzmocnić ideę, że to miejsce różni się od zwykłych forów i wiadomości e-mail. Witamy na pokładzie.
matt wilkie

Musisz umieścić symbol zastępczy dla klauzuli where w tym wierszu tablicy kodów = arcpy.da.FeatureClassToNumPyArray (InFc, [„SHAPE @ XY”], „”, spatial_reference = SR, explode_to_points = True)
Tristan Forward

4

Jak zrozumiałem, musisz zwiększyć liczbę wierzchołków dla swoich funkcji polilinii. A także przekształcenie wszystkich segmentów „Krzywa Beizera, Łuk kołowy, Łuk eliptyczny” w kilka segmentów liniowych.

Do tego zadania w ArcGIS można użyć narzędzia Densify (edycja) w ArcToolbox.

Następnie możesz przekonwertować wierzchołki polilinii na obiekty punktowe, jak sugerował Darren Cope i grafika21.

Jeśli wolisz to zrobić w ArcMap, zapoznaj się z tematem Tworzenie nowych punktów wzdłuż tematu pomocy linii .


3

Następujące elementy powinny działać na poliliniach i wielokątach:

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

W przypadku niektórych danych o drogach w Wielkiej Brytanii mam to; zagnieżdżona lista par X, Y dla każdego wierzchołka tworzącego polilinię:

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]]

Widziałem to na stronie ESRI. Ale jeśli dokładnie przyjrzysz się ich opisowi, ten kod zwraca tylko punkty końcowe, a nie punkty między nimi
użytkownik

2
@crucifiedsoul - Tak, jest to odmiana tej próbki ESRI , ale daje parę X, Y wszystkich punktów, a nie tylko punktów końcowych. Właśnie tego chcesz, prawda?
Chad Cooper

Nie rozumiem Jedyną rzeczą jest zmiana wymieniasz print pnt.X, pnt.Yz part_list.append([pnt.X, pnt.Y]). I drukujesz to na końcu pętli. W jaki sposób kod może uzyskać wszystkie punkty linii, ale kod ESRI nie?
użytkownik

Metoda opisu nie działała dla mnie. Musiałem tylko określić moje pole kształtu - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk

1

Jak zasugerował Darren Cope, konwersję warstwy na wierzchołki punktów można wykonać za pomocą narzędzia Operacje wierzchołków na punkty .

Oto fragment kodu 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")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.