Web-Mapping-Software für eine riesige Raster-Zeitreihe?

11

Ich bin ein ArcGIS Desktop-Benutzer, der zum ersten Mal in die Welt des Web-Mappings einsteigt. Nach den Ratschlägen, die ich hier auf GIS.SE gefunden habe, habe ich mit den kostenlosen Tutorials von OpenGeo begonnen .

Mir wurde jedoch klar, dass die meisten Demos und Beispiele auf Vektordaten ausgerichtet waren. Mein Hauptprojekt beinhaltet die Anzeige einer 300-Frame-Zeitreihe von 5000 x 5000 Pixel-Rastern. Auf meinem Desktop-Computer werden diese in einer einzelnen 16-Bit-Ganzzahl-BIP-Binärdatei mit 5000 x 5000 x 300 gespeichert, die ungefähr 8 GB beträgt. Mein Ziel ist es, auf eine Zelle (eines einzelnen Rasters in der Zeitreihe) klicken zu können und ein Diagramm mit den Werten dieses Pixels in der Zeitreihe mit 300 Elementen anzuzeigen. Die für jedes Zeitreihendiagramm verwendeten Rasterdaten müssen verlustfrei gespeichert werden, obwohl die angeklickten Overlay-Maps verlustbehaftete Caches sein können.

Gibt es etwas, das für dieses Projekt besser geeignet ist (für einen unerfahrenen Web-GIS-Entwickler) als OpenGeo? Oder sollte ich einfach mit diesem Setup weitermachen?

Als Referenz habe ich Programmiererfahrung in Python, Java und PHP. Ich habe nicht viel Erfahrung mit SQL. Dies ist ein offenes Projekt, daher habe ich genügend Zeit, um bei Bedarf neue Sprachen zu lernen. Ich habe bereits einen Webserver, obwohl ich wahrscheinlich den Host wechseln muss, da GoDaddy PostgreSQL ohne VPS nicht zu unterstützen scheint.

Danke für Ihre Hilfe!

EDIT: (13. Januar) Ich suche immer noch nach Informationen darüber, wie ein dreidimensionales 16-Bit-Ganzzahl-BIP-Raster am besten gespeichert und eine einzelne "Spalte" der Z-Achse effizient abgefragt werden kann. Ich möchte es nicht in ein 32-Bit-Format konvertieren (da dies die Dateigröße gegenüber der aktuellen 16-Bit-Form verdoppeln würde).

dmahr
quelle
2
Können Sie PostgreSQL / PostGIS auf Ihren Webserver stellen? - Ich würde dringend empfehlen, einen eigenen Server zu haben, es sei denn, Sie suchen nach skalierbaren Optionen. Dann ist möglicherweise Amazon AWS (EC2 Relational Databases AMI) aws.amazon.com/running_databases eine Option.
Mapperz
1
Mein Host (GoDaddy) unterstützt PostgreSQL gemäß diesem Thread nicht . Ich brauche keine Skalierbarkeit - dieses Projekt dient hauptsächlich dazu, einigen Peer-Forschern einen einfacheren Zugriff auf meine Daten zu ermöglichen, als eine 8-GB-Datei zu senden und in ENVI zu laden.
dmahr
1
Wenn Sie einen neuen Host in Betracht ziehen, kann ich Webfaction nicht genug empfehlen. Sie bieten postgresql / postgis1.5, aber für Rasterfunktionen möchten Sie wahrscheinlich postgis2.0. Dies gilt auch für Shared Hosting.
DJQ

Antworten:

6

EDIT: (13. Januar) Ich suche immer noch nach Informationen darüber, wie ein dreidimensionales 16-Bit-Ganzzahl-BIP-Raster am besten gespeichert und eine einzelne "Spalte" der Z-Achse effizient abgefragt werden kann. Ich möchte es nicht in ein 32-Bit-Format konvertieren (da dies die Dateigröße gegenüber der aktuellen 16-Bit-Form verdoppeln würde).

Das Abfragen eines solchen Rasters sollte keine großen Probleme aufwerfen. Sie können Binärdaten direkt in allen Programmiersprachen lesen, und der Zugriff ist schnell. Stellen Sie einfach sicher, dass Sie Ihre Daten in einem Dateiformat speichern, das alle Metadaten in einer separaten Datei enthält. BIP ist ein solches Format

Beispiel: In PHP wird davon ausgegangen, dass die Datei die Hauptreihenfolge der Zeilen hat (andernfalls wechseln Sie x und y), wobei $ x und $ y die Position in Ihrem Raster sind (ab 0), $ nx, $ ny und $ nz die Anzahl der Pixel in jede Dimension und $ nb die Anzahl der Bytes pro Gitterzelle:

$fp = fopen('yourfile.bil', 'r');

fseek ($fp, $nz*$nb*($y*$nx +$x))//this is a very fast operation
// read some data
$data = fread($fp, $nz*nb);//this is also very fast

Stellen Sie einfach sicher, dass Sie auf das rechte Pixel zugreifen: Beginnt die Zählung von oben links oder nicht, ...

Einige zusätzliche Informationen: Nachdem Sie die Daten gelesen haben, sollten Sie sie in Floats konvertieren. Z.B:

$dataf=unpack("f*", $data);
print_r($dataf);

Falls Ihr Host das Hochladen großer Dateien nicht unterstützt, können Sie z. B. Ihre Bip-Datei in z. B. 8 Bip-Dateien aufteilen.

