Agregar el tipo ST_Geometry a una base de datos de PostgreSQL

Disponible con una licencia Standard o Advanced.

Para usar el tipo ST_Geometry para almacenar datos espaciales en su base de datos de PostgreSQL, utilice la herramienta de geoprocesamiento Crear tipo espacial o un script de Python que llame a la función CreateSpatialType de ArcPy para agregar el tipo, sus subtipos y funciones a la base de datos.

La herramienta y la función Crear tipo espacial hacen lo siguiente:

  • Crean un inicio de sesión sde en el clúster de base de datos de PostgreSQL.
  • Otorgan la autoridad de superusuario al usuario sde (se puede revocar después de crear el tipo ST_Geometry).
  • Crean un esquema denominado sde en la base de datos.
  • Otorgan al usuario sde plena autoridad en el esquema sde.
  • Conceden privilegios USAGE en el esquema sde al grupo de inicio de sesión público. Este privilegio se puede revocar, pero debe otorgar privilegios USAGE en el esquema sde a todos los usuarios que necesiten tener acceso al tipo, subtipos o funciones de ST_Geometry.
  • Crean las funciones, dominios, tablas (sde_coordinate_systems y sde_geometry_columns) y vistas (st_geometry_columns y st_spatial_references) necesarias en el esquema sde, y la tabla sde_spatial_references en el esquema público.

Antes de ejecutar la herramienta o función, debe copiar la biblioteca st_geometry en el servidor de PostgreSQL.

Nota:

st_geometry.dll necesita el paquete Microsoft Visual C++ Redistributable (x64) cuando se implementa en un servidor de Microsoft Windows. Consulte Requisitos de base de datos PostgreSQL para ArcGIS para conocer la versión del paquete que se requiere. Si este paquete no está presente en el servidor de PostgreSQL, descárguelo desde el sitio web de Microsoft e instálelo.

Utilice la herramienta de geoprocesamiento Crear tipo espacial

En los siguientes pasos se explica cómo ejecutar la herramienta de geoprocesamiento Crear tipo espacial para instalar el tipo ST_Geometry en la base de datos de PostgreSQL:

  1. Descargue la biblioteca st_geometry desde My Esri y colóquela en el directorio de PostgreSQL lib. Asegúrese de descargar la biblioteca st_geometry correcta para la versión de PostgreSQL y el sistema operativo que esté utilizando.
    • La ubicación del directorio lib en Linux puede variar en función de cómo haya instalado PostgreSQL. Para determinar la ubicación correcta para la instalación de PostgreSQL, ejecute pg_config como usuario de postgres. El valor que se devuelve para PKGLIBDIR es el directorio de lib donde es necesario colocar el archivo st_geometry.so. Inicie sesión en el equipo como usuario raíz para copiar el archivo en la ubicación lib.
    • Si PostgreSQL está instalado en un servidor de Windows, coloque el archivo st_geometry.dll en el directorio %PostgreSQL%\libdel servidor.
  2. Abra un proyecto en ArcGIS Pro, abra el panel Catálogo y conéctese a la base de datos como un superusuario de PostgreSQL.

    Esto crea un archivo .sde en su carpeta de proyectos.

  3. Abra la herramienta Crear tipo espacial .

    Puede utilizar la ventana Buscar para buscar la herramienta o abrir la herramienta desde el conjunto de herramientas Espacio de trabajo de la caja de herramientas Administración de datos.

  4. Agregue la conexión de base de datos (archivo .sde) que creó en el paso 2 al cuadro de texto Base de datos de entrada.
  5. Escriba la contraseña que se utilizará para el usuario de la base de datos sde en el cuadro de texto Contraseña de usuario SDE.

    Sugerencia:

    Si el clúster de la base de datos de PostgreSQL ya tiene un rol de conexión sde, asegúrese de que la contraseña que escribe coincide con la contraseña del rol de conexión sde existente. Por ejemplo, podría tener una geodatabase corporativa en este mismo cluster de base de datos. En ese caso, el rol de conexión sde ya existe y debe utilizar ahí su contraseña.

  6. Deje el cuadro de texto Nombre del espacio de tabla en blanco.
  7. Haga clic en Ejecutar.

El tipo ST_Geometry, sus subtipos y funciones se crean en el esquema del usuario sde de la base de datos que especificó.

Use la función CreateSpatialType

Ejecute un script de Python que llame a la función CreateSpatialType de ArcPy en cualquier equipo de ArcMap, ArcGIS Pro o ArcGIS Server para crear el tipo ST_Geometry, sus subtipos y funciones en una base de datos de PostgreSQL.

  1. Descargue la biblioteca st_geometry desde My Esri y colóquela en el directorio de PostgreSQL lib. Asegúrese de descargar la biblioteca st_geometry correcta para la versión de PostgreSQL y el sistema operativo que esté utilizando.
    • La ubicación del directorio lib en Linux puede variar en función de cómo haya instalado PostgreSQL. Para determinar la ubicación correcta para la instalación de PostgreSQL, ejecute pg_config como usuario de postgres. El valor que se devuelve para PKGLIBDIR es el directorio de lib donde es necesario colocar el archivo st_geometry.so. Inicie sesión en el equipo como usuario raíz para copiar el archivo en la ubicación lib.
    • Si PostgreSQL está instalado en un servidor de Windows, coloque el archivo st_geometry.dll en el directorio %PostgreSQL%\libdel servidor.
  2. Cree un archivo de texto en el equipo cliente de ArcGIS y copie en él el script siguiente.
    """
    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. Guarde el archivo con una extensión .py.
  4. Ejecute el script, proporcionando opciones e información específicas de su sitio.

    Por ejemplo, este script crea el tipo ST_Geometry en el spdata de la base de datos de PostgreSQL, en el clúster de base de datos pgserve. La biblioteca ST_Geometry está ubicada en el directorio /net/pgserve/opt/PostgreSQL/12.4/lib del servidor de 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

El tipo ST_Geometry, sus subtipos y funciones se crean en el esquema del usuario sde de la base de datos que especificó.