Хранение ST_Geometry в PostgreSQL

В PostgreSQL можно использовать два различных типа хранения пространственных данных: ST_Geometry и PostGIS. Эти типы данных позволяют интегрировать пространственные данные с другими типами данных, поэтому многопользовательская база данных приобретает преимущества использования географических компонент в данных и в анализе. Хранение пространственных данных вместе с другими бизнес-объектами также облегчает многопользовательский доступ, управление и обеспечение безопасности данных, поскольку количество систем хранения данных уменьшается.

По умолчанию, в базе геоданных на PostgreSQL используется пространственный тип ST_Geometry. Также можно установить тип ST_Geometry в базу данных PostgreSQL. Более подробная информация об установке типа ST_Geometry в базу данных PostgreSQL находится в разделе Добавление типа ST_Geometry в базу данных PostgreSQL.

Для изучения использования типа ST_Geometry в PostgreSQL, в этом разделе описывается

Информация о работе с таблицами, которые используют ST_Geometry, с помощью SQL, находится в следующих разделах:

Информация о типе геометрии PostGIS находится в разделе Что такое тип геометрии PostGIS?

Как ST_Geometry хранит пространственные данные

Ниже приводится описание ST_Geometry в PostgreSQL:

Имя

Тип

Описание

размер

LONG INTEGER

Общая длина структуры ST_Geometry, включая буфер формы

srid

LONG INTEGER

Содержит идентификатор геометрии, который связывает его с соответствующей записью о пространственной привязке (системе координат) в таблице sde_spatial_references

numpts

LONG INTEGER

Число точек, определяющих геометрию; для составной геометрии используются разделители частей, одна точка для каждого разделителя.

entity

SHORT INTEGER

Типа геометрического объекта, хранящийся в пространственном столбце (linestring, multilinestring, multipoint, multipolygon, point или polygon)

sqltype

SHORT INTEGER

Тип SQL для геометрии; например, POINT_TYPE, POINTM_TYPE или MULTIPOLYGONZM_TYPE

minx

LFLOAT

Вместе с miny, maxx и maxy определяет пространственный конверт геометрии

miny

LFLOAT

Вместе с minx, maxx и maxy определяет пространственный конверт геометрии

maxx

LFLOAT

Вместе с minx, miny и maxy определяет пространственный конверт геометрии

maxy

LFLOAT

Вместе с minx, miny и maxx определяет пространственный конверт геометрии

minz

LFLOAT

Минимальное z-значение

maxz

LFLOAT

Максимальное z-значение

minm

LFLOAT

Минимальное значение измерения

maxm

LFLOAT

Максимальное значение измерения

площадь

LFLOAT

Площадь геометрии

len

LFLOAT

Длина периметра геометрии

геометрия

BYTEA

Сжатая геометрия Esri

Как и другие типы объектов, тип данных ST_Geometry имеет метод constructor и функции. Метод constructor возвращает новый экземпляр (объект) типа данных и задает значения его атрибутов.

Имя constructor совпадает с типом (ST_Geometry). При обработке объекта типа ST_Geometry, вызывается метод constructor, как показано на следующем примере:

CREATE TABLE hazardous_sites (name varchar(128),
              location st_geometry);

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

Например, следующий запрос возвращает названия и площадь отдельных штатов США.

SELECT name, st_area(geometry)
FROM us_states
ORDER BY name;

ST_LineString, ST_MultiLineString, ST_MultiPoint, ST_MultiPolygon, ST_Point и ST_Polygon являются подтипами (или подклассами) ST_Geometry. ST_Geometry и его подтипы используют общие атрибуты и функции. Определение конструктора для ST_LineString, ST_MultiLineString, ST_MultiPoint, ST_MultiPolygon, ST_Point и ST_Polygon одинаково. Имя конструктора совпадает с типом, который он создает.

Схема метаданных

Пространственный тип для типов PostgreSQL и таблиц метаданных хранится в схеме. Определение схемы – это описание базовой таблицы для таблиц метаданных, используемых для задания и описания типа столбца/таблицы, пространственного индекса и информации о пространственной привязке.

Описание каждой таблицы приводится в разделе Системные таблицы базы геоданных, хранящейся в PostgreSQL. Это таблицы st_coordinate_systems, st_units_of_measure, sde_geometry_columns, sde_spatial_references и sde_coordinate_system.

Создание классов пространственных объектов, использующие способ хранения ST_Geometry, с помощью ArcGIS

Используемый тип хранения выбирается при создании классов пространственных объектов с помощью ArcGIS for Desktop.

Когда вы создаете класс объектов в ArcGIS, который использует хранение ST_Geometry, бизнес-таблица класса объектов создается со столбцом типа ST_Geometry, в котором хранятся пространственные данные класса объектов.

Когда вы подключаетесь к базе данных, выберите ST_Geometry при создании пространственной таблицы, если вы хотите использовать такой тип пространственного столбца. Информация о создании таблиц в базе данных находится в разделе Создание пространственной таблицы базы данных в ArcGIS.

