====== Spatial database :: PostGIS ====== Voyons comment utiliser l'extension PostGIS de Postgresql pour stocker et gérer de l'information géographique dans un SGBD. * Installer PostGIS selon les instructions ici http://postgis.net/install. En résumé : * pour Mac, préférer l'approche "tout-en-un" http://postgresapp.com * pour Windows, installer d'abord Postgresql par [[http://www.enterprisedb.com/products-services-training/pgdownload|EnterpriseDB]], puis activer l'add-on PostGIS (veiller à cocher la case "create spatial database" durant l'installation) * si aucune ne fonctionne, explorer les autres approches pour réaliser cette installation * Astuce pour WAMP et le problème //pg_connect//, d'après Daniel : 1. Copier C:\wamp\bin\php\php5.xxx\libpq.dll 2. Dans C:\wamp\bin\apache\apache2.xxx\bin 3. Restart Apache * Compléter l'installation par la création d'une //geodatabase// : * lancer le serveur Postgresql et s'y connecter avec un client type pgAdmin * créer une database (ex. nommée //ogo//) * dans le contexte de cette base, exécuter la commande SQL suivante CREATE EXTENSION postgis; Pour la suite, ne pas oublier l'indispensable [[http://postgis.refractions.net/documentation/manual-1.5/|documentation]] avec son chapitre [[http://postgis.refractions.net/documentation/manual-1.5/reference.html|PostGIS Reference]] ===== Une première "geotable" ===== * Créer une //géotable// CREATE TABLE my4capitals (id serial PRIMARY KEY, name text); SELECT AddGeometryColumn( 'my4capitals', 'the_geom', 4326, 'POINT', 2 ); * Alimenter la table (cf. http://fr.wikipedia.org/wiki/Well-known_text) INSERT INTO my4capitals VALUES ( nextval('my4capitals_id_seq'), 'Paris', ST_GeometryFromText( 'POINT(2.333 48.867)', 4326)); INSERT INTO my4capitals VALUES ( nextval('my4capitals_id_seq'), 'Bern', ST_GeometryFromText( 'POINT(7.433 46.95)', 4326)); INSERT INTO my4capitals VALUES ( nextval('my4capitals_id_seq'), 'Rome', ST_GeometryFromText( 'POINT(12.5 41.883)', 4326)); INSERT INTO my4capitals VALUES ( nextval('my4capitals_id_seq'), 'Madrid', ST_GeometryFromText( 'POINT(-3.71 40.41)', 4326)); * Lire la table et ses données géographiques SELECT ST_AsEWKT(the_geom) FROM my4capitals; SELECT ST_AsText(the_geom) FROM my4capitals; SELECT ST_AsGeoJSON(the_geom) FROM my4capitals; * Transformer des coordonnées d'une projection à une autre SELECT ST_AsEWKT(ST_Transform(the_geom, 21781)), ST_AsEWKT(the_geom) FROM my4capitals; ===== Géoservice Get4Capitals.php ===== Cet exemple montre comment créer un service sur mesure qui va //publier// l'information géographique de la géotable. Il est notamment fait usage du format GeoJSON pour transmettre ces données au client. OpenLayers saura par exemple l'exploiter facilement comme vu dans [[geoinf14:oltuto#ex5asource_de_donnees_openlayersformat|Ex5A]]. selectQuery($query); $i = 0; $fc = new FeatureCollection(); while ($row = pg_fetch_row($result)) { $fc->addFeature(new Feature($i++, (json_decode($row[1])), array("name" => $row[0]))); } echo json_encode($fc); ?> On a besoin d'un GeoManager (GeoManager.php) qui sait gérer les requêtes avec la geodatabase et encoder les résultats par un flux GeoJSON. CONFIG = $cfg; return $this->CONN = pg_connect($this->CONFIG) or die('connection failed'); } function selectQuery($query) { $result = pg_query($this->CONN, $query); if (!$result) throw new ErrorException($query); return $result; } function insertQuery($query) { pg_query($this->CONN, "BEGIN WORK"); $result = pg_query($this->CONN, $query); if (!$result) { pg_query($this->CONN, "ROLLBACK"); } else { pg_query($this->CONN, "COMMIT"); } } } class Feature { var $type; var $geometry; var $id; var $properties; function Feature($id,$geom,$properties) { $this->type = "Feature"; $this->geometry = $geom; $this->id = $id; $this->properties = $properties; } } class FeatureCollection { var $type; var $features; function FeatureCollection() { $this->type = "FeatureCollection"; $this->features = array(); } function addFeature($feature) { array_push($this->features,$feature); } } ?> __TODO__ - Tester ce géoservice et analyser les différentes étapes du processus (veiller à reconfigurer les paramètres de connexion) - Terminer l'exemple en exploitant le géoservice dans OpenLayers avec une OpenLayers.Layer.Vector