GML, KML, GeoJSON - Geschwindigkeit beim Rendern von 3109 Polygonen?


12

Ich arbeite mit Geoserver und versorge Openlayern (3109 Polygone - viel mehr Eckpunkte) die US Lower 48 Counties. Die Landkreise werden in eine Postgis-Datenbank geladen. Ich bin neugierig auf Entwicklererfahrung, wenn ich versuche, diese Menge von Vertices an den Client zu senden.

Mit welchem ​​WFS-Format haben Sie die besten Ergebnisse erzielt? Wurde zusätzliches Tuning auf Geoserver verwendet?

Mir ist klar, dass gekacheltes WMS schneller ist, aber ich möchte dynamische Änderungen in einer Choroplethen-Map mithilfe von openLayers ermöglichen, d. H. Der Benutzer sendet ein Formular, ein Python-Skript wird aufgerufen, und neue Datenfächer werden zurückgegeben, damit OpenLayer das Map Div neu laden können. Ich möchte dies auch in voller Auflösung ausprobieren, bevor ich die Komplexität von Polygonen in Openlayern reduziere.

Antworten:


4

Vielleicht löst dies einige neue Ideen aus: Ich habe eine Anwendung gestartet, in der Benutzer eine Karte mit vielen Elementen bearbeiten können.

Anstatt alle Daten als WFS zu senden, verwende ich WMS-Zuordnungen. Wenn der Benutzer klickt oder eine Auswahl zeichnet, rufe ich die ausgewählten Elemente als WFS ab .

Nach dem Zurücksenden eines Updates an den Server aktualisiere ich die WMS-Ebene.

Es gibt einige OpenLayers-Beispiele, die zeigen, wie Sie das tun können. Sie müssen es wahrscheinlich ein wenig optimieren, aber OpenLayers + GeoServer wird den schwierigen Teil für Sie herausarbeiten. Die Daten werden als ZIP-Datei gesendet, sodass das ursprüngliche Format nicht einmal so wichtig ist. Es ist nicht der Engpass. Lassen Sie OpenLayers und GeoServer herausfinden, in welchem ​​Format sie Informationen austauschen.

Dieser Ansatz ist recht gut skalierbar. Sogar Leute mit langsamen Verbindungen und langsamen Computern können damit die Karte bearbeiten. Das Abrufen von Hunderten von Elementen ist sehr schnell und zum Bearbeiten wird wahrscheinlich nicht mehr gleichzeitig benötigt.

Endlich .. off-topic, aber da Sie clientseitige Aufgaben mit Kartendaten ausführen möchten: Denken Sie daran, dass IE7 und niedriger problematisch sein werden, wenn Sie mit OpenLayers Polygone zeichnen möchten. OpenLayers verwendet SVG für das clientseitige Zeichnen, und IE7 und niedriger haben keine eingebaute Unterstützung. Diese Benutzer müssen ein beschissenes altes Plugin herunterladen. Alle anderen Browser sind in Ordnung.


IE8 wird fast so schlimm sein. OpenLayers hat mehrere Renderer und für Browser, die Canvas oder SVG nicht unterstützen, wird auf VML zurückgegriffen, was IE7 unterstützt. Die verschiedenen Renderer
bieten

3

GEOJSON ist meiner Meinung nach das beste Format, es ist leicht zu lesen, einfach in Javascript zu verwenden und generell kleiner als GML / KML. Es kann sogar Informationen über den Stil enthalten, siehe hier .

Es ist kein offizieller Standard, wird jedoch sowohl auf Broschüren als auch auf Openlayern und auf vielen GIS-Desktop-Apps wie QGIS unterstützt.


2

Die Verwendung von GeoJSON ist ein guter Anfang, um Ihr System zu beschleunigen, reicht jedoch möglicherweise nicht aus. Sie sollten erwägen, mehrere Versionen Ihrer Datenebene zu erstellen, eine pro Zoomebene, und für jede Version Verallgemeinerungs- / Vereinfachungsmethoden anwenden . Der Client sollte die relevante Ebene in Abhängigkeit von der ausgewählten Zoomstufe anfordern. Dies würde sicherstellen, dass der Detaillierungsgrad der Daten, die zwischen dem Server und dem Client ausgetauscht werden, angemessen ist, und sowohl die Netzwerkübertragung als auch das Rendering erheblich verbessern. Um noch weiter zu gehen, könnten Sie Ihr System mit Vektorkacheln und räumlicher Indizierung erweitern, wie in diesem Dokument beschrieben , aber ich bin nicht sicher, ob OpenLayer und Geoserver damit umgehen können ... noch!

Auf jeden Fall: Vergessen Sie GML.


Dies ist meine Fallback-Methode, wenn das WFS mit voller Auflösung zu langsam ist. Ich interessiere mich für Probleme dieser Größe und möchte sowohl die volle Auflösungsgeschwindigkeit als auch ggf. die reduzierte Auflösungsgeschwindigkeit melden können.
Jay Laura

2

Erstellen Sie mit Ihrem Python-Skript eine neue SLD-Datei und senden Sie diese mit Ihrer Anfrage an den WMS-Server.

Es ist ein Beispiel hier .


Ich habe dies in Betracht gezogen und werde diese Option wahrscheinlich auf Geschwindigkeit testen. Dies ist nicht für die Entwicklung, sondern für die Forschung gedacht, daher möchte ich WFS ausprobieren.
Jay Laura

1

Ich bin schon zweimal einen ähnlichen Weg gegangen und clientseitiges Rendern für mehr als eine kleine Anzahl von Punkten oder wirklich einfachen Polygonen ist einfach keine gute Idee. Wenn Sie sich erst einmal an diese Architektur gebunden haben, ist es kostspielig, einen Back-out durchzuführen, und es ist wahrscheinlich, dass sich in einem Projekt die Anforderungen ändern oder das Datenvolumen zunimmt, wenn verschiedene Stakeholder / Supervisor feststellen, wozu Ihr System in der Lage ist. Der browserbasierte clientseitige Rendering-Ansatz lässt sich nicht skalieren.

Wenn Sie ein dynamisches Rendering wünschen, wende ich mich an @ iant. Ich zuvor beschrieben eine Reihe von Optionen für ein anderes , aber verwandtes Problem hier . Ich habe auch die Polygonverallgemeinerung verwendet, um das clientseitige Rendern zu unterstützen, und obwohl dies definitiv hilft, erzeugt es schwierigere Probleme, z.

Selbst wenn Sie mit einer bekannten Plattform arbeiten - Sie kennen beispielsweise die Hardware, die Browserversion und die Plugins aller Clients -, was unwahrscheinlich ist, wissen Sie nicht, unter welcher Art von Last diese Clients stehen. Diese Art von Ansatz erfordert, dass der Browser eine Menge CPU-Zeit erhält, um die Benutzererfahrung flüssig zu halten, und alles andere wird Ihre Benutzer ärgern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.