:Author: Барри Роулингсон :Author: Астрид Эмде :Author: Камерон Шортер :Version: osgeo-live5.0 :License: Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) .. image:: ../../images/project_logos/logo-PostGIS.png :scale: 30 % :alt: project logo :align: right :target: http://postgis.org/ ******************************************************************************** Введение в PostGIS ******************************************************************************** PostGIS добавляет дополнительную функциональность к СУБД PostgreSQL. PostGIS расширяет возможности PostgreSQL с точки зрения хранения пространственных данных, запросов к ним и управления ими. В данном "введении" будут описаны основные функции PostgreSQL и PostGIS. Архитектура Клиент-Сервер ================================================================================ PostgreSQL, как и другие СУБД, работает в качестве сервера в системе клиент-сервер. Клиент отправляет серверу запрос и получает отклик. По такому же принципу работает сеть Интернет: ваш браузер является клиентом, посылающим запрос, а веб-сервер возвращает обратно веб-страницу. Запросы PostgreSQL производятся с помощью языка SQL, откликами обычно являются таблицы данных из базы данных. Ничего не мешает серверу PostgreSQL находится на одном компьютере с клиентом. Ваш клиент подключается к серверу по внутреннему IP-интерфейсу обратной связи, который не виден для других компьютеров (если вы не настроите иначе). Здесь будут показаны три клиента: клиент командной строки, :doc:`Quantum GIS <../overview/qgis_overview>` и графический клиент базы данных — ``pgAdmin``. Создание баз данных, поддерживающих пространственную информацию ================================================================================ .. review comment: Предлагаю добавить скриншот, а лучше два, показывающий как выбрать и открыть терминал (xterm). Камерон Клиенты командной строки запускаются из окна эмулятора терминала. Запустите эмулятор терминала из меню *Приложения* в разделе *Дополнительное*. Это даст вам доступ к оболочке командной строки. Напечатайте:: psql -V нажмите Ввод, чтобы увидеть версию PostgreSQL. Один сервер PostgreSQL позволяет организовать работу, распределив её по отдельным базам данных. Каждая из баз данных будет работать в своем режиме, со своими собственными таблицами, видами, пользователями, и т.п. При установлении соединения к серверу PostgreSQL вы должны указать нужную базу данных. Чтобы получить список баз данных, хранящихся на сервере, напечатайте команду:: psql -l Вы увидите несколько баз данных, используемых несколькими проектами системы. В этом введении будет создана новая база данных. .. tip:: Список использует стандартный Unix-pager: нажмите пробел, чтобы перейти на следующую страницу, :kbd:`b`, чтобы вернуться, :kbd:`q` для выхода и :kbd:`b` для вызова справки. PostgreSQL предоставляет служебную программу для создания базы данных ``createdb``. Мы создадим базу данных с помощью расширения PostGIS, указав используемый шаблон. Назовите базу данных ``demo``. У этом случае команда будет выглядеть следующим образом: .. review comment: createdb - служебная программа, а не команда unix :: 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:: Нажмите :kbd:`CTRL` + :kbd:`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 строк) Даныне таблицы подтверждают, что наша база пространственная. Таблица ``geometry_columns`` служит для передачи информации о том, какая из таблиц содержит пространсвенную информацию. Создание пространственной таблицы сложным способом ================================================================================ Теперь, имея пространственную базу данных, можно создать несколько пространственных таблиц. Сначала мы создадим обычную таблицу базы данных, чтобы хранить данные о городе. Эта таблица будет содержвать два поля — одно числовое поле-идентификатор, второе — название города: :: 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. Запустите Quantum GIS и выберите ``Add PostGIS layers`` из меню *Слой*. Параметры для подключения к данным Natural Earth в PostGIS уже определены в выпадающем меню *Соединения*. Там же вы можете создать новое подключение к серверу и хранить настройки для быстрого доступа. Нажмите ``Edit``, если хотите увидеть, какие параметры указаны для данных Natural Earth, или нажмите ``Connect``, чтобы продолжить: .. image:: ../../images/screenshots/1024x768/postgis_addlayers.png :scale: 50 % :alt: Connect to Natural Earth :align: center Появится список пространственных таблиц базы данных: .. image:: ../../images/screenshots/1024x768/postgis_listtables.png :scale: 50 % :alt: Natural Earth Layers :align: center Выберите озёра ("Lakes") и нажмите ``Add`` внизу (не ``Load`` вверху, которая подгрузит параметры подключения базы данных), после чего слой откроется в QGIS: .. image:: ../../images/screenshots/1024x768/postgis_lakesmap.png :scale: 50 % :alt: My First PostGIS layer :align: center Вы должны увидеть карту с озёрами. QGIS не знает, что это озера, поэтому, возможно, они будут не голубого цвета. Используйте документацию QGIS, чтобы узнать, как изменить цвет. Простое создание пространственной таблицы ================================================================================ Большинство приложений OSGeo поддерживают импорт пространственных данных из файлов в базу данных PostGIS. Для демонстрации этого будет использован QGIS. Импорт шейп-файлов в PostGIS через QGIS можно сделать в с помощью дополнения *PostGIS Manager*. Чтобы установить его, перейдите в меню ``Модули``, далее ``Загрузить модули``. QGIS загрузит самую новую версию из репозитория (для этого вам потребуется работающее интернет-соединение). Найдите ``PostGIS Manager`` и нажмите кнопку ``Install plugin``. .. image:: ../../images/screenshots/1024x768/postgis_getmanager.png :scale: 50 % :alt: Fetch PostGIS Manager Plugin :align: center В меню ``Модули`` должен появиться пункт *PostGIS Manager*. Для запуска плагина также можно кликнуть по кнопке с логотипом PostGIS (слон с земным шаром), расположенной на панели. После этого будет уставновлено соединение с базой данных *Natural Earth*. Оставьте поле пароль пустым, если будет необходимо его ввести. Вы увидите основное окно управления: слева вы сможете выбрать таблицы из базы данных, в правой части — узнать информацию о них. Вкладка *Просмотр* покажет небольшую карту. Для примера был выбран слой "Населённые пункты", карта была приближена к произвольному месту. .. image:: ../../images/screenshots/1024x768/postgis_managerpreview.png :scale: 50 % :alt: PostGIS Manager Preview :align: center Далее *PostGIS Manager* будет использован для импорта шейп-файла в базу данных. Мы используем данным о синдроме внезапной смерти у детей в Северной Каролине, которые входят в одно из дополнений статистического пакета R. Из меню ``Data`` выберите опцию ``Load data from shapefile``. Нажмите кнопку ``...`` и загрузите шейпф-айл ``sids.shp`` в пакет R ``maptools``: .. image:: ../../images/screenshots/1024x768/postgis_browsedata.png :scale: 50 % :alt: Find the shapefile :align: center Не изменяя настроек в появившемся окне, нажмите ``Load``: .. image:: ../../images/screenshots/1024x768/postgis_importsids.png :scale: 50 % :alt: Import a shapefile :align: center Шейп-файл должен быть импортирован в PostGIS без ошибок. Закройте менеджер PostGIS и вернитесь в основное окно QGIS. Подгрузите данные SIDS с помощью опции "Добавить слой PostGIS". Изменив порядок слоёв и заливок, вы сможете создать фоновую картограмму (хороплет), отображающую количество детей, умерших от синдрома внезапной смерти в Северной Каролине. .. image:: ../../images/screenshots/1024x768/postgis_sidsmap.png :scale: 50 % :alt: SIDS data mapped :align: center Знакомство с pgAdmin III ================================================================================ Вы можете использовать графический клиент базы данных ``pgAdmin III`` из системного меню "Базы данных", чтобы сделать запрос или изменить атрибутивную информацию в базе данных. Это официальный клиент для PostgreSQL, позволяющий использовать SQL для управления таблицами данных. .. image:: ../../images/screenshots/1024x768/postgis_adminscreen1.png :scale: 50 % :alt: pgAdmin III :align: center .. image:: ../../images/screenshots/1024x768/postgis_adminscreen2.png :scale: 50 % :alt: pgAdmin III :align: center Что стоит попробовать ================================================================================ Несколько дополнительных задач, которые нужно выполнить: #. Попробуйте больше пространственных функций, например, ``st_buffer(the_geom)``, ``st_transform(the_geom,25831)``, ``x(the_geom)`` — вы найдёте полную документацию здесь: http://postgis.org/documentation/ #. Экспортируйте ваши таблицы в шейп-файлы, используя ``pgsql2shp`` в командной строке. #. Попробуйте утилиту ``ogr2ogr`` для экспорта/импорта данных. Что дальше? ================================================================================ Это только первые шаги на пути использования PostGIS. Существует гораздо больше полезных функций, которые вы при желании можете попробовать. Веб-страница PostGIS — http://postgis.org Документация PostGIS — http://postgis.org/documentation/