Weitere Informationen dazu, wie ich den Rest der Website gestalten würde: Da Ihre Daten statisch sind, können Sie mit gdal2tiles und Openlayern einen kleinen Mapviewer erstellen. http://www.gdal.org/gdal2tiles.html Da Sie sagen: "Ich brauche keine Skalierbarkeit - dieses Projekt dient hauptsächlich dazu, einigen Peer-Forschern einen einfacheren Zugriff auf meine Daten zu ermöglichen als das Senden einer 8-GB-Datei und Laden in ENVI. "Sie könnten möglicherweise sogar auf die Verwendung einer Webgis-Toolbox verzichten: Lassen Sie Ihre Benutzer einfach auf das Bild klicken und die Koordinaten abrufen: http://www.emanueleferonato.com/2006/09/02/click -image-and-get-Koordinaten-mit-Javascript /

(obwohl Sie einen Weg finden sollten, Ihr 5000x5000-Bild schön zu präsentieren)

johanvdw
quelle
Genial, das ist wirklich eine hilfreiche Klarstellung. Ein Follow-up: Soll ich diese Binärdatei in PostGIS speichern? Ich möchte nur die Situation vermeiden, in der der Server die gesamte Binärdatei aus der Datenbank ziehen muss, bevor er sie mit PHP oder Python abfragt. Das wäre ein unerschwinglich langsamer Schritt.
dmahr
Nein, die Datei sollte sich im Dateisystem befinden. Es macht keinen Sinn, eine Datenbank zu verwenden. Selbst das Öffnen einer Verbindung dauert wahrscheinlich länger als der obige Code.
Johanvdw
7

Dies sieht nach drei getrennten Problemen aus: einem der Infrastruktur, einem der Architektur und einem der Ereignisbehandlung. Ich werde einen möglichen Ansatz darlegen, aber meine Antwort ist notwendigerweise allgemein.

Infrastruktur

Ich empfehle die Verwendung eines VPS-Hosting-Dienstes wie Linode (www.linode.com) für Ihren Server. Auf diese Weise erhalten Sie vollen (dh Root-) Zugriff auf einen professionell gewarteten Server - keine Sorge, dass der Strom ausfällt oder die Verbindung zum Internet unterbrochen wird.

Die Architektur

Hier gibt es so viele Möglichkeiten, dass es wirklich überwältigend sein kann. Als Beispiel führe ich einige Systeme mit GeoServer und OpenLayers aus. GeoServer wird von Tomcat 7 bereitgestellt. Das OpenLayers / jQuery-Frontend wird von Apache2 bereitgestellt. Sie können Postgres / PostGIS zum Speichern von Vektordaten einschließen, dies ist jedoch keine gute Option für Rasterdaten. Sie können auch ein Python-System mit Django oder sogar web.py (http://webpy.org/) für einen recht einfachen Controller einrichten. Mit GeoServer können Sie Rasterdaten in den folgenden Formaten speichern:

  • ArcGrid - Arc Grid-Abdeckungsformat
  • GeoTIFF - Tagged Image File Format mit geografischen Informationen
  • Gtopo30 - Gtopo30-Abdeckungsformat
  • ImageMosaic - Plugin für Bildmosaik
  • WorldImage - Eine Rasterdatei, die von einer Geodatendatei begleitet wird

Handhabung des Events

Wenn der Benutzer auf die Karte klickt, möchten Sie an dieser Stelle ein Zeitreihendiagramm der Felddaten anzeigen. Richten Sie zunächst einen Controller ein, der in Python oder Java geschrieben sein kann und auf URL-Anforderungen mit einem Breiten- und Längengrad wartet. Dieser Controller gibt entweder ein statisches Image zurück, das auf dem Server gerendert wurde, oder JSON-Daten, die der Client (jQuery) in ein Diagramm umwandeln kann.

Um die XY-Daten auf der Karte abzurufen, verwenden Sie möglicherweise eine Funktion wie diese (siehe http://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html ):

onClick: function(evt) {
    var clickSpot = evt.xy;
    // pass clickSpot to the controller ...
}

Ich hoffe das hilft.

Katahdin
quelle
Danke für das Schreiben! Haben Sie jemals eines dieser Dateiformate verwendet, um dreidimensionale Raster mit einer Größe von über 8 GB zu erstellen? Ich weiß, dass GeoTIFFs beispielsweise 4 GB nicht überschreiten können. Und wird die Serversoftware in der Lage sein, eine einzelne Zeitreihe von Daten auf der Z-Achse effizient abzufragen?
dmahr
Schauen Sie sich Bildpyramiden an . Dies kann bei Problemen mit der Dateigröße hilfreich sein. Bei der Behandlung des Klickereignisses empfängt Ihr Code (Controller) die XY-Daten und sucht und extrahiert dann den Z-Wert aus jedem der 300 Bilder mit Zeitstempel. Das ist viel Verarbeitung und Festplatten-E / A, daher kann es lange dauern. Wenn diese "Brute-Force" -Methode zu lange dauert, können Sie nach alternativen Algorithmen und / oder Zeitreihen-Speicherschemata suchen.
Katahdin
Ja, diese "Brute Force" -Methode ist langsamer als ich es vorziehen würde (auf einem Desktop-Computer ist sie sogar langsam). Ich denke, ich bin daran interessiert, den gesamten Web-Mapping-Service nach dem besten alternativen Speicherschema zu gestalten, das ich finden kann.
dmahr
1

Wenn ich Ihre Frage richtig verstehe, würde ich einen Zeit-WMS-Dienst erstellen, beispielsweise mit MapServer .

Auf diese Weise ist es einfach, das richtige Raster für jede Datumszeit anzuzeigen (mit einer GetMap-Anforderung) und die Werte für eine Zelle in einem bestimmten Datums- / Uhrzeitbereich anzufordern (mit einer GetFeatureInfo-Anforderung).

Capooti
quelle