Table of Contents

Spatial database :: PostGIS

Voyons comment utiliser l'extension PostGIS de Postgresql pour stocker et gérer de l'information géographique dans un SGBD.

1. Copier C:\wamp\bin\php\php5.xxx\libpq.dll
2. Dans C:\wamp\bin\apache\apache2.xxx\bin
3. Restart Apache
  CREATE EXTENSION postgis;

Pour la suite, ne pas oublier l'indispensable documentation avec son chapitre PostGIS Reference

Une première "geotable"

CREATE TABLE my4capitals (id serial PRIMARY KEY, name text);
SELECT AddGeometryColumn( 'my4capitals', 'the_geom', 4326, 'POINT', 2 );
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));
SELECT ST_AsEWKT(the_geom) FROM my4capitals;
SELECT ST_AsText(the_geom) FROM my4capitals;
SELECT ST_AsGeoJSON(the_geom) FROM my4capitals;
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 Ex5A.

<?php
require_once 'GeoManager.php';
$conn = new Connection("host=10.192.57.14 port=5432 dbname=ogo user=ogo password=1234");

$query = "SELECT name, ST_AsGeoJSON(the_geom) from my4capitals";
$result = $conn->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.

<?php
class Connection {

    private $CONFIG;
    private $CONN;

    function __construct($cfg) {
        $this->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

  1. Tester ce géoservice et analyser les différentes étapes du processus (veiller à reconfigurer les paramètres de connexion)
  2. Terminer l'exemple en exploitant le géoservice dans OpenLayers avec une OpenLayers.Layer.Vector