Ajouter le type ST_Geometry à une base de données PostgreSQL

Disponible avec une licence Standard ou Advanced.

Pour utiliser le type ST_Geometry afin de stocker des données spatiales dans votre base de données PostgreSQL, utilisez l’outil de géotraitement Créer le type spatial ou un script Python qui appelle la fonction ArcPy CreateSpatialType afin d’insérer le type, ses sous-types et les fonctions dans la base de données.

L’outil Créer le type spatial permet d’effectuer les opérations suivantes :

  • Création d'un rôle de connexion sde dans le cluster de bases de données PostgreSQL.
  • Octroi de l'autorité de super-utilisateur à l'utilisateur SDE (cette autorité peut être révoquée une fois le type ST_Geometry créé).
  • Créez une structure nommée sde dans la base de données où vous voulez installer le type ST_Geometry.
  • Octroi d'une autorité complète sur la structure sde à l'utilisateur SDE.
  • Octroi de privilèges USAGE sur la structure sde au groupe de connexion public. Vous pouvez révoquer ce privilège, mais vous devez accorder le privilège USAGE sur la structure sde à tous les utilisateurs qui ont besoin d'accéder au type, aux sous-types ou aux fonctions ST_Geometry.
  • Création des fonctions, domaines, tables (sde_coordinate_systems et sde_geometry_columns) et vues (st_geometry_columns et st_spatial_references) nécessaires dans la structure sde, ainsi que de la table sde_spatial_references dans la structure publique.

Avant d'exécuter l'outil ou la fonction, vous devez copier la bibliothèque st_geometry dans le serveur PostgreSQL.

Remarque :

La bibliothèque st_geometry.dll requiert le paquetage distribuable Microsoft Visual C++ Redistributable Package (x64) lorsqu’elle est déployée sur un serveur Windows. Reportez-vous à la rubrique Configuration requise des bases de données PostgreSQL pour connaître la version requise du paquetage. Si ce paquetage n'est pas présent sur le serveur PostgreSQL, téléchargez-le depuis le site de Microsoft et installez-le.

Utilisez l'outil de géotraitement Créer le type spatial.

Les étapes suivantes expliquent comment exécuter l'outil de géotraitement Créer un type spatial pour installer le type ST_Geometry dans une base de données PostgreSQL :

  1. Téléchargez la bibliothèque st_geometry depuis My Esri et placez-la dans le répertoire lib de PostgreSQL. Veillez à télécharger la bibliothèque st_geometry appropriée à la version de PostgreSQL et au système d'exploitation que vous utilisez.
    • L’emplacement du répertoire lib sur Linux peut varier selon la façon dont vous avez installé PostgreSQL. Pour déterminer l'emplacement correct de l'installation PostgreSQL, exécutez pg_config en tant qu'utilisateur postgres. La valeur qui est renvoyée pour PKGLIBDIR est le répertoire lib dans lequel vous devez placer le fichier st_geometry.so. Connectez-vous en tant qu’utilisateur racine pour copier le fichier dans le répertoire lib.
    • Si PostgreSQL est installé sur un serveur Windows, placez le fichier st_geometry.dll dans le répertoire %PostgreSQL%\lib.
  2. Ouvrez un projet dans ArcGIS Pro, ouvrez la fenêtre Catalogue, puis connectez-vous à la base de données en tant que superutilisateur PostgreSQL.

    Cette opération génère un fichier .sde dans le dossier du projet.

  3. Ouvrez l'outil Créer un type spatial.

    Vous pouvez utiliser la fenêtre Rechercher pour trouver l'outil ou l'ouvrir à partir du jeu d'outils Espace de travail de la boîte à outils Gestion des données.

  4. Ajoutez le fichier de connexion à la base de données (.sde) que vous avez créé à l'étape 2 dans la zone de texte Base de données en entrée.
  5. Entrez le mot de passe de l'utilisateur de base de données sde dans la zone de texte Mot de passe utilisateur SDE.

    Astuce :

    Si la grappe de bases de données PostgreSQL détient déjà un rôle de connexion sde, vérifiez que le mot de passe que vous saisissez correspond à celui du rôle de connexion sde existant. Une géodatabase d'entreprise peut par exemple déjà se trouver dans la même grappe de bases de données. Dans ce cas, le rôle de connexion sde existe déjà et vous devez utiliser son mot de passe.

  6. Laissez vide la zone de texte Nom de l'espace de table.
  7. Cliquez sur Run (Exécuter).

