¿Cuál es la mejor manera de producir un mapa de densidad a partir de puntos ponderados en QGIS?

18

Realmente me gustaría repetir la funcionalidad de la herramienta ArcGIS Kernel Density. ¿Cómo podría hacer eso?

Me gustaría limitar las respuestas al software de código abierto y fácil de instalar, es decir, QGIS se instala fácilmente con GRASS en todas las plataformas, por lo que QGIS + GRASS estaría bien, pero SAGA no (desafortunadamente, ya que tiene lo que puede ser la herramienta ideal)

Estoy tratando de producir mapas de densidad de vida silvestre en áreas protegidas en QGIS. El mapa de densidad en el siguiente ejemplo se produjo en ArcGIS a partir de observaciones puntuales de la vida silvestre, con recuentos brutos del tamaño del grupo (un campo en el archivo vectorial) utilizado para ponderar la densidad de cada celda de la cuadrícula en la herramienta Densidad del núcleo (SpatialAnalyst), con un radio de búsqueda elegido y un tamaño de celda de cuadrícula:

Densidad de vida silvestre en el Parque Nacional Kafue con celdas de cuadrícula de 5x5km y densidad de grano de radio de 7.5 km

En una pregunta anterior sobre densidad , se sugirió utilizar la herramienta GRASS v.kernel para imitar la herramienta ArcGIS Kernel Density, pero v.kernel no hace el mismo trabajo . Después de mirar el manual y (con éxito) producir un mapa de densidad, parece que la función v.kernel solo funciona con la densidad de puntos , y no hay oportunidad de dar una variable para cada punto (como recuentos sin procesar) para ponderar cada punto .

ACTUALIZAR

Parece que hay varias *.surf.*herramientas en GRASS que pueden ayudar a crear una superficie de densidad, y estas aceptan una columna de ponderación o un valor z, o se realizan en rásteres. @underdark sugirió v.surf.rst, y la 'columna z' sería mi variable de ponderación (conteo), pero no puedo entender cómo pedirle a la herramienta que cree un cierto tamaño de cuadrícula o use un cierto radio.

¿Sugerencias sobre cómo usar v.surf.rst o cualquier otro método?


Data de muestra

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
fuente
¿Puedes describir más tus datos de entrada? Quizás v.surf.rst sería más apropiado que v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . ¿Tiene un valor de conteo por celda de cuadrícula que se muestra arriba?
oscuro
@underdark: se agregaron algunos datos de muestra. Son datos de puntos con recuentos (número de elefantes vistos) y puede haber más de una observación por celda de cuadrícula. Normalmente en ArcGIS, 'conteo' se convertiría en el campo 'población' de la herramienta de densidad del núcleo.
Simbamangu
Cuanto más lo pienso, menos creo que v.kernel sea una buena opción para su caso de uso. ¿Has revisado la literatura? Tal vez primero haga una pregunta sobre qué método es apropiado en este caso.
oscuro
Mi pregunta principal es cómo repetir la funcionalidad de la densidad del núcleo de Arcview, que es un método conocido. ¡Tienes razón, v.kernel es casi seguro que no es la herramienta adecuada para hacerlo!
Simbamangu
@underdark, gracias. He ampliado un poco la pregunta, lo que puede ayudar; v.surf.rst parece apropiado, pero podría usar alguna orientación sobre su uso.
Simbamangu el

Respuestas:

8

De acuerdo con su página de manual, el comando GRASS r.resamp.filter lo hará para los rásteres que representan datos de puntos exactamente lo que ArcGIS hará para las capas de puntos : use la filter=boxopción para un ráster "simple" y use la filter=gaussopción para el otro núcleo ArcGIS. Use la -nbandera para evitar propagar nulos.


Tenga en cuenta que las estimaciones de densidad del núcleo (también conocido como "mapas de calor") no son interpolaciones de los datos. El valor de un KDE en una ubicación x estima la cantidad de un valor " Z " por unidad de área cerca de x . (El radio o "ancho de banda" cuantifica lo que significa "cerca"). No es necesario definir los valores de Z en cada ubicación posible en el mapa. Por ejemplo, Z podría representar la presencia de algo como una persona, en cuyo caso el KDE da densidad de población . Tampoco los valores de Z deben variar continuamente en todo el mapa. Para la interpolación, se supone que Zse define en todas las ubicaciones y que los datos son observaciones de los valores de Z en puntos específicos. El interpolador intenta predecir los valores no observados de Z en todos los demás puntos. Esto tendría sentido cuando Z es, por ejemplo, una temperatura o presión, pero generalmente no tiene sentido cuando Z registra la presencia de algo o cuando los datos son un censo completo. (En el último caso, contemple lo que podría significar un mapa de densidad de carreteras para una región y cómo podría entenderse la posibilidad de "interpolar" carreteras a través de áreas que no son carreteras).

