Mit der Standard- oder Advanced-Lizenz verfügbar.
Um räumliche Daten mit dem Typ "ST_Geometry" in einer PostgreSQL-Datenbank zu speichern, kann der Datenbankadministrator das Geoverarbeitungswerkzeug Räumlichen Typ erstellen oder ein Python-Skript, das die ArcPy-Funktion CreateSpatialType aufruft, ausführen, 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 den Parameter Räumlicher Typ 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 ausführen. 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.
Führen Sie die folgenden Schritte aus, um das Geoverarbeitungswerkzeug Räumlichen Typ erstellen auszuführen und den Typ "ST_Geometry" in einer PostgreSQL-Datenbank zu installieren:
- 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.
Wenden Sie sich an den Administrator Ihrer ArcGIS-Organisation, wenn die Download-Option nicht vorhanden ist.
- 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.
- Öffnen Sie ein Projekt in ArcGIS Pro, öffnen Sie den Bereich Katalog, und stellen Sie als PostgreSQL-Administrator eine Verbindung mit der Datenbank her.
Im Projektordner wird eine Datenbankverbindungsdatei (.sde) erstellt.
- Ö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".
- Fügen Sie dem Textfeld des Parameters Eingabedatenbank die in Schritt 2 erstellte Datenbankverbindung hinzu.
- Geben Sie das Kennwort für den SDE-Datenbankbenutzer in das Textfeld des Parameters SDE-Benutzerkennwort ein.
Tipp:
Wenn der PostgreSQL-Datenbank-Cluster bereits über eine SDE-Anmelderolle verfügt, muss das von Ihnen angegebene Kennwort mit dem Kennwort der vorhandenen SDE-Anmelderolle übereinstimmen. 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.
- Lassen Sie das Textfeld des Parameters Tablespace-Name leer.
- 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 die folgenden Schritte aus, um ein Python-Skript auszuführen, 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.
- 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.
- 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) - Speichern Sie die Datei mit der Erweiterung .py.
- 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.