Le type, les sous-types et les fonctions ST_Geometry sont créés dans la structure de l’utilisateur sde dans la base de données que vous avez spécifiée.

Utiliser la fonction CreateSpatialType

Vous exécutez un script Python qui appelle la fonction CreateSpatialType ArcPy sur n'importe quelle machine ArcMap, ArcGIS Pro ou ArcGIS Server pour créer le type, le sous-type et les fonctions ST_Geometry d'Esri dans une base de données PostgreSQL.

  1. Téléchargez la bibliothèque st_geometry depuis My Esri et placez-la dans le répertoire lib de PostgreSQL. Veillez à télécharger la bibliothèque st_geometry appropriée à la version de PostgreSQL et au système d'exploitation que vous utilisez.
    • L’emplacement du répertoire lib sur Linux peut varier selon la façon dont vous avez installé PostgreSQL. Pour déterminer l'emplacement correct de l'installation PostgreSQL, exécutez pg_config en tant qu'utilisateur postgres. La valeur qui est renvoyée pour PKGLIBDIR est le répertoire lib dans lequel vous devez placer le fichier st_geometry.so. Connectez-vous en tant qu’utilisateur racine pour copier le fichier dans le répertoire lib.
    • Si PostgreSQL est installé sur un serveur Windows, placez le fichier st_geometry.dll dans le répertoire %PostgreSQL%\lib.
  2. Créez un fichier texte sur l'ordinateur du client ArcGIS, puis copiez-y le script suivant.
    """
    Name: create_spatial_type.py
    Description: Provide connection information to an Oracle or PostgreSQL database
    and create spatial type in the database.
    Type create_spatial_type.py -h or create_spatial_type.py --help for usage
    Author: Esri
    """
    
    # Import system modules
    import arcpy, os, optparse, sys
    
    
    # Define usage and version
    parser = optparse.OptionParser(usage = "usage: %prog [Options]", version="%prog 1.0 for " + arcpy.GetInstallInfo()['Version'] )
    
    #Define help and options
    parser.add_option ("--DBMS", dest="Database_type", type="choice", choices=['ORACLE', 'POSTGRESQL', ''], default="", help="Type of enterprise DBMS: ORACLE, or POSTGRESQL.")
    parser.add_option ("-i", dest="Instance", type="string", default="", help="DBMS instance name")
    parser.add_option ("--auth", dest="account_authentication", type ="choice", choices=['DATABASE_AUTH', 'OPERATING_SYSTEM_AUTH'], default='DATABASE_AUTH', help="Authentication type options (case-sensitive):  DATABASE_AUTH, OPERATING_SYSTEM_AUTH.  Default=DATABASE_AUTH")
    parser.add_option ("-U", dest="Dbms_admin", type="string", default="", help="DBMS administrator user")
    parser.add_option ("-P", dest="Dbms_admin_pwd", type="string", default="", help="DBMS administrator password")
    parser.add_option ("-D", dest="Database", type="string", default="none", help="Database name:  Not required for Oracle")
    parser.add_option ("-p", dest="Password", type="string", default="", help="SDE user password")
    parser.add_option ("-t", dest="tablespace", type="string", default="", help="Default tablespace for SDE user")
    parser.add_option ("--path", dest="libpath", type="string", default="", help="path to the ST shape library including library file name.")
    
    # Check if value entered for option
    try:
    	(options, args) = parser.parse_args()
    
    	
    #Check if no system arguments (options) entered
    	if len(sys.argv) == 1:
    		print "%s: error: %s\n" % (sys.argv[0], "No command options given")
    		parser.print_help()
    		sys.exit(3)
    	
    
    	#Usage parameters for spatial database connection
    	database_type = options.Database_type.upper()
    	instance = options.Instance
    	account_authentication = options.account_authentication.upper()
    	password = options.Password 
    	tablespace = options.tablespace
    	database = options.Database.lower()
    	dbms_admin = options.Dbms_admin
    	dbms_admin_pwd = options.Dbms_admin_pwd
    	lib_path = options.libpath
    
    	if( database_type ==""):	
    		print " \n%s: error: \n%s\n" % (sys.argv[0], "DBMS type (--DBMS) must be specified.")
    		parser.print_help()
    		sys.exit(3)		
    
    	# Local variables
    	instance_temp = instance.replace("\\","_")
    	instance_temp = instance_temp.replace("/","_")
    	instance_temp = instance_temp.replace(":","_")
    	Conn_File_NameT = instance_temp + "_" + database
    	
    	if os.environ.get("TEMP") == None:
    		temp = "c:\\temp"	
    	else:
    		temp = os.environ.get("TEMP")
    	
    	if os.environ.get("TMP") == None:
    		temp = "/usr/tmp"		
    	else:
    		temp = os.environ.get("TMP")  
    	
    	Connection_File_Name = Conn_File_NameT + ".sde"
    	Connection_File_Name_full_path = temp + os.sep + Conn_File_NameT + ".sde"
    	
    	
    	# Check for the .sde file and delete it if present
    	arcpy.env.overwriteOutput=True
    	if os.path.exists(Connection_File_Name_full_path):
    		os.remove(Connection_File_Name_full_path)
    	
    	
    	print "\nCreating Database Connection File...\n"	
    	# Process: Create Database Connection File...
    	# Usage:  out_file_location, out_file_name, DBMS_TYPE, instance, database, account_authentication, username, password, save_username_password(must be true)
    	arcpy.CreateDatabaseConnection_management(out_folder_path=temp, out_name=Connection_File_Name, database_platform=database_type, instance=instance, database=database, account_authentication=account_authentication, username=dbms_admin, password=dbms_admin_pwd, save_user_pass="TRUE")
    	for i in range(arcpy.GetMessageCount()):
    		if "000565" in arcpy.GetMessage(i):   #Check if database connection was successful
    			arcpy.AddReturnMessage(i)
    			arcpy.AddMessage("\n+++++++++")
    			arcpy.AddMessage("Exiting!!")
    			arcpy.AddMessage("+++++++++\n")
    			sys.exit(3)            
    		else:
    			arcpy.AddReturnMessage(i)
    			arcpy.AddMessage("+++++++++\n")	
    	
    	# Process: Create spatial type...
    	try:
    		print "Create spatial type...\n"
    		arcpy.CreateSpatialType_management(input_workspace=Connection_File_Name_full_path, sde_user_password=password, tablespace_name=tablespace, st_shape_library_path=lib_path)
    		print "after spatial type...\n"
    		for i in range(arcpy.GetMessageCount()):
    			arcpy.AddReturnMessage(i)
    		arcpy.AddMessage("+++++++++\n")
    	except:
    		for i in range(arcpy.GetMessageCount()):
    			arcpy.AddReturnMessage(i)
    			
    	if os.path.exists(Connection_File_Name_full_path):
    		os.remove(Connection_File_Name_full_path)
    			
    #Check if no value entered for option	
    except SystemExit as e:
    	if e.code == 2:
    		parser.usage = ""
    		print "\n"
    		parser.print_help()   
    		parser.exit(2)
  3. Enregistrez le fichier avec l'extension .py.
  4. Exécutez le script en indiquant les options et informations propres à votre site.

    Par exemple, ce script crée le type ST_Geometry dans la base de données PostgreSQL spdata, sur l'agrégat de base de données pgserve. La bibliothèque ST_Geometry se trouve dans le répertoire /net/pgserve/opt/PostgreSQL/9.3/lib sur le serveur PostgreSQL (pgserve).

    create_spatial_type.py --DBMS POSTGRESQL -i pgserve --auth DATABASE_AUTH -U postgres -P M3tsy$ -D spdata -p 3$@b0eg -t sde --path /net/pgserve/opt/PostgreSQL/9.3/lib/st_geometry.so

Le type, les sous-types et les fonctions ST_Geometry sont créés dans la structure de l’utilisateur sde dans la base de données que vous avez spécifiée.