Suite

Mettre à jour les valeurs Z sur une entité linéaire

Mettre à jour les valeurs Z sur une entité linéaire


J'utilise ArcMap 10.1 avec la licence Info. Voici mon problème. J'ai une section de ligne de voie avec des valeurs Z incorrectes appliquées. Il y a plus de 15 000 sommets que je dois mettre à jour en même temps. Je sais que je peux le faire manuellement, mais cela prendrait une éternité. Fondamentalement, j'ai juste besoin d'ajouter 2 pieds aux valeurs Z existantes.

Comment puis-je procéder?


Cela peut être un peu délicat avec les polylignes car les valeurs z de chaque sommet ne sont pas immédiatement accessibles via le champ de forme. Vous devrez accéder à l'objet de géométrie polyligne (champ Forme) avecFAÇ[email protected]et explorez davantage pour accéder à chaque point de la géométrie de la polyligne. Voici unepythonetarcpyextrait de code expliquant comment accéder aux valeurs z des sommets d'une ligne spécifique dans une classe d'entités polyligne.

id_field = 'TARGET_FID' #field identifie quelles fonctionnalités doivent être décalées id_value = 12 #value dans id_field qui identifie une caractéristique spécifique qui doit être décalée shift_value = 2 avec arcpy.da.UpdateCursor("Breaklines", ['[email protected]', id_field]) as u_cur : pour la ligne dans u_cur : if row[1] == id_value : geometry = row[0] pts = geom.getPart(0) #get polyline geometry pt_array = arcpy.Array() #create array to house nouveaux points pour pt en pts : pt.Z += shift_value #shift z value pt_array.add(pt) #add point to array new_polyline_geometry = arcpy.Polyline(pt_array, None, True) #important d'activer la valeur z en ayant le troisième paramètre défini sur True row[0] = new_polyline_geometry #set row[0] qui est [email protected] (objet géométrique) u_cur.updateRow(row)

En un mot:

  • boucle sur les sommets de la géométrie de la polyligne
  • mettre à jour chaque valeur z de la géométrie du point
  • ajouter le point mis à jour à un tableau
  • une fois tous les points de la polyligne ajustés :
    • créer une nouvelle géométrie de polyligne avec le tableau de points, en veillant à le définir sur z-enabled
    • puis mettez à jour l'ancienne géométrie de la polyligne avec la géométrie nouvellement créée

Actuellement, cela ne fonctionnera que sur la première partie de la géométrie, voirpts = geom.getPart(0), cependant, il peut être facilement modifié pour fonctionner sur la ligne s'il comporte plusieurs parties. En mettant à jour le code et en intégrant une autre boucle et en utilisant le.partCountde laPolyligneobjet.


Bloquer:

def plineZ(shp): arr=arcpy.Array();pM=arcpy.Point() part=shp.getPart(0);n=len(part) for i in xrange(n): p=part.getObject( i) pM.X=pX;pM.Y=pY;pM.Z=p.Z+2*0.33 arr.add(pM) return arcpy.Polyline(arr)

Expression:

plineZ( !Forme! )

Exécutez-le sur le champ Forme à l'aide d'une copie de sauvegarde de la classe d'entités. Fonctionne uniquement pour les polylignes en une seule pièce


Si tu utilisesarcpy.da.UpdateCursor, vous pouvez accéder et modifier les valeurs Z avec'[email protected]'. La clé est d'utiliserexploser_en_pointsargument; cela vous permet de parcourir les sommets sans avoir à vous soucier de la géométrie et des objets de tableau.

Attention requise : arcpy.da.UpdateCursor met bien sûr à jour vos données. Travaillez sur une copie de vos données d'origine.

fc = "chemin vers fc" z_increase = 2 avec arcpy.da.UpdateCursor(fc, '[email protected]', explosive_to_points=True) comme curseur : pour la ligne du curseur : cursor.updateRow([row[0] + z_increase])