Un logiciel de cartographie Web pour une énorme série temporelle raster?


11

Je suis un utilisateur d'ArcGIS Desktop qui entre dans le monde de la cartographie Web pour la première fois. En suivant les conseils que j'ai trouvés ici sur GIS.SE, j'ai commencé avec les tutoriels gratuits d' OpenGeo .

Cependant, j'ai commencé à réaliser que la plupart des démos et des exemples étaient orientés vers des données vectorielles. Mon projet principal consiste à afficher une série temporelle de 300 images de rasters de 5000 x 5000 pixels. Sur mon ordinateur de bureau, ceux-ci sont stockés dans un seul binaire BIP entier 5000x5000x300 16 bits, qui totalise environ 8 Go. Mon objectif est de pouvoir cliquer sur une cellule (d'un seul raster de la série chronologique) et afficher un graphique affichant les valeurs de ce pixel dans la série chronologique de 300 éléments. Les données raster utilisées pour chaque graphique de série chronologique doivent être stockées sans perte, bien que les cartes de superposition sur lesquelles vous cliquez peuvent être des caches avec perte.

Y a-t-il quelque chose qui pourrait être mieux adapté à ce projet (pour un développeur SIG Web novice) qu'OpenGeo? Ou devrais-je simplement continuer avec cette configuration?

Pour référence, j'ai une expérience en programmation en Python, Java et PHP. Je n'ai pas beaucoup d'expérience avec SQL. Ceci est un projet ouvert donc j'ai beaucoup de temps pour apprendre de nouvelles langues si besoin est. J'ai déjà un serveur Web, mais je devrai probablement changer d'hôte car GoDaddy ne semble pas prendre en charge PostgreSQL sans obtenir un VPS.

Merci de votre aide!

EDIT: (13 janvier) Je cherche toujours des informations sur la meilleure façon de stocker un raster BIP entier 16 bits en 3 dimensions et de pouvoir interroger efficacement une seule "colonne" de données sur l'axe z. Je ne veux pas le convertir au format 32 bits (car cela doublerait sa taille de fichier par rapport à sa forme actuelle 16 bits).


2
Pouvez-vous mettre PostgreSQL / PostGIS sur votre serveur Web? - Je recommande fortement d'avoir votre propre serveur à moins que vous ne recherchiez des options évolutives, alors Amazon AWS (EC2 Relational Databases AMI) aws.amazon.com/running_databases pourrait être une option.
Mapperz

1
Mon hôte (GoDaddy) ne prend pas en charge PostgreSQL selon ce fil . Je n'ai pas vraiment besoin d'évolutivité - ce projet vise principalement à permettre à quelques pairs chercheurs d'avoir un accès plus facile à mes données que d'envoyer un fichier de 8 Go et de le charger dans ENVI.
dmahr

1
Si vous envisagez un nouvel hôte, je ne saurais trop recommander Webfaction; ils offrent postgresql / postgis1.5 mais pour la fonctionnalité raster, vous voulez probablement postgis2.0. C'est aussi sur l'hébergement mutualisé.
djq

Réponses:


6

EDIT: (13 janvier) Je cherche toujours des informations sur la meilleure façon de stocker un raster BIP entier 16 bits en 3 dimensions et de pouvoir interroger efficacement une seule "colonne" de données sur l'axe z. Je ne veux pas le convertir au format 32 bits (car cela doublerait sa taille de fichier par rapport à sa forme actuelle 16 bits).

L'interrogation d'un tel raster ne devrait pas vraiment poser de gros problèmes. Vous pouvez lire des données binaires directement en utilisant tous les langages de programme, et l'accès est rapide. Assurez-vous simplement de stocker vos données dans un format de fichier qui contient toutes les métadonnées dans un fichier séparé. Le BIP est un tel format

par exemple en php, en supposant que le fichier est de l'ordre majeur des lignes (sinon changez x et y), avec $ x et $ y la position dans votre grille (en comptant à partir de 0), $ nx, $ ny et $ nz le nombre de pixels dans chaque dimension et $ nb le nombre d'octets par cellule de grille:

$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

Assurez-vous simplement d'accéder au bon pixel: le décompte commence-t-il en haut à gauche ou non, ...

Quelques informations supplémentaires: Après avoir lu les données, vous devez les convertir en flottants. Par exemple:

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

Dans le cas où votre hôte ne prend pas en charge le téléchargement de fichiers volumineux, vous pouvez par exemple diviser votre fichier bip en par exemple 8 fichiers bip.

