PROCÉDURE

placer des lignes à partir de points d’une classe d’entités sur un point unique dans une autre classe d’entités à l’aide d’ArcPy.

Last Published: March 8, 2023

Résumé

Dans ArcGIS Pro, les entités ponctuelles peuvent être connectées à des entités linéaires à l’aide de l’outil Points To Line (Points vers lignes). Dans certains cas, il est nécessaire de placer des lignes de connexion d’un groupe d’entités ponctuelles sur un point sélectionné dans une autre classe d’entités ponctuelles. Toutefois, à l’aide de l’outil Points vers lignes, les lignes générées se connectent uniquement aux points de la même classe d’entités ponctuelles, comme illustré dans l’image ci-dessous.

Sortie après l’utilisation de l’outil Points vers lignes

La procédure suivante décrit comment connecter par programmation des points d’une classe d’entités à une entité ponctuelle unique d’une autre classe d’entités avec des lignes à l’aide d’ArcPy.

Procédure

  1. Dans ArcGIS Pro, ouvrez la carte contenant les classes d’entités ponctuelles et linéaires.
  2. Sélectionnez une entité ponctuelle sur la carte. Pour plus d’informations, reportez-vous à l’article ArcGIS Pro : Sélectionner interactivement des entités.
  3. Ouvrez la fenêtre Python. Pour plus d’informations, reportez-vous à la rubrique ArcGIS Pro : Fenêtre Python.
  4. Exécutez le script suivant :
    1. Importez les modules requis et définissez les noms des couches d’entités ponctuelles et linéaires nécessaires.
import arcpy

<VariableName1> = "<PointName1>"
<VariableName2> = "<PointName2>"
<VariableName3> = "<LineName>"
  1. Sélectionnez un point dans <VariableName1> et un ou plusieurs points dans <VariableName2> sur la carte.
assert arcpy.management.GetCount(points_layer1)[0] == "1", "select exactly 1 point from <VariableName1>"
assert int(arcpy.management.GetCount(points_layer1)[0]) > 0, "select > 0 point(s) from <VariableName2>"
  1. Récupérez les coordonnées du point sélectionné dans <VariableName1>.
with arcpy.da.SearchCursor(<VariableName1>, ["SHAPE@XY"]) as cursor:
  for row in cursor:
    end_x, end_y = row[0]
    end_point = arcpy.PointGeometry(arcpy.Point(float(end_x), float(end_y)))
  1. Créez une nouvelle classe d’entités pour stocker les lignes si nécessaire.
if not arcpy.Exists(VariableName3):
  arcpy.management.CreateFeatureclass(arcpy.env.workspace, "<LineName>", "POLYLINE")
  1. Créez un tableau pour stocker la géométrie de ligne et exécutez la fonction arcpy.da.SearchCursor().
line_array = arcpy.Array()

with arcpy.da.SearchCursor(<VariableName2>, ["SHAPE@XY"]) as cursor:
  for row in cursor:
    start_x, start_y = row[0]
    start_point = arcpy.PointGeometry(arcpy.Point(float(start_x), float(start_y)))
  1. Ajoutez les points de début et de fin au tableau de lignes.
line_array.append(start_point.centroid)
line_array.append(end_point.centroid)
  1. Créez un objet polyligne à partir du tableau de lignes.
line = arcpy.Polyline(line_array)
line_array.removeAll()
  1. Utilisez le curseur d’insertion pour insérer la ligne dans la classe d’entités linéaires.
with arcpy.da.InsertCursor(<VariableName3>, ["SHAPE@"]) as icursor:
  icursor.insertRow([line])

  1. Ajoutez la couche de lignes à la carte pour actualiser l’affichage. Appuyez deux fois sur la touche Entrée.
arcpy.management.MakeFeatureLayer(<VariableName3>,"<LineName>")

Le bloc de code ci-dessous illustre le script complet.

import arcpy

points_layer1 = "facilities"
points_layer2 = "pts"
lines_layer = "lines"

assert arcpy.management.GetCount(points_layer1)[0] == "1", "select exactly 1 point from points_layer1"
assert int(arcpy.management.GetCount(points_layer1)[0]) > 0, "select > 0 point(s) from points_layer2"

with arcpy.da.SearchCursor(points_layer1, ["SHAPE@XY"]) as cursor:
  for row in cursor:
    end_x, end_y = row[0]
    end_point = arcpy.PointGeometry(arcpy.Point(float(end_x), float(end_y)))

if not arcpy.Exists(lines_layer):
  arcpy.management.CreateFeatureclass(arcpy.env.workspace, "lines", "POLYLINE")

line_array = arcpy.Array()

with arcpy.da.SearchCursor(points_layer2, ["SHAPE@XY"]) as cursor:
  for row in cursor:
    start_x, start_y = row[0]
    start_point = arcpy.PointGeometry(arcpy.Point(float(start_x), float(start_y)))
   
    line_array.append(start_point.centroid)
    line_array.append(end_point.centroid)

    line = arcpy.Polyline(line_array)
    line_array.removeAll()
   
    with arcpy.da.InsertCursor(lines_layer, ["SHAPE@"]) as icursor:
      icursor.insertRow([line])
     
arcpy.management.MakeFeatureLayer(lines_layer,"lines")

L’image ci-dessous montre des entités linéaires connectant un groupe d’entités ponctuelles à une entité ponctuelle sélectionnée dans une autre classe d’entités.

Lignes connectées d’un groupe d’entités ponctuelles à une autre classe d’entités ponctuelles sélectionnée

ID d’article: 000029537

Recevoir des notifications et trouver des solutions liées à de nouvelles questions ou à des problèmes connus

Recevez des réponses synthétisées et des solutions en vidéo de notre nouvel agent conversationnel (IA).

Télécharger l’application Esri Support

Informations associées

En savoir plus sur ce sujet

Obtenir de l’aide auprès des experts ArcGIS

Contacter le support technique

Télécharger l’application Esri Support

Accéder aux options de téléchargement