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:
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
Respostas:
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=box
opção para uma varredura "simples" e use afilter=gauss
opção para o outro kernel do ArcGIS. Use o-n
sinalizador 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.)
fonte
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!
fonte
Um método realmente simplista com o GRASS GIS mais próximo da densidade de pontos no ArcMap do que da densidade de kernel:
Importe os pontos para um mapa de varredura
r.in.xyz
usando o método = sum em uma resolução de varredura especificada (definida comg.region
).Use
r.neighbors
para 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!)
fonte
v.in.xyz
ev.neighbors
também pode funcionar. O manual não especifica como você define em qual atributo é usadov.neighbors
.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
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
fonte
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.
fonte
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 ogetImage()
método e salva no seu disco com aImageIO.write("mymap.png")
.Aqui está um exemplo de saída:
É possível alterar a força de suavização e a paleta de cores.
fonte