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".
He eliminado otros campos y he extraído dos capas vectoriales, una con todas las estaciones y otra sólo con las antiguas.
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:
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:
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"
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:
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:
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:
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:
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.