Software di mappatura Web per un'enorme serie temporale raster?


11

Sono un utente ArcGIS Desktop che sta entrando nel mondo della mappatura web per la prima volta. Seguendo i consigli che ho trovato qui su GIS.SE, ho iniziato con i tutorial gratuiti di OpenGeo .

Tuttavia, ho iniziato a rendermi conto che la maggior parte delle demo e degli esempi erano orientati verso i dati vettoriali. Il mio progetto principale prevede la visualizzazione di una serie temporale di 300 frame di raster da 5000 x 5000 pixel. Sul mio computer desktop questi sono memorizzati in un singolo binario BIP intero a 16 bit 5000x5000x300, che ammonta a circa 8 GB. Il mio obiettivo è essere in grado di fare clic su una cella (di un singolo raster nelle serie temporali) e far apparire un grafico che mostra i valori di quel pixel nelle serie temporali di 300 elementi. I dati raster utilizzati per ciascun grafico delle serie temporali devono essere archiviati senza perdita di dati, sebbene le mappe di sovrapposizione su cui si fa clic possano essere cache con perdita.

Esiste qualcosa che potrebbe essere più adatto per questo progetto (per uno sviluppatore GIS web alle prime armi) di OpenGeo? O dovrei semplicemente continuare con questa configurazione?

Per riferimento, ho esperienza di programmazione in Python, Java e PHP. Non ho molta esperienza con SQL. Questo è un progetto a tempo indeterminato, quindi ho un sacco di tempo per imparare nuove lingue, se necessario. Ho già un web server, anche se probabilmente dovrò cambiare host perché GoDaddy non sembra supportare PostgreSQL senza ottenere un VPS.

Grazie per l'aiuto!

EDIT: (13 gennaio) Sto ancora cercando informazioni su come archiviare al meglio un raster BIP intero a 16 bit tridimensionale ed essere in grado di eseguire una query efficiente su una singola "colonna" di dati dell'asse z. Non voglio convertirlo in un formato a 32 bit (perché ciò raddoppierebbe la sua dimensione del file dalla sua attuale forma a 16 bit).


2
Puoi mettere PostgreSQL / PostGIS sul tuo server web? - Consiglio vivamente di avere il proprio server a meno che non si stiano cercando opzioni scalabili, quindi Amazon AWS (EC2 Relational Database AMI) aws.amazon.com/running_database potrebbe essere un'opzione.
Mapperz

1
Il mio host (GoDaddy) non supporta PostgreSQL secondo questo thread . Non ho davvero bisogno di scalabilità: questo progetto è principalmente per consentire ad alcuni ricercatori tra pari di avere un accesso più facile ai miei dati rispetto all'invio di un file da 8 GB e al caricamento in ENVI.
Dmahr,

1
Se stai considerando un nuovo host, non posso raccomandare abbastanza webfaction; offrono postgresql / postgis1.5 ma per funzionalità raster probabilmente si desidera postgis2.0. Anche questo è su hosting condiviso.
djq,

Risposte:


6

EDIT: (13 gennaio) Sto ancora cercando informazioni su come archiviare al meglio un raster BIP intero a 16 bit tridimensionale ed essere in grado di eseguire una query efficiente su una singola "colonna" di dati dell'asse z. Non voglio convertirlo in un formato a 32 bit (perché ciò raddoppierebbe la sua dimensione del file dalla sua attuale forma a 16 bit).

Eseguire una query su un raster di questo tipo non dovrebbe comportare grossi problemi. Puoi leggere i dati binari direttamente usando tutte le lingue del programma e l'accesso è veloce. Assicurati solo di archiviare i tuoi dati in un formato file che abbia tutti i metadati in un file separato. BIP è un tale formato

ad esempio in php, supponendo che il file sia in ordine di riga (altrimenti cambia xey), con $ xe $ y la posizione nella griglia (contando da 0), $ nx, $ ny e $ nz il numero di pixel in ogni dimensione e $ nb il numero di byte per griglia:

$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

Assicurati solo di accedere al pixel giusto: il conteggio inizia in alto a sinistra o no, ...

Alcune informazioni extra: dopo aver letto i dati, è necessario convertirli in float. Per esempio:

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

Nel caso in cui il tuo host non supporti il ​​caricamento di file di grandi dimensioni, potresti ad esempio suddividere il tuo file bip in ad esempio 8 file bip.

