1 votos

Creación de un mapa de calor de la probabilidad de entrega en QGIS3

Estoy utilizando QGIS 3.4.2 para crear un mapa de calor para trazar el lugar de origen donde se genera un mensaje de red, en una red vehicular.
He separado los mensajes en dos grupos, uno en cada capa: entregados y no entregados.
Hasta ahora funciona al 100%.

Ahora quiero combinar ambas capas para generar un único mapa térmico, que debe mostrar el porcentaje de entrega combinado.
Por ejemplo, si en una región determinada se generaron 4 mensajes y sólo se pudo entregar uno de ellos, el porcentaje debería indicar un 25%...

Actualmente estoy utilizando dos archivos CSV separados y muy básicos, uno para los mensajes entregados y otro para los mensajes no_entregados:

Longitude,Latitude
-5483420,-2938848
-5490938,-2938382
-5480800,-2953976

Pero puedo fusionarlos fácilmente y crear un único CSV similar a este:

Longitude,Latitude,Delivered
-5483420,-2938848,Y
-5490938,-2938382,N
-5480800,-2953976,N

No encuentro ni un solo ejemplo en Internet.

1voto

Jakub P. Puntos 126

Sus coordenadas no parecen latitudes y longitudes. He supuesto que son coordenadas X e Y proyectadas en Web Mercator. Así que empecé un nuevo proyecto en QGIS, cargué el mapa base de OpenStreet Maps y comprobé esas coordenadas. Vi que eran de Curitiba.

Empecé a buscar datos geoespaciales abiertos de Curitiba para poder utilizar información real en esta respuesta. Encontré el siguiente sitio de datos geográficos: https://ippuc.org.br/geodownloads/geo.htm

Desde allí descargué el fichero de terminales de transporte, los datos están referidos al sistema SIRGAS 2000 y proyectados en UTM 22S: https://ippuc.org.br/geodownloads/SHAPES_SIRGAS/TERMINAL_DE_TRANSPORTE_SIRGAS.zip

Mirando la tabla de atributos, se me ocurrió que podía asignar valor Y a las entidades que tuvieran datos de inauguración anteriores a 1983, y valor N a las demás. Llamé al campo "older_than_1983".

1

He eliminado otros campos y he extraído dos capas vectoriales, una con todas las estaciones y otra sólo con las antiguas.

2

En este momento tengo algunos datos de prueba para tratar de hacer un mapa de calor de la proporción, lo que indica: En qué proporción, la densidad de estaciones de transporte en un área de Curitiba fue inaugurada antes de 1983, con respecto a la densidad total de estaciones de transporte para ese sector. El radio a considerar fue de 5000m.


Lo primero que hice fue generar dos mapas de calor, con el HeatMap (estimación de la densidad del núcleo) una para cada capa vectorial. Ambas con los mismos parámetros siguientes:

3

Los valores resultantes en los rásters no eran exactamente los mismos, como era de esperar, pero estaban aproximadamente en el rango entre 0 y 4 (terminales en ronda de 5000m). He dado el mismo estilo a ambos raster:

4

Para obtener la relación entre los valores de las capas, realicé una operación de álgebra raster, con la función Calculadora de trama y la siguiente expresión:
("Terminales_Total_HeatMap@1" > 0) * 100 * "Terminales_Yes_HeatMap@1" / "Terminales_Total_HeatMap@1"

5

La lógica de esa expresión la describiría de la siguiente manera: Cuando el valor de píxel de la banda 1 de la capa "Terminales_Total" es mayor que cero, la condición entre paréntesis devuelve un 1, indicando verdadero, si la condición resulta falsa, devuelve un 0; al resultado de esa condición, lo multiplicamos por el porcentaje de la proporción entre los valores de píxel de la capa "Terminales_Sí" y la capa "Terminales_Total".

Sorprendentemente, la trama de salida tenía valores entre 0 y 440:

6

Es decir, en algunos lugares había 4 veces más terminales que en 1983, con respecto al total. Esto es obviamente falso. Viendo la imagen, es difícil encontrar cuales son los píxeles con valores altos (deberían ser blancos). Supongo que como las capas de origen tienen diferente extensión, alguna estimación en los bordes de un raster ya daba un valor cercano a 5 mientras que en el otro raster todavía daba un valor cercano a 1.

De todos modos, se podría hacer una operación algebraica más para deshacerse de los valores superiores a 100. Os dejo inquietos. Yo lo solucioné sólo para la visualización, en el estilo de la capa, estirando la rampa de color entre 0 y 100:

7


Analicemos un poco el problema de los porcentajes superiores a 100.

Al principio pensé que el problema se debía a una alineación incorrecta de los píxeles entre ambos rásters de entrada, porque tienen longitudes diferentes. Sin embargo, cuando revisé la información de los raster, vi que ambos tenían sus píxeles en coordenadas múltiples de 10 metros, por lo que estaban correctamente alineados.

Decidí hacer un nuevo álgebra para saber cuáles eran los píxeles que daban un porcentaje superior a 100. Renombré el mapa de calor de porcentajes como: Porcentaje_mayor_que_100_Mapa_calor . Vale, asignar buenos nombres a las capas no parece estar entre mis virtudes. Pero puedo lidiar con eso.

He creado una nueva álgebra de trama con la siguiente expresión:

("Percentage_Greater_than_100_Heatmap@1" > 100)

La salida es una trama que contiene el valor 1 para los píxeles de origen que tienen un valor superior a 100, y el valor cero para los demás.

He añadido una asignación del valor 0 como NoData en el estilo de la capa de salida para ver sólo los píxeles de valor 1:

8

La ubicación de los píxeles negros me resulta totalmente extraña, esperaba ver sólo unos pocos puntos.
Seleccioné cualquier píxel negro con la herramienta identificar, para entender a qué se debía el valor erróneo:

9

En efecto, el valor del mapa térmico "Sí" es superior al valor del mapa térmico "Total", en contra de la lógica.

Lo considero una indeterminación de la estimación del algoritmo que genera los mapas térmicos. Es decir, el término "estimación" tiene sentido en el nombre del algoritmo ( HeatMap (estimación de la densidad del núcleo) ).

Creo que esos píxeles deberían valer el 100%. Los corrijo con la siguiente expresión en la calculadora de trama:

("Percentage_Greater_than_100_Heatmap@1" > 100) * 100 +
("Percentage_Greater_than_100_Heatmap@1" <= 100) * "Percentage_Greater_than_100_Heatmap@1"

Esta expresión devuelve el valor 100 para los píxeles que cumplen la condición de tener un valor superior a 100 en la entrada, y conserva el valor del píxel de entrada para los demás.

El resultado es una trama con valores superiores a cero e inferiores o iguales a 100.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X