Suite

Sélectionnez le(s) point(s) à partir des coordonnées données et déplacez-vous vers les nouvelles coordonnées en utilisant arcpy

Sélectionnez le(s) point(s) à partir des coordonnées données et déplacez-vous vers les nouvelles coordonnées en utilisant arcpy


Objectif : déplacer les points d'adresse vers leur emplacement correct.

Plan : j'ai une couche d'AddressPoints dont certains doivent être déplacés vers un nouvel emplacement. Je veux prendre un calque de ligne (appelé AddressPoints_AdjustLocation, représenté par une ligne pointillée violette ci-dessous) et tracer une ligne à partir de l'emplacement actuel des points d'adresse (qui est généralement proche de la route) jusqu'à l'emplacement souhaité (qui est la porte d'entrée du imeuble)

Code que j'ai pour l'instant :

arcpy.MakeFeatureLayer_management("… /pathToAddressPoints", "lyr_AddressPoints") arcpy.MakeFeatureLayer_management("… /pathToAddressPoints_AdjustLocation", "lyr_AddressPoints_AdjustLocation") # Créer un curseur qui contient toutes les lignes d'entités AdjustLocation sélectionnées = arcpy.SearchAddress_Address("lyr_AddressLocation) rows : pour la ligne dans les lignes : feat = row.getValue("SHAPE") vertex_list = [] pour le sommet dans feat.getPart(0) : si le sommet : vertex_list.append([vertex.X, vertex.Y]) vertexStart = vertex_list[0] # TODO : Sélectionnez tous les points d'adresse dans "lyr_AddressPoints" qui coupent l'emplacement vertexStart vertexEnd = vertex_list[-1] # TODO : Pour chaque point d'adresse sélectionné ci-dessus, déplacez-le vers l'emplacement vertexEnd

Les deux éléments pour lesquels j'ai besoin d'aide sont de savoir comment sélectionner des points d'adresse qui intersectent la position de vertexStart, puis déplacer ces points d'adresse vers l'emplacement de vertexEnd (à l'aide de UpdateCursor, je suppose).


J'ai donc fini par résoudre mon problème en utilisant une méthode un peu différente… Donc, ce que je fais, c'est tracer une ligne à partir de laquelle le point d'adresse est celui que je veux déplacer, et terminer la ligne à l'endroit où je veux que le point d'adresse se termine jusqu'à au. Lorsque j'exécute mon code, il parcourt et sélectionne chaque ligne une à la fois, puis sélectionne tous les points d'adresse qui coupent cette ligne (n'importe où le long de cette ligne, pas seulement au début de ce que j'essayais de faire avant… ), et déplace tous les points d'adresse (généralement un seul) vers le dernier sommet de la ligne. Le faire de cette façon me permettrait de sélectionner plusieurs points d'adresse avec la même ligne si nécessaire et de les déplacer tous au même endroit.

La raison pour laquelle j'ai cela dans un script est que je télécharge les points d'adresse d'origine à partir d'un site Web de comté (à plusieurs reprises toutes les deux semaines), puis les combine avec mes ajouts/corrections/suppressions, puis les fusionne avec d'autres comtés pour en faire un grand base de données. Ainsi, je peux déplacer les points d'adresse là où je le souhaite sans déranger les gardiens de données d'origine.

arcpy.MakeFeatureLayer_management("… /pathToAddressPoints", "lyr_AddressPoints") arcpy.MakeFeatureLayer_management("… /pathToAddressPoints_AdjustLocation", "lyr_AddressPoints_AdjustLocation") # Créer un curseur qui contient toutes les lignes d'entités AdjustLocation sélectionnées = arcpy.SearchAddress_Address("lyr_AddressLocation) lignes : pour la ligne dans les lignes : arcpy.SelectLayerByAttribute_management("lyr_AddressPoints_AdjustLocation", "NEW_SELECTION", ""OBJECTID" = " + str(row.getValue("OBJECTID"))) arcpy.SelectLayerByLocation_management("lyr_AddressPoints", "INTERSECT ", "lyr_AddressPoints_AdjustLocation") print("AVERTISSEMENT!!!: LOCATION ADJUST OBJECTID " + str(row.getValue("OBJECTID")) + " N'A SÉLECTIONNÉ AUCUN POINT D'ADRESSE !!!" if arcpy.GetCount_management("lyr_AddressPoints" ).getOutput(0) == '0' else "OBJECTID " + str(row.getValue("OBJECTID")) + " sélectionné " + arcpy.GetCount_management("lyr_AddressPoints").getOutput(0) + " fonctionnalité(s) ) pour l'emplacement adj") if arcpy.GetCount_management ("lyr_AddressPoints ").getOutput(0) <> '0' : # Récupère les x,y des sommets de la fonction AdjustLocation actuelle feat = row.getValue("SHAPE") vertex_list = [] pour le sommet dans feat.getPart(0) : if vertex: vertex_list.append([vertex.X, vertex.Y]) pntLastVertex = arcpy.Point(vertex_list[-1][0], vertex_list[-1][1]) # Convertit le dernier sommet en un point aprows = arcpy.UpdateCursor("lyr_AddressPoints") pour aprow dans aprows: aprow.setValue("SHAPE", pntLastVertex) aprows.updateRow(aprow)

À condition que les points d'adresse fassent toujours référence au bâtiment le plus proche (ce qui n'est peut-être pas toujours le cas, je suppose), vous pouvez utiliser l'outil Near GP pour trouver l'entité la plus proche dans la couche des bâtiments (ou vous pouvez d'abord créer des points centroïdes de bâtiments).

Vous pouvez ensuite utiliser arcpy.da.UpdateCursor pour mettre à jour la géométrie des points d'adresse source en fonction de l'entité dont ils sont les plus proches. Les coordonnées XY du centre de gravité du bâtiment le plus proche seront calculées dans deux champs ajoutés - NEAR_X et NEAR_Y.

Si vous souhaitez déplacer vos points d'adresse vers l'emplacement de la porte d'entrée, vous devez avoir des portes stockées sous forme de points (ce qui est utilisé avec l'outil Près) ou vous pouvez être heureux d'avoir le centroïde du bâtiment (si cela est suffisant pour votre fins et vous ne voulez pas numériser l'emplacement de la porte manuellement).


Voir la vidéo: The Very Thought Of You