Хранение ST_Geometry в PostgreSQL
Пространственный тип данных ST_Geometry может использоваться в базах данных PostgreSQL, как содержащих, так и не содержащих базы геоданных. Типы данных ST_Geometry позволяют интегрировать пространственные данные с другими типами данных, поэтому многопользовательская база данных приобретает преимущества использования географического компонента в данных и в анализе. Хранение пространственных данных вместе с другими бизнес-объектами также облегчает многопользовательский доступ, управление и обеспечение безопасности данных, поскольку количество систем хранения данных уменьшается.
По умолчанию, базы геоданных в PostgreSQL настроены на использование пространственного типа ST_Geometry, хотя его все равно следует настроить. Дополнительные сведения см. в разделе Настройка базы геоданных в PostgreSQL. Если вы используете базу данных PostgreSQL, не содержащую базы геоданных, можно установить тип ST_Geometry. Более подробная информация об установке типа ST_Geometry в базу данных PostgreSQL находится в разделе Добавление типа ST_Geometry в базу данных PostgreSQL.
Для изучения использования типа ST_Geometry в PostgreSQL, в этом разделе описывается
- Архитектура пространственного типа ST_Geometry в PostgreSQL
- Как создать классы пространственных объектов в ArcGIS, использующие хранение ST_Geometry
- Использование таблиц PostgreSQL, содержащих столбец ST_Geometry, с ArcGIS
- Как зарегистрировать столбец ST_Geometry, чтобы ограничить используемую пространственную привязку
Информация о работе с таблицами, которые используют ST_Geometry, с помощью SQL, находится в следующих разделах:
- Создание таблиц со столбцом ST_Geometry
- Вставка пространственных объектов в таблицу со столбцом ST_Geometry
- Построение запросов к таблицам со столбцом ST_Geometry
- Обновление значений в пространственном столбце ST_Geometry с помощью SQL
- Использование пространственных представлений с таблицами со столбцом ST_Geometry
Как ST_Geometry хранит пространственные данные
Ниже приводится описание ST_Geometry в PostgreSQL:
Имя (Name) |
Тип |
Описание |
---|---|---|
size |
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 |
Максимальное значение измерения |
area |
LFLOAT |
Площадь геометрии |
len |
LFLOAT |
Длина периметра геометрии |
shape |
BYTEA |
Сжатая геометрия Esri |
Как и другие типы объектов, тип данных ST_Geometry имеет метод конструктора и функции. Метод конструктора возвращает новый экземпляр (объект) типа данных и задает значения его атрибутов.
Имя конструктора совпадает с типом (ST_Geometry). При обработке объекта типа ST_Geometry, вызывается метод конструктора, как показано на следующем примере:
CREATE TABLE hazardous_sites (name varchar(128),
location st_geometry);
Ниже приводится список функций доступа ST_Geometry, которые используют один входной объект ST_Geometry и возвращают запрашиваемое значение свойства в виде числа:
- Компонентная функция ST_Area возвращает площадь геометрии.
- ST_Length возвращает длину геометрии.
- ST_Entity возвращает число, содержащий битовую маску, описывающую тип примитива.
- ST_NumPoints возвращает число точек (вершин), которые задают геометрию.
- ST_MinM, ST_MinX, ST_MinY и ST_MinZ возвращают минимальную желаемую координату геометрии.
- ST_MaxM, ST_MaxX, ST_MaxY и ST_MaxZ возвращают максимальную желаемую координату геометрии.
- ST_SRID возвращает идентификатор пространственной привязки геометрии.
Например, следующий запрос возвращает названия и площадь отдельных штатов США.
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 хранится в схеме sde. Определение схемы – это описание базовой таблицы для таблиц метаданных, используемых для задания и описания типа столбца/таблицы, пространственного индекса и информации о пространственной привязке.
Описание каждой таблицы и представления приводится в разделе Системные таблицы базы геоданных, хранящейся в PostgreSQL. Это таблицы sde_geometry_columns и sde_coordinate_systems. Это представления st_geometry_columns и st_spatial_references, они основаны на этих же таблицах.
Помимо системных таблиц, представлений и функций, для обработки метаданных ST_Geometry используются следующие объекты базы данных:
- Роль учетной записи sde
- Схема sde в базе данных
- Триггер ST_Geometry: sde_coord_sys_def_insert_tg
- Домены ST_Geometry:
- st_geomcollection
- st_linestring
- st_multilinestring
- st_multipoint
- st_multipolygon
- st_point
- st_polygon
Создание классов пространственных объектов, использующие способ хранения ST_Geometry, с помощью ArcGIS
Используемый тип хранения выбирается при создании классов пространственных объектов с помощью ArcGIS for Desktop.
Когда вы создаете класс объектов в ArcGIS, который использует хранение ST_Geometry, бизнес-таблица класса объектов создается со столбцом типа ST_Geometry, в котором хранятся пространственные данные класса объектов.
в базе данных
Вы задаете используемый тип пространственных данных при создании класса объектов в ArcGIS. Подробнее см. в разделе Создание пространственной таблицы базы данных в ArcGIS.
В базе геоданных
Информация о хранении класса объектов контролируется параметрами ключевого слова конфигурации в таблице sde_dbtune. Ключевое слово конфигурации задается при создании класса пространственных объектов в ArcGIS. При создании базы геоданных в ключевом слове конфигурации DEFAULTS параметр GEOMETRY_STORAGE имеет значение ST_Geometry. Если вы хотите хранить все или большую часть пространственных данных с помощью типа ST_Geometry, не меняйте значение параметра GEOMETRY_COLUMNS ключевого слова DEFAULTS, а затем при создании класса объектов из ArcGIS, укажите ключевое слово DEFAULTS.
Если вы изменили параметр DEFAULTS GEOMETRY_STORAGE для использования типа геометрии PostGIS, но хотите создать несколько классов объектов с применением типа данных ST_Geometry, можно создать новое ключевое слово конфигурации для хранения ST_Geometry в таблице sde_dbtune. Используйте команду администрирования sdedbtune, чтобы экспортировать содержание таблицы sde_dbtune в текстовой файл, добавить ключевое слово, в котором GEOMETRY_STORAGE имеет значение ST_GEOMETRY, а затем снова используйте sdedbtune для импорта изменений. Например, можно экспортировать таблицу sde_dbtune и добавить ключевое слово конфигурации так:
##ST_GEOMETRY GEOMETRY_STORAGE "ST_GEOMETRY" UI_TEXT "User-interface for ST_GEOMETRY keyword" END
Подробнее см. в разделе Изменение содержания таблицы sde_dbtune.
После добавления ключевого слова его можно указать при создании класса объектов в ArcGIS, тогда новый класс объектов будет использовать хранение ST_Geometry.
Доступ к таблицам PostgreSQL со столбцами ST_Geometry
Если вы используете SQL для создания таблицы со столбцом ST_Geometry, вы можете получить доступ к данным с помощью SQL, сторонних приложений или из ArcGIS. Когда вы подключаетесь к базе данных из ArcGIS, можно просматривать данные, выполнять анализ или загружать данные в таблицы, которые имеют столбец ST_Geometry. Для этого необходимо выполнение следующих условий:
- Таблица должна содержать один столбец ST_Geometry.
- Таблица не должна иметь других столбцов, тип которых задается пользователем.
- Если в таблице содержатся различные типы геометрии (точки, линии и полигоны), необходимо указать, какие типы геометрии вы хотите увидеть; в ArcGIS можно одновременно просматривать только один тип.
- Все записи таблицы должны использовать одинаковую пространственную привязку.
Если вы создали таблицу в базе геоданных с помощью SQL, можно зарегистрировать ее в базе геоданных, если вы хотите использовать функциональность базы геоданных (репликацию, сети, классы отношений и топологию) или редактировать таблицу в ArcGIS. Зарегистрировать таблицу в базе геоданных можно при соблюдении следующих условий:
- Таблица должна принадлежать пользователю, который ее регистрирует.
- Она должна содержать один столбец ST_Geometry.
- Она не должна иметь других столбцов, тип которых задается пользователем.
- Таблица должна содержать один тип геометрии (точки, линии или полигоны).
- Все записи таблицы должны использовать одинаковую пространственную привязку.
- Также необходимо наличие столбца с целочисленными, уникальными значениями, отличными от NULL, которые можно использовать как ID строки.
Регистрация пространственного столбца
Если вы используете 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 и хранит только трехмерные координаты:
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