Processing math: 100%

5 votos

Mostrar millones de localizaciones muy, muy rápido

Estamos construyendo una aplicación cartográfica para los datos de los votantes utilizando PostGIS y Leaflet. Tiene una interfaz web. Nuestro archivo de votantes tendrá varios millones de entradas. En nuestra aplicación se puede seleccionar un subconjunto del archivo de votantes y mostrarlo.

Funciona bien cuando se hace zoom porque el conjunto de resultados es pequeño. El reto es averiguar qué hacer cuando el conjunto de resultados es grande. Tal y como yo lo veo, tenemos múltiples opciones:

  1. Sólo hay que abandonar cuando los conjuntos de resultados superan los X registros. El usuario recibiría un mensaje de error: "Demasiados registros para mostrar. Amplíe o reduzca sus criterios de búsqueda". Esto no es lo ideal.

  2. Intenta hacer un clustering en el lado del cliente y sólo muestra los clusters. Esto no funcionará porque no es posible transferir rápidamente conjuntos de resultados muy grandes al navegador. Ningún tipo de compresión conseguirá reducir un millón de registros a un tamaño aceptable.

  3. Intenta hacer un clustering del lado del servidor. Lo hemos hecho utilizando las técnicas que se encuentran aquí: ¿Grupos espaciales con PostGIS? La dificultad es, de nuevo, la velocidad; no se pueden agregar millones de localizaciones y calcular rápidamente los centroides de los grupos y los recuentos. Quizá lo estemos haciendo mal.

  4. Hacer algún tipo de agregación utilizando los códigos postales. Esto es más rápido; esencialmente se hace un select zipcode, count(*) from voters where (some predicate) group by zipcode . Luego se busca el centroide del código postal por separado. Es más rápido porque se trata de una consulta cubierta que normalmente se puede responder sólo con los índices. Pero los códigos postales no se muestran bien porque son densos en una ciudad y no tan densos en otros lugares.

  5. Agregado basado en algún otro campo, tal vez algo relacionado con los azulejos. No he pensado del todo en esto.

  6. Explotar alguna propiedad del índice GiST en la localización. Esto es teóricamente posible; un índice GiST ya "agrupa" puntos internamente en el Árbol R. No sé por dónde empezar con esta idea.

¿Cómo resuelven otras personas el problema de resumir millones de puntos, de forma dinámica y rápida, para presentarlos a un usuario final?

4voto

2015135 Puntos 6

Es habitual agregar por coordenadas redondeadas. Es decir, llamar a ST_SnapToGrid con cierta precisión, que devolverá puntos idénticos para puntos lo suficientemente cercanos, y luego agrupar por el punto resultante. Otra forma de hacer lo mismo, pero con menos control, es calcular el geohash - la longitud del geohash determina la distancia de ajuste en este caso.

1voto

Mark Jeronimus Puntos 196

Si su tabla no cambia, puede intentar crear clusters con, por ejemplo, ST_ClusterDBScan (ver por ejemplo esta pregunta ), para imitar el comportamiento de grupo de marcadores de folletos mostrando sólo un punto para cada grupo en dezoom. Tendría que almacenar una tabla para cada nivel de zoom deseado, y utilizar diferentes parámetros para crear cada tabla. Esta es una forma relativamente eficiente de hacerlo, pero si sus datos se modifican constantemente puede resultar difícil.

Si no, como dijo Michael, lo que yo haría es rasterizar, por ejemplo, usando coordenadas redondeadas (pero asegúrese de tener coordenadas proyectadas o x e y pueden tener grandes diferencias y su cuadrícula no se verá cuadrada) o también geohash Para ello, basta con añadir unas cuantas columnas (por ejemplo, para cada nivel deseado de geohash, como 6, 5, 4 y 3 debería ser suficiente). De esta manera se puede añadir un índice en estas columnas para contar de manera eficiente el número de puntos dentro de cada geohash, y mostrar un mapa rasterizado en función del nivel mediante la agrupación en el geohash que corresponden a su nivel de zoom.

También puede utilizar la extensión raster de Postgis para almacenar sus datos, pero si quiere filtrar en varias columnas puede no ser la mejor manera.

Por último, diría que la "mejor" forma de mostrar los datos rasterizados debería ser la cuadrícula hexagonal (por razones matemáticas), y sé que es posible en Postgis ( ejemplo aquí ) pero no sé si se puede hacer de manera eficiente.

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