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 une 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.

Conseil :

Si vous avez utilisé l’outil de géotraitement Créer une géodatabase d’entreprise avec l’option Spatial Type définie sur PostGIS pour créer une géodatabase dans PostgreSQL, et que vous décidez ultérieurement d’ajouter le type ST_Geometry à cette géodatabase, vous pouvez exécuter l’outil Créer un type spatial pour ajouter le type ST_Geometry à cette géodatabase. Sinon, exécutez seulement l’outil Créer un type spatial dans une base de données.

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

  • Créez 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 un schéma nommé sde dans la base de données.
  • 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 du groupe public, 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 sur le serveur PostgreSQL.

Remarque :

Le fichier st_geometry.dll requiert Microsoft Visual C++ Redistributable Package (x64) lorsqu’il est déployé sur un serveur Microsoft Windows. Pour connaître la version requise du paquetage, reportez-vous à la rubrique Configuration ArcGIS requise pour PostgreSQL. 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 le type spatial pour installer le type ST_Geometry dans une base de données PostgreSQL :

  1. Téléchargez la bibliothèque st_geometry à partir de My Esri et placez-la dans le répertoire PostgreSQL lib.

    Les bibliothèques st_geometry sont destinées à des systèmes d’exploitation spécifiques, des versions de PostgreSQL et des versions ArcGIS.

    Si l’option de téléchargement n’est pas présente, contactez l’administrateur de votre organisation ArcGIS.

    • L’emplacement du répertoire lib sous Linux varie selon le mode d’installation de PostgreSQL. Pour déterminer l’emplacement correct de l’installation de 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 à la machine 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 sur le serveur.
  2. Ouvrez un projet dans ArcGIS Pro, ouvrez la fenêtre Catalog (Catalogue), puis connectez-vous à la base de données en tant que superutilisateur PostgreSQL.

    Vous créez ainsi un fichier .sde dans le dossier de votre projet.

  3. Ouvrez l’outil Créer le 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 Input Database (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.

    Conseil :

    Si l’agrégat 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. Par exemple, si une géodatabase d’entreprise se trouve dans le même agrégat de bases de données, 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 une machine ArcGIS Pro ou ArcGIS Server pour créer le type ST_Geometry, le sous-type et les fonctions dans une base de données PostgreSQL.

  1. Téléchargez la bibliothèque st_geometry à partir de My Esri et placez-la dans le répertoire PostgreSQL lib.

    Les bibliothèques st_geometry sont destinées à des systèmes d’exploitation spécifiques, des versions de PostgreSQL et des versions ArcGIS.

    • L’emplacement du répertoire lib sous Linux varie selon le mode d’installation de PostgreSQL. Pour déterminer l’emplacement correct de l’installation de 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 à la machine 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 sur le serveur.
  2. Créez un fichier texte sur la machine cliente ArcGIS, puis copiez le script suivant dans le fichier :
    """
    Name: create_spatial_type.py
    Description: Provide connection information to an enterprise database
    and create spatial type in the Oracle or PostgreSQL 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 10.1 and higher releases")
    
    #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("{}: error: {}\n".format(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("{}: error: {}\n".format(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, instnace, database, account_authentication, username, password, save_username_password(must be true)
    	arcpy.management.CreateDatabaseConnection(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.management.CreateSpatialType(input_database=Connection_File_Name_full_path, sde_user_password=password, tablespace_name=tablespace, st_shape_library_path=lib_path)
    		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 le cluster de base de données pgserve. La bibliothèque ST_Geometry se trouve dans le répertoire /net/pgserve/opt/PostgreSQL/12.4/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/12.4/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.