Ho cercato una soluzione solida che mi permettesse di creare una mappa web e sovrapporre poligoni vettoriali senza impiegare un'eternità a caricare tali dati con l'obiettivo di consentirmi di visualizzare ogni poligono di un colore diverso su un evento hover.
Per quanto ne so, ci sono 3 opzioni specifiche per raggiungere questo obiettivo tramite canvas, SVG, Flash.
Flash sembra che sarebbe la soluzione migliore se funzionasse su Apple iPhone / iPad in quanto sembra fornire il rendering più veloce e un display più pulito. La tela sembra essere la seconda scelta migliore, ma richiede MOLTO tempo se sono presenti centinaia di poligoni visualizzati su una mappa mentre SVG impiega ancora più tempo per il rendering.
Ho quasi perso la speranza di trovare una soluzione a questo problema, ma oggi mi sono imbattuto in una società chiamata GISCloud http://www.giscloud.com (attualmente in versione beta con iscrizione gratuita).
Questa società è riuscita SOMEHOW a trovare un modo fantastico per rendere centinaia di vettori su una mappa in tempo quasi reale. Sono rimasto sorpreso dal loro approccio e la mia domanda alla comunità riguarda come possiamo replicare il loro approccio per l'uso con tecnologie esistenti come volantini, openlayer, cera ...
Dai un'occhiata a te stesso visualizzando questa fantastica demo: http://www.giscloud.com/map/284/africa
Assicurati di passare con il mouse su uno qualsiasi dei poligoni sulla pagina e prova i controlli di zoom per vedere che questi poligoni sono effettivamente vettori.
Quello che ho notato osservando le richieste con firebug è che la mappa richiede specifici file json. Sembra che a seconda del livello / area di zoom ci siano più file json richiesti.
Vorrei anche menzionare qui che una volta che giscloud carica i dati sulla pagina passando sopra un vettore, cambia immediatamente il colore senza creare una nuova richiesta.
ESEMPI:
- 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
Suppongo che la struttura dell'URL segua la logica standard del servizio di piastrellatura (ad esempio la terza all'ultima cartella è il livello di zoom ...).
In ogni caso ho analizzato i dati effettivi di questi file json e sembra che la logica che stanno usando segua un tipo di logica con cui creano i loro vettori basandosi solo su questi valori di dati:
- larghezza / altezza: definiscono la larghezza e l'altezza dei dati forniti in ogni richiesta json
- pixel: qui definiscono i valori dei pixel che presumo siano in qualche modo correlati ad alcune coordinate generali di pixel x / y per livelli di punti generalizzati? Immagino che in qualche modo abbiano un modo di semplificare automaticamente la regione in base al livello di zoom. Sto assumendo da loro usando le coordinate dei pixel. Immagino che stiano riducendo drasticamente la dimensione dei dati che devono essere caricati rispetto ai dati lat / long.
- stili: qui definiscono due valori css RGB. "F" che rappresenta il colore del file poligonale e "S" che rappresenta il colore del bordo poligonale.
- geom: qui è dove immagino che in qualche modo stiano definendo in modo specifico ciascun poligono all'interno del riquadro che viene caricato dove tali dati vengono definiti in base alla finestra del contenitore della mappa. Ciò che è anche interessante è che ogni voce ha un valore "S" che presumo sia usato come un attributo facoltativo o valore di collegamento funzione e alla fine di ogni voce qui c'è un'area che sembra definire un ID specifico per vettore insieme a l'ID layer che suppongo sia utilizzato per unire in qualche modo i dati di ogni richiesta di riquadri json chiamata.
Suppongo anche che abbiano in qualche modo trovato un modo per determinare e suddividere automaticamente i dati che devono essere caricati per ogni riquadro a seconda della dimensione dei dati che dovrebbero essere caricati per il riquadro richiesto.
Ecco una ripartizione estratta di una di queste richieste:
{"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"},
{...}
...
]
}
Come possiamo replicare lo stesso (o simile) tipo di velocità usando i postgis (che anch'io sono quelli che sembrano usare)?