Поддержка геоданных (PostGIS)#

Описание#

PostGIS - это расширение с открытым исходным кодом, которое предоставляет поддержку хранения объектов географических информационных систем (ГИС) в базе данных и возможность запрашивать их через SQL-запросы.

Расширение позволяет работать с геометрическими, географическими и растровыми объектами. Данные могут быть представлены в двумерной, трехмерной и четырехмерной системах координат.

В rpm/deb-пакете поставляются расширения:

  • postgis;

  • postgis_topology;

  • postgis_sfcgal;

  • postgis_raster;

  • postgis_tiger_geocoder;

  • address_standardizer;

  • address_standardizer_data_us.

В отдельном rpm/deb-пакете поставляется расширение pgroutng.

Дополнительные расширения, рекомендуемые к установке с postgis, увеличивают возможности базовой версии PostGIS, предлагая дополнительные инструменты для работы с пространственными данными различного уровня сложности. Подробная информация о каждом дополнительном расширении содержится в официальной документации PostGIS.

Доработки#

В СУБД Pangolin включены инструменты для работы с геоданными (Spatial).

В отличие от свободно распространяемой версии, предоставляемая в Pangolin функциональность исключает инструменты командной строки и графический интерфейс (GUI) для загрузки и выгрузки данных. Исключение связано с необходимостью указывать пароль пользователя в открытом виде. Кроме того, введены ограничения на импорт и экспорт растровых форматов, так как такие процедуры несут потенциальные риски безопасности. Загрузка и выгрузка данных в систему производится стандартным образом при работе с доверенным ресурсом.

Типы данных#

В таблице ниже приведены типы данных, поддерживаемые расширением postgis.

Тип данных

Описание

spheroid

Геометрический объект, представляющий сфероид (эллипсоид вращения), который используется для представления формы Земли. Сфероиды часто применяются в картографии и геодезии

geometry

Основной тип данных для хранения двумерных геометрических объектов (point, linestring, polygon). Этот тип данных поддерживает работу с различными системами координат

box3d

Представляет трехмерный прямоугольник (параллелепипед), который охватывает геометрию. Используется для оптимизации запросов и ускорения поиска объектов

box2d

Двумерный аналог box3d, представляет собой прямоугольную область, охватывающую двумерную геометрию. Применяется для оптимизации запросов в двумерном пространстве

box2df

То же самое, что и box2d, но с использованием плавающей точки для повышения точности вычислений

gidx

Внутренний тип данных, используемый системой индексов

geography

Тип данных, аналогичный geometry, но учитывающий сферическую форму Земли. Используется для работы с глобальными координатами (широта/долгота)

Дополнительные расширения, описанные в разделе «postgis. Поддержка геоданных» документа «Описание расширений продукта СУБД Pangolin», добавляют в базу данных элементы и процедуры для обработки пространственной информации.

Настройка#

Установка используемых в рамках функционального решения расширений описана в разделе «postgis. Поддержка геоданных» документа «Описание расширений продукта СУБД Pangolin».

Сценарии использования#

После активации postgis, можно создавать и управлять геопространственными типами данных и использовать различные геопространственные функции.

Более подробная информация об управлении расширением, в том числе управление типами данных с помощью функций содержится в официальной документации PostGIS.

Создание геопространственной таблицы#

Пример создания таблицы с геопространственными данными:

  1. Создание таблицы:

    CREATE TABLE locations (
     id SERIAL PRIMARY KEY,
     name VARCHAR(100),
     geom GEOMETRY(Point, 4326)
    );
    
  2. Вставка примеров данных:

    INSERT INTO locations (name, geom) VALUES
    ('Location A', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)),
    ('Location B', ST_GeomFromText('POINT(121.4737 31.2304)', 4326));
    

Использование postgis для геопространственных запросов#

  1. Запрос расстояния между двумя точками:

    SELECT ST_Distance(
     ST_GeomFromText('POINT(116.4074 39.9042)', 4326),
     ST_GeomFromText('POINT(121.4737 31.2304)', 4326)
    );
    
  2. Запрос на проверку, находится ли точка в заданной области:

    SELECT name FROM locations
    WHERE ST_Contains(
     ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
     geom
    );
    

Особенности миграции с Oracle#

Пустые значения postgis не поддерживаются, поскольку они не имеют аналогов в Oracle Spatial.

Значения NULL для Oracle SRID будут преобразованы в 0 и наоборот. Чтобы обеспечить правильное соответствие между идентификаторами систем координат (SRID) Oracle и PostGIS, создайте файл srid.map в каталоге общего доступа PostgreSQL. Каждая строка этого файла должна содержать пару чисел, разделенных пробелом: слева указывается значение SRID из Oracle, справа - соответствующее значение SRID PostGIS. Сохраняйте размер файла небольшим для обеспечения хорошей производительности миграционного процесса.

Поддерживаются только такие геометрические типы, как: POINT, LINE, POLYGON, MULTIPOINT, MULTILINE и MULTIPOLYGON в двух и трех измерениях.