Consigue todos los puntos de una polilínea

11

Tengo algunos objetos de características de polilínea en python. Ahora quiero obtener todos los puntos de las polilíneas.

Por ejemplo, si una polilínea tiene un punto de inicio y un punto [0,0]final [5,5]. Resultado: [1,1];[2,2];[3,3];[4,4];[5,5].

Quiero encontrar todos los puntos enteros en esa línea, incluidos los puntos finales. Para la línea recta, esto es muy simple, pero si la polilínea tiene tipos de geometría Beizer Curve, Circular Arc, Elliptic Arc, ¿cómo puedo hacerlo?

EDITAR:

Solo puedo usar esas herramientas que están disponibles en todos los niveles de licencia de ArcGIS. Por ejemplo, ArcGIS Basic.

usuario
fuente
2
En general, a menudo no obtendrá buenos puntos 'enteros'. Funciona en tu ejemplo, pero no con frecuencia en la vida real. Por lo general, solo obtienes ubicaciones para vértices, por lo que en tu caso obtendrías [0,0] y [5,5]. Los puntos 'intermedios' pueden ser 'asumidos'. No estoy seguro de cómo hacer esto en Python, pero varias herramientas le permitirán crear un archivo de puntos de vértices a partir de una línea.
Darren Cope

Respuestas:

18

Sé que esto es antiguo, pero estaba buscando lo mismo, ya que no tengo ArcInfo para las herramientas FeatureVerticesToPoints . Después de usar la solución de cursor de búsqueda anterior, avancé para simplificar el código y descubrí que usando NumPy Arrays en el Módulo de acceso a datos se podía producir un script simple y muy rápido. Estoy usando esto como una herramienta de script.

Nota: La clave es el explode_to_pointsparámetro enarcpy.da.FeatureClassToNumPyArray

Aquí hay un enlace a la Ubicación del repositorio de ArcGIS: Clase de entidad a puntos

# Feature Class to Points
# 
# Paul Smith (2012) [email protected]

# 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)
Paul Smith
fuente
Bienvenido a GIS.se Paul :) +1 para una primera contribución bien redondeada y mejor que la media, con código para arrancar. ¡Gracias! Algunos consejos de edición: seleccione texto, en línea o un bloque, y luego ctrl-kaplique el formato de código (lo mismo para bantiguo y italico). Por convención, tendemos a evitar partes parlanchinas como "hola", "gracias", "aplausos". Se supone que están siempre presentes y ayudan a reforzar la idea de que este lugar es diferente de los foros y correos electrónicos habituales. Bienvenido a bordo.
Matt Wilkie
Debe colocar un marcador de posición para la cláusula where_ en esta línea del código array = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", spaceial_reference = SR, explode_to_points = True)
Tristan Forward
4

Como entendí, necesita aumentar el número de vértices para sus entidades de polilínea. Y también para transformar todos los segmentos de "Curva de Beizer, Arco circular, Arco elíptico" en varios segmentos de línea.

Para esta tarea en ArcGIS, puede usar la herramienta Densificar (Edición) en ArcToolbox.

Luego, puede convertir los vértices de sus polilíneas en entidades de puntos como se sugiere Darren Cope y el material gráfico21.

Si prefiere hacerlo en ArcMap, eche un vistazo a Crear nuevos puntos a lo largo de un tema de ayuda lineal .

Alex Markov
fuente
3

Lo siguiente debería funcionar en polilíneas y polígonos:

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

Para algunos datos de carreteras del Reino Unido, entiendo esto; Una lista anidada de pares X, Y para cada vértice que forma la polilínea:

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]]
Chad Cooper
fuente
He visto esto en la página de ESRI. Pero si observa detenidamente su descripción, este código solo devuelve los puntos finales, no los puntos entre ellos
usuario
2
@crucifiedsoul: Sí, esta es una variación de esa muestra de ESRI , pero proporciona el par X, Y de todos los puntos, no solo los puntos finales. Eso es lo que quieres, ¿correcto?
Chad Cooper
No lo entiendo Lo único que está cambiando va a reemplazar print pnt.X, pnt.Ycon part_list.append([pnt.X, pnt.Y]). Y está imprimiendo esto al final del ciclo. ¿Cómo puede su código obtener todos los puntos de una línea pero el código ESRI no?
usuario
El método de describir no funcionó para mí. Solo tenía que especificar mi campo de forma - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk
1

Como ha sugerido Darren Cope, la conversión de la capa en vértices de un punto se puede hacer con la herramienta Vertices de entidad en puntos .

Aquí está el código de Python recortado:

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