30.000 Datenpunkte… kann dies mit Openlayern angemessen bedient werden?

8

Ich versuche, ein Web-GIS-Problem anzugehen und muss die beste Strategie herausfinden. Ich habe eine Karte mit 30.000 Zellen, die ein Raster für die Provinz Alberta bilden. Ich habe eine Liste von Datenpunkten für jede Zelle - ungefähr 50 Indikatorfelder und Werte für jede Zelle. Ein Wert könnte beispielsweise die menschliche Bevölkerung sein, sodass jede Zelle einen Wert für die menschliche Bevölkerung für diese Zelle hat. Ich möchte eine interaktive Karte erstellen, die diese Werte visuell entweder mit Quadraten für die Zellen oder mit einem gemischten Heatmap-Look anzeigen kann. Darüber hinaus möchte ich in der Lage sein, zusammengesetzte Berechnungen für alle Datenpunkte durchzuführen und diese Berechnungen zu verwenden, um zusätzliche Karten zu erstellen. Unter Berücksichtigung der Berechnungen gibt es ungefähr 300.000 Permutationen auf der Karte. Um das Ganze abzurunden, ist es auch zeitlich begrenzt; Es gibt 16 verschiedene Zeitscheiben.

Meine bisherige Strategie:

1) Berechnen Sie auf der Serverseite die Zellenwerte zur Laufzeit dynamisch und senden Sie die Werte an den Client (alle 30.000). Dies entspricht ungefähr einem Wert für jedes Quadrat mit 3 x 3 Pixeln in einem Bild mit 525 x 525 Pixel auf dem Bildschirm.

2) Verwenden Sie auf der Clientseite mit offenen Ebenen ein 1px-PNG, dessen Größe geändert werden kann, und passen Sie den Alpha-Wert nach Bedarf an, um den unterschiedlichen Farbverlauf anzuzeigen, der dem Datenwert für jede Zelle entspricht. Die Größe des PNG wird geändert, wenn die Karte vergrößert oder verkleinert wird. Theoretisch würden sie genau positioniert, um eine pauschale Abdeckung der Karte als Quadrate zu bilden, oder sie würden sich unter Verwendung des Wärmekartenansatzes genug überlappen, um eine pauschale Abdeckung zu bilden.

Die Frage:

Ist es sinnvoll, diese Zellenwerte dynamisch auf dem Server zu berechnen und dann in Echtzeit an eine OpenLayers-Schnittstelle zu senden? Ich bin zuversichtlich, dass der Server die Berechnungen durchführen kann, aber kann OpenLayers vernünftigerweise 30.000 Datenpunkte gleichzeitig auf einer Karte anzeigen? Ist es vernünftig zu erwarten, dass mit Punktdaten eine pauschale Abdeckung erstellt werden kann? Ich denke, ich versuche, das Äquivalent einer Vektorkarte mit 30.000 Formen zu erstellen, die eine 100% ige Abdeckung der Karte bieten, aber Punktdaten verwenden, um sie zu vereinfachen.

Die alternativen Strategien in meinem Kopf sind:

a) um die Karten in Echtzeit auf dem Server zu generieren und als gerasterte Ebenen an den Client zu senden

b) um alle Permutationen im Voraus zu generieren und als gerasterte Karten auf dem Server zu speichern

Irgendwelche Gedanken? Ist meine Annäherung weit weg und bellt den falschen Baum an? Irgendwelche Ratschläge zu einer besseren Methode?

Ich würde mich über alle Gedanken zu diesem Thema sehr freuen! Wenn Sie interessiert sind, möchte ich vielleicht sogar einen Entwickler beauftragen, der Ihnen dabei hilft.

Vielen Dank!

Noah

Noah Purves-Smith
quelle
Ich recherchiere mehr und gehe möglicherweise den völlig falschen Weg. Wie wäre es mit der Verwendung von Rendering-Transformationen mit GeoServer? Wie schnell könnte GeoServer eine Transformation mit 30.000 Datenpunkten erstellen?
Noah Purves-Smith
Verwenden Sie den Cluster in Openlayers - flickr Beispiel dev.openlayers.org/releases/OpenLayers-2.12/examples/…
Mapperz
Danke für den Kommentar Mapperz ... Clustering löst leider nicht wirklich das, was wir brauchen.
Noah Purves-Smith

Antworten:

13

Diese Frage wurde mehrmals gestellt. 30.000 Punkte auf einer OL-Karte funktionieren nicht. Oder sogar auf einer Flash / Silverlight-Karte.

Grobe (grobe!) Größenordnungen, an die Sie sich erinnern sollten - 100 Punkte auf einer JS-Karte (Openlayers), 1.000 Punkte auf einer Flash-Karte (z. B. ArcGIS Flash oder Silverlight) und 10.000 Punkte auf einer Desktop-App (ArcGIS Desktop) sind Ihre gute Leistung Ebenen. Dies sind "tatsächliche" Punkte, die nicht wie unten beschrieben versteckt oder gefälscht sind.

