Pages: 1
- Sujet précédent - gdal og2ogr : insertion/mise à jour de table postgis depuis un SHP ? - Sujet suivant
#1 Mon 06 June 2022 01:46
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
gdal og2ogr : insertion/mise à jour de table postgis depuis un SHP ?
Bonjour,
Je travaille sous windows. Postgis et gdal (j'utilise gdal/ogr2ogr depuis l'invit de commande. Version de gdal disponible sous C:\Program Files\QGIS 3.16\bin).
Jusqu'à maintenant, au sein de ma base postgis, depuis pgadmin, j'effectuais des insertions de nouvelles entités au sein de table deja existante
via des requetes SQL du type :
Code:
INSERT INTO SCHEMA_humain.TableDestination ( "fieldXX", "geom") SELECT "fieldXX", "geom" FROM table_Source
Ou bien des mises à jour d'entités (update)
grace à
Code:
update set from where
Celà fonctionnait. Mais la grosse limite de cette approche est qu'elle necessite au prealable d'importer au sein de la bdd postgis les shp.
Mon but est donc de directement inserer de nouvelles entités / mettre à jour (depuis fichier source shp/table destinatation postgis en utilisant gdal ogr2ogr.
Afin de s'affranchir au préalable de cette importation de shp ds la bdd.
Le fichier source est 1 fichier shapefile de POINTS (EPSG 2154)
La table cible/destination est donc une table postgis deja existante de POINTS (EPSG 2154)
(Je précise que le schema de la table de destination n'est PAS le schema public mais le schema 'humain'.)
Il semble y avoir 2 approches pour accomplir cette tache. Soit d'utiliser les options -append associé à -fieldmap. (ou bien - update pour des mis à jours).Soit l'approche avec -sql en définissant la requete SQL.
Je privilegie si possible l'approche avec -sql.
Voici la structure à laquelle je pensais par exemple pour une insertion.
Code:
ogr2ogr - progress - append D:\XXX.shp -f PG:"dbname='dbname' host='ipXXXXX' port='5432' user='XXXX' password='XXXX' active_schema='humain'" -sql INSERT INTO schema_humain.TableName ( "champ1", "champ2", "champ3", "geom") --selection des champs du SHP SELECT "champ1", "champ2", "champ3", "geom" FROM shp
Une personne pourrait elle me dire si je me fourvoie ? Me dire où sont mes erreurs? Avec cette méthode, est il possible de specifier les champs du shp au sein de la clause SQL ? (champ non geom et champ geom?). Lorsque comme moi on a en entrée du shp et en sortie une table postgis, doit on plutot prioriser l'approche avec -append -addfield (ou -update) plutot que l'approche avec -sql ?
Concernant le shp, est ce que le nom du champ geometrique (qui doit notamment etre defini au sein de la requete sql) est forcemment "geom" ?Sinon
Quel serait le moyen de le connaitre?
Merci beaucoup.
Dernière modification par image95 (Mon 06 June 2022 06:28)
Hors ligne
#2 Wed 08 June 2022 08:35
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: gdal og2ogr : insertion/mise à jour de table postgis depuis un SHP ?
Bonjour,
Attention le flag -sql est du pseudo SQL avec un pseudo dialect SQL quand la couche d'entrée n'est pas une couche issue d'un SGBDR. . C'est pour faire des opérations basiques. Je ne crois pas que ce que vous envisagez soit possible.
Le flag -append permet d'ajouter des entités à une couche déjà existante.
Le flag -update je ne suis pas certain que cela fasse ce que vous pensez. Il me semble (à confirmer) qu'il sert à remplacer la couche mais sans la dropper ni la recréer. Ça fait je pense un truncate et un insert mais c'est à vérifier.
Par ailleurs on ne peut généralement pas cumuler certains flags entre eux (append, update).
Le mieux est d'essayer avec un petit jeu de données.
Hors ligne
#3 Wed 08 June 2022 08:48
- loicbcn
- Participant occasionnel
- Date d'inscription: 22 Jan 2018
- Messages: 26
Re: gdal og2ogr : insertion/mise à jour de table postgis depuis un SHP ?
Bonjour,
Essaie sans saut de lignes avec des guillemets correctement placés. Voici ce que je tenterais:
Code:
ogr2ogr -f "POSTGRESQL" "PG:dbname='dbname' host='ipXXXXX' port='5432' user='XXXX' password='XXXX'" -dialect "SQLITE" -sql "INSERT INTO schema_humain.TableName (champ1, champ2, champ3, geom) SELECT champ1, champ2, champ3, geom FROM shp" "D:\XXX.shp"
Voir: https://gdal.gloobe.org/ogr/ogr2ogr.html ...
Une autre méthode, c'est de faire un .bat qui lance des fichiers psql, ce qui permet de faire du code plus propre et de lancer de vrais requêtes postgis... Je te mets un exemple que j'ai sous la main, même s'il ne correspond pas tout à fait à ton cas, il donne une idée.
Un .bat:
Code:
SET PGCLIENTENCODING=utf-8 chcp 65001 set HOST=localhost set USER=postgres set PGPASSWORD=pwd set PORT=5432 set PSQL="C:\Program Files\QGIS3.10\bin\psql" rem peupler les champs libelle, libelong, typezone à partir des plu %PSQL% -w -U %USER% -d "gdv" -p %PORT% -f "sqls/02_plu.sql"
qui lance le fichier "02_plu.sql" situé dans un répertoire "sqls":
Code:
-- Croisement avec les plus puis mise à jour des parcelles with interplu as ( select distinct on(idpar) idpar, zu.id idzu, zu.libelle, zu.libelong, zu.typezone, st_area(st_intersection(p.geom, zu.geom)) surf from resultat.parcelles p inner join datas.plu zu on zu.insee = p.idcom and st_intersects(p.geom, zu.geom) order by idpar, surf desc ) update resultat.parcelles as p set libelle = i.libelle, libelong = i.libelong, typezone = i.typezone from interplu as i where i.idpar = p.idpar;
Voilà, bon courage.
Hors ligne
Pages: 1
- Sujet précédent - gdal og2ogr : insertion/mise à jour de table postgis depuis un SHP ? - Sujet suivant