====== 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