Mapserver et les requêtes avec PostgreSQL

Suite à de multiple tentatives de connexion de table avec des clauses plus ou moins variables entre Mapserver et PostgreSQL, j’ai trouvé différents problèmes et différentes manières de les régler.

Simple ou double cote ?!

Voici une requête classique :

the_geom FROM (
	SELECT * 
	FROM table1 
	) AS foo USING UNIQUE ogc_fid USING SRID=27572

Cette requête est incluse dans des double cote :

DATA " ma requête "

Si vous avez enregistrez vos tables avec des nom contenant des caractères en majuscules ou des tirets, vous devez les modifier .

Astuce (à éviter pour les raisons qui vont suivre) : Pour que les tables soient reconnu, vous devez les inclure dans des double côtes :

the_geom FROM (
	SELECT * 
	FROM "TaBle-1"
	) AS foo USING UNIQUE ogc_fid USING SRID=27572

Cette requête cette requête sera incluse dans des simple cote :

DATA ' ma requête '

Ce schéma se répète avec les noms de champ pour lors de jointures ou d’utilisation de clauses WHERE ou encore lors de la sélection de champs particuliers :

the_geom FROM (
	SELECT * 
	FROM table1 LEFT OUTER JOIN table2
	ON (table1.id = table2.id) 
	) AS foo USING UNIQUE ogc_fid USING SRID=27572

Requête à inclure dans :

DATA " ma requête "
the_geom FROM (
	SELECT * 
	FROM "Table1" LEFT OUTER JOIN table2
	ON ("Table1".id = table2."ID") 
	) AS foo USING UNIQUE ogc_fid USING SRID=27572

Requête à inclure dans :

DATA ' ma requête '

Le problème se compique lors de l’exécution d’une clause WHERE avec l’opérateur LIKE car si vous utilisez le caractère % ou _ , vous devrez les englober dans des simple cote. Donc, On abandonne obligatoirement les majuscule dans le nom des champs et dans le nom des tables.

Donc le résultat est

DATA "the_geom FROM (
	SELECT * 
	FROM table1 LEFT OUTER JOIN table2
	ON (table1.id = table2.id) 
	WHERE table1.id LIKE '29%'
	) AS foo USING UNIQUE ogc_fid USING SRID=27572"

Les Jointures

J’ai remarqué que la jointure de deux tables dont le but est de renvoyer les éléments identique dans les deux tables peux s’écrire de deux voir trois manières.

Écriture 3 :

DATA "the_geom FROM (
	SELECT * 
	FROM table1 INNER JOIN table2
	ON( table1.id = table2.id)
	) AS foo USING UNIQUE ogc_fid USING SRID=27572"

Écriture 2 :

DATA "the_geom FROM (
	SELECT * 
	FROM table1,table2
	WHERE table1.id = table2.id
	) AS foo USING UNIQUE ogc_fid USING SRID=27572"

Dans cet Exemple, il n’y a pas de clause de jointure. Dans le cas une abscence de clauses JOIN c’est INNER JOIN qui est défini par défault si une clause WHERE avec un critère d’égalité est entrée sinon INNER JOIN se comporte comme CROSS JOIN (et donc comme un produit cartésien)

Écriture 3 :

DATA "the_geom FROM (
	SELECT * 
	FROM table1 NATURAL JOIN table2
	) AS foo USING UNIQUE ogc_fid USING SRID=27572"

Étant donné que la jointure des deux tables porte sur des champs identiques, il est possible de simplifier la requête en supprimant la clause WHERE ( avec une égalité de champs), USING, et ON.

Maintenant je ne sais pas si une de ces requêtes est plus rapide. Donc je vais tester ça.

Publié dans API Web, Informatique, SGBD | Marqué avec , | Laisser un commentaire

Insérer un jeu de données Mapinfo dans une base de données PostgreSQL-PostGIS

Informations préalables

Tout d’abord, il est indispensable d’avoir installé GDAL sur votre système. Vous devez également avoir un SGBD PostgreSQL et PostGIS d’installé. Ensuite la base de données que vous souhaitez utiliser doit être spatialisé.

Maintenant, vous devez disposer d’un jeu de données complet avec un système de projection renseigné.

