Введение в расширение PostGIS для PostgreSQL
PostGIS — одно из самых замечательных расширений для PostgreSQL, которое может превратить реляционную базу данных в действительно мощную ГИС ( географическую информационную систему ). Сообщество PostGIS действительно хорошо разбирается в документации и обучении , и цель этой публикации — предоставить вам некоторые ресурсы о том, как начать работу с основными компонентами использования PostGIS для супер-новичка. Я помогу вам создать образец набора данных, импортировать файл формы и опубликовать все это в веб-браузере.
Что такое PostGIS?
PostGIS — это расширение Postgres для хранения типов пространственных данных, таких как точки, линии и многоугольники, в базе данных. Чаще всего вы увидите людей, использующих PostGIS с пространственными точками на карте или глобусе по долготе и широте, но есть и другие интересные варианты использования, такие как нейробиология и сетевые технологии, поэтому его можно использовать для любой системы с пространственными отношениями.
PostGIS также имеет большой набор функций, которые позволяют вам работать с географией и геометрией внутри sql и индексов , чтобы повысить эффективность задач базы данных.
PostGIS можно использовать для хранения пространственных данных, создания и хранения пространственных фигур, определения маршрутов , расчета площадей и расстояний. Он используется картографами, разработчиками и учеными в различных приложениях, таких как недвижимость (Redfin), приложения для картографии и маршрутизации, такие как Ride the City, древности и NOAA.
С точки зрения архитектуры проекта, PostGIS будет основным источником пространственных данных, и часто для взаимодействия, обновления, изменения или запроса данных будет использоваться настольный ГИС-клиент. База данных снабжает веб-приложение и пользовательский интерфейс, а в некоторых случаях и другие инструменты обработки данных.
Основные инструменты
- Postgres : вам нужна работающая база данных Postgres.
- PostGIS : вы просто запускаете
CREATE EXTENSION postgis;
PostgreSQL, чтобы начать работу. - pgAdmin : Скорее всего, вам понадобится графический интерфейс для работы с Postgres и PostGIS. У pgAdmin есть хороший просмотрщик геометрии, позволяющий просматривать данные PostGIS в формате карты. Основное использование pgAdmin — это работа с данными, поэтому вам все равно понадобится настольная ГИС для выполнения большого количества слоев, надписывания и работы с необычными картами.
- QGIS : вам, скорее всего, понадобится настольное приложение для работы с данными ГИС, очень похожее на графический интерфейс для таких баз данных, как pgAdmin, но с гораздо большим количеством функций для загрузки карт, их маркировки и улучшения.
- pg_featureserv : это быстрый способ предоставить данные PostGIS веб-сервису и API.
Пример загрузки данных PostGIS
Чтобы продолжить работу над этим руководством, давайте загрузим некоторые данные PostGIS в нашу базу данных. Вы можете использовать тот же набор данных, что и в руководстве по PostGIS , поэтому, если вы делали это раньше или делаете это в следующий раз, вы можете использовать тот же набор.
Используя pgAdmin, подключитесь к своей базе данных, а затем вам нужно будет создать базу данных или использовать базу данных postgis. Затем вы установите PostGIS, CREATE EXTENSION postgis;
. Затем запустите восстановление из файла резервной копии.
Обновите базу данных, и вы сможете увидеть новые таблицы. Если вы запросите улицы или районы и щелкнете в средстве просмотра геометрии, вы сможете увидеть свои данные.
Если вы войдете в свои данные и сделаете это SELECT * FROM nyc_neighborhoods;
в представлении данных, вы увидите геометрию столбца в непрозрачной двоичной форме, и вы, возможно, ожидали увидеть точки данных по долготе и широте. Именно здесь начинают приходить на помощь функции PostGIS. ST_AsText(geom)
функция, преобразующая этот двоичный файл в геометрические точки. Если вы хотите просмотреть информацию о геометрии/широте и долготе, вам нужно будет SELECT gid, boroname, name, ST_AsText(geom) FROM nyc_neighborhoods;
увидеть фактические данные широты/долготы, которые отображаются на вашем экране.
Вот несколько кратких принципов работы с PostGIS SQL и функциями геометрии.
Нахождение отдельных точек
SELECT name, ST_AsText(geom) FROM nyc_subway_stations LIMIT 10;
результат
"Cortlandt St" "POINT(583521.854408956 4507077.862599085)" "Rector St" "POINT(583324.4866324601 4506805.373160211)" "South Ferry" "POINT(583304.1823994748 4506069.654048115)" "138th St" "POINT(590250.10594797 4518558.019924332)" "149th St" "POINT(590454.7399891173 4519145.719617855)" "149th St" "POINT(590465.8934191109 4519168.697483203)" "161st St" "POINT(590573.169495527 4520214.766177284)" "167th St" "POINT(591252.8314104103 4520950.353355553)" "167th St" "POINT(590946.3972262995 4521077.318976877)" "170th St" "POINT(591583.6111452815 4521434.846626811)"
Расчет площади
В квадратных метрах
SELECT ST_Area(geom) FROM nyc_neighborhoods WHERE name = 'West Village';
результат
1044614.5296485956
Расчет расстояния
SELECT ST_Length(geom) FROM nyc_streets WHERE name = 'Columbus Cir';
результат
308.3419936909855
Геометрия и география
В PostGIS есть важное различие между геометрией и географией: геометрия является декартовой, а география добавляет дополнительные вычисления кривизны Земли. В общем, если вы имеете дело с небольшими территориями, такими как город или здание, вам не нужно добавлять дополнительные вычислительные затраты для географических целей, но если вы пытаетесь вычислить что-то большее, например маршруты авиакомпаний, вам нужно это сделать.
Вот как вы можете создать географическую таблицу (т. е. преобразовать данные) из одной из наших существующих таблиц в новую таблицу, содержащую геометрические точки.
CREATE TABLE nyc_subway_stations_geog AS SELECT Geography(ST_Transform(geom,4326)) AS geog, name, routes FROM nyc_subway_stations;
Редактирование карт и добавление дополнительных данных с помощью QGIS
Давайте сейчас откроем этот набор данных в QGIS. Как только он будет установлен локально, вы подключите к нему свою базу данных. Вы добавите каждую нужную таблицу на карту в виде слоя, а затем сможете добавлять метки и строить на их основе.
Далее давайте добавим новые данные. Мы можем найти шейп-файл для всего, что хотим добавить в Нью-Йорке, и добавить это в наш набор данных. На веб-сайте NYC Open Dataset я нашел кое-что , что можно добавить в контуры зданий. Шейп-файлы (.shp) на самом деле содержат все необходимые нам данные о местоположении, а также встроены в сам файл.
Используя «Слой» — «Добавить слой» — «Добавить вектор». Я вставил этот файл формы в свою карту, и вы можете видеть, что он создает слой поверх уже имеющейся у меня карты. С помощью инструмента QGIS DB Manager вы можете вставить данные слоев файла формы обратно в базу данных PostGIS в виде отдельной таблицы. Так легко, правда?
Подробную информацию о QGIS можно найти в их документации и учебном пособии .
Для перемещения данных в PostGIS и из него также очень полезны shp2pgsql и ogr2ogr.
Публикация данных PostGIS в Интернете
Существует множество способов перенести данные PostGIS в Интернет, начиная с использования таких веб-фреймворков, как Python, GeoDjango, Rails и т. д. Также существует несколько инструментов с открытым исходным кодом, таких как Geoserver и Mapserver. Все это требует немалой настройки, поэтому я пропущу их в этом вступлении, но покажу вам один из инструментов Crunchy Data, который является действительно простым способом перенести ваши пространственные данные в веб-приложение и перейти к следующим шагам. , pg_featureserv .
Чтобы запустить это локально в качестве быстрого теста, установите файлы, настройте строку среды базы данных, запустите ее с ./pg_featureserv
, и она будет запущена по адресу http://localhost:9000/index.html.
Вы можете создать веб-карту с помощью одной команды sql:
SELECT run_container('-dt -p 5435:5433/tcp -e DATABASE_URL="postgres://application:ExSdKI5SAH0tyBS3fMQgKsUWt3VEx1iWNx97ElShxalHo@p.tcidkauygvdljdrbxwkqlnjl5y.postgresbridge.com:5432/postgres" -e PGFS_SERVER_HTTPPORT=5433 docker.io/pramsey/pg_featureserv:latest');
Заключение
Итак, вы загрузили демонстрационные данные PostGIS, добавили слои в QGIS, импортировали файл формы как новый слой и добавили его обратно в свою базу данных. Вы изучили несколько функций sql для PostGIS и запустили веб-карту в браузере.