Добавление типа ST_Geometry в базу данных PostgreSQL

Доступно с лицензией Standard или Advanced.

Чтобы использовать тип ST_Geometry для хранения пространственных данных в базе данных PostgreSQL, используйте инструмент геообработки Создать пространственный тип либо скрипт Python, вызывающий функцию ArcPy CreateSpatialType для добавления типа, его подтипов и функций в базу данных.

Инструмент Создать пространственный тип и функция выполняет следующие действия:

  • Создает роль логина sde в кластере базы данных в PostgreSQL.
  • Присваивает пользователю sde права суперпользователя (они могут быть отозваны после создания типа ST_Geometry).
  • Создает схему с именем sde в базе данных, в которой вы устанавливаете тип ST_Geometry.
  • Присваивает пользователю sde все права для схемы sde.
  • Создает права USAGE в схеме sde для группы персональных учетных записей. Вы можете отозвать данное право доступа, но вы должны присвоить право USAGE схемы sde всем пользователям, нуждающимся в доступе к типу ST_Geometry, подтипам или функциям.
  • Создает необходимые функции, домены, таблицы (sde_coordinate_systems и sde_geometry_columns), виды (st_geometry_columns и st_spatial_references) в схеме sde, а также таблицу sde_spatial_references в общей схеме.

Перед запуском инструмента или функции необходимо скопировать библиотеку st_geometry на сервер PostgreSQL.

Примечание:

При развертывании на сервере Windows, для st_geometry.dll требуется Microsoft Visual C++ Redistributable Package (x64). См. требования к базе данных PostgreSQL для требуемой версии упаковки. Если данный пакет отсутствует на сервере PostgreSQL, то загрузите его с сайта Microsoft и выполните установку.

Используйте инструмент геообработки Создать пространственный тип.

Следующие шаги объясняют процесс запуска инструмента геообработки Создать пространственный тип для установки типа ST_Geometry в базу данных PostgreSQL:

  1. Загрузите библиотеку st_geometry из My Esri и перенесите ее в папку lib PostgreSQL. Убедитесь, что вы загрузили библиотеку st_geometry, соответствующую версии PostgreSQL и используемой ОС.
    • Местоположение директории lib в Linux может меняться в зависимости от способа установки PostgreSQL. Чтобы определить корректное местоположение для установки PostgreSQL, выполните команду pg_config в качестве пользователя postgres. Значение, возвращаемое для PKGLIBDIR, является папкой lib, в которую необходимо поместить файл st_geometry.so. Для копирования файла в lib войдите как пользователь root.
    • Если PostgreSQL установлен на сервере Windows, поместите файл st_geometry.dll в директорию %PostgreSQL%\lib.
  2. Откройте проект в ArcGIS Pro, откройте панель Каталог и подключите базу данных под суперпользователем PostgreSQL.

    В папке вашего проекта будет создан файл .sde.

  3. Откройте инструмент Создать пространственный тип.

    Вы можете воспользоваться окном Поиск для поиска инструмента или открыть его из группы инструментов Рабочая область набора инструментов Управление данными.

  4. Добавьте подключение к базе данных (файл .sde) , созданное на шаге 2, в текстовое поле Входная база данных.
  5. Введите пароль пользователя базы данных sde в поле Пароль пользователя SDE.

    Подсказка:

    Если в кластере базы данных PostgreSQL уже есть роль sde, убедитесь, что введенный вами пароль соответствует паролю существующей роли sde. Например, у вас есть многопользовательская база геоданных в том же кластере базы данных. В этом случае роль sde уже есть, и вам следует использовать ее пароль.

  6. Оставьте поле Имя табличного пространства пустым.
  7. Щелкните Запустить.

Тип ST_Geometry, подтипы и функции создаются в схеме пользователя sde указанной вами базы данных.

Используйте функцию CreateSpatialType

Вы можете запустить скрипт Python, который вызывает функцию ArcPy CreateSpatialType на любой машине с ArcMap, ArcGIS Pro илиArcGIS Server для создания типа, подтипа или функции Esri ST_Geometry в базе данных PostgreSQL.

  1. Загрузите библиотеку st_geometry из My Esri и перенесите ее в папку lib PostgreSQL. Убедитесь, что вы загрузили библиотеку st_geometry, соответствующую версии PostgreSQL и используемой ОС.
    • Местоположение директории lib в Linux может меняться в зависимости от способа установки PostgreSQL. Чтобы определить корректное местоположение для установки PostgreSQL, выполните команду pg_config в качестве пользователя postgres. Значение, возвращаемое для PKGLIBDIR, является папкой lib, в которую необходимо поместить файл st_geometry.so. Для копирования файла в lib войдите как пользователь root.
    • Если PostgreSQL установлен на сервере Windows, поместите файл st_geometry.dll в директорию %PostgreSQL%\lib.
  2. Создайте текстовый файл на клиентском компьютере ArcGIS и скопируйте следующий скрипт в файл.
    """
    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. Сохраните файл с расширением .py.
  4. Запустите скрипт, предоставив специфичные для вашего сайта опции и информацию.

    Например, этот скрипт создает тип ST_Geometry в базе данных PostgreSQL spdata, на кластере базы данных pgserve. Библиотека ST_Geometry расположена в папке /net/pgserve/opt/PostgreSQL/9.3/lib на сервере 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/9.3/lib/st_geometry.so

Тип ST_Geometry, подтипы и функции создаются в схеме пользователя sde указанной вами базы данных.