Le jeu de données se compose de :

  • pays.DAT
  • pays.ID
  • pays.MAP
  • pays.TAB
  • pays.IND (optionnel)

Vous pouvez obtenir des informations sur le système de projection en tapant :

ogrinfo -so -al pays.TAB

Insertion des données dans une base de données

Maintenant vous devez vous placer dans le répertoire des données et utiliser la commande suivante.

PGCLIENTENCODING=iso-8859-15 ogr2ogr -f "PostgreSQL" PG:"host=localhost dbname=MaBase user=moi port=5432 password=MonMot2Passe" -lco GEOMETRY_NAME=the_geom -a_srs EPSG:27572 pays.TAB

Description :

PGCLIENTENCODING

Cet argument est indispensable si vous souhaitez insérer des données encodées au format ISO-8859-xx dans une base de données UTF-8

ogr2ogr

C’est la commande de conversion de fichier

-f "PostgreSQL"

L’option -f défini le format dans lequel va être enregistré le jeu de données. Dans notre cas, nous voulons enregistrer notre jeu de données dans une base de données d’un SGBDR « PostgreSQL » (celle-ci étant, bien sûr, spatialisée)

PG:"host=localhost dbname=MaBase user=moi port=5432 password=MonMot2Passe"

Ces informations sont à renseigner afin déterminer quel seveur, quel port (5432 est le port par défaut donc il n’est pas forcément nécessaire de le renseigner pour une première installation par défaut), et quelle base de données nous devront utiliser pour stocker le jeu de données. Nous devons également définir un utilisateur ayant des droits suffisants pour créer des tables dans cette base de données

-lco GEOMETRY_NAME

Cette option suivi de l’argument GEOMETRY_NAME permet de modifier le nom de la colonne géométrie ce qui est utile lors que l’on veut aussi utiliser la commande shp2pgsql. Il faut donc mettre la valeur « the_geom »

-a_srs

Cette option est indispensable dans mon cas car le système de projection n’est pas reconnu avec la commande ogrinfo. Dans mon exemple, la projection sous Mapinfo est définie en Lambert II carto Paris. J’ai donc mis le code EPSG correspondant : 27572 (en sachant qu’il remplace le code 27582 anciennement utilisé pour cette projection, celui-ci étant aujourd’hui obsolète)

-overwrite

Cette option s’avère utile pour mettre à jour le contenu de vos tables mais n’est pas indispensable.

Création d’un index spatial

Afin d’améliorer les performance de votre système de gestion de base de données, il est d’indexer vos tables sur la géométrie. Une bonne méthode est disponible sur le site PostGIS.fr. Ainsi nous allons créer un index sur la colonne the_geom

Tout d’abord, nous devons nous connecter à la base de données :

 psql -u moi -d MaBase

Maintenant, nous allons créer notre index et le nommer the_geom_gist (c’est pas un nom obligatoire. c’est juste pour mémoriser sur quel colonne et quel méthode j’ai utiliser pour créer l’index) :

CREATE INDEX "the_geom_gist" ON "pays" USING GIST ("the_geom" GIST_GEOMETRY_OPS );
-- L'analyse de la table est indispensable pour l'optimisation des requêtes. 
-- Il est donc nécessaire de l'effectuer après chaque ajout de tables ou modification de celles-ci.
VACUUM ANALYZE "pays";

Gestion des droits

Pour permettre à un utilisateur de lire vos données cartographiques tout en évitant les problèmes de sécurité, nous devons limiter les droits d’accès avec une unique possibilité de lecture.

Pour cela, il faut faire la manipulation sur chaque table de la base de données :

GRANT SELECT ON "pays" TO "www-data";
VACUUM "pays";
Publié dans Divertissement, Erreurs, Géomatique, HowTo, Informatique, Outils, SGBD | Marqué avec , , , , | Laisser un commentaire

Mon source.list pour Linux Ubuntu 7.10

Ce source.list permet d’installer des paquets pour Ubuntu Gusty avec une orientation SIG.

Modifiez votre fichier en tapant :

sudo gedit /etc/apt/sources.list

Vous pouvez aussi faire les modification via Nautilus :

sudo nautilus