whuber
fuente
Parece que no tengo r.resamp.filter en mi caja de herramientas GRASS (en OS X, GRASS 6.4). Sin embargo, hasta que lo mencionaste, no me había dado cuenta de que los 'mapas de calor' son lo mismo que KD; Asumí que estaban interpolando toda la superficie. ¿La herramienta Raster | Heatmap en QGIS hace un KD? ¿Qué es la 'relación de descomposición'?
Simbamangu
Creo que el término "mapa de calor" se ha cooptado en SIG de su significado original a uno que se refiere en general y vagamente a casi cualquier mapa similar a una trama. Dudo que cualquier SIG ofrezca una funcionalidad que coincida con el significado original.
whuber
Tras la investigación, la herramienta de mapa de calor en QGIS hace algo similar a KD en Arc, si establece la relación de decaimiento en 0 (reduciendo la densidad a 0 en los bordes del radio). Parece haber algunas diferencias: valores de celda calculados 25 veces más altos (radio de 5 km / celda de 2.5 km), como es la forma en que se aplica la función a las celdas: Arc parece usar un radio alrededor del punto real, mientras que QGIS selecciona la celda superpuesta y se estrecha desde ese punto.
Simbamangu el
2
"Mapa de calor" en el uso común parece significar muchas cosas: al mirar a mi alrededor, veo que se aplica a superficies interpoladas, a la densidad del núcleo y también a la coloración simple de píxeles no suavizados. Documento interesante sobre el uso / historial original, y parece que quizás deberíamos estar usando términos más precisos al etiquetar las herramientas QGIS.
Simbamangu el
3
@Simbamangu r.resamp.filter es nueva en la hierba 7 , pero hay una instantánea mensual para OS X . Además, la herramienta de mapa de calor no parece presentar una opción para el algoritmo para la distribución de densidad, por lo que no es exactamente equivalente a Kernel Density o r.resamp.filter, creo.
Torsti
3

El módulo 'Estimación de densidad de kernel' de SAGA es lo que está buscando.

Instale la interfaz del módulo SAGA en QGIS (en el menú: Complementos -> Obtener complementos de Python ...) y use el módulo. ¡Buena suerte!

Vladimir
fuente
Me ENCANTARÍA usar SAGA, pero estoy trabajando en OSX 10.7 y aún no lo he compilado con éxito (no hay binarios para OSX); Recientemente he usado horas probando más de un método de compilación, pero las compilaciones siempre fallan.
Simbamangu 01 de
Luego, debe hacer una pregunta sobre la compilación SAGA en OSX 10.7. Como veo SAGA, la única alternativa razonable a la herramienta ArcGIS KD.
Vladimir el
3

Un método realmente simplista con GRASS GIS que está más cerca de la densidad de puntos en ArcMap que de la densidad del kernel:

  1. Importe los puntos a un mapa ráster con el r.in.xyzmétodo de uso = suma a una resolución ráster especificada (establecida con g.region).

  2. Use r.neighborspara suavizar el mapa con method = average (que es el valor predeterminado) y use el tamaño de la opción para establecer el radio de búsqueda.

(No tengo acceso a GRASS en este momento, ¡así que en realidad no lo intenté!)

Torsti
fuente
v.in.xyzy v.neighborstambién podría funcionar. Sin embargo, el manual no especifica cómo establecer qué atributo se utiliza v.neighbors.
Torsti
2

Como solicitó más orientación sobre v.surf.rst, aquí están mis entradas

Primero, sobre el tamaño de la cuadrícula: puede usar Plugin -> GRASS -> Editar la región de GRASS actual y establecer la resolución de salida. Su salida de v.surf.rst tendrá esa resolución.

Para el radio, la "tensión" parece ser el parámetro. No soy un experto en este algoritmo, pero leyendo el manual, este parece ser el bit relevante

"... La alta tensión" aumenta las distancias entre los puntos "y reduce el rango de impacto de cada punto, la baja tensión" disminuye la distancia "y los puntos se influyen entre sí a mayor distancia) .."

Entonces podría usar el parámetro de tensión aproximadamente como lo haría con el parámetro de radio.

A partir de sus datos de muestra, el resultado de v.surf.rst se ve a continuación y parece razonable dado que está utilizando los recuentos como pesos para la interpolación

ingrese la descripción de la imagen aquí

pensamientos espaciales
fuente
1
Gracias por esto, mucho más fácil de entender que la página de ayuda. Sin embargo, como se señaló anteriormente por @whuber, la interpolación no es el método correcto para este tipo de datos de muestra puntual.
Simbamangu
2

Si bien no lo he probado, en el repositorio de QGIS Contributors hay un complemento llamado 'Estimación del rango de inicio con R'. Esto incluye los cálculos de Kernel (densidad?). Creo que, si funciona, este sería el mejor método. R hará el método estadístico real para calcular la densidad del núcleo.

Si tienes R instalado, deberías poder instalar el complemento y probarlo.

Alex Leith
fuente
1

Si acepta hacer un poco de programación en java fuera de qgis, simplemente puede usar esta biblioteca del generador de mapas de densidad .

Usando el constructor HeatMapBuilder(int w, int h, int[][] pts, int[] weights), es posible asignar un peso a cada punto según lo necesite. La imagen de salida se puede recuperar con el getImage()método y guardar en su disco con un ImageIO.write("mymap.png").

Aquí hay un ejemplo de salida:

mapa de calor con biblioteca opencarto java

Es posible cambiar la intensidad de suavizado y la paleta de colores.

julien
fuente