Qual é a melhor maneira de produzir um mapa de densidade a partir de pontos ponderados no QGIS?

18

Eu realmente gostaria de repetir a funcionalidade da ferramenta ArcGIS Kernel Density - como eu poderia fazer isso?

Gostaria de limitar as respostas ao software de código aberto e fácil de instalar - ou seja, o QGIS é instalado facilmente com o GRASS em todas as plataformas, para que o QGIS + GRASS fique bom, mas o SAGA não (infelizmente, pois tem o que pode ser a ferramenta ideal).

Estou tentando produzir mapas de densidade da vida selvagem em áreas protegidas no QGIS. O mapa de densidade no exemplo a seguir foi produzido no ArcGIS a partir de observações pontuais da vida selvagem, com contagens brutas do tamanho do grupo (um campo no arquivo vetorial) usado para ponderar a densidade de cada célula da grade na ferramenta Densidade do Kernel (SpatialAnalyst), com um raio de pesquisa escolhido e tamanho da célula da grade:

Densidade da vida selvagem no Parque Nacional Kafue com células de grade de 5 x 5 km e densidade de kernel de 7,5 km de raio

Em uma pergunta anterior sobre densidade , foi sugerido o uso da ferramenta GRASS v.kernel para imitar a ferramenta ArcGIS Kernel Density, mas o v.kernel não faz o mesmo trabalho . Depois de examinar o manual e (com sucesso) produzir um mapa de densidade, parece que a função v.kernel funciona apenas com densidade de pontos e não há oportunidade de fornecer uma variável para cada ponto (como contagens brutas) para ponderar cada ponto .

ATUALIZAR

Parece haver várias *.surf.*ferramentas no GRASS que podem ajudar a criar uma superfície de densidade - e elas aceitam uma coluna de ponderação ou valor z, ou são executadas em rasters. @underdark sugeriu v.surf.rst - e a 'zcolumn' seria minha variável de ponderação (contagem) - mas não consigo descobrir como pedir à ferramenta para criar um determinado tamanho de grade ou usar um determinado raio.

Sugestões sobre como usar o v.surf.rst ou qualquer outro método?


Dados de amostra

x,y,count
431250,8707500,0
418750,8707500,5
413750,8707500,3
411250,8707500,1
408750,8685000,0
411250,8685000,0
416250,8685000,0
416250,8682500,6
411250,8682500,3
418750,8680000,0
433750,8677500,3
421250,8677500,0
423750,8675000,1
431250,8672500,0
428750,8672500,2
426250,8672500,2
423750,8670000,0
Simbamangu
fonte
Você pode descrever mais os dados de entrada? Talvez o v.surf.rst seja mais apropriado que o v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . Você tem um valor de contagem por célula da grade mostrada acima?
Underdark
@underdark - Adicionados alguns dados de amostra. São dados pontuais com contagens (número de elefantes vistos) e pode haver mais de uma observação por célula da grade. Normalmente no ArcGIS 'count' se tornaria o campo 'population' da ferramenta de densidade do kernel.
Simbamangu 1/11/12
Quanto mais penso nisso, menos acredito que o v.kernel é uma boa opção para o seu caso de uso. Você checou a literatura? Talvez primeiro faça uma pergunta sobre qual método é apropriado nesse caso.
Underdark
minha pergunta principal é como repetir a funcionalidade da densidade do kernel do Arcview, que é um método conhecido. Você está certo, o v.kernel quase certamente não é a ferramenta certa para fazer isso!
Simbamangu 1/11/12
@underdark, obrigado - eu expandi a questão um pouco, o que pode ajudar; O v.surf.rst parece apropriado, mas pode usar algumas orientações sobre seu uso.
Simbamangu

Respostas:

8

De acordo com sua página de manual, o comando GRASS r.resamp.filter fará para rasters que representam dados de pontos exatamente o que o ArcGIS fará para camadas de pontos : use a filter=boxopção para uma varredura "simples" e use a filter=gaussopção para o outro kernel do ArcGIS. Use o -nsinalizador para evitar a propagação de nulos.


Observe que as estimativas de densidade do kernel (também conhecidas como "mapas de calor") não são interpolações dos dados. O valor de um KDE em um local x estima a quantidade de um valor " Z " por unidade de área próxima a x . (O raio ou "largura de banda" quantifica o que significa "próximo".) Os valores de Z não precisam ser definidos em todos os locais possíveis no mapa. Por exemplo, Z pode representar a presença de algo como uma pessoa; nesse caso, o KDE fornece densidade populacional . Os valores de Z também não precisam variar continuamente no mapa. Para interpolação, assume - se que Zé definido em todos os locais e que os dados são observações dos valores de Z em pontos especificados. O interpolador tenta prever os valores não observados de Z em todos os outros pontos. Isso faria sentido quando Z é, digamos, uma temperatura ou pressão, mas geralmente não faz sentido quando Z registra a presença de algo ou quando os dados são um censo completo. (No último caso, considere o significado de um mapa de densidade de estradas para uma região e como alguém poderia "interpolar" estradas em áreas fora da estrada.)