Когда вы подключаетесь к базе геоданных, тип хранения выбирается с помощью ключевого слова конфигурации. Настройки хранения, используемые по умолчанию, задаются в таблице sde_dbtune параметром GEOMETRY_STORAGE ключевого слова конфигурации DEFAULTS. Если вы не изменили значение параметра GEOMETRY_STORAGE ключевого слова DEFAULTS, все создаваемые классы объектов будут использовать тип хранения ST_Geometry, пока вы не зададите другое ключевое слово конфигурации при создании класса объектов.

Если вы изменили параметр DEFAULTS GEOMETRY_STORAGE на PostGIS, вы все равно можете создавать классы объектов, использующие ST_Geometry. Для этого создайте новое ключевое слово конфигурации для типа хранения ST_Geometry в таблице sde_dbtune. Например, можно создать ключевое слово конфигурации так:

##ST_GEOMETRY
GEOMETRY_STORAGE    "ST_GEOMETRY"
UI_TEXT   "User-interface for ST_GEOMETRY keyword"

END

Затем, когда вы создаете класс объектов в ArcGIS, выберите это ключевое слово и новый класс объектов будет использовать хранение ST_Geometry.

ПодсказкаПодсказка:

Используйте команду sdedbtune, чтобы изменить или добавить значения в таблицу sde_dbtune. Инструкции см. в Изменение содержания таблицы DBTUNE.

Доступ к таблицам PostgreSQL со столбцами ST_Geometry

Если вы используете SQL для создания таблицы со столбцом ST_Geometry, вы можете получить доступ к данным с помощью SQL или сторонних приложений, или можно открыть таблицу в ArcGIS. Когда вы подключаетесь к базе данных из ArcGIS, можно просматривать данные, выполнять анализ или загружать данные в таблицы, которые имеют столбец ST_Geometry. Для этого необходимо выполнение следующих условий:

Если вы создали таблицу в базе геоданных с помощью SQL, можно зарегистрировать ее с базой геоданных, если вы хотите использовать функциональность базы геоданных (репликацию, сети, классы отношений и топологию) или редактировать таблицу в ArcGIS. Зарегистрировать таблицу с базой геоданных можно при соблюдении следующих условий:

Регистрация пространственного столбца

Если вы используете SQL для создания таблицы, содержащей столбец ST_Geometry, можно зарегистрировать столбец для использования определенной пространственной привязки и размерности. Таким образом, пользователь, добавляющий записи с помощью SQL, не сможет случайно добавить записи, использующие другой тип пространственной привязки или имеющие другую размерность. Для этого используйте функцию sde.st_register_spatial_column. Синтаксис функции следующий:

SELECT st_register_spatial_column('<database_name>', '<schema_name>', 
'<table_name>', '<spatial_column_name>', <srid>, <coordinate_dimension>)

Заданный SRID должен присутствовать в таблице public.sde_spatial_references. Измерение координат показывает, имеют ли данные только x,y координаты (2), x,y,z координаты (3), x,y,z,m координаты (4) или x,y,m координаты (5). По умолчанию, если вы не задаете размерность координат, данные регистрируются с размерностью x,y.

В следующем примере, столбец shape таблицы blocks в схеме sasha базы данных mycitydb зарегистрирован с SRID, равным 4236 и хранит только 3-мерные координаты:

SELECT st_register_spatial_column(
'mycitydb', 'sasha', 'blocks', 'shape', 4236, 3);

При этом в таблицу public.sde_geometry_columns базы данных или геоданных добавляется запись пространственного столбца.

Если пространственный столбец пуст и вы регистрируете его с определенными SRID и размерностью, регистрацию можно отменить, чтобы изменить SRID или размерность, а затем зарегистрировать его снова, с другими значениями. Отменить регистрацию пространственного столбца можно с помощью функции st_unregister_spatial_column(). Эта функция удаляет пространственный столбец из системной таблицы public.sde_geometry_columns, поэтому он перестает быть связанным с какой-либо базовой системой координат. Синтаксис этой функции следующий:

SELECT st_unregister_spatial_column(
'<database_name>', '<schema_name>',
 '<table_name>', '<column_name>')

Проверить регистрацию пространственного столбца можно с помощью функции st_isregistered_spatial_column. Синтаксис этой функции:

SELECT st_isregistered_spatial_column(
'<database_name>', '<schema_name>',
 '<table_name>', '<column_name>', <srid>)

Если пространственный столбец зарегистрирован с определенным SRID, возвращается 1; если нет – 0.

Чтобы определить, с какой размерностью зарегистрирована таблица, используйте функцию st_get_coord_dimension. Синтаксис функции st_get_coord_dimension:

SELECT st_get_coord_dimension(
'<schema_name>', '<table_name>', '<column_name>', <srid>)

В этом примере st_get_coord_dimension возвращает xyz, поскольку таблица blocks зарегистрирована как трехмерная:

SELECT st_get_coord_dimension(
'sasha', 'blocks', 'shape', 4236);

st_get_coord_dimension
---------------------------
xyz
9/11/2013