PostGIS добавляет дополнительную функциональность к СУБД PostgreSQL. PostGIS расширяет возможности PostgreSQL с точки зрения хранения пространственных данных, запросов к ним и управления ими. В данном “введении” будут описаны основные функции PostgreSQL и PostGIS.
PostgreSQL, как и другие СУБД, работает в качестве сервера в системе клиент-сервер. Клиент отправляет серверу запрос и получает отклик. По такому же принципу работает сеть Интернет: ваш браузер является клиентом, посылающим запрос, а веб-сервер возвращает обратно веб-страницу. Запросы PostgreSQL производятся с помощью языка SQL, откликами обычно являются таблицы данных из базы данных.
Ничего не мешает серверу PostgreSQL находится на одном компьютере с клиентом. Ваш клиент подключается к серверу по внутреннему IP-интерфейсу обратной связи, который не виден для других компьютеров (если вы не настроите иначе).
Здесь будут показаны три клиента: клиент командной строки, Quantum GIS и графический клиент базы данных — pgAdmin.
Клиенты командной строки запускаются из окна эмулятора терминала. Запустите эмулятор терминала из меню Приложения в разделе Дополнительное. Это даст вам доступ к оболочке командной строки. Напечатайте:
psql -V
нажмите Ввод, чтобы увидеть версию PostgreSQL.
Один сервер PostgreSQL позволяет организовать работу, распределив её по отдельным базам данных. Каждая из баз данных будет работать в своем режиме, со своими собственными таблицами, видами, пользователями, и т.п. При установлении соединения к серверу PostgreSQL вы должны указать нужную базу данных.
Чтобы получить список баз данных, хранящихся на сервере, напечатайте команду:
psql -l
Вы увидите несколько баз данных, используемых несколькими проектами системы. В этом введении будет создана новая база данных.
Tip
Список использует стандартный Unix-pager: нажмите пробел, чтобы перейти на следующую страницу, b, чтобы вернуться, q для выхода и b для вызова справки.
PostgreSQL предоставляет служебную программу для создания базы данных createdb. Мы создадим базу данных с помощью расширения PostGIS, указав используемый шаблон. Назовите базу данных demo. У этом случае команда будет выглядеть следующим образом:
createdb -T template_postgis demo
Tip
Вы можете получить справку в командой строке, использую опцию --help.
Если вы запустите команду psql -l, то должны увидеть базу demo в списке баз данных.
Вы можете создать базу данных PostGIS с помощью языка SQL. Сначала мы удалим только что созданную базу данных с помощью команды dropdb, потом используем команду psql, чтобы получить интерпретатор команд SQL:
dropdb demo
psql -d postgres
Эти команды подключат к системной базе данных postgres, которую должны иметь все сервера. Введите запрос SQL, чтобы создать новую базу данных:
postgres=# CREATE DATABASE demo TEMPLATE=template_postgis;
Переключите ваше соединение с базы данных postgres на новую базу данных demo. В дальнейшем вы сможете подключаться непосредственно к базе данных, используя команду psql -d demo. Тут показан способ переключения с помощью psql в командной строке:
postgres=# \c demo
Tip
Нажмите CTRL + C, если подсказка psql появляется после нажатия кнопки возврата. Это приведет к очищению введённой информации. Возможно, вам понадобится закрыть кавычки, двоеточие и тп.
Вы должны увидеть информационное сообщение, в котором будет указано, что вы подключены к базе данных demo. Чтобы проверить, что всё работает, напечатайте \dt , эта команда отобразит список таблиц в базе данных. Вы должны увидеть подобный этому список:
demo=# \dt
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+-------
public | geometry_columns | table | user
public | spatial_ref_sys | table | user
(2 строки)
Это две таблицы, используемые PostGIS. Таблица spatial_ref_sys хранит информацию о системе координат, чтобы быстро просмотреть информацию, используйте команду SQL:
demo=# SELECT srid,auth_name,proj4text FROM spatial_ref_sys LIMIT 10;
srid | auth_name | proj4text
------+-----------+--------------------------------------
3819 | EPSG | +proj=longlat +ellps=bessel +towgs...
3821 | EPSG | +proj=longlat +ellps=aust_SA +no_d...
3824 | EPSG | +proj=longlat +ellps=GRS80 +towgs8...
3889 | EPSG | +proj=longlat +ellps=GRS80 +towgs8...
3906 | EPSG | +proj=longlat +ellps=bessel +no_de...
4001 | EPSG | +proj=longlat +ellps=airy +no_defs...
4002 | EPSG | +proj=longlat +a=6377340.189 +b=63...
4003 | EPSG | +proj=longlat +ellps=aust_SA +no_d...
4004 | EPSG | +proj=longlat +ellps=bessel +no_de...
4005 | EPSG | +proj=longlat +a=6377492.018 +b=63...
(10 строк)
Теперь, имея пространственную базу данных, можно создать несколько пространственных таблиц. Сначала мы создадим обычную таблицу базы данных, чтобы хранить данные о городе. Эта таблица будет содержвать два поля — одно числовое поле-идентификатор, второе — название города:
demo=# CREATE TABLE cities ( id int4, name varchar(50) );
Далее добавьте колонку геометрии, содержащую данные о местоположении городов. Для удобвства назовем это поле the_geom. PostGIS подскажет, какой тип геометрии имеет каждый из объектов (точки, линии, полигоны и т.п.), какая размерность и система координат. Для городов мы будем использовать “географическую” систему координат EPSG:4326.
demo=# SELECT AddGeometryColumn ( 'cities', 'the_geom', 4326, 'POINT', 2);
Заглянув в таблицу города, вы увидите новую колонку, а также информацию о том, что в таблице отсутствуют строки.
demo=# SELECT * from cities;
id | name | the_geom
----+------+----------
(0 строк)
Чтобы добавить строки в таблицу, используйте команды SQL. Чтобы добавить данные геометрии в соответствующую колонку, используйте функцию PostGIS ST_GeomFromText, чтобы сконвертировать координаты и идентификатор референсной системы из текстового формата:
demo=# INSERT INTO cities (id, the_geom, name) VALUES (1,ST_GeomFromText('POINT(-0.1257 51.508)',4326),'London, England');
demo=# INSERT INTO cities (id, the_geom, name) VALUES (2,ST_GeomFromText('POINT(-81.233 42.983)',4326),'London, Ontario');
demo=# INSERT INTO cities (id, the_geom, name) VALUES (3,ST_GeomFromText('POINT(27.91162491 -33.01529)',4326),'East London,SA');
Tip
Используйте кнопки-стрелки для отмены и редактирования командной строки.
Как вы могли заметить, это быстро надоедает. К счастью, существуют иные, более лёгкие пути передачи данных в таблицы PostGIS. Сейчас в нашей базе находятся три города, с которыми мы можем начать работать.
Все самые обычные операторы SQL могут быть использованы для выбора данных из таблицы PostGIS:
demo=# SELECT * FROM cities;
id | name | the_geom
----+-----------------+----------------------------------------------------
1 | London, England | 0101000020E6100000BBB88D06F016C0BF1B2FDD2406C14940
2 | London, Ontario | 0101000020E6100000F4FDD478E94E54C0E7FBA9F1D27D4540
3 | East London,SA | 0101000020E610000040AB064060E93B4059FAD005F58140C0
(3 строки)
Это возвращает нам бессмысленные значения координат в шестнадцатеричной системе. Если вы хотите увидеть вашу геометрию в текстовом формате WKT, используйте функцию ST_AsText(the_geom) или ST_AsEwkt(the_geom). Вы также можете использовать функции ST_X(the_geom), ST_Y(the_geom), чтобы получить числовые значения координат.
demo=# SELECT id, ST_AsText(the_geom), ST_AsEwkt(the_geom), ST_X(the_geom), ST_Y(the_geom) FROM cities;
id | st_astext | st_asewkt | st_x | st_y
----+------------------------------+----------------------------------------+-------------+-----------
1 | POINT(-0.1257 51.508) | SRID=4326;POINT(-0.1257 51.508) | -0.1257 | 51.508
2 | POINT(-81.233 42.983) | SRID=4326;POINT(-81.233 42.983) | -81.233 | 42.983
3 | POINT(27.91162491 -33.01529) | SRID=4326;POINT(27.91162491 -33.01529) | 27.91162491 | -33.01529
(3 строки)
Мы уже увидели, как получить геометрию из текстовых данных WKT с помощью функции ST_GeomFromText. Большинство таких функций начинаются с ST (“пространственный тип”) и описаны в документации PostGIS. Мы используем одну из них, чтобы ответить на практический вопрос: на каком расстоянии в метрах друг от другах находятся три города с названием Лондон, учитывая сферичность земли?
demo=# SELECT p1.name,p2.name,ST_Distance_Sphere(p1.the_geom,p2.the_geom) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
name | name | st_distance_sphere
-----------------+-----------------+--------------------
London, Ontario | London, England | 5875766.85191657
East London,SA | London, England | 9789646.96784908
East London,SA | London, Ontario | 13892160.9525778
(3 строки)
Этот запрос возвращает расстояние в метрах между каждой парой городов. Обратите внимание как часть ‘WHERE’ предотвращает нас от получения расстояния от города до самого себя (расстояние всегда будет равно нулю) и расстояния в обратном порядке (расстояние от Лондона, Англия до Лондона, Онтарио будет таким же как от Лондона, Онтарио до Лондона, Англия). Попробуйте ещё раз без ‘WHERE’ и посмотрите, что произойдёт.
Мы также можем рассчитать расстояния на сфере, используя различные функции и указывая называния сфероида, параметры главных полуосей и коэффициента обратного сжатия:
demo=# SELECT p1.name,p2.name,ST_Distance_Spheroid(
p1.the_geom,p2.the_geom, 'SPHEROID["GRS_1980",6378137,298.257222]'
)
FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
name | name | st_distance_spheroid
-----------------+-----------------+----------------------
London, Ontario | London, England | 5892413.63776489
East London,SA | London, England | 9756842.65711931
East London,SA | London, Ontario | 13884149.4140698
(3 строки)
Для создания карты из данных PostGIS вам необходим клиент, с помощью которого вы сможете интерпретировать данные. Многие из открытых ГИС могут делать это, например, Quantum GIS, gvSIG, uDig. Далее будет показано, как сделать карту с помощью Quantum GIS.
Появится список пространственных таблиц базы данных:
Выберите озёра (“Lakes”) и нажмите Add внизу (не Load вверху, которая подгрузит параметры подключения базы данных), после чего слой откроется в QGIS:
Вы должны увидеть карту с озёрами. QGIS не знает, что это озера, поэтому, возможно, они будут не голубого цвета. Используйте документацию QGIS, чтобы узнать, как изменить цвет.
Большинство приложений OSGeo поддерживают импорт пространственных данных из файлов в базу данных PostGIS. Для демонстрации этого будет использован QGIS.
Импорт шейп-файлов в PostGIS через QGIS можно сделать в с помощью дополнения PostGIS Manager. Чтобы установить его, перейдите в меню Модули, далее Загрузить модули. QGIS загрузит самую новую версию из репозитория (для этого вам потребуется работающее интернет-соединение). Найдите PostGIS Manager и нажмите кнопку Install plugin.
В меню Модули должен появиться пункт PostGIS Manager. Для запуска плагина также можно кликнуть по кнопке с логотипом PostGIS (слон с земным шаром), расположенной на панели.
После этого будет уставновлено соединение с базой данных Natural Earth. Оставьте поле пароль пустым, если будет необходимо его ввести. Вы увидите основное окно управления: слева вы сможете выбрать таблицы из базы данных, в правой части — узнать информацию о них. Вкладка Просмотр покажет небольшую карту. Для примера был выбран слой “Населённые пункты”, карта была приближена к произвольному месту.
Из меню Data выберите опцию Load data from shapefile. Нажмите кнопку ... и загрузите шейпф-айл sids.shp в пакет R maptools:
Не изменяя настроек в появившемся окне, нажмите Load:
Шейп-файл должен быть импортирован в PostGIS без ошибок. Закройте менеджер PostGIS и вернитесь в основное окно QGIS.
Подгрузите данные SIDS с помощью опции “Добавить слой PostGIS”. Изменив порядок слоёв и заливок, вы сможете создать фоновую картограмму (хороплет), отображающую количество детей, умерших от синдрома внезапной смерти в Северной Каролине.
Вы можете использовать графический клиент базы данных pgAdmin III из системного меню “Базы данных”, чтобы сделать запрос или изменить атрибутивную информацию в базе данных. Это официальный клиент для PostgreSQL, позволяющий использовать SQL для управления таблицами данных.
Несколько дополнительных задач, которые нужно выполнить:
Это только первые шаги на пути использования PostGIS. Существует гораздо больше полезных функций, которые вы при желании можете попробовать.
Веб-страница PostGIS — http://postgis.org
Документация PostGIS — http://postgis.org/documentation/