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

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

Sie können einer Oracle-Datenbank den Esri-Typ "ST_Geometry", einen Subtype und Funktionen mithilfe des Geoverarbeitungswerkzeugs Räumlichen Typ erstellen oder eines Python-Skripts hinzufügen, das die ArcPy-Funktion CreateSpatialType aufruft.

Nachdem Sie Ihrer Datenbank den Typ "ST_Geometry" hinzugefügt haben, können Sie ihn zum Speichern räumlicher Daten verwenden.

Sowohl mit dem Werkzeug als auch mit der Funktion wird ein Benutzer mit dem Namen "sde" in der Datenbank erstellt. Der SDE-Benutzer besitzt den ST_Geometry-Typ, Subtypes, Funktionen und Tabellen.

Hinweis:

Bei der Bereitstellung auf einem Microsoft Windows-Server wird für die Bibliothek "ST_Geometry" das Microsoft Visual C++ Redistributable Package (x64) benötigt. Informationen zur erforderlichen Paketversion finden Sie unter ArcGIS-Anforderungen für Oracle. Wenn dieses Paket auf dem 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 Oracle-Datenbank zu installieren:

  1. Laden Sie die Bibliothek st_shapelib (Windows) oder libst_shapelib (Linux) von My Esri herunter, und verschieben Sie sie in einen Speicherort auf dem Oracle-Server.

    Verwenden Sie die Bibliothek, die für das Betriebssystem Ihres Oracle-Servers vorgesehen ist.

    Das Verzeichnis auf dem Server, in dem Sie die Bibliothek ablegen, muss vom Client-Computer, auf dem Sie das Werkzeug Räumlichen Typ erstellen oder das Skript ausführen, zugänglich sein. Wenn Sie die Bibliothek auf einem UNIX- oder Linux-Computer platzieren, müssen Sie sicherstellen, dass der Datenbankadministrator über Lesezugriff auf das Verzeichnis und über die Berechtigungen zum Ausführen der Bibliotheksdatei verfügt.

  2. Öffnen Sie ein Projekt in ArcGIS Pro, öffnen Sie den Bereich Katalog und verbinden Sie sich als Oracle-SYS-Datenbankadministrator mit der Datenbank.

    Hierbei wird eine .sde-Datei im Projektordner angelegt.

  3. Öffnen Sie das Geoverarbeitungswerkzeug 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 Eingabe-Datenbankverbindung die Datenbankverbindung hinzu, die Sie in Schritt 3 erstellt haben.
  5. Geben Sie das Kennwort für den SDE-Datenbankbenutzer in das Textfeld SDE-Benutzerkennwort ein.
  6. Um einen Standard-Tablespace für den SDE-Benutzer zu erstellen, geben Sie seinen Namen in das Textfeld Tablespace-Name ein.

    Das Werkzeug Räumlichen Typ erstellen erstellt einen 400-MB-Tablespace im Standardspeicherort von Oracle. Um den Speicherort oder die Größe des Tablespace zu steuern, erstellen Sie den Tablespace zunächst in Oracle und geben den vorhandenen Tablespace im Textfeld Tablespace-Name an. Der bereits vorhandene Tablespace wird durch das Werkzeug als Standard für den SDE-Benutzer festgelegt.

  7. Navigieren Sie zum Pfad der ST_Geometry-Shape-Bibliothek oder geben Sie ihn ein.

    Dabei handelt es sich um den Pfad zum Verzeichnis auf dem Oracle-Server, in dem Sie die Datei libst_shapelib.so bzw. st_shapelib.dll einschließlich des Dateinamens abgelegt haben.

    Wenn Sie beispielsweise die Datei libst_shapelib.so im Verzeichnis libraries auf einem Linux-Server namens "boxy" abgelegt haben, müssen Sie /boxy/libraries/libst_shapelib.so eingeben.

  8. Klicken Sie auf Ausführen.

Der ST_Geometry-Typ, Subtypes und Funktionen werden im Schema des SDE-Benutzers erstellt, und in Oracle wird ein Eintrag für die Shape-Bibliothek hinzugefügt.

Wenn Sie mit der Funktion "ST_Transform" geographische Transformationen durchführen möchten, müssen Sie den Ordner "pedata" aus dem ArcGIS Pro-Installationsverzeichnis kopieren, auf dem Oracle-Server platzieren und eine PEDATAHOME-Umgebungsvariable auf dem Server festlegen, die auf dieses Verzeichnis verweist.

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 Esri-Typ "ST_Geometry", einen Subtype und Funktionen in einer Oracle-Datenbank zu erstellen.

  1. Laden Sie die Bibliothek st_shapelib (Windows) oder libst_shapelib (Linux) von My Esri herunter, und verschieben Sie sie in einen Speicherort auf dem Oracle-Server.

    Stellen Sie sicher, dass die Bibliothek dem Betriebssystem Ihres Oracle-Servers entsprechend verwendet wird.

    Das Verzeichnis auf dem Server, in dem Sie die Bibliothek ablegen, muss vom Client-Computer, auf dem Sie das Werkzeug Räumlichen Typ erstellen oder das Skript ausführen, zugänglich sein. Wenn Sie die Bibliothek auf einem UNIX- oder Linux-Computer platzieren, müssen Sie sicherstellen, dass der Datenbankadministrator über Lesezugriff auf das Verzeichnis und über die Berechtigungen zum Ausführen der Bibliotheksdatei verfügt.

  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 Oracle-Instanz "oserve/orcl", und die Bibliothek "ST_Geometry" befindet sich im Verzeichnis /ora/shape auf dem Oracle-Server (oserve).

    create_spatial_type.py --DBMS ORACLE -i oserve/orcl --auth DATABASE_AUTH -U sys -P M3tsy$ -p 3$@b0eg -t sde --path /net/oserve/ora/shape/libst_shapelib.so

Der ST_Geometry-Typ, Subtypes und Funktionen werden im Schema des SDE-Benutzers erstellt, und in Oracle wird ein Eintrag für die Shape-Bibliothek hinzugefügt.

Wenn Sie mit der Funktion "ST_Transform" geographische Transformationen durchführen möchten, müssen Sie den Ordner "pedata" aus dem ArcGIS Pro-Installationsverzeichnis kopieren, auf dem Oracle-Server platzieren und eine PEDATAHOME-Umgebungsvariable auf dem Server festlegen, die auf dieses Verzeichnis verweist.