Suite

Modifier les points d'extrémité dans la polyligne à l'aide d'ArcPy ?


J'essaie de créer un outil d'accrochage de point de terminaison de polyligne en Python à l'aide d'ArcGIS 10. à l'aide d'un curseur de recherche, j'ai lu les valeurs dans un tableau d'objets de ligne (qui contiennent l'identifiant de la caractéristique de la ligne et deux objets "EndPoint" - premier et last - qui contiennent les coordonnées X et Y de chacun), puis traitez une interpolation des données des points pour donner à tous les points leurs valeurs correctes.

Jusqu'à présent, cette partie fonctionne parfaitement. Cependant, lorsque j'essaie de revenir en arrière et de modifier le fichier de formes, je peux voir les données que je modifie, mais je n'arrive pas à les modifier.

Voici le code pour mettre à jour les champs :

# -------------------------- # # Mettre à jour le fichier avec les nouveaux EPs # # ------------ -------------- # Créer un curseur de mise à jour # rows = arcpy.UpdateCursor(outputDirectory + "" + trails_fc + ".shp") # Entrez la boucle for pour chaque fonctionnalité/ligne # i = 0 pour rangée dans rangées : # Créer l'objet de géométrie # feat = row.getValue(shapefieldname) partnum = 0 if feat.getPart(partnum)[0].X != allLines[i].startEP.x: arcpy.AddMessage ("Modifier : " + str(feat.getPart(partnum)[0].X) + " en " + str(allLines[i].startEP.x) ) feat.getPart(partnum)[0].X = allLines [i].startEP.x rows.updateRow(row) arcpy.AddMessage("est maintenant : " + str(feat.getPart(partnum)[0].X)) i+=1

Ma lecture se compose de déclarations comme celle-ci :

Changer : -105.512166832 à -105.699533165 est maintenant : -105.512166832

Pour une raison quelconque, les lignes ne sont pas mises à jour. Et pour la vie de moi, je ne trouve pas de tutoriel ou d'instructions sur la façon de modifier un point particulier dans une polyligne. Je ne peux que trouver comment modifier un point en tant que champ dans un fichier de formes de points.

Quelqu'un a des idées ?


Malheureusement, vous ne pouvez pas affecter directement de nouvelles valeurs à la géométrie existante d'une entité - vous devez plutôt créer un nouvel objet géométrique et mettre à jour le champ de forme de l'entité avec ce nouvel objet. Heureusement, les objets du tableau ont unremplacerméthode. Donc plutôt que d'essayer de modifier directement la coord X du point à l'intérieur du tableau, vous devez :

  • Créer un nouveauarcpy.Pointobjet avec les bonnes coordonnées (il semble que vous l'ayez déjà fait)
  • Obtenir une copie de l'objet tableau stocké dans le champ Forme de la ligne
  • Utilisez leremplacerméthode pour définir le point souhaité dans votre tableau avec votre point modifié
  • Créer un nouvel objet Polyline avec ce tableau
  • Utiliser l'objet de lignesetValueméthode pour mettre à jour le champ Forme avec votre nouvelle polyligne correcte
  • Utilisez l'objet curseurupdateRowméthode pour insérer la ligne modifiée dans l'ensemble de données.

Concrètement :

pour r dans cur : ary = r.getValue("SHAPE").getPart(0) ary.replace(0,correct_point_object) # first arg 0 remplace le premier point de la ligne newLine = arcpy.Polyline(ary) r.setValue ("SHAPE",newLine) cur.updateRow(r)

Noter laremplacerLa méthode prend un indice et une valeur. Malheureusement, il n'accepte pas, par ex. -1 comme index du dernier point du tableau. Cependant, vous pouvez diremy_array[my_array.count].

Il semble que vous précalculiez les coordonnées X ailleurs et que vous les récupériez plus tard. Si tel est le cas, j'irais probablement à fond et créerais de nouveaux objets Polyline avec les bons points pour chaque ligne pendant que vous calculez les bonnes coordonnées. Ce sera probablement plus facile et plus propre. De cette façon, votre code pourrait ressembler davantage à

row_num = 0 pour r dans cur : r.setValue(shapeField,correct_geometry_list[row_num]) cur.updateRow(r) row_num += 1

Ce qui, du moins pour moi, est un peu plus clair… mais c'est stylistique !

Modifier pour ajouter :

Je n'ai pas pu mettre ça dans un commentaire. Sans voir votre code, il est difficile de dire où il pourrait tomber. Voici un script complet testé qui fonctionne pour moi. J'espère qu'il servira de référence. Notez qu'ici je calcule la nouvelle géométrie directement à partir de l'ancienne, plutôt que de faire deux passes ; cela peut ou non être possible selon la façon dont vous effectuez vos calculs de position d'accrochage. De plus, cette fois, je construis un tout nouveau tableau basé sur l'ancien plutôt que d'utiliser leremplacerméthode, au cas où cela serait nécessaire.

import arcpy def offsetPoint(old_point,X_distance,Y_distance): """Fonction triviale pour décaler un point - remplacer par ce que vous faites réellement.""" new_point = arcpy.Point(old_point.X+X_distance, old_point.Y+ Y_distance) return new_point def offsetFirstPointInLine(line_geom,X_distance,Y_distance): """ Prend un objet géométrique Polyline et renvoie une nouvelle Polyline avec le premier point de la première pièce décalé de la distance donnée.""" array = line_geom.getPart( 0) first_point = array[0] new_point = offsetPoint(first_point,X_distance,Y_distance) # Construisez un nouveau tableau avec votre nouveau point en position 0, et # le reste des points de l'ancien tableau. new_array = arcpy.Array([new_point]+ [array.getObject(x) for x in range(1,array.count)]) # Créez ensuite un nouvel objet Polyline avec ce tableau. new_line = arcpy.Polyline(new_array) return new_line fc = r"C:UsersstudentDocumentsArcGISDefault.gdbSomeStorms" cur = arcpy.UpdateCursor(fc) for r in cur: geom = r.getValue( "SHAPE") r.setValue("SHAPE",offsetFirstPointInLine(geom,-45000,-5000)) cur.updateRow(r) del r,cur

Espérons que cela aide à l'éclaircir.