ensuite, vous pourrez ouvrir et enregistrer le fichier sources.list.

Maintenant, adaptez le contenu ou supprimez et coller le texte suivant :

## File : sources.list
 
##### Serveurs Français #####
 
#paquets principaux maintenus par Ubuntu
deb http://fr.archive.ubuntu.com/ubuntu/ gutsy main restricted
deb http://fr.archive.ubuntu.com/ubuntu/ gutsy-updates main restricted
 
#paquets libres et non-libres non-maintenus par Ubuntu
deb http://fr.archive.ubuntu.com/ubuntu/ gutsy universe multiverse
deb http://fr.archive.ubuntu.com/ubuntu/ gutsy-updates universe multiverse
#ancien paquets stabilisées par des volontaires
deb http://fr.archive.ubuntu.com/ubuntu/ gutsy-backports main restricted universe multiverse
 
# Dépôts de sources (uniquement utiles pour télécharger les sources avec "apt-get source". Dans ce cas enlever les #)
# deb-src http://fr.archive.ubuntu.com/ubuntu/ gutsy universe multiverse
# deb-src http://fr.archive.ubuntu.com/ubuntu/ gutsy-updates universe multiverse
# deb-src http://fr.archive.ubuntu.com/ubuntu/ gutsy main restricted
# deb-src http://fr.archive.ubuntu.com/ubuntu/ gutsy-updates main restricted
# deb-src http://fr.archive.ubuntu.com/ubuntu/ gutsy-backports main restricted universe multiverse
 
##### Serveurs Internationaux #####
# (pour les fichiers absent des serveurs français)
 
## A conserver (mise à jour de sécurité)
deb http://security.ubuntu.com/ubuntu gutsy-security main restricted
deb http://security.ubuntu.com/ubuntu gutsy-security universe multiverse
 
deb http://archive.ubuntu.com/ubuntu/ gutsy main restricted
deb http://archive.ubuntu.com/ubuntu/ gutsy-updates main restricted
deb http://archive.ubuntu.com/ubuntu/ gutsy universe multiverse
deb http://archive.ubuntu.com/ubuntu/ gutsy-updates universe multiverse
deb http://archive.ubuntu.com/ubuntu/ gutsy-backports main restricted universe multiverse
 
#sources
# deb-src http://archive.ubuntu.com/ubuntu/ gutsy main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ gutsy-updates main restricted
# deb-src http://security.ubuntu.com/ubuntu gutsy-security main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ gutsy universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ gutsy-updates universe multiverse
# deb-src http://security.ubuntu.com/ubuntu gutsy-security universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ gutsy-backports main restricted universe multiverse
 
## Logiciel à jour
 
# PGadmin3 via APT (nécessite une clé public)
deb ftp://ftp4.fr.postgresql.org/pub/mirrors/postgresql/pgadmin3/release/ubuntu gutsy pgadmin
 
# Gdal | mapserver | php5-mapscript | grass | qgis via APT (nécessite une clé public)
deb http://les-ejk.cz/ubuntu gutsy multiverse
deb-src http://les-ejk.cz/ubuntu gutsy multiverse

Pour obtenir des paquets sur ces nouveaux serveurs, nous devons demander une clé public.
Pour cela, tapez :

wget -q -O - http://www.pgadmin.org/pgp/archive_key_debian_ubuntu.gpg | sudo apt-key add -
wget -q -O - http://les-ejk.cz/pgp/jachym_cepicky-gpg.pub | sudo apt-key add -
Publié dans Informatique | Marqué avec , , | Laisser un commentaire

Installation de Mapserver5 sur Ubuntu7.10

Pré-requis:

Ce tutoriel nécessite :

  • une connexion internet,
  • d’avoir les paquets à jour ainsi qu’une petite modification du source.list afin d’avoir tous les paquets nécessaires
  • d’avoir installé apache2 et php5

Mémo :

  • Installation de Apache2 et php5 :
    sudo aptitude install apache2 php5
  • Configiration du fichier hosts ici

Installation des paquets

sudo aptitude install cgi-mapserver mapserver-bin mapserver-doc php5-mapscript python-mapscript

Note : Avec cette méthode, mapserv est installé dans /usr/lib/cgi-bin.

