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:
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
Respuestas:
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=box
opción para un ráster "simple" y use lafilter=gauss
opción para el otro núcleo ArcGIS. Use la-n
bandera 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).
fuente
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!
fuente
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:
Importe los puntos a un mapa ráster con el
r.in.xyz
método de uso = suma a una resolución ráster especificada (establecida cong.region
).Use
r.neighbors
para 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é!)
fuente
v.in.xyz
yv.neighbors
también podría funcionar. Sin embargo, el manual no especifica cómo establecer qué atributo se utilizav.neighbors
.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
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
fuente
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.
fuente
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 elgetImage()
método y guardar en su disco con unImageIO.write("mymap.png")
.Aquí hay un ejemplo de salida:
Es posible cambiar la intensidad de suavizado y la paleta de colores.
fuente