Site icon 8HOST.COM

Установка и настройка PostGIS в Ubuntu 14.04

PostGIS – это расширение реляционной базы данных PostgreSQL, предназначенное для работы с пространственными данными. PostGIS позволяет хранить пространственные данные с помощью типов данных geometry и geography, выполнять пространственные запросы, определять площадь, расстояние, длину и периметр, а также создавать пространственные индексы.

Данное руководство поможет установить PostGIS, настроить PostgreSQL для поддержки пространственных данных, загрузить пространственные объекты в БД и выполнить базовый запрос.

Требования

1: Установка PostGIS

PostGIS нет в репозитории Ubuntu. Пакеты PostGIS можно скачать с UbuntuGIS, стороннего репозитория, в котором хранятся открытые пакеты GIS. Конечно, UbuntuGIS не всегда содержит самые современные версии PostGIS, однако он хорошо поддерживается. Кроме того, благодаря этому репозиторию не придётся компилировать PostGIS из исходного кода.

В Ubuntu 14.04 добавьте нестабильную ветку репозитория UbuntuGIS:

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable

Команда вернёт:

Unstable releases of Ubuntu GIS packages. These releases are more bleeding edge and while generally they should work well, they dont receive the same amount of quality assurance as our stable releases do.
More info: https://launchpad.net/~ubuntugis/+archive/ubunt/ubuntugis-unstable
Press [ENTER] to continue or ctrl-c to cancel adding it

Нажмите Enter, после чего код будет добавлен:

gpg: keyring `/tmp/tmpintg192h/secring.gpg' created
gpg: keyring `/tmp/tmpintg192h/pubring.gpg' created
gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpintg192h/trustdb.gpg: trustdb created
gpg: key 314DF160: public key "Launchpad ubuntugis-stable" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

Обновите индекс пакетов:

sudo apt-get update

Установите PostGIS:

sudo apt-get install postgis

Подтвердите установку, нажав Y. Команда установит PostGIS и зависимости.

2: Настройка PostgreSQL для поддержки PostGIS

Функции PostGIS нужно включать для каждой БД индивидуально.

Примечание: Для демонстрации примеров используется БД test1 и пользователь postgres из руководства по установке PostgreSQL.

Перейдите в сессию пользователя postgres.

sudo -i -u postgres

Подключитесь к БД test1:

psql -d test1

Включите расширение PostGIS для этой БД:

CREATE EXTENSION postgis;

Убедитесь, что расширение включено:

SELECT PostGIS_version();

Команда вернёт:

postgis_version
---------------------------------------
2.2 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

Теперь эта БД поддерживает пространственные данные. Закройте сессию SQL и вернитесь в терминал:

\q

Вернитесь в сессию системного пользователя.

su 8host

3: Оптимизация PostgreSQL для обработки объектов GIS

PostgreSQL может работать на любой платформе, но настройки СУБД «из коробки» слишком консервативны. Объекты GIS очень большие по сравнению с текстовыми данными. Оптимизируйте PostgreSQL для поддержки данных GIS.

Отредактируйте конфигурационный файл PostgreSQL, postgresql.conf.

sudo nano /etc/postgresql/9.3/main/postgresql.conf

В строке shared_buffers нужно указать около 75% оперативной памяти. На сервере в 512MB достаточно выделить 200MB.

shared_buffers = 200MB                  # min 128kB

Строка #work_mem закомментирована по умолчанию. Раскомментируйте её и укажите значение 16MB:

work_mem = 16MB                         # min 64kB

Раскомментируйте строку #maintenance_work_mem и увеличьте её значение до 128MB:

maintenance_work_mem = 128MB            # min 1MB

Найдите checkpoint_segments, раскомментируйте её и укажите значение 6:

checkpoint_segments = 6         # in logfile segments, min 1, 16MB each

Затем раскомментируйте строку #random_page_cost и укажите значение 2.0:

random_page_cost = 2.0                 # same scale as above

Сохраните и закройте файл (CTRL+X, Y и Enter).

Примечание: Больше о пространственных параметрах PostgreSQL можно узнать здесь.

Перезапустите PostgreSQL:

sudo service postgresql restart

4: Загрузка пространственных данных

Добавьте в БД пространственные данные, чтобы ознакомиться с инструментарием и процессом обработки этих данных в PostgreSQL.

Сайт Natural Earth – отличный источник таких данных.

Перейдите в домашний каталог и создайте папку nedata, в которой будут храниться данные с Natural Earth.

cd ~
mkdir nedata

Перейдите в этот каталог:

cd nedata

Загрузите пространственные данные с сайта:

wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip

Команда загрузит сжатый файл. Распакуйте его с помощью unzip.

Примечание: Чтобы установить unzip, введите:

sudo apt-get install unzip

Чтобы распаковать файл, введите:

unzip ne_110m_admin_0_countries.zip

На сервере появится шесть файлов:

Файлы .dbf, .prj, .shp и .shx составляют ShapeFile, популярный формат геопространственных данных, используемый программным обеспечением GIS. Загрузите его в БД test1.

Для этого нужно установить GDAL (библиотеку Geospatial Data Abstraction Library). При установке GDAL устанавливается OGR (OpenGIS Simple Features Reference Implementation) и команда ogr2ogr. Это библиотека для перевода векторных данных, с помощью которой можно перевести Shapefile в формат, понятный PostGIS.

Установите GDAL:

sudo apt-get install gdal-bin

Вернитесь в сессию пользователя postgres.

sudo -i -u postgres

Конвертируйте Shapefile, загруженный с Natural Earth, в формат, который может прочитать PostGIS, с помощью команды ogr2ogr.

ogr2ogr -f PostgreSQL PG:dbname=test1 -progress -nlt PROMOTE_TO_MULTI /home/8host/nedata/ne_110m_admin_0_countries.shp

Рассмотрим эту команду по частям.

Примечание: Посетите сайт ogr2ogr, чтобы узнать об остальных опциях.

Вышеприведённая команда вернёт такой вывод:

0...10...20...30...40...50...60...70...80...90...100 - done.

Убедитесь, что данные были успешно импортированы, с помощью команды ogrinfo.

ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries

Она вернёт:

INFO: Open of `PG:dbname=test1'
using driver `PostgreSQL' successful.
Layer name: ne_110m_admin_0_countries
Geometry: Multi Polygon
Feature Count: 177
Extent: (-180.000000, -90.000000) - (180.000000, 83.645130)
Layer SRS WKT:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4326"]] FID Column = ogc_fid
Geometry Column = wkb_geometry
scalerank: Integer (4.0)
featurecla: String (30.0)
...
region_wb: String (254.0)
name_len: Real (16.6)
long_len: Real (16.6)
abbrev_len: Real (16.6)
tiny: Real (16.6)
homepart: Real (16.6)

Теперь в БД добавлены пространственные данные.

5: Запрос пространственных данных

Для примера попробуйте найти десять самых северных стран в мире. С PostGIS это очень просто.

Вернитесь в БД test1.

psql -d test1

Запросите таблицы:

\dt

Команда вернёт две таблицы:

List of relations
Schema |           Name            | Type  |  Owner
-------+---------------------------+-------+----------
public | ne_110m_admin_0_countries | table | postgres
public | spatial_ref_sys           | table | postgres
(2 rows)

Используйте таблицу ne_110m_admin_0_countries, которая содержит необходимые данные. Столбец admin содержит название страны, столбец wkb_gemoetry – геометрические данные. Чтобы просмотреть столбцы ne_110m_admin_0_countries, выполните команду:

\d ne_110m_admin_0_countries

На экране появятся столбцы и их типы данных. Тип данных столбца wbk_geometry имеет такой вид:

wkb_geometry | geometry(MultiPolygon,4326) |

Столбец wbk_geometry содержит многоугольники. В данном примере вы имеете дело со странами и их нерегулярными границами, следовательно, каждая страна в базе не имеет одного значения широты. Таким образом, чтобы получить широту для каждой страны, сначала нужно выяснить центроид каждой страны с помощью функции ST_Centroid. Извлеките значение Y центроида с помощью функции ST_Y; это значение можно использовать как широту.

Запрос выглядит так:

SELECT admin, ST_Y(ST_Centroid(wkb_geometry)) as lattitude
FROM ne_110m_admin_0_countries
ORDER BY latitude DESC
LIMIT 10;

Результаты будут выведены в порядке убывания, так как самая северная страна будет иметь самую высокую широту.

Данный запрос выведет десять самых северных стран мира:

admin     |    latitude
----------+------------------
Greenland | 74.7704876939899
Norway    | 69.1568563971328
Iceland   |  65.074276335291
Finland   | 64.5040939185674
Sweden    | 62.8114849680803
Russia    | 61.9808407507127
Canada    | 61.4690761453491
Estonia   |  58.643695240707
Latvia    | 56.8071751342793
Denmark   | 56.0639344617945
(10 rows)

Чтобы закрыть БД, введите:

\q

Примечание: Больше информации о функциях PostGIS можно найти в документации расширения.

Заключение

Теперь у вас есть таблица с поддержкой пространственных данных. более подробный мануал можно найти по этой ссылке.