Darüber hinaus ist es nicht sehr schön, mit 30.000 Punkten zu interagieren. Wie greife ich auf "diesen einen" Marker hinter einem anderen Marker zu?

Sie haben 2 Möglichkeiten:

1) Erstellen Sie wie erwähnt ein Raster auf dem Server. Stellen Sie einen WMS-Dienst bereit. Wenn Ihr Benutzer über einen Punkt klickt / schwebt, kehren Sie zum Server zurück, um die Daten zu erhalten

2) Reduzieren Sie die Anzahl der angezeigten Punkte. Hauptsächlich über SERVER-SIDE-Clustering und auch über Bounding-Box-Trimming. Clientseitiges Clustering ist "ok" und "niedlich", hilft Ihnen aber bei 30.000 Punkten nicht weiter. Es wird langsam sein. Sie richten Ihre Ebene also mit der bbox-Strategie ein, und OL ruft für Sie beim Schwenken / Zoomen den Server an, und Sie geben einen neuen Datensatz zurück, der so weit gekürzt wurde, dass Sie weniger als 100-300 Punkte zurückgeben.

Vadim
quelle
Schlage mich dazu! Nummer 1 wird in meiner Antwort erweitert.
Michael Markieta
Danke für die Antwort Vadim. Ich glaube nicht, dass ich das Problem sehr gut erklärt habe, aber ich glaube auch, dass ich nach der falschen Lösung gesucht habe. Ich denke, das Erstellen eines Rasters auf dem Server ist definitiv der richtige Weg, nachdem ich mich weiter damit befasst habe. Kannst du sagen, dass ich ein Neuling bin?
Noah Purves-Smith
@Noah - kein Problem. Sie sind auf dem richtigen Weg :) WMS ist der bessere Weg für soooo viele Daten, es sei denn, Sie können sie verdichten.
Vadim
Gute Antwort. Meine Lösung ähnelte Ihrem zweiten Vorschlag und konnte einen Datensatz von einer Million Datenpunkten unterstützen.
cjstehno
6

Aus UI- und UX-Sicht sind 30.000 einzelne Punkte auf einer Karte nicht gerade die beste Darstellung Ihrer Daten.

Sie können auch UTF8-Gitter zusätzlich zu Ihren gerasterten Punktdaten verwenden. Die Auflösung Ihres Rasters und die Anzahl der Punkte machen die Auswahl von Daten jedoch definitiv sehr unvorhersehbar und nicht die beste UX. http://mapbox.com/developers/utfgrid/

Eine Kombination von OL-Clustern mit UTF8-Gittern wäre interessant. Dies kann durch ein Clustering von Daten in Servergröße erfolgen, das Rastercluster zurückgibt, die dann mithilfe von UTF8-Grids ausgewählt werden können. Sie können die Manipulation über diesen Punkt hinaus wählen, um weiter zu zoomen (wie bei den klassischen clientseitigen Vektorclustering-Methoden wie in OL). Möglicherweise möchten Sie auch einige Daten verarbeiten, z. B. den Durchschnittswert innerhalb dieses Clusters berechnen und dem Benutzer präsentieren.

Michael Markieta
quelle
2

Wie bereits erwähnt, sind 30.000 Funktionen über OL eine wirklich schlechte Idee. Ich habe 10.000 Punkte mit Canvas-Rendering in Chrome verwaltet und das hat OK funktioniert, aber das Wechseln zu einem Grafik-Marker (.png) hat dazu geführt, dass es gecrawlt hat.

Ich wollte nur einen Vorschlag für Ihren serverseitigen Ansatz machen. Offensichtlich können Sie nicht alle 300.000 Permutationen im Voraus vorgenerieren, und Ihr Umfang wird mit der Zeit sicherlich wachsen. Wenn Sie ein WMS mit SLD verwenden möchten, können Sie mit dem folgenden Ansatz eine beliebige Karte erstellen.

Der Client (z. B. OpenLayers) sendet eine WMS-Image-Anforderung an den Server. Die URL für die Anforderung enthält einen Parameter. ...&SLD=http://app-server/sld?time=2010&measure=population...Hier ist der SLD-Parameter eine URL (die URL-codiert sein müsste), um eine SLD im laufenden Betrieb zu generieren. Wenn der WMS-Server Ihre Anfrage erhält, fragt er Ihren Anwendungsserver nach einem eindeutigen SLD ab und erhält eine XML-Antwort. Anschließend wird die von Ihrem Benutzer angeforderte Permutation generiert.

Ich habe dies mit GeoServer für WMS und PHP gemacht, um SLDs zu generieren, und die Leistung war in Ordnung (aber dann hatte ich keinen Grund, warum es nicht sein sollte, Ihre Situation könnte anders sein).

Tomfumb
quelle