====== PostGIS, les bases ====== Voyons comment utiliser l'extension PostGIS de Postgresql pour stocker et gérer de l'information géographique dans un SGBD. 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]] * 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 * 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_AsGeoJSON(the_geom) FROM my4capitals; * Transformer des coordonnées d'une projection à une autre SELECT ST_AsEWKT(ST_Transform(the_geom, 21781)) FROM my4capitals; ===== Le 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 faire usage du format GeoJSON pour transmettre ces données au client. OpenLayers saura par exemple l'exploiter facilement. On a d'abord besoin d'un GeoManager (GeoManager.php) qui sait communiquer avec la geodatabase. CONN = pg_connect(self::$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); } } ?> Et voici le service Get4Capitals.php qui pilote le GeoManager selon ses besoins : 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); ?> __TODO__ - Tester cet exemple et analyser les différentes étapes du processus - Terminer l'exemple en exploitant le géoservice dans OpenLayers avec une OpenLayers.Layer.Vector