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 der 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 den Typ sowie dessen Subtypes und Funktionen hinzuzufügen.

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 der Bezeichnung "sde" in der Datenbank, in der der Typ "ST_Geometry" installiert werden soll
  • Erteilen Sie dem SDE-Benutzer uneingeschränkte Berechtigungen für das SDE-Schema.
  • Gewähren Sie der Gruppe mit öffentlicher Anmeldung USAGE-Berechtigungen für das SDE-Schema. Diese Berechtigung ist widerrufbar, allerdings müssen Sie allen Benutzern, die Zugriff auf den Typ "ST_Geometry", Subtypes oder Funktionen benötigen, USAGE-Berechtigungen für das SDE-Schema erteilen.
  • Erstellen Sie die 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 die 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 Windows-Server wird für die st_geometry.dll das Microsoft Visual C++ Redistributable Package (x64) benötigt. Informationen zur erforderlichen Paketversion finden Sie unter PostgreSQL-Datenbankanforderungen. Wenn dieses Paket auf dem PostgreSQL-Server nicht verfügbar ist, laden Sie es von der Microsoft-Site herunter, und installieren Sie es.

Verwenden des Geoverarbeitungswerkzeugs 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. Stellen Sie sicher, dass Sie die richtige Bibliothek "st_geometry" für die aktuell verwendete Version von PostgreSQL und des Betriebssystems herunterladen.
    • Der Speicherort des Verzeichnisses lib unter Linux kann je nach Installation von PostgreSQL variieren. Um den richtigen Speicherort Ihrer 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 an, um die Datei in das Verzeichnis lib zu kopieren.
    • Wenn PostgreSQL unter einem Windows-Server installiert ist, fügen Sie die Datei st_geometry.dll in das Verzeichnis %PostgreSQL%\lib 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.

    Dadurch wird eine .sde-Datei in Ihrem Projektordner erstellt.

  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, stellen Sie sicher, dass das eingegebene Kennwort mit dem Kennwort der vorhandenen SDE-Anmelderolle übereinstimmt. In diesem Datenbank-Cluster ist möglicherweise eine Enterprise-Geodatabase enthalten. Sollte dies der Fall sein, 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.

Verwenden der Funktion "CreateSpatialType"

Führen Sie ein Python-Skript aus, das die ArcPy-Funktion CreateSpatialType auf einem beliebigen ArcMap-, 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. Stellen Sie sicher, dass Sie die richtige Bibliothek "st_geometry" für die aktuell verwendete Version von PostgreSQL und des Betriebssystems herunterladen.
    • Der Speicherort des Verzeichnisses lib unter Linux kann je nach Installation von PostgreSQL variieren. Um den richtigen Speicherort Ihrer 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 an, um die Datei in das Verzeichnis lib zu kopieren.
    • Wenn PostgreSQL unter einem Windows-Server installiert ist, fügen Sie die Datei st_geometry.dll in das Verzeichnis %PostgreSQL%\lib 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 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. 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 Bibliothek "st_geometry" befindet sich im Verzeichnis /net/pgserve/opt/PostgreSQL/9.3/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/9.3/lib/st_geometry.so

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