Quelques informations supplémentaires sur la façon dont je ferais le reste du site Web: puisque vos données sont statiques, vous pouvez générer un petit visualiseur de carte en utilisant gdal2tiles et openlayers. http://www.gdal.org/gdal2tiles.html En fait, puisque vous dites que "je n'ai pas vraiment besoin d'évolutivité - ce projet vise principalement à permettre à quelques chercheurs pairs d'avoir un accès plus facile à mes données que d'envoyer un 8 Go de fichier et le charger dans ENVI. "Vous pourriez peut-être même vous passer d'une boîte à outils webgis: laissez simplement vos utilisateurs cliquer sur l'image et attraper les coordonnées: http://www.emanueleferonato.com/2006/09/02/click -image-et-obtenez-les-coordonnées-avec-javascript /

(même si vous devriez trouver un moyen de bien présenter votre image 5000x5000)


Génial, c'est une clarification vraiment utile. Un suivi: dois-je stocker ce binaire dans PostGIS? Je veux juste éviter la situation où le serveur doit extraire tout le fichier binaire de la base de données avant de l'interroger avec PHP ou Python. Ce serait une étape extrêmement lente.
dmahr

Non, le fichier doit se trouver sur le système de fichiers. Inutile d'utiliser une base de données. Même l'ouverture d'une connexion prendra probablement plus de temps que le code ci-dessus.
johanvdw

7

Cela ressemble à trois problèmes distincts: l'un de l'infrastructure, l'autre de l'architecture et l'autre de la gestion des événements. Je vais exposer une approche possible, mais ma réponse est nécessairement générale.

Infrastructure

Je recommande d'utiliser un service d'hébergement VPS comme Linode (www.linode.com) pour votre serveur. Cela vous donne un accès complet (c'est-à-dire root) à un serveur entretenu par des professionnels - pas de soucis de coupure de courant ou de perte de sa connexion à Internet.

Architecture

Il y a tellement d'options ici que cela peut être vraiment écrasant. À titre d'exemple, j'exécute quelques systèmes avec GeoServer et OpenLayers. GeoServer est servi par Tomcat 7. Le frontend OpenLayers / jQuery est servi par Apache2. Vous pouvez inclure Postgres / PostGIS pour stocker des données vectorielles, mais ce n'est pas une bonne option pour les données raster. Vous pouvez également configurer un système Python en utilisant Django ou même web.py (http://webpy.org/) pour un contrôleur assez simple. GeoServer vous permet de stocker des données raster dans les formats suivants:

  • ArcGrid - Format de couverture de la grille d'arc
  • GeoTIFF - Format de fichier image balisé avec des informations géographiques
  • Gtopo30 - Format de couverture Gtopo30
  • ImageMosaic - Plugin de mosaïquage d'images
  • WorldImage - Un fichier raster accompagné d'un fichier de données spatiales

Gestion des événements

Lorsque l'utilisateur clique sur la carte, vous souhaitez faire apparaître un tracé de série chronologique des données de champ à ce point. Tout d'abord, configurez un contrôleur, qui pourrait être écrit en Python ou Java, qui écoute les demandes d'URL avec une latitude et une longitude. Ce contrôleur renvoie soit une image statique rendue sur le serveur, soit des données json que le client (jQuery) peut transformer en un tracé.

Ensuite, pour obtenir les données XY sur la carte, vous pouvez utiliser une fonction comme celle-ci (voir http://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html ):

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

J'espère que ça aide.


Merci pour le compte rendu! Avez-vous déjà utilisé l'un de ces formats de fichier pour créer des rasters tridimensionnels de plus de 8 Go? Je sais que les GeoTIFF ne peuvent pas dépasser 4 Go par exemple. Et le logiciel serveur pourra-t-il interroger efficacement une seule série chronologique de données sur l'axe z?
dmahr

Jetez un œil aux pyramides d'images . Cela peut aider à résoudre les problèmes de taille de fichier. Lors de la gestion de l'événement de clic, votre code (contrôleur) recevra les données XY, puis recherchera et extraira la valeur z de chacune des 300 images horodatées. Cela représente beaucoup de traitement et d'E / S disque, cela peut donc prendre beaucoup de temps. Si cette méthode de «force brute» prend trop de temps, vous pouvez rechercher des algorithmes alternatifs et / ou des schémas de stockage de séries chronologiques.
katahdin

Oui, cette méthode de "force brute" sera plus lente que je ne le préférerais (elle est même lente sur un ordinateur de bureau). Je suppose que je suis intéressé à cadrer l'ensemble du service de cartographie Web autour du meilleur schéma de stockage alternatif que je puisse trouver.
dmahr

1

Si je comprends bien votre question, je créerais un service WMS temporel, par exemple avec MapServer .

De cette façon, il sera facile d'afficher le raster correct pour chaque datetime (avec une requête GetMap) et de demander les valeurs d'une cellule dans une plage de datetime donnée (avec une requête GetFeatureInfo).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.