Visualisez les informations relatives à Mapserver

Après l’installation, vous pouvez voir les paramètres se reportant aux supports ainsi qu’aux formats d’export et import pris en compte par Mapserver.

Tapez :

/usr/lib/cgi-bin/mapserv -v

Réponse de la machine :

MapServer version 5.0.0 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=THREADS SUPPORTS=GEOS INPUT=EPPL7 INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

Vous pouvez également retrouver ces informations en mettant sur votre serveur un fichier info.php à la racine du serveur (par exemple /var/www) contenant :

<?php phpinfo() ?>

Il nous suffira ensuite de taper http://localhost/info.php

Vous pouvez désormais tester le CGI de mapserver en cliquant sur le lien suivant :
http://localhost/cgi-bin/mapserv
Votre navigateur devrez vous retourner la phrase suivante : « No query information to decode. QUERY_STRING is set, but empty. »

Installation des exemples

Vous pouvez maintenant installer un exemple d’application conçu pour mapserver5 http://maps.dnr.state.mn.us/mapserver_demos/workshop-5.0.zip

Note : Dans mon cas, j’ai extrait le contenu de l’archive dans /home/gglafouine/gis-test/mapserver (les liens sont en relation avec ce dossier alors modifiez les en conséquences).

Configuration d’Apache2

Désormais nous devons éditer le fichier Default du serveur Apache afin de lui définir un nouvel hôte permettant d’accéder à notre application.

sudo gedit /etc/apache2/sites-available/default

Ajouter l’hôte virtuel :

<VirtualHost *>
	ServerName mapserver
	DocumentRoot /home/gglafouine/gis-test/mapserver
 
	<Directory />
		Options FollowSymLinks
		AllowOverride All
	</Directory>
 
	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>
 
	ErrorLog /var/log/apache2/mapserverdemo_error.log
	LogLevel warn
	CustomLog /var/log/apache2/mapserver_access.log combined
	ServerSignature On
</VirtualHost>

Nous devons ensuite modifier le fichier hosts :

 sudo gedit /etc/hosts

Ajoutez la ligne suivante :

127.0.0.2	localhost.localdomain localhost mapserver

Astuce : Vous pouvez créer un nouveau lien sur le fichier mapserv contenu dans le dossier /usr/lib/cgi-bin/ en le nommant mapserv50 (cela évite de modifier les occurrences des fichiers.)

Maintenant vous devez relancez le serveur :

sudo /etc/init.d/apache2 restart

Vous pouvez désormais vérifier une nouvelle fois le fonctionnement de mapserver en CGI en cliquant sur le lien suivant :

Votre navigateur devrez vous retourner la phrase suivante : « No query information to decode. QUERY_STRING is set, but empty.

Notre exemple n’est pas encore prêt à être utilisé. Pour cela, nous devons modifier les fichiers :

  • index.html
  • itasca.map

configuration de l’exemple

Tout d’abord, nous allons modifier le fichier index.html contenu dans le dossier workshop-5.0.

sudo gedit /home/gglafouine/gis-test/mapserver/workshop-5.0/index.html

Entrez les chemins correspondant à votre installation dans les ligne suivantes :

8
9
10
        // EDIT THE NEXT 2 LINES TO MATCH YOUR SETUP
        var snippet = "IMAGEPATH '/home/gglafouine/gis-test/mapserver/tmp/'";
        snippet += " IMAGEURL '/tmp/'";
41
42
43
44
      <!-- EDIT THESE HIDDEN VARIABLES -->
      <input type="hidden" name="map" value="/home/gglafouine/gis-test/mapserver/workshop-5.0/itasca.map">
      <input type="hidden" name="program" value="/cgi-bin/mapserv50">
      <input type="hidden" name="root" value="/mapserver/workshop-5.0">

Il nous faut encore modifier une ligne dans le mapfile :

sudo gedit /home/gglafouine/gis-test/mapserver/workshop-5.0/itasca.map

Modifiez la ligne :

76
      WMS_ONLINERESOURCE "http://localhost.localdomain/mapserver/workshop-5.0/index.html"

