2010-02-05 15 views
7

SpatialKey genera algunos mapas de calor realmente atractivos, y estamos estudiando qué implica hacer esto para que un proyecto interno pueda visualizar grandes cantidades de puntos. Estoy buscando comentarios sobre algunas ideas sobre dónde empezar (y es solo un problema realmente interesante).La generación de mapas de densidad/calor como SpatialKey

SpatialKey heatmap http://img697.imageshack.us/img697/7964/resolutiondays508x17550.jpg

Sabemos que están usando Flash, y de lo que podemos decir, los mapas de calor son interactivos en lugar de ser procesada desde un servidor de baldosas. Nuestra primera conjetura sobre cómo se implementa esto es que el servidor proporciona a su cliente Flash una cuadrícula, cada celda tiene un conteo calculado por el servidor. El cliente Flash luego hace una interpolación basada en los valores de la celda en la grilla para hacer la salida bonita que ve arriba.

En este momento, solo me interesa saber cómo podrían generar la red de forma eficiente desde el servidor (si nuestra suposición sobre su implementación es incluso correcta). Parece que implicaría:

  1. Realizar una consulta para lo que está actualmente en el mapa los límites
  2. Realización de una subconsulta agregación para cada celda dentro de esos límites (haciendo un recuento, suma o la media, como en el ejemplo anterior) .

Tira haciendo esto en varios niveles de zoom con una buena resolución de cuadrícula y parece que necesitarías un índice espacial personalizado para hacerlo eficiente.

¿Alguno de los interesados ​​en explicar una ruta alternativa? Si es importante, estamos acostumbrados a almacenar nuestros datos en PostgreSQL con PostGIS para el índice espacial, pero estoy dispuesto a intentar cualquier cosa.

Respuesta

5

Como supongo, me imagino que han implementado una biblioteca GIS en Flash en el lado del cliente y están utilizando esto para proyectar las coordenadas de latitud y longitud en un espacio de píxeles. Luego se agregan por píxel para determinar la "altura" de cada píxel y lo renderizan igual que si hiciera un círculo, pero usando un relleno de degradado con una transparencia, con los colores de inicio y final del relleno de degradado determinados por la altura del pixel Múltiples círculos superpuestos uno encima del otro crearán píxeles más brillantes.

Una alternativa podría ser hacer esto en una escala de grises, luego asignar el valor de brillo a una escala de colores. Eso podría ser más eficiente.

Vendemos los mapas de calor treemap más tradicionales para uso de integración en aplicaciones de análisis visual (p. Ej., Heat map SDK), y ahora contamos con mapas de calor geográficos que colorean áreas. Leemos mapas ESRI Shapefile estándar y hacemos toda la proyección y representación en el lado del cliente (en Java, no en Flash, pero el mismo concepto). Creo que SpatialKey está haciendo lo mismo, ya que son compatibles con la representación de área completa, lo que realmente no se puede hacer si está utilizando un servidor de mosaico como Google Maps.

Todavía no estamos haciendo mapas de calor de densidad como este, pero hemos realizado un par de pruebas usando imágenes estáticas como fondo. Si desea más información, hágamelo saber y puedo preguntarle a mi desarrollador cómo lo hicimos. Sé que actualmente estamos desarrollando más funciones basadas en puntos, aunque todavía no sé dónde están los mapas de densidad de calor en el cronograma.

SpatialKey acaba de escribir una buena publicación sobre los diferentes mapas de calor rellenos de área (es decir, mapas temáticos) y mapas de calor de densidad. Puede verificarlo al http://blog.spatialkey.com/2010/02/comparing-thematic-maps-with-density-heatmaps/.

Si lo hace encontrar una buena manera de hacer mapas de calor densidad, estaría interesado en aprender cómo lo hizo, ya que sería una valiosa adición a nuestro análisis visual SDK. La mejor de las suertes.

+0

me he dado cuenta de que puede haber malinterpretado la pregunta. La pregunta aparece dirigida a cómo obtener el conjunto de datos que contiene la latitud, longitud y "altura", en lugar de cómo representarlo. Una vez más, sin saber cómo SpatialKey está haciendo esto, creo que al menos parcialmente está bien. En vez de ejecutar subconsultas para cada celda, lo que podría abrumar rápidamente a la base de datos (una cuadrícula de 10x10 requeriría 100 subconsultas), se puede hacer lo siguiente: - Hacer que el lado del cliente pasa la anchura y la altura de la superficie de hacer junto con los límites en longitud y latitud –

+0

- Calcula la resolución de la longitud y la latitud haciendo un mapeo de rango entre longitud y latitud y ancho y alto. Esto le indica el ancho y alto efectivo del contenedor para cada celda desde una perspectiva de latitud y longitud. - Consultar todos los puntos en los límites de longitud y latitud - Iterar a través de cada punto y redondear a la longitud y latitud más cercanas - Almacenar resultado de una búsqueda de tabla hash donde la clave es la longitud binned y latitud y el valor de ser el recuento –

+0

- salida el resultado como un conjunto de datos con tres columnas: longitud, latitud y contar (por ejemplo: altura) el cliente puede entonces fácilmente renderizar este conjunto de datos usando una biblioteca GIS en el front-end. O bien, puede preprogramar los puntos y enviarlos al front-end utilizando coordenadas X, Y de píxeles. [Nota: Me acabo de dar cuenta de que mi uso del término "altura" aquí puede ser confuso. Esto se debe a un mapa de densidad es esencialmente un mapa tolopogical de color con el color que representa la altura de cada punto] –

0

MapReduce para su mapa totales agregados reales, y algo con Indexación Geoespacial para la base de datos - para alimentar a estos trabajos de MapReduce. Estoy buscando implementar este mismo enfoque, pero para interfaces en lugar de mapas :) MongoDB parece ser una buena opción en este momento.

Cuestiones relacionadas