¿Software de mapeo web para una gran serie de tiempo ráster?

11

Soy un usuario de ArcGIS Desktop que está entrando en el mundo del mapeo web por primera vez. Siguiendo los consejos que encontré aquí en GIS.SE, comencé con los tutoriales gratuitos de OpenGeo .

Sin embargo, comencé a darme cuenta de que la mayoría de las demostraciones y ejemplos estaban orientados a datos vectoriales. Mi proyecto principal consiste en la visualización de una serie temporal de 300 cuadros de rásteres de 5000 x 5000 píxeles. En mi computadora de escritorio, estos se almacenan en un solo binario BIP entero de 16 bits 5000x5000x300, que totaliza alrededor de 8GB. Mi objetivo es poder hacer clic en una celda (de un solo ráster en la serie de tiempo) y tener un gráfico emergente que muestre los valores de ese píxel en la serie de tiempo de 300 elementos. Los datos ráster utilizados para cada gráfico de series de tiempo deben almacenarse sin pérdidas, aunque los mapas de superposición en los que se hace clic pueden ser cachés con pérdidas.

¿Hay algo que pueda ser más adecuado para este proyecto (para un desarrollador novato de SIG web) que OpenGeo? ¿O debería seguir con esta configuración?

Como referencia, tengo experiencia en programación en Python, Java y PHP. No tengo mucha experiencia con SQL. Este es un proyecto abierto así que tengo mucho tiempo para aprender nuevos idiomas si es necesario. Ya tengo un servidor web, aunque probablemente tendré que cambiar de host porque GoDaddy no parece admitir PostgreSQL sin obtener un VPS.

¡Gracias por tu ayuda!

EDITAR: (13 de enero) Todavía estoy buscando información sobre la mejor manera de almacenar un ráster BIP tridimensional de 16 bits y poder consultar de manera eficiente una sola "columna" de datos del eje z. No quiero convertirlo a un formato de 32 bits (porque eso duplicaría su tamaño de archivo de su forma actual de 16 bits).

dmahr
fuente
2
¿Puedes poner PostgreSQL / PostGIS en tu servidor web? - Recomiendo encarecidamente tener su propio servidor para, a menos que esté buscando opciones escalables, entonces Amazon AWS (EC2 Relational Databases AMI) aws.amazon.com/running_databases podría ser una opción.
Mapperz
1
Mi host (GoDaddy) no es compatible con PostgreSQL de acuerdo con este hilo . Realmente no necesito escalabilidad: este proyecto es principalmente para permitir que algunos investigadores pares tengan un acceso más fácil a mis datos que enviar un archivo de 8GB y cargarlo en ENVI.
dmahr
1
Si está considerando un nuevo host, no puedo recomendar la webfaction lo suficiente; ofrecen postgresql / postgis1.5 pero para la funcionalidad de ráster probablemente desee postgis2.0. Esto también está en alojamiento compartido.
djq

Respuestas:

6

EDITAR: (13 de enero) Todavía estoy buscando información sobre la mejor manera de almacenar un ráster BIP tridimensional de 16 bits y poder consultar eficientemente una sola "columna" de datos del eje z. No quiero convertirlo a un formato de 32 bits (porque eso duplicaría su tamaño de archivo de su forma actual de 16 bits).

Consultar un ráster de este tipo no debería plantear grandes problemas. Puede leer datos binarios directamente usando todos los lenguajes del programa, y ​​el acceso es rápido. Solo asegúrese de almacenar sus datos en un formato de archivo que tenga todos los metadatos en un archivo separado. BIP es un formato

por ejemplo, en php, suponiendo que el archivo tiene un orden de fila mayor (de lo contrario, cambie x e y), con $ x y $ y la posición en su cuadrícula (contando desde 0), $ nx, $ ny y $ nz el número de píxeles en cada dimensión y $ nb el número de bytes por celda de cuadrícula:

$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

Solo asegúrese de acceder al píxel correcto: el conteo comienza desde la parte superior izquierda o no, ...

Información adicional: después de leer los datos, debe convertirlos en flotantes. P.ej:

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

En caso de que su host no admita la carga de archivos grandes, podría, por ejemplo, dividir su archivo bip en, por ejemplo, 8 archivos bip.

