Szukałem solidnego rozwiązania, które pozwoliłoby mi stworzyć mapę internetową i nałożyć wieloboki wektorowe bez ciągłego ładowania takich danych, aby umożliwić mi wyświetlanie każdego wielokąta w innym kolorze podczas zdarzenia najechania kursorem.
O ile mi wiadomo, istnieją 3 konkretne opcje osiągnięcia tego poprzez płótno, SVG, Flash.
Flash wydaje się najlepszym rozwiązaniem, gdyby działał na iPhone'ach / iPadach Apple, ponieważ zapewnia najszybszy rendering i najczystszy wyświetlacz. Płótno wydaje się drugim najlepszym wyborem, ale zajmuje BARDZO dużo czasu, jeśli na mapie są wyświetlane setki wielokątów, a renderowanie SVG zajmuje jeszcze więcej czasu.
I prawie stracił nadzieję na znalezienie rozwiązania tego problemu , ale dzisiaj natknąłem się na firmę o nazwie GISCloud http://www.giscloud.com (obecnie w wersji beta z wolnego rejestrację).
Ta firma w ramach projektu SOMEHOW opracowała niesamowity sposób renderowania setek wektorów na mapie w czasie prawie rzeczywistym. Byłem zaskoczony ich podejściem, a moje pytanie do społeczności dotyczy tego, w jaki sposób możemy powtórzyć ich podejście do użycia z istniejącymi technologiami, takimi jak ulotka, openlayery, wosk ...
Przekonaj się, oglądając to niesamowite demo: http://www.giscloud.com/map/284/africa
Upewnij się, że najedziesz myszką na którykolwiek z wielokątów na stronie i przetestujesz elementy sterujące powiększeniem, aby zobaczyć, czy te wielokąty są rzeczywiście wektorami.
Zauważyłem, że patrząc na żądania za pomocą firebuga, mapa żąda określonych plików JSON. Wygląda na to, że w zależności od poziomu / obszaru powiększenia żądanych jest wiele plików json.
Powinienem tu również wspomnieć, że gdy giscloud ładuje dane na stronie, najechanie kursorem na wektor natychmiast zmienia kolor bez tworzenia nowego żądania.
PRZYKŁADY:
- 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
Zakładam, że struktura adresu URL jest zgodna ze standardową logiką usługi kafelkowania (na przykład od trzeciego do ostatniego folderu jest poziomem powiększenia ...).
W każdym razie przeanalizowałem rzeczywiste dane tych plików json i wydaje się, że logika, której używają, jest zgodna z pewnym rodzajem logiki, za pomocą której tworzą swoje wektory oparte na tych wartościach danych:
- szerokość / wysokość: określają szerokość i wysokość danych obsługiwanych w każdym żądaniu json
- piksele: tutaj definiują wartości pikseli, które, jak zakładam, w jakiś sposób odnoszą się do ogólnych współrzędnych pikseli x / y dla uogólnionych poziomów punktów? Domyślam się, że w jakiś sposób automatycznie upraszczają region w zależności od poziomu powiększenia. Zakładam, że używają współrzędnych pikseli. Wydaje mi się, że radykalnie zmniejszają rozmiar danych, które należy załadować, w porównaniu do danych z długości / długości.
- style: tutaj definiują dwie wartości css RGB. „F” reprezentuje kolor pliku wielokąta, a „S” reprezentuje kolor ramki wielokąta.
- geom: tutaj przypuszczam, że w jakiś sposób definiują konkretnie definiowanie każdego wielokąta w ładowanym kafelku, w którym takie dane są definiowane na podstawie okna kontenera mapy. Interesujące jest również to, że każdy wpis ma wartość „S”, która, jak zakładam, jest używana jako opcjonalny atrybut lub wartość łącza funkcji, a na końcu każdego wpisu znajduje się obszar, który wydaje się definiować konkretny identyfikator wektora wraz z identyfikator warstwy, który zgaduję, jest używany do połączenia danych z każdego wywoływanego żądania kafelka json.
Zakładam również, że w jakiś sposób wymyślili sposób automatycznego określania i podziału danych, które należy załadować dla każdego kafelka, w zależności od rozmiaru danych, które należy załadować dla żądanego kafelka.
Oto wyodrębniony podział jednego z tych żądań:
{"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"},
{...}
...
]
}
Jak możemy powielać ten sam (lub podobny) typ prędkości za pomocą postgis (z którego ja również zdaje się korzystać)?