Obtenez tous les points d'une polyligne

11

J'ai des objets d'entité polyligne en python. Maintenant, je veux obtenir tous les points des polylignes.

Par exemple, si une polyligne a un point de départ et un point d' [0,0]arrivée [5,5]. Résultat: [1,1];[2,2];[3,3];[4,4];[5,5].

Je veux trouver tous les points entiers sur cette ligne, y compris les points de fin. Pour la ligne droite, c'est très simple, mais si la polyligne a des types de géométrie de courbe de Beizer, d'arc circulaire et d'arc elliptique, comment puis-je le faire?

ÉDITER:

Je ne peux utiliser que les outils disponibles dans tous les niveaux de licence d'ArcGIS. Par exemple, ArcGIS Basic.

utilisateur
la source
2
En général, vous n'obtiendrez pas souvent de bons points «entiers». Cela fonctionne dans votre exemple, mais pas souvent dans la vraie vie. Habituellement, vous obtenez simplement des emplacements pour les sommets, donc dans votre cas, vous obtiendrez [0,0] et [5,5]. Les points «intermédiaires» peuvent être «supposés». Vous ne savez pas comment faire cela en python, mais plusieurs outils vous permettront de créer un fichier de points de sommets à partir d'une ligne.
Darren Cope

Réponses:

18

Je sais que c'est ancien mais je cherchais la même chose car je n'ai pas ArcInfo pour les outils FeatureVerticesToPoints . Après avoir utilisé la solution de curseur de recherche ci-dessus, je suis allé de l'avant pour simplifier le code et j'ai constaté qu'en utilisant les tableaux NumPy dans le module d'accès aux données, un script simple et très rapide pouvait être produit. J'utilise cela comme un outil de script.

Remarque: la clé est le explode_to_pointsparamètrearcpy.da.FeatureClassToNumPyArray

Voici le lien vers l'emplacement du référentiel ArcGIS: classe d'entités vers points

# 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
la source
Bienvenue sur GIS.se Paul :) +1 pour une première contribution bien arrondie et meilleure que la moyenne, avec du code pour démarrer. Merci! Quelques conseils d'édition: sélectionnez du texte, en ligne ou un bloc, puis ctrl-kappliquez la mise en forme du code (idem pour l' bancien et le italic). Par convention, nous avons tendance à éviter les bavardages comme "salut", "merci", "acclamations". Ceux-ci sont implicites comme étant toujours présents, et contribuent à renforcer l'idée que cet endroit est différent des forums et des e-mails habituels. Bienvenue à bord.
Matt Wilkie
Vous devez placer un espace réservé pour la clause where_clause sur cette ligne du code array = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", spatial_reference = SR, explode_to_points = True)
Tristan Forward
4

Si j'ai bien compris, vous devez augmenter le nombre de sommets pour vos entités polylignes. Et aussi pour transformer tous les segments "Courbe de Beizer, Arc circulaire, Arc elliptique" en plusieurs segments de ligne.

Pour cette tâche dans ArcGIS, vous pouvez utiliser l' outil Densifier (modification) dans ArcToolbox.

Ensuite, vous pouvez convertir les sommets de vos polylignes en entités ponctuelles comme le suggèrent Darren Cope et l'illustration21.

Si vous préférez le faire dans ArcMap, consultez Création de nouveaux points le long d'une rubrique d'aide en ligne .

Alex Markov
la source
3

Les éléments suivants devraient fonctionner sur les polylignes et les polygones:

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

Pour certaines données routières au Royaume-Uni, je reçois ceci; une liste imbriquée de paires X, Y pour chaque sommet qui compose la polyligne:

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
la source
Je l'ai vu sur la page ESRI. Mais si vous regardez attentivement dans leur description, ce code ne renvoie que les points finaux, pas les points entre eux
utilisateur
2
@crucifiedsoul - Oui, c'est une variation de cet échantillon ESRI , mais il donne la paire X, Y de tous les points, pas seulement les points finaux. C'est ce que tu veux, n'est-ce pas?
Chad Cooper
Je ne comprends pas. La seule chose est en train de changer vous remplacez print pnt.X, pnt.Yavec part_list.append([pnt.X, pnt.Y]). Et vous imprimez cela à la fin de la boucle. Comment votre code peut-il obtenir tous les points d'une ligne, mais pas le code ESRI?
utilisateur
La méthode de description n'a pas fonctionné pour moi. Je devais juste spécifier mon champ de forme - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk
1

Comme Darren Cope l'a suggéré, la conversion de votre calque en points sommets peut être effectuée à l'aide de l' outil Sommets d'entités en points .

Voici le code python coupé:

# 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")
oeuvre21
la source