===== Intégration de la base de données d'occupation du sol du Languedoc-Roussillon de SIGLR ===== === Procédure (adaptez les noms de fichiers à votre cas) === * Télécharger de l'archive qui nous intéresse sur la page : http://ocsol.siglr.net/index.php?option=com_docman&task=cat_view&gid=14&Itemid=5 * Transformer le shp obtenu aprés décompression de l'archive : shp2pgsql -s 27572 -g geometrie -I V0_OCSOL_LR_POLY_2006_L2E_SHP_NOBD.shp occsol_2006>occsol_2006.sql puis psql -f occsol_2006.sql -h addresse_ip_hote -U utilisateur nom_base_de_donnée * On peut maintenant supprimer la redondance et les attributs "inutiles" : CREATE TABLE poste_occsol ( id_poste character varying(3) NOT NULL, libelle character varying(100), description text ); ALTER TABLE poste_occsol ADD CONSTRAINT libelle_occsol_pkey PRIMARY KEY (id_poste); INSERT INTO poste_occsol (SELECT distinct cde_06, intit_06, null FROM occsol_2006); ALTER TABLE occsol_2006 DROP COLUMN bd06_; ALTER TABLE occsol_2006 DROP COLUMN bd06_id; ALTER TABLE occsol_2006 DROP COLUMN niv1_06; /* la fonction substring(cde_06 FROM 1 FOR 1) fera l'affaire */ ALTER TABLE occsol_2006 DROP COLUMN niv2_06; /* la fonction substring(cde_06 FROM 2 FOR 1) fera l'affaire */ ALTER TABLE occsol_2006 DROP COLUMN niv3_06; /* la fonction substring(cde_06 FROM 3 FOR 1) fera l'affaire */ ALTER TABLE occsol_2006 DROP COLUMN intit_06; /* on utilisera une jointure sur la table poste_ocsol */ ALTER TABLE occsol_2006 DROP COLUMN int_06; ALTER TABLE occsol_2006 RENAME gid TO id_entite_occsol; ALTER TABLE occsol_2006 ALTER COLUMN cde_06 TYPE character varying(3); ALTER TABLE occsol_2006 RENAME cde_06 TO id_poste; ALTER TABLE occsol_2006 add CONSTRAINT fk_id_poste_est_occsol FOREIGN KEY (id_poste) REFERENCES poste_occsol(id_poste); === Résolution des problèmes d'intégration de la base d'occupation du sol === [[http://trac.osgeo.org/postgis/wiki/UsersWikiCleanPolygons|Utilisation de la fonction CleanPolygons]] Les données, valides sous mapinfo sont transformées par shp2pgsql. Lors de leur insertion dans la base postgis, un select count(*) from occsol where isvalid(geometrie) is false; retourne le résultat 983!!! Ce qui présage des erreurs lors de l'exécution de requêtes géographiques. Une première tentative de correction avec la requête suivante : update occsol set geometrie=buffer(geometrie,0) where isvalid(geometrie) is false; nous permet d'avoir 0 comme résultat à la requête précédente. Cependant, une première requête spatiale calculant la part de chaque poste d'occupation du sol de différents périmètres retourne une surface totale supérieure à la surface de l'aire d'étude. Les géométries sont corrigées mais la couche contient des objets superposés! Le wiki de [[http://www.postgis.org|PostGIS]] et particulièrement cette page nous apportent la solution : http://trac.osgeo.org/postgis/wiki/UsersWikiCleanPolygons