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:
-
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.
-
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.
-
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.
-
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. -
Agregado basado en algún otro campo, tal vez algo relacionado con los azulejos. No he pensado del todo en esto.
-
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?