Ich habe nach einer soliden Lösung gesucht, mit der ich eine Webkarte erstellen und Vektorpolygone überlagern kann, ohne dass es für immer dauert, solche Daten zu laden , um zu ermöglichen, dass jedes Polygon bei einem Schwebeflugereignis eine andere Farbe anzeigt.
Soweit mir bekannt ist, gibt es drei spezielle Optionen, um dies über Canvas, SVG und Flash zu erreichen.
Flash scheint die beste Lösung zu sein, wenn es auf Apple iPhones / iPads funktioniert, da es das schnellste Rendering und die sauberste Anzeige bietet. Canvas scheint die zweitbeste Wahl zu sein, dauert jedoch SEHR lange, wenn Hunderte von Polygonen auf einer Karte angezeigt werden, während das Rendern von SVG noch länger dauert.
Ich habe fast die Hoffnung verloren, eine Lösung für dieses Problem zu finden, aber heute bin ich auf eine Firma namens GISCloud http://www.giscloud.com gestoßen (derzeit in der Beta mit kostenloser Registrierung).
Diese Firma hat es irgendwie geschafft, einen erstaunlichen Weg zu finden, um Hunderte von Vektoren auf einer Karte in nahezu Echtzeit zu rendern. Ich war erstaunt über ihre Herangehensweise und meine Frage an die Community bezieht sich darauf, wie wir ihre Herangehensweise für die Verwendung mit vorhandenen Technologien wie Broschüren, Openlayern, Wachs nachbilden können.
Überzeugen Sie sich selbst von dieser erstaunlichen Demo: http://www.giscloud.com/map/284/africa
Stellen Sie sicher, dass Sie den Mauszeiger über eines der Polygone auf der Seite halten, und testen Sie die Zoom-Steuerelemente, um festzustellen, ob es sich bei diesen Polygonen tatsächlich um Vektoren handelt.
Was mir beim Betrachten von Anfragen mit Firebug aufgefallen ist, dass die Map bestimmte JSON-Dateien anfordert. Es scheint, dass abhängig von der Zoomstufe / dem Zoombereich mehrere JSON-Dateien angefordert werden.
Ich möchte hier auch erwähnen, dass giscloud nach dem Laden der Daten auf der Seite, die über einem Vektor schweben, sofort die Farbe ändert, ohne eine neue Anforderung zu erstellen.
BEISPIELE
- 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
Ich gehe davon aus, dass die URL-Struktur der Standard-Tiling-Service-Logik folgt (zum Beispiel ist der drittletzte Ordner die Zoomstufe ...).
Auf jeden Fall habe ich die tatsächlichen Daten dieser JSON-Dateien analysiert und es scheint, dass die von ihnen verwendete Logik einer Art Logik folgt, mit der sie ihre Vektoren nur auf der Grundlage dieser Datenwerte erstellen:
- width / height: Sie definieren die Breite und Höhe der Daten, die in jeder JSON-Anfrage geliefert werden
- Pixel: Hier definieren sie Pixelwerte, von denen ich annehme, dass sie sich auf einige allgemeine x / y-Pixelkoordinaten für verallgemeinerte Punktebenen beziehen. Ich vermute, sie haben irgendwie eine Möglichkeit, die Region abhängig von der Zoomstufe automatisch zu vereinfachen. Ich gehe davon aus, dass sie Pixelkoordinaten verwenden. Ich vermute, dass sie die Größe der zu ladenden Daten im Vergleich zu Lat / Long-Daten drastisch reduzieren.
- Stile: Hier definieren sie zwei RGB-CSS-Werte. "F" repräsentiert die Farbe der Polygondatei und "S" repräsentiert die Farbe der Polygonumrandung.
- geom: hier denke ich, definieren sie irgendwie spezifisch jedes polygon innerhalb der zu ladenden kachel , wo solche daten basierend auf dem kartencontainerfenster definiert werden. Interessant ist auch, dass jeder Eintrag einen "S" -Wert hat, von dem ich annehme, dass er als optionales Attribut oder als Feature-Link-Wert verwendet wird. Am Ende jedes Eintrags befindet sich hier ein Bereich, der zusammen mit eine bestimmte Vektor-ID zu definieren scheint Die Layer-ID, die ich errate, wird verwendet, um die Daten aus jeder aufgerufenen JSON-Kachel-Anfrage zu verknüpfen.
Ich gehe auch davon aus, dass sie irgendwie eine Möglichkeit gefunden haben, die Daten, die für jede Kachel geladen werden müssen, abhängig von der Größe der Daten, die für die angeforderte Kachel geladen werden müssten, automatisch zu bestimmen und aufzuteilen.
Hier ist eine extrahierte Aufschlüsselung einer dieser Anforderungen:
{"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"},
{...}
...
]
}
Wie können wir die gleiche (oder eine ähnliche) Geschwindigkeit mit Postgis nachbilden (was ich anscheinend auch benutze)?