Message posté par : Yvan Riou
----------------------------------------
Bonjour,
J'ai finalement trouvé grâce à de bonnes âmes sur Internet.
Voici une proposition de solution :
###########################################################################################
# Yvan RIOU - Janvier 2022
#
# esri2postgis v 1.0
#
###########################################################################################
# script python de transfert d'une géobase fichiers esri vers une base de données
PostGIS #
# paramètres :
#
# - nom de la géobasefichier en entrée
#
# - SRS des classes d'entités à transférer
#
# - nom de la bdd postgis en sortie
#
# - schéma accueillannt les classes d'éntités transférées
#
# - nom d'hôte ou adresse ip du serveur postgres
#
# - port d'écoute du serveur postgres
#
# - utilisateur ayant les droits sur la bdd postgis
#
# - mot de passe de l'utilisateur
#
###########################################################################################
import sys
import os
import argparse
from osgeo import ogr
def main(argv):
dbname = ''
schemaname = ''
wkid = ''
pGdbname = ''
hostname = ''
port = ''
username = ''
password = ''
parser = argparse.ArgumentParser()
parser.add_argument('-d','--filegeodb',required=True,dest='dbname',type=str)
parser.add_argument('-w','--wkid',required=True,dest='wkid',type=str)
parser.add_argument('-g','--postgisdb',required=True,dest='pGdbname',type=str)
parser.add_argument('-s','--schema',required=True,dest='schemaname',type=str)
parser.add_argument('-t','--host',required=True,dest='hostname',type=str)
parser.add_argument('-p','--port',required=True,dest='port',type=str)
parser.add_argument('-u','--username',required=True,dest='username',type=str)
parser.add_argument('-r','--password',required=True,dest='password',type=str)
args = parser.parse_args()
dbname = args.dbname
wkid = args.wkid
pGdbname = args.pGdbname
schemaname = args.schemaname
hostname = args.hostname
port = args.port
username = args.username
password = args.password
if os.path.isdir(dbname):
driver = ogr.GetDriverByName('OpenFileGDB')
gdb = driver.Open(dbname)
outDriver = ogr.GetDriverByName('PostgreSQL')
connectionString = "PG:dbname='%s' active_schema='%s'
host='%s' port='%s' user='%s' password='%s'" %
(pGdbname,schemaname,hostname,port,username,password)
try:
outDS = ogr.Open(connectionString)
nOutLayers = outDS.GetLayerCount()
except:
print('Connexion à la bdd PosgGIS impossible. Vérifiez les arguments
passés.')
exit(-3)
for featsClass_idx in range(gdb.GetLayerCount()):
featsClass = gdb.GetLayerByIndex(featsClass_idx)
if wkid == str(featsClass.GetSpatialRef().GetAuthorityCode(None)) :
nomFC = featsClass.GetName()
nomFC = nomFC.lower()
layerDef = featsClass.GetLayerDefn()
for outFeatsClass_idx in range(nOutLayers):
outFeatsClass = outDS.GetLayerByIndex(outFeatsClass_idx)
outNomFC = outFeatsClass.GetName()
outNomFC = outNomFC.lower()
if outNomFC == nomFC:
try:
outDS.DeleteLayer(outNomFC)
except:
print ("Erreur de suppression")
exit(-1)
break
del outFeatsClass
try:
outFeatsClass =
outDS.CreateLayer(nomFC,featsClass.GetSpatialRef(),ogr.wkbUnknown,[])
for x in range(layerDef.GetFieldCount()):
curFieldDefn = layerDef.GetFieldDefn(x)
outFeatsClass.CreateField(layerDef.GetFieldDefn(x))
outFeatsClass.StartTransaction()
for x in range(featsClass.GetFeatureCount()):
newFeat = featsClass.GetNextFeature()
#newFeat.setFID(-1)
outFeatsClass.CreateFeature(newFeat)
#if x % 128 == 0:
#outFeatsClass.CommitTransaction
#outFeatsClass.StartTransaction()
outFeatsClass.CommitTransaction()
del outFeatsClass
except:
print ('Erreur de création de la CE PostGIS ' + nomFC)
exit(-2)
del featsClass
del outDS
del gdb
else:
print ("le nom de FileGeoDB fourni n'est pas un répertoire.")
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=349827#p349827
Pour y répondre : geolibre(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net