Instrução

Colocar linhas a partir de pontos em uma classe de feição para um único ponto em outra classe de feição utilizando ArcPy.

Last Published: March 8, 2023

Resumo

No ArcGIS Pro, as feições de ponto podem ser conectadas com feições de linha utilizando a ferramenta Pontos para Linha . Em alguns casos, há uma necessidade de colocar linhas de conexão de um grupo de feições de ponto para um ponto selecionado em uma classe de feição de ponto diferente. No entanto, usando a ferramenta Pontos para Linha, as linhas geradas se conectam somente aos pontos da mesma classe de feição de ponto, conforme mostrado na imagem abaixo.

A saída após usar a ferramenta Ponto para Linha

O procedimento a seguir descreve como conectar programaticamente pontos em uma classe de feição a uma feição de ponto único em outra classe de feição com linhas utilizando ArcPy.

Procedimento

  1. No ArcGIS Pro, abra o mapa que contém as classes de feição de ponto e linha.
  2. Selecione uma feição de ponto no mapa. Consulte ArcGIS Pro: Selecionar feições interativamente para obter mais informações.
  3. Abra a janela Python. Consulte ArcGIS Pro: Janela Python para obter mais informações.
  4. Execute o seguinte script:
    1. Importe os módulos necessários e defina nomes para as camadas de feição de linha e ponto necessários.
import arcpy

<VariableName1> = "<PointName1>"
<VariableName2> = "<PointName2>"
<VariableName3> = "<LineName>"
  1. Selecione um ponto de <VariableName1> e um ou mais pontos de <VariableName2> no mapa.
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. Obtenha as coordenadas de um ponto selecionado em <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. Crie uma nova classe de feição para armazenar as linhas, se necessário.
if not arcpy.Exists(VariableName3):
  arcpy.management.CreateFeatureclass(arcpy.env.workspace, "<LineName>", "POLYLINE")
  1. Crie uma matriz para armazenar a geometria da linha e execute a função 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. Acrescente os pontos inicial e final à matriz de linhas.
line_array.append(start_point.centroid)
line_array.append(end_point.centroid)
  1. Crie um objeto de polilinha a partir da matriz de linhas.
line = arcpy.Polyline(line_array)
line_array.removeAll()
  1. Use o cursor de inserção para inserir a linha na classe de feição de linhas.
with arcpy.da.InsertCursor(<VariableName3>, ["SHAPE@"]) as icursor:
  icursor.insertRow([line])

  1. Adicione a camada de linhas ao mapa para atualizar a exibição. Pressione a tecla Enter duas vezes,
arcpy.management.MakeFeatureLayer(<VariableName3>,"<LineName>")

O bloco de código abaixo demonstra o script completo.

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")

A imagem abaixo mostra feições de linha conectando um grupo de feições de ponto a uma feição de ponto selecionada em outra classe de feição.

Linhas conectadas de um grupo de feições de ponto para uma classe de feição de ponto selecionada diferente

ID do Artigo: 000029537

Receba notificações e encontre soluções para problemas novos ou comuns

Obtenha respostas resumidas e soluções de vídeo do nosso novo chatbot de IA.

Baixe o Aplicativo de Suporte da Esri

Informações Relacionadas

Descubra mais sobre este tema

Obtenha ajuda de especialistas do ArcGIS

Entre em contato com Suporte Técnico

Baixe o Aplicativo de Suporte da Esri

Ir para as opções de download