Quero criar uma varredura com uma resolução de 25 metros × 25 metros, em que cada célula contém a distância da costa mais próxima, calculada a partir do centro da célula. Para fazer isso, tudo o que tenho é um arquivo de forma das costas da Nova Zelândia .
Eu tentei seguir o tutorial de Dominic Roye para fazê-lo em R que funciona ... mais ou menos. É uma resolução de até 1 km × 1 km, mas se eu tentar aumentar a RAM, ela excederá a disponível no meu PC (é necessário ~ 70 gb de RAM) ou qualquer outra que eu também tenha acesso. Ao dizer isso, acho que essa é uma limitação do R e suspeito que o QGIS possa ter uma maneira mais computacionalmente eficiente de criar esse raster, mas sou novo nele e não consigo descobrir como fazê-lo.
Eu tentei seguir Criando raster com distância para o recurso usando o QGIS? para criá-lo no QGIS, mas ele retorna este erro:
_core.QgsProcessingException: Não foi possível carregar a camada de origem para INPUT: C: /..../ Litoral / nz-linhas de costa-e-ilhas-polígonos-topo-150k.shp não encontrado
e não sei por que.
Alguém tem alguma sugestão do que pode estar errado ou uma maneira alternativa de fazer isso?
Editar:
A varredura que espero produzir teria cerca de 59684 linhas e 40827 colunas, para que ela se sobreponha à varredura anual de déficit de água da LINZ. Se a varredura produzida for maior que a varredura anual por déficit hídrico, eu posso cortá-la em R ...
Uma coisa que eu acho que pode ser um problema em potencial é que o arquivo de forma do litoral da Nova Zelândia tem uma grande quantidade de mar entre as ilhas, e não estou interessado em calcular a distância da costa para essas células. Eu realmente só quero calcular os valores para células que incluem alguma fatia de terra. Não tenho certeza de como fazer isso, ou se é realmente um problema.
fonte
Respostas:
Com PyQGIS e GDAL, a biblioteca python não é muito difícil de fazer isso. Você precisa de parâmetros de transformação geográfica (resolução superior esquerda x, x pixel, rotação, superior esquerda y, rotação, resolução ns pixel) e número de linhas e colunas para criar a rasterização resultante. Para calcular a distância da costa mais próxima, é necessária uma camada vetorial para representar a costa.
Com o PyQGIS , cada ponto raster como centro da célula é calculado e sua distância ao litoral é medida usando o método 'closestSegmentWithContext' da classe QgsGeometry . A biblioteca python GDAL é usada para produzir uma varredura com esses valores de distância na matriz de linhas x colunas.
O código a seguir foi usado para criar uma varredura de distância (resolução de 25 m × 25 m e 1000 linhas x 1000 colunas) começando no ponto (397106.7689872353, 4499634.06675821); perto da costa oeste dos EUA.
Depois de executar o código acima, a rasterização resultante foi carregada no QGIS e parece com a imagem a seguir (pseudocolor com 5 classes e rampa espectral). A projeção é UTM 10 N (EPSG: 32610)
fonte
Pode ser uma solução para tentar:
Agora você deve ter uma nova camada de pontos com a distância da costa, como neste exemplo
fonte
Dentro do QGIS, você pode tentar o plugin GRASS. Tanto quanto sei, ele gerencia a memória melhor que o R e espero que a outra solução falhe em grandes áreas.
o comando GRASS é chamado r.grow.distance, que você pode encontrar na barra de ferramentas de processamento. Observe que você precisa converter sua linha para varredura primeiro.
Um de seus problemas pode ser o tamanho da saída, para que você possa adicionar algumas opções úteis de criação, como (para um arquivo tif) BIGTIFF = SIM, TILED = SIM, COMPRESSAR = LZW, PREDICTOR = 3
fonte
Eu tentaria o contrário. Se você estiver usando o polígono da NZ, converta as arestas do polígono em linha. Depois disso, crie um buffer no limite a cada 25 metros de distância do limite (talvez o centrídeo possa ajudar a determinar quando parar). Em seguida, corte os buffers com polígono e depois converta esses polígonos em varredura. Não sei se isso funcionaria, mas definitivamente você precisará de menos RAM. E o PostGiS é ótimo quando você tem problemas de desempenho.
Espero que ajude pelo menos um pouco :)
fonte
Originalmente, eu não ia responder minha própria pergunta, mas um colega meu (que não usa este site) me escreveu um monte de código python para fazer o que eu estou procurando; incluindo limitar as células para ter a distância de costa apenas para células terrestres e deixar as células marítimas como NAs. O código a seguir deve ser capaz de executar em qualquer console python, com as únicas coisas que precisam de alteração:
1) Coloque o arquivo de script na mesma pasta que o arquivo de formas de interesse;
2) altere o nome do shapefile no script python para qualquer que seja o nome do seu shapefile;
3) defina a resolução desejada e;
4) altere a extensão para corresponder a outros rasters.
Arquivos de formato maiores do que o que estou usando exigirão grandes quantidades de RAM, mas, caso contrário, o script é rápido de executar (cerca de três minutos para produzir uma varredura de 50m de resolução e dez minutos para uma varredura de 25m).
fonte