Enfin, vous pouvez visualiser les exemples en cliquant sur :
http://mapserver/workshop-5.0/

Et là ça fonctionne.

Publié dans API Web, HowTo, Serveur | Marqué avec , , , , | Laisser un commentaire

Corriger l’erreur : Could not determine domain name for ServerName

Encore une fois, je tombe sur quelque erreurs qui me pousse à aller voir mon ami Google afin de le questionner un peu sur le pourquoi et le comment

La première erreur : le serveur démarre avec l’adresse 127.0.1.1 au lieu de 127.0.0.1

Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

J’ai trouvé la réponse iciet la

Il faut vérifier le fichier /etc/hosts

sudo gedit /etc/hosts
1
2
3
4
5
6
7
8
9
10
127.0.0.1	localhost
127.0.1.1	ubuntu
 
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Il faut modifier les deux premières lignes comme il suit :

1
2
127.0.0.1	localhost.localdomain localhost ubuntu
#127.0.1.1	ubuntu

Ainsi, les deux erreurs sont corrigés en une seul fois ;-)

Il ne reste plus qu’à relancer le serveur est à vérifier.

sudo /etc/init.d/apache2 reload

Et la machine vous répond gentiment :

 * Reloading web server config apache2                                          5602
                                                                         [ OK ]

Maintenant nous allons ouvrir le navigateur et allez sur http://localhost/ et en bas de la page nous pouvons visualiser la version d’Apache ainsi que les modules installés.

Dans mon cas j’obtiens :

Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.3 Server at localhost Port 80

Note : Vous obtiendrez la même chose si vous entrez en lien le nom de votre machine. Dans mon cas ce sera http://ubuntu/

Publié dans HowTo, Serveur | Marqué avec , , | Un commentaire

Insérer des images dans un article sans les uploader sur le serveur FTP

Je viens de trouver un moyen d’éviter de passer par mon serveur ftp pour insérer des images dans un article. C’est une technique employer pour le transfert d’image par email normalement mais bon ça marche aussi dans mon cas.
La manipulation est assez simple puisqu’il suffit de convertir mot image en code base64. Pour cela, j’utilise le convertisseur disponible sur le site Motobit software qui permet d’encoder et de décoder des images et du texte en base64.

Il suffit ensuite de mettre ce code dans une balise image en stipulant le format des données et l’encodage utilisé.
Maintenant j’insère le code de mon image dans une balise image:

<img src="data:image/jpeg;base64,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" alt="fouine"/>

Voici le résultat :
fouine

Cette méthode à l’avantage de pouvoir transférer des images dans un document HTML sans utiliser de pièces jointes ou d’enregistrer les images dans le contenu d’un article pour le stocker dans une base de données. Mais elle pose quand même l’inconvénient d’augmenter la taille des requêtes et les informations à stockées dans la base de données d’environ 37% pour une image jpeg.
encodage-base64

Liens utiles :

Publié dans Outils | Marqué avec , , | Laisser un commentaire

Un peu de musique, ça vous ferez pas plaisir?

Depuis quelques temps, on entend parler de Radioblog. Un site qui vous offre la possibilité d’écouter de la musique en ligne or celui-ci est fermé depuis que la SACEM est venu mettre son grain de sel. Toutefois nous pouvons encore trouver de la très bonne musique gratuite sur le site Jamendo.

Voici un petit album tranquille que j’écoute assez souvent au travail. La plupart des chansons sont en anglais et certaines sont en polonais.

Publié dans Divertissement | Marqué avec , , | Laisser un commentaire

Problème de son sous Linux Ubuntu 7.10 avec mon Toshiba Satellite Pro A100

Bon je viens de m’attaquer à mon problème de son sur mon PC portable. Une Vrai horreur. Déjà qu’on entend pas grand chose, et bien en plus de cela, quand j’écoute la musique sur Jamendo, ça saccade un maximum.

Après quelque minute de recherche grâce à mon ami Google, j’ai trouvé une page contenant la solution à l’un de mes problèmes.

>> Méthode trouvé sur le forum Ubuntu

Modifier le fichier alsa-base :

sudo gedit /etc/modprobe.d/alsa-base

Ajouter cette ligne à la fin du fichier :

options snd-hda-intel model=3stack

