Suite

Méthode pour diviser les segments de ligne d'un réseau routier d'une longueur supérieure à X en n segments de ligne plus petits à l'aide d'ArcGIS ?


J'utilise ArcGIS Desktop 10.2 et j'aimerais prendre des routes dans un réseau supérieur à une certaine longueur et les diviser en morceaux égaux plus petits. J'ai remarqué que la division par pourcentage peut être réalisée via le menu de l'éditeur ; cependant, il semble que cela doit être fait ligne par ligne.

Pourriez-vous suggérer des moyens d'automatiser le processus pour diviser toutes les routes sur une certaine longueur en parties plus petites en fonction du pourcentage de l'original ?


Un peu d'automatisation Python permet de faire ce travail. Les étapes de base :

  • Déterminer la distance maximale dans les unités de la classe d'entités à l'aide d'un objet de référence spatiale (nécessite une classe d'entités projetée, je crois)
  • Créer une nouvelle classe d'entités vide avec la classe d'entités ligne en entrée comme modèle
  • Itérer la classe d'entités en entrée et vérifier ses longueurs de ligne
  • Si la longueur est trop longue, divisez continuellement la ligne à l'aide d'untandis queboucle,positionner le long de la ligne, etligne de séparation au point.
  • Une fois que les lignes sont plus courtes que la longueur maximale, ajoutez un objet de ligne à une liste
  • Insérer tous les objets de ligne dans la nouvelle classe d'entités avec un curseur d'insertion

Contributions:

inFc: classe d'entités linéaires en entrée

outFc: classe d'entités en sortie

dist: distance max en mètres

Code:

#Chemin complet vers la classe d'entités linéaires en entrée inFc = r"C:Userse1b8DesktopE1B8WorkspaceWorkspace5.gdb	estLines_split" #Chemin complet vers la classe d'entités linéaires en sortie outFc = r"C:Userse1b8 DesktopE1B8WorkspaceWorkspace5.gdb	estLines_split2" #Distance (mètres) dist = 15 #----------- import arcpy import os #overwrite output (facultatif) arcpy.env.overwriteOutput = True print "détermination des informations de référence spatiale" #Obtenir l'objet de référence spatiale sr = arcpy.Describe (inFc).spatialReference #meters conversion meterPerUnit = sr.metersPerUnit #Distance dans les unités de classe d'entités checkDistance = dist / meterPerUnit print "max distance:", checkDistance print " création d'une classe d'entités en sortie" #Créer une classe d'entités outPath = os.path.dirname (outFc) outName = os.path.basename (outFc) arcpy.CreateFeatureclass_management (outPath, outName, "POLYLINE", inFc, spatial_reference = sr) #set workspace arcpy.env.workspace = outPath #list with geometry field fields = ["[email protected]"] #Ajouter des champs de classe d'entités au champ de liste ds += [f.name for f in arcpy.ListFields (inFc)] #Get objectid field name oidFld = arcpy.Describe (inFc).OIDFieldName #Remove oid field from fields list fields.remove (oidFld) #empty list to have lignes ajoutées aux lignes = [] print print "itération", arcpy.GetCount_management (inFc).getOutput (0), "lignes" i = 0 #cursor pour itérer la classe d'entités avec arcpy.da.SearchCursor (inFc, champs) comme curseur : #itérer les lignes pour la ligne dans le curseur : i += 1 #get géométrie objet géométrie = ligne [0] #get longueur longueur = géométrie.longueur #vérifier si la longueur est supérieure à la limite si longueur > vérifierDistance : imprimer "ligne", j'imprime "line length :", longueur #liste vide pour la date intermédiaire à supprimer garbage = [] #créer une ligne vide fc pour une seule fonctionnalité split = arcpy.CreateUniqueName ("split") outPath = os.path.dirname (split) outName = os.path.basename (split) arcpy.CreateFeatureclass_management (outPath, outName, "POLYLINE", inFc, spatial_reference = sr) #insert feature in new fc avec arcpy.da.InsertCursor (split, fields) as cu r: cur.insertRow (row) del cur #add new fc to garbage garbage += [split] #create empty point fc for single feature midPnt = arcpy.CreateUniqueName ("point") outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath, outName, "POINT", spatial_reference = sr) #Get midpoint pnt = geometry.positionAlongLine (.5, True) #insert point dans la nouvelle classe d'entités avec arcpy. da.InsertCursor (midPnt, "[email protected]") as cur: cur.insertRow ((pnt,)) del cur #add new fc to garbage garbage += [midPnt] #boucle tant que la longueur est supérieure à la limite tant que longueur > checkDistance : #Split line at (mid)point newSplit = arcpy.CreateUniqueName("split") garbage += [newSplit] arcpy.SplitLineAtPoint_management (split, midPnt, newSplit) #Créer de nouveaux points médians midPnt = arcpy.CreateUniqueName ("point") garbage += [midPnt] outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath, outName, "POINT", spatial_reference = sr) #liste vide pour les nouveaux points pnts = [] #itérer la ligne de séparation et obtenir les points médians avec arcpy.da.SearchCursor (newSplit, "[email protected]") comme cur : pour geom, en cur : pnt = geom.positionAlongLine (.5 , True) pnts += [pnt] del cur #ajouter des points médians à la classe d'entités médianes avec arcpy.da.InsertCursor (midPnt, "[email protected]") comme cur : pour pnt dans pnts : cur.insertRow ((pnt,)) del cur #diviser la variable de longueur par deux longueur = longueur / 2 print "longueur de ligne :", longueur split = newSplit rows += [row for row in arcpy.da.SearchCursor (split, fields)] #nettoyer les données intermédiaires pour la corbeille dans garbage: arcpy.Delete_management (trash) else: rows += [row] #del cursor variable del cursor print print "insertion de lignes dans la nouvelle classe d'entités" #insert curseur nouvelle classe d'entités avec des lignes avec arcpy.da.InsertCursor (outFc, champs ) comme curseur : pour la ligne dans les lignes : cursor.insertRow (ligne) del curseur print print "created:", outFc print print "done"

La sortie ressemble à ceci :

détermination des informations de référence spatiale distance max : 65.6166666667 création de la classe d'entités en sortie itération de 11 lignes longueur de ligne 4 : 90.6641581736 longueur de ligne : 45.3320790868 longueur de ligne 6 : 81.7030489448 longueur de ligne : 40.8515244724 longueur de ligne 7 : 82.7060163161 longueur de ligne : 41.3530081581 longueur de ligne 9 : 97.005780961 longueur de ligne : 48.5028904805 ligne 10 longueur de ligne : 90.6565601113 longueur de ligne : 45.3282800557 insertion de lignes dans la nouvelle classe d'entités créée : C:Userse1b8DesktopE1B8WorkspaceWorkspace5.gdb	estLines_split2 done

Dans la classe d'objets :

Hors classe d'entités :


Ce n'est pas exactement équivalent au processus que vous décrivez, mais ArcGIS a le outil pour diviser automatiquement les longues lignes en parties de X sommets. Cependant, il n'utilise pas de limite de pourcentage, mais simplement une limite de sommet. Néanmoins, si votre seule intention est de diviser les lignes en tailles à peu près égales, cela peut être utile :

http://resources.arcgis.com/EN/HELP/MAIN/10.2/index.html#//001700000037000000


Voir la vidéo: TRACER ROUTIER (Octobre 2021).