Na captura de tela em anexo, os atributos contêm dois campos de interesse "a" e "b". Quero escrever um script para acessar as linhas adjacentes para fazer alguns cálculos. Para acessar uma única linha, eu usaria o seguinte UpdateCursor:
fc = r'C:\path\to\fc'
with arcpy.da.UpdateCursor(fc, ["a", "b"]) as cursor:
for row in cursor:
# Do something
Por exemplo, com OBJECTID 4, estou interessado em calcular a soma dos valores da linha no campo "a" adjacente à linha OBJECTID 4 (ou seja, 1 + 3) e adicionar esse valor à linha OBJECTID 4 no campo "b". Como acessar linhas adjacentes com o cursor para fazer esse tipo de cálculo?
fonte
OBJECTID
-, essa solução pode identificar vizinhos de maneira confiável, de acordo com os valores dessa chave. No entanto, os dicionários normalmente não oferecem suporte a uma pesquisa "próxima" ou "anterior". Você precisa de algo como um Trie .Ao percorrer as linhas, você precisa acompanhar os valores anteriores. Esta é uma maneira de fazer isso:
ou, se a tabela não for grande, provavelmente criaria um dicionário, como d = {a: b} e, no cursor de atualização, acesse os dados do dicionário: d.get (a + 1) ou d.get (a -1) para fazer as contas ..
fonte
Aceitei a resposta de @Hornbydd por me levar a uma solução de dicionário. O script anexado executa as seguintes ações:
fonte
O módulo Data Access é bastante rápido e você pode criar a
SearchCursor
para salvar todos os valores de 'a' em uma lista e criar umUpdateCursor
para iterar por cada linha e selecionar na lista para atualizar as linhas 'b' necessárias. Dessa forma, você não precisa se preocupar em salvar dados entre linhas =)Então, algo como isto:
Essa é uma solução bastante grosseira, mas eu a usei recentemente para solucionar um problema muito semelhante. Se o código não funcionar, espero que ele o coloque no caminho certo!
Editar: Última alteração se instrução de AND para OU Editar2: Alterada novamente. Ahh a pressão do meu primeiro post no StackExchange!
fonte
aList
vez de anexar cada entrada. 2) Use emenumerate()
vez de ter um contador separado para o índice.Primeiro você precisa de um cursor de pesquisa; Eu não acho que você pode obter valores com um cursor de atualização. Em cada iteração, use aNext = row.next (). GetValue ('a') para obter o valor da próxima linha.
Para obter o valor da linha anterior, eu configuraria uma variável fora do loop for igual a zero. Isso é atualizado para igualar o valor atual das linhas de 'a'. Você pode acessar essa variável na próxima iteração.
Isso satisfaria sua equação de B = A (rowid-1) + A (rowid + 1)
fonte
fieldA
e usá-lo para calcular um novo valor parafieldB
.)