Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Обычная база данных имеет типы данных, такие как строки, числа и даты. Пространственная база данных добавляет дополнительные типы данных (пространственные типы данных) для представления географических объектов. Эти пространственные типы данных абстрагируют и инкапсулируют пространственные структуры, такие как границы и размерность.
MatrixDB использует расширение PostGIS для поддержки пространственных типов данных.
Примечание: Эта функция доступна только в корпоративной версии.
Установите RPM-пакет на каждом узле (PostGIS зависит от geos39, поэтому сначала установите зависимости):
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;
PostGIS поддерживает следующие распространённые типы данных:
Создайте таблицу, включающую пространственные типы данных:
-- Point table
CREATE TABLE global_points (
id INT,
name VARCHAR(64),
location GEOGRAPHY(POINT)
)
Distributed by(id);
-- Face table
CREATE TABLE global_areas (
id INT,
name VARCHAR(64),
area GEOGRAPHY(POLYGON)
)
Distributed by(id);
Вставка данных точки:
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))');
Вычисление расстояния между координатами точек:
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)
Для эффективности пространственных вычислений пространственные данные должны быть проиндексированы. PostGIS поддерживает следующие типы пространственных индексов:
Создание индекса для поля location:
CREATE INDEX global_points_gix ON global_points USING GIST ( location );
Создание индекса для поля area:
CREATE INDEX global_areas_gix ON global_areas USING GIST ( area );