Qualche informazione in più su come farei il resto del sito Web: dato che i tuoi dati sono statici, potresti generare un piccolo mapviewer usando gdal2tiles e openlayer. http://www.gdal.org/gdal2tiles.html In effetti, dal momento che dici che "Non ho davvero bisogno di scalabilità - questo progetto è principalmente per consentire ad alcuni ricercatori tra pari di avere un accesso più facile ai miei dati rispetto all'invio di un 8 GB di file e caricandolo in ENVI. "Potresti anche fare a meno di usare una toolbox webgis: lascia che i tuoi utenti facciano clic sull'immagine e catturi le coordinate: http://www.emanueleferonato.com/2006/09/02/click -image-and-get-coordinate-con-javascript /

(anche se dovresti trovare un modo per presentare bene la tua immagine 5000x5000)


Fantastico, questo è un chiarimento davvero utile. Un follow-up: devo archiviare questo file binario in PostGIS? Voglio solo evitare la situazione in cui il server deve estrarre l'intero file binario dal database prima di interrogarlo con PHP o Python. Sarebbe un passo proibitivo lento.
Dmahr

No, il file dovrebbe essere sul filesystem. Inutile usare un database. Anche solo l'apertura di una connessione richiederà probabilmente più tempo del codice sopra.
johanvdw,

7

Ciò si presenta come tre problemi distinti: uno di infrastruttura, uno di architettura e uno di gestione degli eventi. Definirò un possibile approccio, ma la mia risposta è necessariamente generale.

Infrastruttura

Consiglio di utilizzare un servizio di hosting VPS come Linode (www.linode.com) per il tuo server. Questo ti dà accesso completo (ad esempio, root) a un server gestito professionalmente - nessuna preoccupazione per la mancanza di alimentazione o la perdita della sua connessione a Internet.

Architettura

Ci sono così tante opzioni qui che può essere davvero travolgente. Ad esempio, eseguo un paio di sistemi con GeoServer e OpenLayers. GeoServer è servito da Tomcat 7. Il front-end OpenLayers / jQuery è servito da Apache2. È possibile includere Postgres / PostGIS per la memorizzazione di dati vettoriali, ma questa non è una buona opzione per i dati raster. Puoi anche configurare un sistema Python usando Django o persino web.py (http://webpy.org/) per un controller piuttosto semplice. GeoServer ti consente di memorizzare i dati raster nei seguenti formati:

  • ArcGrid - Formato di copertura griglia ad arco
  • GeoTIFF - Formato file immagine con tag con informazioni geografiche
  • Gtopo30 - Formato di copertura Gtopo30
  • ImageMosaic - Plugin per mosaico di immagini
  • WorldImage - Un file raster accompagnato da un file di dati spaziali

Gestione degli eventi

Quando l'utente fa clic sulla mappa, si desidera far apparire un grafico di serie temporali dei dati del campo in quel punto. Innanzitutto, imposta un controller, che potrebbe essere scritto in Python o Java, che ascolta le richieste url con latitudine e longitudine. Questo controller restituisce un'immagine statica renderizzata sul server o dati json che il client (jQuery) può trasformare in un grafico.

Successivamente, per ottenere i dati XY sulla mappa, è possibile utilizzare una funzione come questa (consultare http://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html ):

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

Spero che aiuti.


Grazie per il commento! Hai mai usato uno di questi formati di file per eseguire raster tridimensionali di dimensioni superiori a 8 GB? So che GeoTIFF non può superare i 4 GB, ad esempio. E il software server sarà in grado di interrogare in modo efficiente una singola serie temporale di dati sull'asse z?
Dmahr

Dai un'occhiata alle piramidi di immagine . Ciò può aiutare con problemi di dimensioni del file. Quando gestisci l'evento click, il tuo codice (controller) riceverà i dati XY e quindi cercherà ed estrarrà il valore z da ciascuna delle 300 immagini con timestamp. È un sacco di elaborazione e IO del disco, quindi potrebbe richiedere molto tempo. Se il metodo "forza bruta" impiega troppo tempo, è possibile esaminare algoritmi alternativi e / o schemi di archiviazione di serie temporali.
katahdin,

Sì, il metodo "forza bruta" sarà più lento di quanto preferirei (è persino lento su un computer desktop). Immagino di essere interessato a inquadrare l'intero servizio di mappatura web attorno al miglior schema di archiviazione alternativo che riesco a trovare.
Dmahr,

1

Se capisco correttamente la tua domanda, creerei un servizio WMS orario, ad esempio con MapServer .

In questo modo sarà facile visualizzare il raster corretto per ciascun datetime (con una richiesta GetMap) e richiedere i valori per una cella in un determinato intervallo di datetime (con una richiesta GetFeatureInfo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.