Sou realmente novo em Python e gostaria de saber se existe um método rápido para obter valores de célula de um pixel raster por pixel e as coordenadas (mapear coordenadas XY do centro de cada pixel) usando Python no ArcGIS 10?
Para descrever isso ainda mais, preciso obter o mapa X, o mapa Y e o valor da célula do primeiro pixel, atribuir esses três valores a três variáveis e repetir esta etapa para o restante dos outros pixels (percorrer toda a varredura).
Eu acho que preciso descrever minha pergunta mais. O problema é que eu preciso obter a localização XY de um pixel da primeira varredura e obter os valores das células de várias outras rasters correspondentes a essa localização XY. Esse processo deve percorrer todos os pixels da primeira varredura sem criar nenhum arquivo shapefile de ponto intermediário, pois consumirá muito tempo, pois tenho que lidar com uma varredura com quase 8 bilhões de pixels. Além disso, preciso fazer isso usando Python no ArcGIS 10.
@ JamesS: Muito obrigado pela sua sugestão. Sim, isso funcionaria para uma varredura, mas eu preciso coletar os valores das células para várias outras rasters também. O problema é que, depois de obter as coordenadas X e Y do primeiro pixel da primeira varredura, preciso obter o valor da célula da segunda varredura correspondente àquele local X, Y da primeira varredura, depois à terceira varredura e assim por diante. Então, acho que, ao percorrer o primeiro raster, obter a localização X e Y de um pixel e obter os valores das células da outra raster correspondente a esse local devem ser feitos simultaneamente, mas não tenho certeza. Isso pode ser feito convertendo o primeiro raster em um shapefile de ponto e executando Extrair multivalores para a função de ponto no ArcGIS 10, mas eu '
@ hmfly: Obrigado, Sim, este método (RastertoNumpyarray) funcionará se eu conseguir obter a coordenada de um valor conhecido de linha e coluna da matriz.
@ whuber: Eu não quero fazer nenhum cálculo, tudo o que preciso fazer é escrever coordenadas XY e valores de célula em um arquivo de texto e isso é tudo
fonte
Respostas:
Seguindo a ideia do @ Dango, criei e testei (em pequenos rasters com a mesma extensão e tamanho de célula) o seguinte código:
Com base no código @hmfly, você pode ter acesso aos valores desejados:
Infelizmente, existe um 'mas' - o código é adequado para matrizes NumPy que podem ser manipuladas pela memória do sistema. Para o meu sistema (8 GB), a maior matriz era de cerca de 9000.9000.
Como minha experiência não me permite fornecer mais ajuda, você pode considerar algumas sugestões sobre como lidar com matrizes grandes: /programming/1053928/python-numpy-very-large-matrices
arcpy.RasterToNumPyArray
O método permite especificar o subconjunto da varredura convertida em matriz NumPy ( página de ajuda do ArcGIS10 ) o que pode ser útil ao agrupar grandes conjuntos de dados em submatrizes.fonte
Se você deseja apenas obter os valores de pixel (linha, coluna), pode escrever um script arcpy como este:
Mas, se você deseja obter a coordenada do pixel, o NumPyArray não pode ajudá-lo. Você pode converter a varredura em ponto pela ferramenta RasterToPoint e, em seguida, obter a coordenada arquivada pelo Shape.
fonte
O método mais simples para gerar coordenadas e valores de células em um arquivo de texto no ArcGIS 10 é a função de amostra , sem necessidade de código e, especialmente, sem necessidade de repetir cada célula. Na calculadora raster ArcGIS <= 9.3x , costumava ser tão simples quanto
outfile.csv = sample(someraster)
produzir um arquivo de texto com todos os valores e coordenadas de células (não nulos) (no formato z, x, y). No ArcGIS 10, parece que o argumento "in_location_data" agora é obrigatório, então você precisa usar a sintaxeSample(someraster, someraster, outcsvfile)
.Editar: Você também pode especificar vários rasters:
Sample([someraster, anotherraster, etc], someraster, outcsvfile)
. Se isso funcionaria em 8 bilhões de células, não tenho idéia ...Edit: Note, eu não testei isso no ArcGIS 10, mas usei a função de amostra por anos em <= 9.3 (e Workstation).
Edit: Agora testei no ArcGIS 10 e ele não será gerado em um arquivo de texto. A ferramenta altera a extensão do arquivo para ".dbf" automaticamente. No entanto ... o código python a seguir funciona como instruções de álgebra de mapa SOMA e MOMA ainda são suportadas no ArcGIS 10:
fonte
Uma maneira de fazer isso seria usar a ferramenta Raster_To_Point seguida pela ferramenta Add_XY_Coordinates . Você terminará com um shapefile em que cada linha na tabela de atributos representa um pixel da sua varredura com colunas para X_Coord , Y_Coord e Cell_Value . Em seguida, você pode percorrer esta tabela usando um cursor (ou exportá-la para algo como o Excel, se preferir).
Se você tiver apenas uma varredura para processar, provavelmente não vale a pena criar scripts - basta usar as ferramentas do ArcToolbox. Se você precisar fazer isso para muitos rasters, tente algo como isto:
[ Nota: Eu não tenho o ArcGIS 10 e não estou familiarizado com o ArcPy, portanto, este é apenas um esboço muito aproximado. Não foi testado e quase certamente precisará de ajustes para que funcione.]
Você pode fazer um loop sobre as tabelas de atributos shapefile usando um Cursor de Pesquisa ou (possivelmente mais simples) usando o dbfpy . Isso permitirá que você leia os dados da sua varredura (agora armazenados em uma tabela .dbf do shapefile) em variáveis python.
fonte
Talvez você possa criar um arquivo mundial para a varredura, encobri-la em uma matriz numpy. então, se você fizer um loop sobre a matriz, obterá os valores das células e, se você atualizar constantemente x, y do arquivo mundial, também terá as coordenadas para cada valor de célula. espero que seja útil.
fonte
O código de Marcin funcionou bem, exceto que um problema nas funções rasCentrX e rasCentrY estava fazendo com que as coordenadas de saída aparecessem em uma resolução diferente (como observou Grazia). Minha correção foi mudar
para
e
para
Usei o código para converter uma grade ESRI em um arquivo CSV. Isso foi obtido removendo a referência ao inRaster2 e usando um csv.writer para gerar as coordenadas e os valores:
Também não achei a transposição necessária
tão convertido que para
fonte
Feio, mas altamente eficaz:
fonte
Uma solução simples usando pacotes python de código aberto:
Fiona é útil, pois você pode abrir um shapefile, percorrer os recursos e (como eu) anexá-los a um
dict
objeto. De fato, afeature
própria Fiona é como umdict
, por isso é fácil acessar propriedades. Se meus pontos tivessem algum atributo, eles apareceriam neste ditado junto com as coordenadas, id, etc.O Rasterio é útil porque é fácil de ler no raster como uma matriz numpy, um tipo de dados leve e rápido. Também temos acesso a uma
dict
das propriedades de varredura, incluindo oaffine
, que é todos os dados que precisamos para converter as coordenadas x, y de varredura em coordenadas de linha, col. Veja a excelente explicação de @ perrygeo aqui .Terminamos com um
pt_data
tipodict
que possui dados para cada ponto e o extraídoraster_value
. Poderíamos reescrever facilmente o shapefile com os dados extraídos, se quiséssemos.fonte