Más información sobre cómo haría el resto del sitio web: dado que sus datos son estáticos, podría generar un pequeño visor de mapas usando gdal2tiles y openlayers. http://www.gdal.org/gdal2tiles.html De hecho, ya que usted dice que "Realmente no necesito escalabilidad, este proyecto es principalmente para permitir que algunos investigadores pares tengan un acceso más fácil a mis datos que enviar un Archivo de 8 GB y cargarlo en ENVI ". Tal vez podría incluso hacerlo sin usar una caja de herramientas webgis: simplemente deje que sus usuarios hagan clic en la imagen y capturen las coordenadas: http://www.emanueleferonato.com/2006/09/02/click -imagen-y-consigue-coordenadas-con-javascript /

(aunque debería encontrar una manera de presentar su imagen 5000x5000 muy bien)

johanvdw
fuente
Impresionante, esta es una aclaración realmente útil. Un seguimiento: ¿debo almacenar este binario en PostGIS? Solo quiero evitar la situación en la que el servidor tiene que extraer todo el archivo binario de la base de datos antes de consultarlo con PHP o Python. Ese sería un paso prohibitivamente lento.
dmahr
No, el archivo debe estar en el sistema de archivos. No tiene sentido usar una base de datos. Incluso solo abrir una conexión probablemente llevará más tiempo que el código anterior.
johanvdw
7

Esto parece tres problemas separados: uno de infraestructura, uno de arquitectura y uno de manejo de eventos. Presentaré un enfoque posible, pero mi respuesta es necesariamente general.

Infraestructura

Recomiendo usar un servicio de alojamiento VPS como Linode (www.linode.com) para su servidor. Esto le brinda acceso completo (es decir, root) a un servidor mantenido profesionalmente, sin preocuparse por la falta de energía o la pérdida de su conexión a Internet.

Arquitectura

Hay tantas opciones aquí que puede ser realmente abrumador. Como ejemplo, ejecuto un par de sistemas con GeoServer y OpenLayers. GeoServer es servido por Tomcat 7. El front-end OpenLayers / jQuery es servido por Apache2. Puede incluir Postgres / PostGIS para almacenar datos vectoriales, pero esta no es una buena opción para datos ráster. También puede configurar un sistema Python usando Django o incluso web.py (http://webpy.org/) para un controlador bastante simple. GeoServer le permite almacenar datos ráster en los siguientes formatos:

  • ArcGrid - Formato de cobertura de Arc Grid
  • GeoTIFF - Formato de archivo de imagen etiquetada con información geográfica
  • Gtopo30 - Formato de cobertura Gtopo30
  • ImageMosaic - Complemento de mosaico de imágenes
  • WorldImage: un archivo ráster acompañado de un archivo de datos espaciales

Manejo de eventos

Cuando el usuario hace clic en el mapa, desea que aparezca un gráfico de serie temporal de los datos del campo en ese punto. Primero, configure un controlador, que podría escribirse en Python o Java, que escuche las solicitudes de URL con latitud y longitud. Este controlador devuelve una imagen estática renderizada en el servidor o datos json que el cliente (jQuery) puede convertir en un diagrama.

Luego, para obtener los datos XY en el mapa, puede utilizar una función como esta (consulte http://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html ):

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

Espero que eso ayude.

katahdin
fuente
Gracias por el reportaje! ¿Alguna vez ha utilizado alguno de esos formatos de archivo para crear rásteres tridimensionales de más de 8 GB? Sé que GeoTIFF no puede superar los 4 GB, por ejemplo. ¿Y será capaz el software del servidor de consultar de manera eficiente una sola serie temporal de datos del eje z?
dmahr
Echa un vistazo a las pirámides de imágenes . Eso puede ayudar con los problemas de tamaño de archivo. Al manejar el evento de clic, su código (controlador) recibirá los datos XY y luego buscará y extraerá el valor z de cada una de las 300 imágenes con marca de tiempo. Eso es mucho procesamiento y E / S de disco, por lo que podría llevar mucho tiempo. Si ese método de "fuerza bruta" lleva demasiado tiempo, podría buscar algoritmos alternativos y / o esquemas de almacenamiento de series temporales.
katahdin
Sí, ese método de "fuerza bruta" será más lento de lo que preferiría (incluso es lento en una computadora de escritorio). Creo que estoy interesado en enmarcar todo el servicio de mapeo web en torno al mejor esquema de almacenamiento alternativo que pueda encontrar.
dmahr
1

Si entiendo correctamente su pregunta, crearía un servicio WMS horario, por ejemplo con MapServer .

De esta manera, será fácil mostrar el ráster correcto para cada fecha y hora (con una solicitud GetMap) y solicitar los valores para una celda en un rango de fecha y hora determinado (con una solicitud GetFeatureInfo).

capooti
fuente