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 в PostgreSQL.
Воспользуйтесь ArcGIS для создания классов пространственных объектов с типом хранения ST_Geometry
Воспользуйтесь ArcGIS для доступа к таблицам PostgreSQL со столбцами ST_Geometry.
Зарегистрируйте столбец ST_Geometry, чтобы ограничить используемую пространственную привязку.
Откройте Справка по функциям SQL ST_Geometry PDF.
Как ST_Geometry хранит пространственные данные
Ниже приводится описание ST_Geometry в PostgreSQL:
|
Имя |
Тип |
Описание |
|---|---|---|
|
size |
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 |
Максимальное значение измерения |
|
площадь |
LFLOAT |
Площадь геометрии |
|
len |
LFLOAT |
Длина периметра геометрии |
|
форма |
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).
Если параметр GEOMETRY_STORAGE под ключевым словом DEFAULTS задан на использование геометрии 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