Et voilà :-) Vous pouvez redémarrer afin de voir le résultat.

Maintenant j’ai du son. Mais il me reste toujours le son saccadé sous Firefox quand j’écoute la musique sur Jamendo. Purement un problème de plugin ou de codec. Concernant le problème de saccade, j’avais apparemment un petit problème avec flash. La version installée était bien la 9 mais Firefox m’indiquait qu’il utilisait la version 7. J’ai donc réinstallé la version 9 et j’ai rajouté par dessus ça le plugin vlc pour firefox et ça ne saccade plus :-P après la réinstallation.

Edité le 29 avril à 22h30

Le problème est apparemment récursif puisqu’en redémarrant mon pc je repasse avec flash version 7. Flash ou Firefox est daubé sous Ubuntu :-| . J’ai pas de problème par contre sous windows XP car, en cliquant sur mon lecteur multimédia, il m’indique bien que j’utilise le plugin Flash version9. Bon je pense que je vais voir ça demain vu que je fais le pont.

Publié dans Erreurs, HowTo, Informatique, logiciel | Marqué avec , , | Laisser un commentaire

WordPress : Un nouveau thème pour le panneau d’administration

On voit plus souvent des thèmes concernant le « front-office » que le back-office de WordPress. En effet, coté classe, WordPress n’a rien de vraiment flambant (en même temps il n’est pas fait pour ça :-) ), et on le remarque surtout coté « back-office » même si des efforts ont été réalisés avec l’arrivée de la version 2.5, cela reste insuffisant à mon goût de ce coté. Mais il y a peu de temps, j’ai découvert des thèmes assez intéressants pour agrémenter le côté austère du « back-office » :
vous trouverez une liste de 9 thèmes disponible sur le blog lyxia, vous pourrez avoir l’avis d’Amauri Balmer sur le thème tiger . Le seul hic, c’est que la plupart ne sont plus compatible avec la dernière version de WordPress (entre autre le plugin WP_Tiger). Je me penche donc vers le plugin Fluency Admin en version 1.1 créé par Dean J Robinson compatible avec WordPress 2.5. Je trouve cette alternative plutôt pas mal et le design bien sympathique ;-) . Vous pourrez également tester la version 1 de Leopard Admin créé par Teddy Hwang qui n’est pas mal non plus mais plus orienté vers les Pro-Mac.

Publié dans logiciel | Marqué avec , , | Laisser un commentaire

Comment utiliser les widgets de Mapfish

>> Document officiel “HowTo Use Widgets” non traduit disponible ici

Dans cette page vous trouverez une sorte de tutoriel pour apprendre : à utiliser les widgets client de MapFish, à les intégrer dans un document HTML simple ou plus complexe en utilisant ExtJs pour la mise en page.

Prérequis

Ce tutoriel suppose que vous avez déjà installé MapFish. Si ce n’est pas le cas, allez à la page d’installation et suivez les instructions. Après, vous pourrez lire cet article.

Un document HTML Simple

Commençons tout d’abord par créer un fichier avec un minimum de contenu. Appelons le simple.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<html>
<head>
  <title>Tutoriel MapFish - Comment utiliser les Widgets</title>
  <link rel="stylesheet" type="text/css" href="/chemin/vers/mfbase/ext/resources/css/ext-all.css" />
 
  <script type="text/javascript" src="/chemin/vers/mfbase/openlayers/lib/OpenLayers.js"></script>
  <script type="text/javascript" src="/chemin/vers/mfbase/ext/adapter/ext/ext-base.js"></script>
  <script type="text/javascript" src="/chemin/vers/mfbase/ext/ext-all-debug.js"></script>
 
  <script type="text/javascript">
    // A cause d'un bug sous Firefox 2 vous devez spécifiez le chemin de la racine MapFish.
    // regardez sur https://bugzilla.mozilla.org/show_bug.cgi?id=351282
    var gMfLocation = "/chemin/vers/mfbase/";
  </script>
  <script type="text/javascript" src="/chemin/vers/mfbase/mapfish/MapFish.js"></script>
 
  <script type="text/javascript">
    Ext.onReady(function() {alert ('prêt à continuer');});
  </script>
