He estado buscando una solución sólida que me permitiera crear un mapa web y superponer polígonos vectoriales sin demorar mucho en cargar dichos datos con el objetivo de permitirme hacer que cada polígono muestre un color diferente en un evento de desplazamiento.
Hasta donde sé, hay 3 opciones específicas para lograr esto a través de lienzo, SVG, Flash.
Parece que Flash sería la mejor solución si funcionara en iPhones / ipads de Apple, ya que parece proporcionar la representación más rápida y la pantalla más limpia. El lienzo parece ser la segunda mejor opción, pero lleva mucho tiempo si tiene cientos de polígonos que se muestran en un mapa, mientras que SVG tarda aún más en renderizarse.
Yo casi perdido la esperanza de encontrar una solución a este problema , pero hoy me encontré con una compañía llamada GISCloud http://www.giscloud.com (actualmente en beta con inscripción gratuita).
Esta empresa, ALGUNA VEZ, logró encontrar una forma increíble de representar cientos de vectores en un mapa en tiempo casi real. Me sorprendió su enfoque y mi pregunta a la comunidad se relaciona con la forma en que podemos replicar su enfoque para usarlo con tecnologías existentes como folletos, capas abiertas, cera ...
Echa un vistazo por ti mismo viendo esta increíble demostración: http://www.giscloud.com/map/284/africa
Asegúrese de pasar el cursor sobre cualquiera de los polígonos de la página y pruebe los controles de zoom para ver que estos polígonos son vectores.
Lo que he notado al mirar las solicitudes con firebug es que el mapa está solicitando archivos json específicos. Parece que, dependiendo del nivel / área de zoom, se solicitan varios archivos json.
También debería mencionar aquí que una vez que giscloud carga los datos en la página que se cierne sobre un vector, cambia inmediatamente el color sin crear una nueva solicitud.
EJEMPLOS
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/4/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/4.json
Supongo que la estructura de la URL sigue la lógica estándar del servicio de mosaico (por ejemplo, la tercera a la última carpeta es el nivel de zoom ...).
En cualquier caso, he analizado los datos reales de estos archivos json y parece que la lógica que están utilizando sigue algún tipo de lógica mediante la cual crean sus vectores basados en estos valores de datos:
- ancho / alto: definen el ancho y alto de los datos que se sirven en cada solicitud json
- píxeles: aquí definen valores de píxeles que supongo que de alguna manera se relacionan con algunas coordenadas generales de píxeles x / y para niveles de puntos generalizados. Supongo que de alguna manera tienen una forma de simplificar automáticamente la región según el nivel de zoom. Supongo que mediante el uso de coordenadas de píxeles, supongo que están reduciendo drásticamente el tamaño de los datos que deben cargarse en comparación con los datos de lat / long.
- estilos: aquí definen dos valores css RGB. "F" representa el color del archivo poligonal y "S" representa el color del borde del polígono.
- geom: aquí es donde supongo que de alguna manera están definiendo específicamente la definición de cada polígono dentro del mosaico que se está cargando donde dichos datos se definen en función de la ventana del contenedor del mapa. Lo que también es interesante es que cada entrada tiene un valor "S" que supongo que se usa como un atributo opcional o un valor de enlace de característica y al final de cada entrada aquí hay un área que parece definir un ID por vector específico junto con el ID de capa que supongo se utiliza para unir de alguna manera los datos de cada solicitud de mosaico json que se llama.
También estoy asumiendo que de alguna manera han descubierto una manera de determinar y dividir automáticamente los datos que deben cargarse para cada mosaico, dependiendo del tamaño de los datos que deberían cargarse para el mosaico solicitado.
Aquí hay un desglose extraído de una de estas solicitudes:
{"width":256,"height":256,"tile":
{"pixels":
[0,6461,-1,0,5,148,0,509,-1,10715,-1,1,-1,251,-1,1,-1,1,-1,251,-2,3,-1,255,-1,249,-2,5,-2,247,-1,509,-3,251,-1,2,-2,253,-2,252,-2,254,-1,255,-1,254,-1,255,-1,1276,-2,13,-1,233,-1,2,-1,253,-1,1,-1,255,-1,247,-1,1306,-1,1533,-1,1269,-1,1276,-1,2303,-1]},
"styles":
[{"f":"rgb(99,230,101)","s":"rgb(5,148,0)","lw":"0"}],
"geom":
[
{"s":0,"p":[4,143,5,144,3,146,1,146,2,143,4,143],"c":"layer1156_5098"},
{"s":0,"p":[-2,143,0,140,2,141,2,144,1,146,-2,144,-2,143],"c":"layer1156_5067"},
{"s":0,"p":[7,143,5,144,4,143,2,143,2,141,5,138,6,139,5,141,7,143],"c":"layer1156_5051"},
{"s":0,"p":[10,141,11,137,12,137,14,137,12,142,9,143,9,142,10,141],"c":"layer1156_5041"},
{"s":0,"p":[1,136,0,140,-2,143,-2,136,1,136],"c":"layer1156_5038"},
{"s":0,"p":[8,143,5,141,5,137,8,136,10,137,10,141,8,143],"c":"layer1156_5033"},
{"s":0,"p":[5,137,2,141,0,140,1,136,1,136,2,135,3,136,5,137],"c":"layer1156_5028"},
{"s":0,"p":[10,134,12,136,11,138,8,135,10,134],"c":"layer1156_5020"},
{"s":0,"p":[-2,133,0,136,-2,136,-2,133],"c":"layer1156_5005"},
{...}
...
]
}
¿Cómo podemos replicar el mismo tipo (o similar) de velocidad usando postgis (que es lo que parecen estar usando también)?