ST_Geometry в PostgreSQL

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

Чтобы использовать тип ST_Geometry в базах геоданных в PostgreSQL, скопируйте библиотеку st_geometry в установку PostgreSQL перед созданием базы геоданных. Инструкции см. в разделе Создать базу геоданных в PostgreSQL в Windows или Создать базу геоданных в PostgreSQL в Linux. Если используется база данных PostgreSQL, которая не содержит базы геоданных, можно установить тип ST_Geometry для работы с пространственными таблицами, которые создаются в базе данных.

Обратитесь к следующим ссылкам, чтобы узнать больше о типе ST_Geometry в PostgreSQL:

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

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

ИмяТипОписание

размер

LONG INTEGER

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

srid

LONG INTEGER

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

numpts

LONG INTEGER

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

элемент

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 одинаково. Имя конструктора совпадает с типом, который он создает.

Определение схемы ST_Geometry

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

Это таблицы 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

Использование ArcGIS для создания классов пространственных объектов с типом хранения ST_Geometry

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

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

В базе данных

По умолчанию пространственный тип ST_Geometry используется для классов объектов, которые вы создаете в базе данных PostgreSQL. Чтобы использовать пространственный тип PostGIS, вы должны указать другое ключевое слово при создании класса объектов с помощью клиента ArcGIS. Подробнее см. Создание класса пространственных объектов.

В базе геоданных

Информация о хранении класса объектов контролируется параметрами ключевого слова конфигурации в системной таблице. Ключевое слово конфигурации задается при создании класса пространственных объектов в ArcGIS. Параметр ключевого слова конфигурации DEFAULTS GEOMETRY_STORAGE задается либо как ST_Geometry (если вы создали базу геоданных для использования ST_Geometry), либо как PG_Geometry (если вы создали базу геоданных для использования пространственных типов PostGIS).

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

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

END

Дополнительные сведения см. в разделе Изменение ключевых слов конфигурации.

После того, как ключевое слово будет добавлено, любой сможет указать его при создании класса объектов в ArcGIS.

Использование ArcGIS для доступа к таблицам PostgreSQL со столбцами ST_Geometry

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

  • Таблица должна содержать один столбец ST_Geometry.
  • Таблица не должна иметь других столбцов, тип которых задается пользователем.
  • Если в таблице хранятся несколько типов геометрии (точки, линии и полигоны), то вы должны указать, какие типы геометрии вы хотите просматривать, одновременно в ArcGIS можно посмотреть только один тип данных.
  • Все записи таблицы должны использовать одинаковую пространственную привязку.

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

  • Таблица должна принадлежать пользователю, который ее регистрирует.
  • Она должна содержать один столбец ST_Geometry.
  • Она не должна иметь других столбцов, тип которых задается пользователем.
  • Таблица должна содержать один тип геометрии (точки, линии или полигоны).
  • Все записи таблицы должны использовать одинаковую пространственную привязку.
  • Также необходимо наличие столбца с целочисленными, уникальными значениями, отличными от NULL, которые можно использовать как ObjectID.

Регистрация столбца ST_Geometry

Если вы используете 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