</head>
<body>
  <span></span>
  <div id="myDiv"></div>
  <div id="olmap" style="width: 450px; height: 300px; background-color: #999;"></div>
 </body>
</html>

Les deux premières lignes décrivent le style du document.
À la suite des balises html et head viennent les styles Ext, l’API javascript OpenLayers , l’adaptateur Ext et ExtJS lui-même. Puis MapFish.js est chargé. Cela charge automatiquement les widgets de MapFish et les dossiers javascript fondamentaux. Notez que code>ext-all-debug.js peut être remplacé par ext-all.js afin accélérer le chargement. Notez aussi que dans un environnement de production, l'administrateur de l'application préfèrera utiliser le script MapFish afin de d'obtenir un fichier unique et léger contenant l'intégralité du code javascript.

Note : Pensez à remplacer /chemin/vers/mfbase/ par la valeur appropriée à votre installation.

Nous sommes maintenant prêt pour installer un gestionnaire d'évènement qui initialise (exécute), notre application après le chargement intégral du document.

Cette ligne

18
    Ext.onReady(function() {alert ('prêt à continuer');});

Dit que : Lorsque le document est entièrement chargé, la fonction passée en argument sera appelée. C'est la norme de fonctionnement Ext voir ExtJs .

Nous mettrons le code de notre application ici.

Dans la balise body de notre document, nous avons déjà mis deux éléments div dont un, avec l'id « olmap », qui contiendra la carte .

Pour ceux qui n'ont pas encore chargé la page de test, chargez la avec un navigateur et vous devrait voir une boîte grise avec un message d'alerte en disant "prêt à continuer".

Ajout d'une carte

La prochaine étape consiste à ajouter dans la page une simple carte OpenLayers . Vous le ferez dans la
section Ext.onReady afin de vous assurer que le document soit entièrement chargée.

18
19
20
21
22
23
24
25
26
27
    Ext.onReady(function() {
        var map = new OpenLayers.Map($('olmap'));
 
        var wms = new OpenLayers.Layer.WMS("OpenLayers WMS", 
            "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'}, {buffer: 0});
 
        map.addLayers([wms]);
        map.addControl(new OpenLayers.Control.LayerSwitcher());
        map.zoomToMaxExtent();
    });

Il s'agit d'un usage typique de OpenLayers. Vous pouvez vous référer à la documentation pour obtenir de plus amples renseignements sur la manière d'utiliser et de manipuler les objets, les méthodes et les événements de OpenLayers. Vous trouverez également de nombreuses façons de les utiliser avec MapFish.

Maintenant, actualiser la page de votre navigateur, vous devriez voir une carte du monde avec les outils de navigation dans la précédente boîte grise.

Ajout d'un widget

Maintenant que nous avons une carte dans notre page, nous voulons ajouter un widget. Nous vous proposons d'intégrer le widget de "raccourcis" dans la page. Ce widget doit permettre à l'utilisateur de choisir un lieu dans une liste choix afin d'obtenir vue de la carte correspondant à l'emplacement choisi.

Pour cela vous devrez ajouter le code suivant à la fin de la fonction onReady callback , juste après la déclaration zoomToMaxExtent.

        var store = new Ext.data.SimpleStore({
             fields: ['value', 'text', 'bbox'],
             data : [['OC', 'Oceana', new OpenLayers.Bounds(56.0234375, -72.53125, 214.2265625, 32.9375)],
                     ['NA', 'North America', new OpenLayers.Bounds(-186.37890625, -2.21875, -28.17578125, 103.25)],
                     ['SA', 'South America', new OpenLayers.Bounds(-146.828125, -71.828125, 11.375, 33.640625)],
                     ['AF', 'Africa', new OpenLayers.Bounds(-58.9375, -51.7890625, 99.265625, 53.6796875)],
                     ['EU', 'Europe', new OpenLayers.Bounds(-23.078125, 26.2578125, 56.0234375, 78.9921875)],
                     ['AS', 'Asia', new OpenLayers.Bounds(15.59375, -21.90625, 173.796875, 83.5625)]]
         });
 
         var shortcuts = new mapfish.widgets.Shortcuts({
             map: map,
             el: 'myDiv',
             store: store,
             templates: {
                 header: new Ext.Template("Choisissez un lieu dans la liste"),
                 footer: new Ext.Template("La carte sera centrée automatiquement à cet emplacement")
             }
         });
         shortcuts.render();

Dans ce code, il faut d'abord créer un nouveau conteneur qui va être utilisés par la liste de choix Ext. Ce conteneur doit être assimilé à un tableau relationnel entre le nom des lieux (ici les continents) et leurs étendues géographiques correspondantes (données à titre de limite d'emprise à OpenLayers).
Ensuite, nous créons un nouveau widget de Raccourcis MapFish. Enfin, nous lui donnons quelques options de configuration de manière à ce que :

  • il s'appuie sur l'objet OpenLayers map précédemment créé,
  • Il soit bien restitué dans l'élément DOM avec l' id « myDiv »,
  • il utilise le conteneur store préalablement créé,
  • certaines explications supplémentaires sont données à l'utilisateur au dessus et en dessous de la liste de choix.

