Типы пространственных данных

Документ описывает типы пространственных данных, поддерживаемые YMatrix.

Обычно база данных поддерживает стандартные типы данных, такие как строка, число и дата. Однако пространственные базы данных требуют дополнительных типов данных — пространственных типов данных — для представления географических объектов. Эти пространственные типы данных инкапсулируют пространственные структуры, такие как границы и размерности.

YMatrix использует расширение PostGIS для поддержки пространственных типов данных.

Примечание!
Эта функция доступна только в корпоративной версии.

1 Установка PostGIS

PostGIS зависит от geos39. Сначала необходимо установить RPM-пакет на каждом узле:

$ sudo yum install https://ftp.postgresql.org/pub/repos/yum/common/redhat/rhel-7-x86_64/geos39-3.9.1-1.rhel7.x86_64.rpm

$ sudo yum install mxdb-postgis-2.5-1.el7.x86_64.rpm

Подключитесь к базе данных и создайте расширение:

=# CREATE EXTENSION postgis;

2 Использование PostGIS

2.1 Основные пространственные типы данных в PostGIS

PostGIS поддерживает следующие основные пространственные типы данных:

  • POINT: Точка
  • LINESTRING: Линейный сегмент
  • POLYGON: Многоугольник

2.1.1 Создание таблиц

Создайте таблицы, содержащие пространственные типы данных:

-- Point table
=# CREATE TABLE global_points (
   id INT,
   name VARCHAR(64),
   location GEOGRAPHY(POINT)
   )
   USING MARS3
   DISTRIBUTED BY (id)
   ORDER BY (id);

-- Polygon table
=# CREATE TABLE global_areas (
   id INT,
   name VARCHAR(64),
   area GEOGRAPHY(POLYGON)
   )
   USING MARS3
   DISTRIBUTED BY (id)
   ORDER BY (id);

2.1.2 Вставка данных

Вставьте данные точки:

=# INSERT INTO global_points VALUES(1, 'point1', 'POINT(-110 29)');
=# INSERT INTO global_points VALUES(2, 'point2', 'POINT(-111 30)');

Вставьте данные многоугольника:

=# INSERT INTO global_areas VALUES(1, 'area1', 'POLYGON((-100 25, -100 30, -120 30, -120 25, -100 25))');
=# INSERT INTO global_areas VALUES(2, 'area2', 'POLYGON((-90 25, -90 30, -100 30, -100 25, -90 25))');

2.1.3 Основные пространственные функции

Вычислите расстояние между координатами точек:

=# SELECT name, ST_Distance('POINT(-110 30)'::geography, location) FROM global_points;
  name  |   st_distance
--------+------------------
 point1 | 110844.074057415
 point2 |  96485.974080553
(2 rows)

Вычислите площадь:

=# SELECT id, name, ST_Area(area) FROM global_areas;
 id | name  |      st_area
----+-------+--------------------
  1 | area1 | 1098617743576.8588
  2 | area2 | 547807626660.82526
(2 rows)

Проверьте, лежит ли точка внутри многоугольника:

=# SELECT a.name, p.name FROM global_points AS p, global_areas AS a WHERE ST_Intersects(a.area, p.location);
 name  |  name
-------+--------
 area1 | point1
 area1 | point2
(2 rows)

Вычислите пересечение двух многоугольников:

=# SELECT ST_AsText(ST_Intersection(a1.area, a2.area)) FROM global_areas AS a1, global_areas AS a2 WHERE a1.name = 'area1' AND a2.name = 'area2';
st_astext
---------------------------------------------------------
 LINESTRING(-100 24.9999999999992,-100 29.9999999999995)
(1 row)

2.2 Создание пространственных индексов

Пространственные индексы необходимы для эффективного выполнения пространственных запросов. PostGIS поддерживает следующие типы пространственных индексов:

  • GIST: Обобщённое дерево поиска
  • BRIN: Индекс диапазона блоков
  • SP-GiST: Пространственно-разделённое обобщённое дерево поиска

Создайте индекс для столбца location:

=# CREATE INDEX global_points_gix ON global_points USING GIST (location);

Создайте индекс для столбца area:

=# CREATE INDEX global_areas_gix ON global_areas USING GIST (area);