PostGIS — это мощное открытое расширение для PostgreSQL, которое превращает реляционную СУБД в полнофункциональную пространственную базу данных. Оно добавляет поддержку географических объектов, позволяя хранить, запрашивать и манипулировать пространственными данными средствами SQL.
PostGIS расширяет стандартный PostgreSQL новыми типами данных, функциями и операторами для работы с геоданными. Благодаря этому вы можете:
Более 1000 функций для:
sudo apt-get update
sudo apt-get install postgresql postgis
-- Подключение к PostgreSQL
psql -U postgres
-- Создание базы данных
CREATE DATABASE gis_database;
-- Подключение к базе данных
\c gis_database
-- Включение расширения PostGIS
CREATE EXTENSION postgis;
-- Включение дополнительных расширений
CREATE EXTENSION postgis_topology;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION fuzzystrmatch;
SELECT PostGIS_Full_Version();
CREATE TABLE buildings (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
address VARCHAR(255),
geom GEOMETRY(Point, 4326)
);
CREATE TABLE city_areas (
id SERIAL PRIMARY KEY,
district_name VARCHAR(100),
population INTEGER,
geom GEOMETRY(Polygon, 4326)
);
-- Добавление точки (долгота, широта)
INSERT INTO buildings (name, address, geom)
VALUES (
'Центральный офис',
'ул. Главная, 1',
ST_SetSRID(ST_MakePoint(37.6178, 55.7558), 4326)
);
-- Добавление полигона
INSERT INTO city_areas (district_name, population, geom)
VALUES (
'Центральный район',
150000,
ST_GeomFromText('POLYGON((37.6 55.7, 37.7 55.7, 37.7 55.8, 37.6 55.8, 37.6 55.7))', 4326)
);
-- Найти все здания в пределах района
SELECT b.name, b.address
FROM buildings b
JOIN city_areas a ON ST_Within(b.geom, a.geom)
WHERE a.district_name = 'Центральный район';
-- Найти расстояние между объектами
SELECT
ST_Distance(
ST_SetSRID(ST_MakePoint(37.6178, 55.7558), 4326)::GEOGRAPHY,
ST_SetSRID(ST_MakePoint(37.6189, 55.7569), 4326)::GEOGRAPHY
) AS distance_meters;
-- Буферизация (создание зоны вокруг объекта)
SELECT ST_Buffer(geom, 1000) AS buffer_zone
FROM buildings
WHERE name = 'Центральный офис';
-- Найти количество зданий в каждом районе
SELECT
a.district_name,
COUNT(b.id) AS building_count
FROM city_areas a
LEFT JOIN buildings b ON ST_Within(b.geom, a.geom)
GROUP BY a.district_name
ORDER BY building_count DESC;
-- Создание выпуклой оболочки для группы объектов
SELECT ST_ConvexHull(ST_Collect(geom)) AS coverage_area
FROM buildings;
-- Вычисление центра масс
SELECT ST_Centroid(ST_Collect(geom)) AS center_point
FROM buildings;
-- Создание GIST-индекса
CREATE INDEX idx_buildings_geom ON buildings USING GIST (geom);
CREATE INDEX idx_city_areas_geom ON city_areas USING GIST (geom);
-- Анализ использования индекса
EXPLAIN ANALYZE
SELECT name FROM buildings
WHERE ST_DWithin(
geom::GEOGRAPHY,
ST_SetSRID(ST_MakePoint(37.6178, 55.7558), 4326)::GEOGRAPHY,
1000
);
-- Использование функций с поддержкой индексов
SELECT name
FROM buildings
WHERE geom && ST_MakeEnvelope(37.6, 55.7, 37.7, 55.8, 4326)
AND ST_Within(geom, ST_MakeEnvelope(37.6, 55.7, 37.7, 55.8, 4326));
-- Кластеризация по пространственному индексу
CLUSTER buildings USING idx_buildings_geom;
-- Создание представления для публикации в GeoServer
CREATE VIEW public_buildings AS
SELECT id, name, geom
FROM buildings
WHERE is_public = true;
-- Настройка прав доступа
GRANT SELECT ON public_buildings TO geoserver_user;
-- Экспорт в GeoJSON
SELECT json_build_object(
'type', 'FeatureCollection',
'features', json_agg(
json_build_object(
'type', 'Feature',
'geometry', ST_AsGeoJSON(geom)::json,
'properties', json_build_object(
'id', id,
'name', name
)
)
)
) AS geojson
FROM buildings;
-- Экспорт в WKT
SELECT name, ST_AsText(geom) AS wkt_geometry
FROM buildings;
-- Преобразование системы координат
SELECT ST_Transform(geom, 3857) AS web_mercator
FROM buildings;
-- Проверка валидности геометрии
SELECT ST_IsValid(geom), ST_IsValidReason(geom)
FROM city_areas;
-- Исправление невалидной геометрии
UPDATE city_areas
SET geom = ST_MakeValid(geom)
WHERE NOT ST_IsValid(geom);
-- Размер таблиц с пространственными данными
SELECT
table_name,
pg_size_pretty(pg_total_relation_size(table_name)) AS total_size
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY pg_total_relation_size(table_name) DESC;
-- Обновление статистики для оптимизатора запросов
VACUUM ANALYZE buildings;
VACUUM ANALYZE city_areas;
PostGIS превращает PostgreSQL в мощную пространственную базу данных, способную решать сложные геоаналитические задачи. Сочетание реляционной модели данных с продвинутыми пространственными функциями делает его идеальным выбором для:
Освоение PostGIS открывает возможности для создания масштабируемых и производительных решений в области работы с пространственными данями, от простых картографических сервисов до сложных систем пространственного анализа и машинного обучения с геоданными.
© Copyright 2000-2025 ООО «Интернет-Фрегат»