Obter todos os pontos de uma polilinha


11

Eu tenho alguns objetos de recurso de polilinha em python. Agora eu quero obter todos os pontos de polilinhas.

Por exemplo, se uma polilinha tiver um ponto [0,0]final de ponto inicial [5,5]. Resultado: [1,1];[2,2];[3,3];[4,4];[5,5].

Eu quero encontrar todos os pontos inteiros nessa linha, incluindo pontos finais. Para linhas retas, isso é bastante simples, mas se a polilinha possui os tipos de geometria Curva de Beizer, Arco Circular e Arco Elíptico, como posso fazer isso?

EDITAR:

Só posso usar as ferramentas disponíveis em todos os níveis de licença do ArcGIS. Por exemplo, ArcGIS Basic.


2
Em geral, você geralmente não obtém bons pontos 'inteiros'. Isso funciona no seu exemplo, mas não na vida real. Normalmente, você apenas obtém localizações para vértices, portanto, no seu caso, obteria [0,0] e [5,5]. Os pontos 'intermediários' podem ser 'assumidos'. Não tenho certeza de como fazer isso em python, mas várias ferramentas permitem criar um arquivo de ponto de vértices a partir de uma linha.
Darren Cope

Respostas:


18

Eu sei que isso é antigo, mas eu estava procurando o mesmo, pois não tenho o ArcInfo para as ferramentas FeatureVerticesToPoints . Depois de usar a solução de cursor de pesquisa acima, fui adiante para simplificar o código e descobri que, usando o NumPy Arrays no módulo de acesso a dados, era possível produzir um script simples e muito rápido. Estou usando isso como uma ferramenta de script.

Nota: A chave é o explode_to_pointsparâmetro emarcpy.da.FeatureClassToNumPyArray

Aqui está o link para o ArcGIS Repository Location: Feature Class 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)

Bem-vindo ao GIS.se Paul :) +1 para uma primeira contribuição bem arredondada e melhor que a média, com código para inicializar. Obrigado! Algumas dicas de edição: selecione texto, em linha ou em um bloco e, em seguida, ctrl-kaplique a formatação do código (o mesmo para bantigo e italic). Por convenção, tendemos a evitar partes tagarelas como "oi", "obrigado" e "aplausos". Elas estão implícitas como estando sempre presentes e ajudam a reforçar a ideia de que este lugar é diferente dos fóruns e e-mails habituais. Bem vindo a bordo.
214126

Você precisa colocar um espaço reservado para a cláusula where nesta linha da matriz de código = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", referência espacial = SR, explode_to_points = True)
Tristan Forward

4

Pelo que entendi, você precisa aumentar o número de vértices para seus recursos de polilinha. E também para transformar todos os segmentos "Curva de Beizer, Arco Circular, Arco Elíptico" em vários segmentos de linha.

Para esta tarefa no ArcGIS, você pode usar a ferramenta Densify (Edição) no ArcToolbox.

Em seguida, você pode converter os vértices de suas polilinhas em feições pontuais , como sugerido Darren Cope e artwork21.

Se você preferir fazê-lo no ArcMap, consulte o tópico de ajuda Criando novos pontos ao longo de uma linha .


3

O seguinte deve funcionar em polilinhas e 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 alguns dados rodoviários do Reino Unido, eu entendo isso; uma lista aninhada de pares X, Y para cada vértice que compõe a polilinha:

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

Eu já vi isso na página da ESRI. Mas se você olhar com cuidado em sua descrição, esse código retornará apenas os pontos finais, e não os pontos entre eles
usuário:

2
@crucifiedsoul - Sim, essa é uma variação da amostra ESRI , mas fornece o par X, Y de todos os pontos, não apenas os pontos finais. É isso que você quer, correto?
Chad Cooper

Eu não entendo. A única coisa que está mudando você está substituindo print pnt.X, pnt.Ycom part_list.append([pnt.X, pnt.Y]). E você está imprimindo isso no final do loop. Como seu código pode obter todos os pontos de uma linha, mas o código ESRIs não?
usuário

O método de descrição não funcionou para mim. Eu tive que especificar apenas o meu campo de forma - arcpy.da.SearchCursor (fc, ["SHAPE @"]) "
jbalk

1

Como sugeriu Darren Cope, a conversão de sua camada em vértices de pontos pode ser feita usando a ferramenta Feature Vértices to Points .

Aqui está o código python snippedt:

# 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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.