Pour finir nous appelons l'objet avec la méthode render.

Maintenant, vous rafraîchissez la page. Un nouvel élément devrait s'afficher avec la liste des continents offrant la possibilité de zoomer dessus.

Mise en page complexe

Voici quelques notions élémentaires pour intégrer ces widgets dans une mise en page plus travaillée.

Nous commençons par positionner une fenêtre.

Je voudrais tout d'abord vous proposer de copier le fichier simple.html et d'en créer un nouveau nommé window.html.

Pour commencer, vous devrez ajouter le code suivant dans la balise script :

        var mapcomponent = new mapfish.widgets.MapComponent({map: map});
 
        var window = new Ext.Window({
            title: 'Map',
            width: 500,
            height: 300,
            minWidth: 300,
            minHeight: 200,
            layout: 'fit',
            plain: true,
            bodyStyle: 'padding: 5px;',
            items: mapcomponent
        });
        window.show();

Trois choses à remarquer dans ce code.

  • Nous avons créé un nouveau widget MapComponent. Ce widget est obligatoire si vous souhaitez utiliser le système de mise en page Ext avec des blocs redimensionnable. En effet, le widget MapComponent est capable de traiter correctement les événements de redimensionnement. MapComponent doit au moins avoir une option de la propriété "map" qui est la valeur de carte type OpenLayers.
  • La deuxième partie porte sur un objet window. Il s'agit là d'un des nombreux types d'éléments pouvant être utilisés pour construire une mise en page pour une application travaillée. De nombreuses options peuvent être données à cet objet, mais la plus importante est 'items' (élément). Référez vous à la documentation ext pour obtenir plus d'informations.
  • Ensuite nous appelons la méthode show de l'objet window.

Si vous actualisez la page dans votre navigateur, vous devriez maintenant voir la carte dans une fenêtre redimensionnable et déplaçables.
Astuce :Il existe de nombreuses autres façons de travailler avec des mises en page complexes. Vous trouverez d'autres exemples dans MapFishSample.

Vous pouvez également disposer de vos raccourcis dans une fenêtre. Pour ce faire, vous devrez supprimer certaines lignes dans le code existant.
Supprimez l'élément "el" dans le constructeur de raccourcis "Shortcuts" (ligne 36),
Retirez shortcuts.render () (ligne 43). Ainsi, les gabarits des raccourcis et la liste de choix seront figés dans une fenêtre.

Puis ajoutez le code suivant:

        var window = new Ext.Window({
            title: 'Shortcuts',
            width: 200,
            height: 100,
            minWidth: 200,
            minHeight: 100,
            layout: 'fit',
            plain: true,
            bodyStyle: 'padding: 5px;',
            items: shortcuts
        });
        window.setPagePosition(20, 40);
 
        window.show();

Observez le résultat dans votre navigateur.

Pièces jointes :
Simple.html (2,2 kB) - “l'exemple simple.html ,” ajouté par pgiraud le 11/05/07 13:51:55.
Window.html (2,9 kB) - “l'exemple window.html,” ajouté par pgiraud le 11/05/07 13:52:51.

Publié dans API Web, HowTo | Marqué avec , , | Laisser un commentaire