banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB