Hinzufügen des Typs "ST_Geometry" zu einer PostgreSQL-Datenbank

Mit der Standard- oder Advanced-Lizenz verfügbar.

Um räumliche Daten mit dem Typ "ST_Geometry" in einer PostgreSQL-Datenbank zu speichern, verwenden Sie das Geoverarbeitungswerkzeug Räumlichen Typ erstellen oder ein Python-Skript, das die ArcPy-Funktion CreateSpatialType aufruft, um der Datenbank diesen Typ sowie dessen Subtypes und Funktionen hinzuzufügen.

Tipp:

Wenn Sie zum Erstellen einer Geodatabase in PostgreSQL das Geoverarbeitungswerkzeug Enterprise-Geodatabase erstellen verwendet und dabei die Option Spatial Type auf PostGIS festgelegt haben und dieser Geodatabase später den Datentyp "ST_Geometry" hinzufügen möchten, können Sie dazu das Werkzeug Räumlichen Typ erstellen verwenden. Andernfalls führen Sie das Werkzeug Räumlichen Typ erstellen in einer Datenbank aus.

Funktionen des Werkzeugs Räumlichen Typ erstellen:

  • Erstellen einer Anmelderolle mit der Bezeichnung "sde" im PostgreSQL-Datenbank-Cluster
  • Erteilen einer Administratorberechtigung an den SDE-Benutzer (diese kann nach Erstellung des Typs "ST_Geometry" entzogen werden)
  • Erstellen eines Schemas mit dem Namen "sde" in der Datenbank
  • Erteilen uneingeschränkter Berechtigungen für das SDE-Schema für den SDE-Benutzer
  • Gewähren von USAGE-Berechtigungen für das SDE-Schema für die Gruppe mit öffentlicher Anmeldung. Diese Berechtigung für die öffentliche Gruppe ist widerrufbar, allerdings müssen Sie allen Benutzern, die Zugriff auf den Typ "ST_Geometry" oder auf seine Subtypes oder Funktionen benötigen, USAGE-Berechtigungen für das SDE-Schema erteilen.
  • Erstellen der notwendigen Funktionen, Domänen, Tabellen ("sde_coordinate_systems" und "sde_geometry_columns") und Sichten ("st_geometry_columns" und "st_spatial_references") im SDE-Schema und der Tabelle "sde_spatial_references" im öffentlichen Schema

Bevor Sie das Werkzeug oder die Funktion ausführen, müssen Sie die Bibliothek "st_geometry" auf den PostgreSQL-Server kopieren.

Hinweis:

Bei der Bereitstellung auf einem Microsoft Windows-Server wird für die st_geometry.dll-Datei das Microsoft Visual C++ Redistributable Package (x64) benötigt. Informationen zur erforderlichen Paketversion finden Sie unter ArcGIS-Anforderungen für PostgreSQL. Wenn dieses Paket auf dem PostgreSQL-Server nicht verfügbar ist, laden Sie es von der Microsoft-Site herunter, und installieren Sie es.

Verwenden Sie das Geoverarbeitungswerkzeug Räumlichen Typ erstellen.

In den folgenden Schritten wird erläutert, wie das Geoverarbeitungswerkzeug Räumlichen Typ erstellen ausgeführt wird, um den Typ "ST_Geometry" in einer PostgreSQL-Datenbank zu installieren:

  1. Laden Sie die Bibliothek "ST_Geometry" von My Esri herunter, und legen Sie sie im PostgreSQL-Verzeichnis lib ab.

    "ST_Geometry"-Bibliotheken gibt es für bestimmte Betriebssysteme, Versionen von PostgreSQL und ArcGIS-Versionen.

    • Der Speicherort des Verzeichnisses lib unter Linux kann je nach Installation von PostgreSQL variieren. Um den richtigen Speicherort für Ihre PostgreSQL-Installation zu ermitteln, führen Sie pg_config als postgres-Benutzer aus. Der für "PKGLIBDIR" zurückgegebene Wert ist das Verzeichnis lib, in dem Sie die st_geometry.so-Datei speichern müssen. Melden Sie sich als Stammverzeichnisbenutzer bei dem Computer an, um die Datei in das Verzeichnis lib zu kopieren.
    • Wenn PostgreSQL auf einem Windows-Server installiert ist, fügen Sie die Datei st_geometry.dll in das Verzeichnis %PostgreSQL%\lib auf dem Server ein.
  2. Öffnen Sie ein Projekt in ArcGIS Pro, öffnen Sie den Bereich Katalog, und stellen Sie als PostgreSQL-Administrator eine Verbindung mit der Datenbank her.

    Hierbei wird eine .sde-Datei im Projektordner angelegt.

  3. Öffnen Sie das Werkzeug "Räumlichen Typ erstellen".

    Suchen Sie im Fenster Suchen nach dem Werkzeug, oder öffnen Sie das Werkzeug im Toolset Workspace der Toolbox Data Management.

  4. Fügen Sie dem Textfeld Eingabedatenbank die in Schritt 2 erstellte Datenbankverbindung (.sde-Datei) hinzu.
  5. Geben Sie das Kennwort für den SDE-Datenbankbenutzer in das Textfeld SDE-Benutzerkennwort ein.

    Tipp:

    Wenn das PostgreSQL-Datenbank-Cluster bereits über eine SDE-Anmelderolle verfügt, dann muss das von Ihnen eingegebene Kennwort mit dem Kennwort der vorhandenen SDE-Anmelderolle übereinstimmt. Wenn zum Beispiel in diesem Datenbank-Cluster bereits eine Enterprise-Geodatabase enthalten ist, dann ist die SDE-Anmelderolle bereits vorhanden, und Sie müssen hier deren Kennwort verwenden.

  6. Lassen Sie das Textfeld Tablespace-Name leer.
  7. Klicken Sie auf Ausführen.

Der ST_Geometry-Typ, Subtypes und Funktionen werden im Schema des SDE-Benutzers in der von Ihnen angegebenen Datenbank erstellt.

CreateSpatialType (Funktion) verwenden

Führen Sie ein Python-Skript aus, das die ArcPy-Funktion CreateSpatialType auf einem beliebigen ArcGIS Pro- oder ArcGIS Server-Computer aufruft, um den Typ "ST_Geometry", einen Subtype und Funktionen in einer PostgreSQL-Datenbank zu erstellen.

  1. Laden Sie die Bibliothek "ST_Geometry" von My Esri herunter, und legen Sie sie im PostgreSQL-Verzeichnis lib ab.

    "ST_Geometry"-Bibliotheken gibt es für bestimmte Betriebssysteme, Versionen von PostgreSQL und ArcGIS-Versionen.

    • Der Speicherort des Verzeichnisses lib unter Linux kann je nach Installation von PostgreSQL variieren. Um den richtigen Speicherort für Ihre PostgreSQL-Installation zu ermitteln, führen Sie pg_config als postgres-Benutzer aus. Der für "PKGLIBDIR" zurückgegebene Wert ist das Verzeichnis lib, in dem Sie die st_geometry.so-Datei speichern müssen. Melden Sie sich als Stammverzeichnisbenutzer bei dem Computer an, um die Datei in das Verzeichnis lib zu kopieren.
    • Wenn PostgreSQL auf einem Windows-Server installiert ist, fügen Sie die Datei st_geometry.dll in das Verzeichnis %PostgreSQL%\lib auf dem Server ein.
  2. Erstellen Sie eine Textdatei auf einem ArcGIS-Client-Computer, und kopieren Sie das folgende Skript in die Datei:
    """
    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. Speichern Sie die Datei mit der Erweiterung .py.
  4. Führen Sie das Skript aus, indem Sie für Ihre Site spezifische Optionen und Informationen bereitstellen.

    Dieses Skript erstellt beispielsweise den Typ "ST_Geometry" in der PostgreSQL-Datenbank "spdata" im Datenbank-Cluster "pgserve". Die ST_Geometry-Bibliothek befindet sich im Verzeichnis /net/pgserve/opt/PostgreSQL/12.4/lib auf dem PostgreSQL-Server (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

Der ST_Geometry-Typ, Subtypes und Funktionen werden im Schema des SDE-Benutzers in der von Ihnen angegebenen Datenbank erstellt.