whuber
fonte
Parece que não tenho o r.resamp.filter na minha caixa de ferramentas GRASS (no OS X, GRASS 6.4). No entanto - até você mencionar, eu não tinha percebido que 'mapas de calor' são a mesma coisa que o KD; Eu assumi que eles estavam interpolando toda a superfície. A ferramenta Raster | Heatmap no QGIS executa um KD? Qual é a 'taxa de decaimento'?
Simbamangu 6/11/12
Acredito que o termo "mapa de calor" tenha sido cooptado no SIG do seu significado original para um que se refira de maneira geral e vaga a quase todos os mapas rasterizados. Duvido que qualquer SIG ofereça funcionalidades que correspondam ao significado original.
whuber
Após a investigação, a ferramenta heatmap no QGIS faz algo semelhante ao KD no Arc, se você definir a taxa de decaimento para 0 (afunilando a densidade para 0 nas bordas do raio). Parece haver algumas diferenças: valores calculados da célula 25 x mais altos (5 km de raio / 2,5 km de célula), como é a maneira como a função é aplicada às células - o arco parece usar um raio ao redor do ponto real, enquanto o QGIS seleciona a célula sobreposta e afunila a partir desse ponto.
Simbamangu
2
O "mapa de calor" em uso comum parece significar muitas coisas - olhando em volta, eu o vejo aplicado a superfícies interpoladas, densidade do núcleo e coloração simples de pixels não suavizados também. Artigo interessante sobre o uso / histórico original - e parece que deveríamos estar usando termos mais precisos para rotular as ferramentas do QGIS.
Simbamangu
3
@Simbamangu r.resamp.filter é novo na grama 7 , mas há um instantâneo mensal para OS X . Além disso, a ferramenta heatmap não parece apresentar uma opção para o algoritmo de distribuição de densidade, portanto, não é exatamente equivalente à densidade do kernel ou ao r.resamp.filter, eu acho.
Torsti
3

O módulo SAGA 'Kernel Density Estimation' é o que você está procurando.

Instale a interface do módulo SAGA no QGIS (no menu: Plugins -> Buscar plugins Python ..) e use o módulo. Boa sorte!

Vladimir
fonte
Eu adoraria usar o SAGA, mas estou trabalhando no OSX 10.7 e ainda tenho que construí-lo com êxito (não há binários para o OSX); Recentemente, usei horas tentando mais de um método de compilação, mas as compilações sempre falham.
Simbamangu
Então você deve fazer uma pergunta sobre a compilação do SAGA no OSX 10.7. Na minha opinião, a SAGA é a única alternativa razoável à ferramenta ArcGIS KD.
Vladimir
3

Um método realmente simplista com o GRASS GIS mais próximo da densidade de pontos no ArcMap do que da densidade de kernel:

  1. Importe os pontos para um mapa de varredura r.in.xyzusando o método = sum em uma resolução de varredura especificada (definida com g.region).

  2. Use r.neighborspara suavizar o mapa com o método = average (que é o padrão) e use o tamanho da opção para definir o raio da pesquisa.

(Eu não tenho acesso ao GRASS no momento, então eu realmente não tentei isso!)

Torsti
fonte
v.in.xyze v.neighborstambém pode funcionar. O manual não especifica como você define em qual atributo é usado v.neighbors.
Torsti
2

Como você solicitou mais orientações sobre o v.surf.rst, aqui estão minhas entradas

Primeiro, sobre o tamanho da grade - você pode usar o Plugin -> GRASS -> Editar a região GRASS atual e definir a resolução de saída. Sua saída do v.surf.rst terá essa resolução.

Para o raio, a 'tensão' parece ser o parâmetro. Eu não sou especialista neste algoritmo, mas lendo o manual, este parece ser o bit relevante

"... Alta tensão" aumenta as distâncias entre os pontos "e reduz a faixa de impacto de cada ponto, baixa tensão" diminui a distância "e os pontos se influenciam em distâncias mais longas) .."

Portanto, você pode usar o parâmetro de tensão aproximadamente como usaria o parâmetro radius.

A partir dos dados de amostra, o resultado do v.surf.rst se parece abaixo e parece razoável, pois ele está usando as contagens como pesos para interpolação

insira a descrição da imagem aqui

pensamentos espaciais
fonte
1
Obrigado por isso - muito mais fácil de entender do que a página de ajuda. Como observado acima por @whuber, a interpolação não é o método certo para esse tipo de dados de amostra de pontos.
Simbamangu 7/11
2

Embora eu não o tenha testado, no repositório do QGIS Contribuintes, existe um plug-in chamado 'Estimativa do intervalo doméstico com R'. Isso inclui cálculos do Kernel (densidade?). Acho que, se funcionar, esse seria o melhor método. R fará o método estatístico real para calcular a densidade do kernel.

Se você tiver o R ​​instalado, poderá instalar o plug-in e experimentar.

Alex Leith
fonte
1

Se você aceitar fazer um pouco de programação java fora do qgis, poderá simplesmente usar esta biblioteca do construtor de mapas de densidade .

Usando o construtor HeatMapBuilder(int w, int h, int[][] pts, int[] weights), é possível atribuir um peso para cada ponto conforme necessário. A imagem de saída pode ser recuperada com o getImage()método e salva no seu disco com a ImageIO.write("mymap.png").

Aqui está um exemplo de saída:

mapa de calor com a biblioteca java opencarto

É possível alterar a força de suavização e a paleta de cores.

julien
fonte