Mais

Editando pontos finais em polilinha usando ArcPy?


Estou tentando fazer uma ferramenta de ajuste de endpoint de polilinha em Python usando ArcGIS 10. usando um Cursor de Pesquisa, eu li os valores para uma matriz de objetos de linha (que contém o id de recurso da linha e dois objetos "EndPoint" - primeiro e último - que contém as coordenadas X e Y de cada), então processe alguma interpolação de dados dos pontos para dar a todos os pontos seus valores corretos.

Até agora, essa parte funciona perfeitamente. No entanto, quando tento voltar e editar o shapefile, posso ver os dados que estou alterando, mas não consigo editá-los.

Aqui está o código para atualizar os campos:

# -------------------------- # # Atualize o arquivo com os novos EPs # # ------------ -------------- # Criar cursor de atualização # linhas = arcpy.UpdateCursor (outputDirectory + "" + trilhas_fc + ".shp") # Digite para loop para cada recurso / linha # i = 0 para linha em linhas: # Crie o objeto de geometria # feat = row.getValue (shapefieldname) partnum = 0 if feat.getPart (partnum) [0] .X! = AllLines [i] .startEP.x: arcpy.AddMessage ("Alterar:" + str (feat.getPart (partnum) [0] .X) + "para" + str (allLines [i] .startEP.x)) feat.getPart (partnum) [0] .X = allLines [i] .startEP.x rows.updateRow (row) arcpy.AddMessage ("Now is:" + str (feat.getPart (partnum) [0] .X)) i + = 1

Minha leitura consiste em declarações como esta:

Alterar: -105.512166832 para -105.699533165 Agora é: -105.512166832

Por algum motivo, as linhas não estão atualizando. E por toda a vida, não consigo encontrar um tutorial ou instruções sobre como editar um ponto específico em uma polilinha. Só consigo descobrir como editar um ponto como um campo em um arquivo de forma de ponto.

Alguém tem alguma ideia?


Infelizmente, você não pode atribuir novos valores diretamente à geometria existente de um recurso - em vez disso, você deve criar um novo objeto de geometria e atualizar o campo de forma do recurso com esse novo objeto. Felizmente, os objetos de array têm umsubstituirmétodo. Portanto, em vez de tentar modificar diretamente a coordenada X do ponto dentro da matriz, você precisa:

  • Crie um novoarcpy.Pointobjeto com as coordenadas corretas (parece que você já deve ter feito isso)
  • Obtenha uma cópia do objeto de matriz armazenado no campo Forma da linha
  • Use osubstituirmétodo para definir o ponto desejado em sua matriz com seu ponto modificado
  • Faça um novo objeto Polyline com essa matriz
  • Use o objeto de linhasetValuemétodo para atualizar o campo Forma com sua nova polilinha correta
  • Use o cursor do objetoupdateRowmétodo para inserir a linha alterada no conjunto de dados.

Concretamente:

para r em cur: ary = r.getValue ("SHAPE"). getPart (0) ary.replace (0, correct_point_object) # primeiro arg 0 substitui o primeiro ponto na linha newLine = arcpy.Polyline (ary) r.setValue ("FORMA", novaLinha) cur.updateRow (r)

Note osubstituirmétodo leva um índice e um valor. Infelizmente, não aceita, por ex. -1 como um índice para o último ponto na matriz. No entanto, você pode dizermy_array [my_array.count].

Parece que você está pré-calculando as coordenadas X em outro lugar e recuperando-as mais tarde. Se for esse o caso, provavelmente eu iria até o fim e criaria novos objetos Polyline com os pontos corretos para cada linha enquanto você calcula as coordenadas corretas. Isso provavelmente será mais fácil e mais limpo. Dessa forma, seu código poderia ser mais como

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

O que, pelo menos para mim, é um pouco mais claro… mas isso é estilístico!

Edite para adicionar:

Eu não poderia colocar isso em um comentário. Sem ver seu código, é difícil dizer onde ele pode estar caindo. Aqui está um script testado completo que funciona para mim. Espero que sirva de referência. Observe que aqui estou calculando a nova geometria diretamente da antiga, em vez de fazer duas passagens; isso pode ou não ser possível, dependendo de como você está fazendo seus cálculos de posição de snap. Além disso, desta vez, estou construindo um novo array baseado no antigo, em vez de usar osubstituirmétodo, caso seja necessário.

import arcpy def offsetPoint (old_point, X_distance, Y_distance): "" "Função trivial para deslocar um ponto - substitua pelo que você está realmente fazendo." "" 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): "" "Pega um objeto de geometria de polilinha e retorna uma nova polilinha com o primeiro ponto da primeira parte deslocado pela distância fornecida. 0) first_point = array [0] new_point = offsetPoint (first_point, X_distance, Y_distance) # Construa um novo array com seu novo ponto na posição 0, e # o resto dos pontos do array antigo. new_array = arcpy.Array ([new_point] + [array.getObject (x) para x no intervalo (1, array.count)]) # Em seguida, faça um novo objeto Polyline com esse array. new_line = arcpy.Polyline (new_array) return new_line fc = r "C:  Usuários  aluno  Documentos  ArcGIS  Default.gdb  SomeStorms" cur = arcpy.UpdateCursor (fc) para r em cur: geom = r.getValue ( "SHAPE") r.setValue ("SHAPE", offsetFirstPointInLine (geom, -45000, -5000)) cur.updateRow (r) del r, cur

Espero que isso ajude a esclarecer tudo.


Assista o vídeo: ArcGIS LocateXT - Parse HTML (Outubro 2021).