Table des matières
Cet annexe est un recueil de questions/problématiques auxquels nous avons été moi et Gérald souvent été confrontés aussi bien sous GNU/Linux que sous Win32. Nous tentons ici de répondre aux questions les plus pertinentes. Les questions abordées ici sont données en vrac et servent en fait de garde-fou/grenier!
La réponse est oui. La première possibilité est http://www.postgis.fr. La deuxième possibilité est de se rendre à
pour PostgreSQL: http://www.postgresql.org/ftp/win32/ . Vous trouverez un exemple d'installation à cet adresse http://fadace.developpez.com/postgresql/ IMPORTANT: LORS DE L'INSTALLATION NE PRENEZ PAS LE SUPPORT 'EXTENSION SPATIAL POSTGIS' SINON IL VOUS INSTALLERA UNE ANCIENNE VERSION DE POSTGIS!!! PgAdmin est livré avec cette installeur.
pour PostGIS (incluant Geos et Proj): http://postgis.refractions.net/download/windows/ tenu par Marc CAVE AYLAND
Le mieux à mon sens est de recourir à pgadmin qui est totalement libre d'utilisation. Vous avez aussi le portage de ce projet sous php = phppgadmin , disponible à http://www.phppgadmin.org/. Vous pouvez télécharger pgadmin sur le site http://www.pgadmin.org
Il y a plusieurs projets pour cela. A part MapServer, citons ici comme projets déjà prometteurs
en Java UDIG: http://udig.refractions.net . Réalisé par le Gourou de PostGIS : Sir Paul RAMSEY!!!
en Qt QGIS: http://qgis.org dont la version 0.7 fonctionne pour PostGIS >=1.0.X pour Windows. La version 0.6 est utilisable pour Windows mais elle ne fonctionnait que pour PostGIS 0.9.X.
Nous ne faisons ici que citer ceux qui nous paraissent pertinents. D'autres existent aussi: JUMP, FME etc...
C'est une question qui revient souvent surtout lorsqu'on doit alimenter par exemple un serveur cartographique. Dans ce cas d'étude, nous sommes donc en présence de deux machines. L'une fait office de client dans le sens où elle doit accueillir des données, l'autre fait office de serveur dans le sens où elle doit "offrir" les données. Ici nous allons supposer que l'utilisateur se trouve sur la machine-serveur.
Sur les deux machines, on s'assurera que celle-ci autorise les connexions TCP/IP pour PostgreSQL - voir pour cela le chapitre "Paramétrer PostgreSQL" -"section Autoriser les machines du réseau intranet/extranet à se connecter au serveur". Donc les connexions doivent être ouvertes sur la machine de l'utilisateur et sur l'autre.
Dans le meilleur des mondes, le deuxième impératif serait que les deux machines est la même version de PostgreSQL. Cette information peut-être obtenu en faisant
pour le coté client:
psql -h [ip_hote_client] -U [user_client] -d [base_client] -c "SELECT Version()"
pour le côté serveur
psql -d [base_serveur] -c "SELECT Version()"
Si les deux versions ne correspondent pas, dans le meilleur des cas, il est préférable d'avoir Version_Serveur < Version_Client. On est au moins sûr dans ce cas par exemple si on doit migrer des données provenant d'une 7.4.X version un 8.0.X d'assurer la migration surtout s'il s'agit de toutes les tables d'une base.
La commande générale à utiliser est alors pour migrer une table, si l'utilisateur est côté serveur:
pg_dump -ciO -t [table_serveur] [base_serveur] | psql -h [ip_hote_client] -U [user_client] -d [base_client]
N'hésitez pas pour obtenir une meilleure information sur l'emploi de pg_dump d'utiliser
pg_dump --help
Je présente ici deux façons d'utiliser ogr2ogr. Ce dernier est livré avec Gdal http://www.remotesensing.org/gdal/. Les options que j'ai utilisé ici ne marchent que pour la version >= 1.3.2 de Gdal.
Il existe dans la distribution de l'outil Gdal, un utilitaire ogr2ogr - disponible aussi sous win32 - qui permet de passer de MapInfo à PostGIS. Par exemple pour importer le fichier DIrective_Habitats_30.MIF (format mif/mid de MapInfo), dans la base diren, je peux faire
ogr2ogr -f PostgreSQL PG:'host=localhost dbname=ingeresin user=postgres' -lco GEOMETRY_NAME=the_geom Directive_Habitats_30.MIF
-lco GEOMETRY_NAME=the_geom est important sinon votre colonne spatiale s'appellera wkb_geometry par défaut
PG:'host=XXX dbname=XXX user=XXX' permet la connexion à la base
Personnellement, je préfère couper la poire en deux: utiliser ogr2ogr pour une première conversion avec ogr2ogr MapInfo ---> Shapefile puis une deuxième conversion avec shp2pgsql Shapefile ---> PostGIS. En effet, si vous compilez les sources de Gdal sous GNU/Linux, la conversion directe n'impportera pas les données avec les structures/schémas usuels de PostGIS.
Ogr2ogr faisant parti de la distribution de gdal est téléchargeable sur le site http://www.maptools.org.
Sous Win32, pour effectuer les deux conversions pour par exemple un fichier communes.tab, on effectuera les commandes suivantes:
de MapInfo vers Shapefile
ogr2ogr -f "ESRI Shapefile" communes.shp communes.tab
de Shapefile vers PostGIS
shp2pgsql -s [srid] -I -D communes.shp | psql [base]
Il faut pour cela utiliser l'utilitaire pgsql2shp qui est disponible avec PostGIS. La commande la plus courante est
pgsql2shp [base] [table]
qui produit directement le fichier shp ayant le même nom que la table. Il est également possible de créer un fichier shp résultant d'une requête:
pgsql2shp -f [nom_shapefile].shp [base] "[REQUETE]"
La réponse est oui! Prenons ici l'exemple des données de la table test du chapitre 4, "Exemples de requêtes spatiales I" où les données correspondent au cas envisagé ici.
# select geometrytype(geom) from test; geometrytype ----------------- POINT POINT POLYGON POLYGON POLYGON POINT POINT LINESTRING LINESTRING MULTILINESTRING (10 lignes)
Et on obtiendra
# select extent(geom) from test; extent ----------------- BOX(1 4,50 135) (1 ligne)
Il y a bien plusieurs façons de faire. Je donnerais en premier lieu la manière de le faire avec psql , ensuite avec ogr2ogr. Je vais ici prendre l'exemple des données du chapitre 4,"Exemples de requêtes spatiales II" où sur les champs de la table buildings, je veux les données attributaires en renommant:
le champs "id" en "ID";
le champs "data" en "Nom du bâtiment".
Je veux pouvoir donc générer un fichier CSV, que je pourrais par la suite ouvrir avec OPenOffice Calc ou Excel dont le contenu ressemblera à
ID,Noms du bâtiments 1,Collège Arthur Rimbaud 2,Résidence des Mousquetaires 3,Hotel des Impots 4,E.D.F 5,Bibliothèque Victor Hugo 6,Mairie 7,Office du Tourisme
Un des moyens intéressants est par exemple de faire
psql -d testgis -AF "," -c "select id as \"ID\",data as \"Noms du bâtiments\" from buildings" | grep ","
Je manipule ogr2ogr en faisant
ogr2ogr -f "CSV" test.csv -sql "select id as \"ID\",data as \"Nom du bâtiment\" from buildings" "PG:dbname=testgis user=postgres host=localhost password=..."
ce qui me génère un répertoire out qui contiendra le fichier nommé sql_statement.csv attendu.
Avec psql, il est possible de pouvoir exporter aussi les données géométriques. Malheureusement, celà ne semble pas être le cas avec ogr2ogr. Je parle ici sous la garantie de n'avoir testé que la version fournie avec gdal 1.3.1.
Considérons par exemple la situation suivante exposé sur l'image ci-dessus
Pour celà, nous ferons tout simplement
# SELECT count(*) FROM communes_bourgogne WHERE the_geom && SetSRID('BOX3D(746387 2189036,773809 2213846)'::box3d,27582); count ------- 53 (1 ligne)
Nous comprenons ici que la colonne the_geom est ici indexée spatialement.
Prenons comme exemple la BOX3d de la sous-section précédente. BOX3dD(746387 2189036,773809 2213846) Pour la convertir, il suffit tout simplement d'utiliser la fonction BuildArea() qui ici fonctionnera car une BOX3d est un objet fermé
bourgogne=# SELECT astext(buildarea(SetSRID('BOX3D(746387 2189036,773809 2213846)'::box3d,27582))); astext --------------------------------------------------------------------------------------- POLYGON((746387 2189036,746387 2213846,773809 2213846,773809 2189036,746387 2189036)) (1 ligne)
Je détaille ici les notes pour une mise à jour d'une version de PostGIS 0.9.X vers PostGIS 1.0.X. Pour une meilleur information, consultez le chapitre 2 de la documentation de PostGIS. Je vais commencer par la partie HARD UPGRADE.
Pour la version 1.0.X, on s'assure pour l'instant qu'on a fait un make MAIS PAS ENCORE DE make install. Le premier des impératifs est de s'assurer d'avoir un DUMP de ses données. Depuis MinGW:
cd ~/sources/PostGIS/postgis-1.0.X # On configure PostGIS avec les options habituelles configure [....] # On compile mais pas de make install pour le moment make # On dump la ou les bases voulues pg_dump -Fc base_de_donnees > base_de_donnees.dump # Maintenant on fait le make install depuis MinGW make install
On va sous DOS dans le répertoire de postgis-1.0.X et on exécute le script postgis_restore.pl prévu à cet effet. ATTENTION:Pour la version 1.0.3, le script en question ne fonctionne que sous DOS.
cd C:\msys\1.0\home\david\sources\PostGIS\postgis-1.0.X utils\postgis_restore.pl lwpostgis.sql nouvelle_base_de_donnees base_de_donnees.dump > restore.log
Pour m'assurer que les fonctionnalités éventuelles autre que celles de PostGIS que j'aurais ajouté à la base base_de_donnees ont été conserver, je fais depuis MINGW:
grep ^KEEPING restore.log
Si cette commande ne renvoit rien c'est que je n'ai pas ajouté de fonctionnalités supplémentaires à mon ancienne base.
Ceci me créer une nouvelle base de données nouvelle_base_de_donnees qui contient les mises à jours attendues. Il ne me est plus qu'à mettre à jour ma table spatial_ref_sys en faisant depuis MinGW ou DOS - puisque je suis dans la répertoire postgis 1.0.X qui contient le nouveau fichier spatial_ref_sys.sql:
psql -d nouvelle_base_de_donnees -c "delete from spatial_ref_sys" psql -d nouvelle_base_de_donnees -f spatial_ref_sys.sql
Il ne me reste plus qu'à faire la partie de SOFT UPGRADE en faisant depuis DOS:
utils\postgis_proc_upgrade.pl lwpostgis.sql | psql nouvelle_base_de_donnees
Je peux maintenant effacer mon ancienne base:
dropdb base_de_donnees
Avec l'option de compilation pour PostgreSQL --enable-nls (voir chapitre 2) qui permet d'avoir notamment les messages d'erreur et de notification en français, le mieux à mon sens pour réussier l'intélgralité des 12 tests attendus est de compiler PostgreSQL sans cette option.
Attention, les tests de régression que j'ai testé ne marche pas si j'use de cette option. Ceci est une remarque que j'émets uniquement sur Win32. En effet, pour GNU/Linux si PostgreSQL est compilé avec cette option celà marche. Celà vient à mon sens du fait que sous Windows on ne dispose pas tout l'outillage nécessaire pour la locale en C. Ce qui est le cas sous GNU/Linux et pour lequel les tests de régression de PostGIS fonctionnent
Si quelqu'un a une autre piste plus précise que la mienne merci de m'en faire part.
Voici la marche à suivre. Désintallez et recompilez PostgreSQL sans l'option --enable-nls et réinstallez
cd ~/sources/PostgreSQL/postgresql-8.1.3 make uninstall clean distclean configure --prefix=/c/PostgreSQL/8.1.3 make && make install
Allez ensuite dans le répertoire des sources de PostGIS. Créez ensuite la variable d'environnement PGUSER=postgres. Copiez le fichier lwpostgis.sql dans le répertoire regress
cd ~/sources/PostGIS/postgis-1.1.2 export PGUSER=postgres cp lwpostgis.sql regress/ make test
Vous devriez obtenir les résultats suivants
david@BREMKO ~/sources/PostGIS/postgis-1.1.2 $ make test make -C regress test make[1]: Entering directory `/home/david/sources/PostGIS/postgis-1.1.2/regress' make -C ../lwgeom all-shared-lib make[2]: Entering directory `/home/david/sources/PostGIS/postgis-1.1.2/lwgeom' make[2]: Nothing to be done for `all-shared-lib'. make[2]: Leaving directory `/home/david/sources/PostGIS/postgis-1.1.2/lwgeom' Creating spatial db postgis_reg PostgreSQL 8.1.3 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special) Postgis 1.1.2 - 2006-04-22 14:08:24 GEOS: 2.2.1-CAPI-1.0.1 JTS: PROJ: Rel. 4.4.9, 29 Oct 2004 Running tests regress: Ok. regress_index: Ok. lwgeom_regress: Ok. regress_lrs: Ok. removepoint: Ok. setpoint: Ok. simplify: Ok. snaptogrid: Ok. affine: Ok. regress_ogc: Ok. regress_bdpoly: Ok. regress_proj: Ok. Run tests: 12 Successful: 12 Failed: 0 make[1]: Leaving directory `/home/david/sources/PostGIS/postgis-1.1.2/regress'
Et oh merveille, les tests de régression de PostGIS passent sans souci!
D'autres erreurs pour cette version de PostGIS ont été signalées par Alexandra sur la mailing-list de PostGIS. Merci de consulter ce lien auquel a répondu Marc CAVE AYLAND http://postgis.refractions.net/pipermail/postgis-users/2006-April/011884.html
Supposons qu’une machine distante du réseau ait l'IP 192.168.0.14, que nous soyons autorisés à nous connecter à cette machine sur une base ma_base_de_donnees, et que pour nous connecter au serveur PostgreSQL actuellement en service sur la machine, nous soyons obligés de fournir notre login postgres et notre mot de passe "minotore" depuis un shell GNU/Linux. Pour éviter de le faire, il suffit de faire
su postgres
puis
cd touch .pgpass
Il suffit ensuite de mette la chaine suivante dans lefichier
192.168.0.14:5432:ma_base_de_donnees:postgres:minotore
On restreint ensuite les droits sur ce fichier en faisant
chmod 0600 . pgpass
Ainsi la prochaine fois que nous ferons une connexion au serveur
psql -h 192.168.0.14 -U postgres -d ma_base_de_donnes
nous ne serons plus obligés de fournir le mot de passe.
Pour de plus amples informations, merci de consulter le lien http://docs.postgresqlfr.org/8.1/libpq-pgpass.html
Depuis le client, il sufit de saisir
ps axv | grep postgres | egrep -v "(logger|writer|stats|su|grep)"
qui renverra par exemple
16788 ? ... ... 0.2 postgres: david ddass26 128.179.68.7(55324) idle 16816 ? ... ... 0.3 postgres: jean ddass30 [local] idle
La première ligne indiquera par exemple qu'il y a une connexion cliente depuis la machine dont l'IP est 128.179.68.7. Sur cette machine, l'utilisateur david est connecté à la base ddass26. Quant à la seconde, l'utilisateur jean est connecté en local à la base ddass30. Le terme idle désigne une connexion en attente d'activité.
Il est aussi possible de suivre les connexion clientes depuis pgadmin.
Cette section est inspirée du travail de traduction de Guillaume LELARGE que vous pouvez trouver à cette adresse http://docs.postgresqlfr.org/8.1/monitoring.html
On peut aussi surveiller les connexions en essayant la vue pg_stat_activity suivante:
SELECT * FROM pg_stat_activity ;
Pour la vue pg_stat_activity, il est nécessaire de modifier certaines valeurs de votre fichier de configuration de PostgreSQL. Merci de consulter ce lien pour de plus amples informations http://docs.postgresqlfr.org/8.1/monitoring-stats.html
Par exemple pour avoir de meilleures informations sur les statistiques du serveur chez moi, je fais dans mon fichier de configuration
#--------------------------------------------------------------------------- # RUNTIME STATISTICS #--------------------------------------------------------------------------- # - Statistics Monitoring - log_parser_stats = true log_planner_stats = true log_executor_stats = true log_statement_stats = off # - Query/Index Statistics Collector - stats_start_collector = true stats_command_string = true stats_block_level = true stats_row_level = true stats_reset_on_server_start = true
par exemple pour connaître la requête envoyé par un client sur le serveur (colonne current_query du tableau renvoyé par pg_stats_activity.
On pourra par exemple essayer la requête suivante
SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ~ '^??????????$' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 1
en remplaçant ici ???????? par le nom de la table
On utilisera par exemple
SELECT a.attname as champs, pg_catalog.format_type(a.atttypid, a.atttypmod) as type, (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef), a.attnotnull, a.attnum FROM pg_catalog.pg_attribute a WHERE a.attrelid in (SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ~ '^troncon_route$' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 1) AND a.attnum > 0 AND NOT a.attisdropped AND a.attname<>'the_geom' ORDER BY a.attnum
en remplaçant ici ???????? par le nom de la table
Pour celà, j'utilise l'utilitaire iconv de la manière suivante
........ |iconv -f LATIN1 -t UTF-8 |psql -d testgis -h [hôte] -U [utilisateur]
ici .......... désigne une commande du style shp2pgsql .... ou pg_dump ....
A la place de de iconv, on peut aussi utliser recode en faisant
........ |recode l9..u8 |psql -d testgis -h [hôte] -U [utilisateur]
Je fournirais ici là réponse pour GNU/Linux. Commençons d’abord par un petit rappel en consultant le lien suivant http://docs.postgresqlf/8.1/manage-ag-tablespaces.html. Par exemple pour créer la base de données ma_base_de_donnees dans le répertoire /mnt/disk1/data, je commencerais par créer l’espace logique en tant que root
mkdir /mnt/disk1/data
Je rend ensuite postgres propriétaire de ce répertoire
chown -R postgres /mnt/disk1/data
Je me connecte ensuite au modèle de base de données template1 (par exemple)
su postgres psql template1
Je fournis la requête SQL suivante pour créer mon espace logique data
CREATE TABLESPACE data LOCATION '/mnt/disk1/data';
que je remplis de la base de données ma_base_de_donnees:
CREATE DATABASE ma_base_donnees WITH TABLESPACE data;
Pour connaître l’ensemble des espaces logiques disponibles, on peut essayer
psql -d template1 -c "\db"
qui renverra par exemple
Liste des espaces logiques Nom | Propriétaire | Emplacement ------------+--------------+----------------- data | postgres | /mnt/disk1/data pg_default | postgres | pg_global | postgres | (3 lignes)
On peut aussi essayer la requête SQL suivante
SELECT spcname AS "Nom", pg_catalog.pg_get_userbyid(spcowner) AS "Propriétaire", spclocation AS "Emplacement" FROM pg_catalog.pg_tablespace ORDER BY 1;
Pour finir, si l'on souhaite connaître dans quel espace logique se trouve chacune de nos bases de données, on aura recours à la requête suivante:
SELECT datname AS "Base de données", spcname AS "Espace logique" FROM pg_database d JOIN pg_tablespace t ON ( dattablespace = t. oid ) ORDER BY 2;
qui renverra par exemple
Base de données | Espace logique -----------------+--------------- bourgogne | pg_default ddass26 | tablespace ddass30 | tablespace gps | tablespace ignportal | tablespace postgres | pg_default template0 | pg_default template1 | pg_default
La réponse est oui! Pour se faire nous utiliserons par exemple l'utilitaire pg_dump de PostgreSQL. Pour des rappels de base sur les schémas avec PostgreSQL, on pourra par exemple consulter le lien suivant http://docs.postgresqlfr.org/8.1/sql-createschema.html Supposons ici que nous disposons d'un schéma appelé cadastre, que nous souhaiterions copier dans un nouveau schéma aidentique appelé cadastre_2006. Pour se faire, commençons par faire une sauvegarde temporaire de notre schéma de notre base test dans un fichier sql (cadastre.sql)
pg_dump -n cadastre -vFp -f cadastre.sql test
A l'aide de psql, il est ensuite possible de renommer le schéma actuel en faisant
ALTER SCHEMA cadastre RENAME TO cadastre_2006
On réimportera alors la sauvegarde en faisant
psql -d test -f cadastre.sql
Et si on souhaite renommer le schéma, on pourra toujours effectuer la même requête que celle ci-dessus.
Perl sera nécessaire pour la compilation avec PostgreSQL pour avec le support PL/Perl . Il suffit d'installer au moins la version Active Perl 5.6.X ou la 5.8.X. Téléchargez le fichier
Perl http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl
Prendre l'installeur en MSI. C'est une installation standard, indiquez comme chemin d'instalaltion c:\Perl.
Retournez dans votre répertoire des sources de PostgreSQL. Il faut modifier temporairement la variable PATH de votre ordinateur pour que MinGW adapte votre variable d'environnement à Perl. Celà servira surtout pour la commande configure de PostgreSQL:
export PATH=/c/Perl/bin:/c/Perl/lib:$PATH
Il faudra ensuite recompiler PostgreSQL en ajoutant l'option --with-perl et ensuite faire les comandes habituelles de compilation et d'installation make et make install
configure ... --with-perl make make install
Pendant la compilation des messages de notification ou d'erreur peuvent apparaître. N'y prenez pas garde!
Nous partons ici du principe que votre version de PHP n'a pas été compilée avec PostgreSQL. (./configure ... --with-pgsql...). Vérifiez que dans votre répertoire des extensions de php vous ayez le fichier php_pgsql.dll. Pour le charger, il suffit de remplacer depuis votre fichier php.ini la ligne ;extension = php_pgsql.dll par extension = php_pgsql.dll - enlever le ; -. Sinon si vous ne voulez pas ouvrir votre fichier et à condition bien sûr que le fichier php_pgsql.dll existe depuis votre script php:
<?php ... if ( extension_loaded('pgsql') != 1) { switch (PHP_OS) { case "WINNT": $php_suffix = ".dll"; break; default: $php_suffix = ".so"; break; } dl("php_pgsql".$php_suffix); } ... ?>