RU:Osm2pgsql

From OpenStreetMap Wiki
Jump to navigation Jump to search

broom

Help (89606) - The Noun Project.svg

osm2pgsql это утилита, преобразующая формат данных OpenStreetMap (.OSM), в данные для загрузки в базу данных PostgreSQL. Она часто используется для отображения данных OSM визуально, используя Mapnik, Mapnik может запросить картографические данные через PostgreSQL, а вот напрямую с OSM файлами не работает (уже работает, плагин для файлов OSM доступен в последних релизах mapnik). Для получения дополнительной информации об использовании osm2pgsql, как отображать данные OpenStreetMap с помощью Mapnik, сходите на страничку Mapnik.

osm2pgsql - утилита конвертации с потерями. Она вносит только те объекты, которые имеют теги, определенные в конфигурационном файле, и она конвертирует точки и линии в линии и полигоны. Это означает, что вы не сможете узнать, что с чем связано, но для рендренинга карты это не важно (в отличие от маршрутизации).

osm2pgsql работает в двух режимах - нормальном (это так называется?) и в slim режиме. В первом случае RAM используется для промежуточного хранения, во втором используются tracking tables

  • planet_osm_nodes
  • planet_osm_ways
  • planet_osm_rels

в базе данных на диске. В начале 2009, вы должны были использовать тонкий режим для импорта планеты на 32-битной системе, т.к. слишком много узлов для хранения в RAM. Это ограничение не относится к 64-битным системам, если у вас много свободной памяти (по состоянию на 28/05/2010, для planet.osm вам понадобится больше 256GB RAM памяти!! Точно не скажу, но знаю, что 32GB не хватило для europe.osm).

Для подробностей смотрите Osm2pgsql/schema.

Вы также можете собрать osm2pgsql с нуля (исходники в subversion), или взять существующие пакеты Linux.

Для использования osm2pgsql с поддержкой 64-битных ID, получите ту же версию из SVN выше и перед компиляцией раскомментируйте в osmtypes.h строку #define OSMID64. 64-битная поддержка была добавлена Frederik Ramm, после предварительного выделения osm2pgsql-64 ветки в SVN.

Установка

Для Debian Lenny (stable) или Sid (unstable) или Ubuntu (10.04 LTS и позже)

Из менеджера пакетов

В Ubuntu 9.10 (Karmic) или новее, установите пакет osm2pgsql из Kai PPA:

  1. Выполните sudo add-apt-repository ppa:kakrueger/openstreetmap чтобы добавить PPA
  2. Выполните sudo apt-get update для обновления информации о пакетах.
  3. Выполните sudo apt-get install osm2pgsql для установки пакета osm2pgsql.

Если у вас Debian unstable (он же sid), вам достаточно лишь установить osm2pgsql из менеджера пакетов. В случае иного дистрибутива вы получите устаревшую версию, без многих возможностей, вроде hstore или поддержки pbf.

sudo aptitude install osm2pgsql

Внимание ещё раз: пакет может оказаться устаревшим. Если увидели артефакты при рендренинге, или не увидели какие-то объекты, соберите osm2pgsql из исходников.

Из исходников

Для сборки в Ubuntu (10.4 LTS), необходимы следующие зависимости:

sudo apt-get install build-essential libxml2-dev libgeos-dev libpq-dev libbz2-dev proj libtool automake

Если вы желаете поддержку чтения PBF, вам нужен libprotobuf-c0-dev версии не ниже 0.14-1. Поскольку в репозитории 10.4 лежит версия 0.11, вам нужно собрать его из исходников [2]:

sudo apt-get install protobuf-compiler libprotobuf-dev libprotoc-dev
svn checkout http://protobuf-c.googlecode.com/svn/trunk/ protobuf-c-read-only
cd protobuf-c-read-only
./autogen.sh
make
sudo make install 

После чего читаем раздел Из исходников (общее).

Fedora

Установите зависимости:

yum install geos-devel proj-devel postgresql-devel libxml2-devel bzip2-devel
yum install gcc-c++ protobuf-c-devel autoconf automake libtool

После чего читаем раздел Из исходников (общее). Пакет osm2pgsql для Fedora в review.

openSUSE 11.0

Нужно добавить репозиторий:

sudo zypper ar http://download.opensuse.org/repositories/Application:/Geo/openSUSE_11.0

Затем установить зависимости

sudo zypper install libgeos-devel libproj-devel postgresql-devel libxml2-devel libbzip2-devel gcc-c++

После чего читаем раздел Из исходников (общее).

openSUSE 11.1

Нужно добавить репозиторий:

sudo zypper ar http://download.opensuse.org/repositories/Application:/Geo/openSUSE_11.1

Затем установить зависимости

sudo zypper install libgeos-devel libproj-devel postgresql-devel libxml2-devel libbz2-devel gcc-c++

После чего читаем раздел Из исходников (общее).

openSUSE 11.2

Прежде всего, добавляем репозиторий Geo:

sudo zypper ar http://download.opensuse.org/repositories/Application:/Geo/openSUSE_11.2/ "Geo"
sudo zypper refresh

Для скачивания и сборки osm2pgsql, вам сначала нужно установить зависимости и несколько инструментов:

sudo zypper install subversion make gcc gcc-c++ libxml2-devel postgresql-devel libgeos-devel libbz2-devel libproj-devel postgis postgresql-contrib

После чего читаем раздел Из исходников (общее).

Arch Linux

Скачайте PKGBUILD tar.gz из http://aur.archlinux.org/packages.php?ID=22107

Gentoo Linux

(e.g Server Profile)

Для начала поставьте Postgis, всё равно он нам протребуется как цель для импорта (и одновременоно поставит библиотеки геометрии(.

emerge postgresql postgis

Возможно придется предварительно запустить emerge с ключем --autounmask-write для разблокировки необходимых пакетов, которые по умолчанию отключены

emerge --autounmask-write postgis
dispatch-conf

Также потребуются ряд не связанных с геометрией зависимостей

emerge boost
emerge cmake


После чего читаем раздел Из исходников (общее).

FreeBSD

make -C /usr/ports/converters/osm2pgsql install clean

или

portinstall osm2pgsql

Windows XP

Самую свежую версию для Windows с 9 апреля 2010 можно найти здесь http://tile.openstreetmap.org/osm2pgsql.zip
Эта версия, помимо прочего, поддерживает опцию hstore, которая позволяет сохранять все теги из файла .osm в PostgreSQL. Пользователи Windows могут получить базу данных с поддержкой hstore, установив PostgreSQL 8.3.9 из http://wwwmaster.postgresql.org/download/mirrors-ftp/binary/v8.3.9/win32/postgresql-8.3.9-1.zip. Не забудьте отметить опцию hstore во время установки.

Для использвания osm2pgsql, просто распакуйте его, добавьте путь в системную переменную path и запустите.

  1. Распакуйте zip в новую директорию на жёстком диске
  2. Добавьте новую директорию в системную переменную path ([3])
  3. Выйдите из системы, и войдите снова, чтобы переменная обработалась
  4. Откройте сеанс командной строки
  5. Перейдите в директорию, куда вы распаковали osm2pgsql
  6. Теперь выполните > osm2pgsql -h команда отобразит справку
  7. В Windows для указания размещения файла стиля необходимо использовать параметр -S или --style. По умолчанию подразумевается путь как в unix.
  • Пример строки > osm2pgsql -c -d gis -U postgres -W -H localhost -P 5432 N:\Geo_data\OpenStreetMap\OSM_xml\ваш_файл_OSM.bz2


Установщик "HOTOSM" включает в себя и ставит автоматически упомянутый выше бинарник osm2pgsql. Данный установщик также включает в себя Mapnik, Osmosis, и множество полезных инструментов. Последнюю сборку можно скачать из: https://github.com/hotosm/installer/downloads

Версия из http://artem.dev.openstreetmap.org/files/ несколько устарела (нет импорта отношений)

Из исходников

Используя MinGW, можно решить много проблем, возникающих при сборке osm2pgsql:

Конфигурационный скрипт osm2pgsql не находит zlib и другие библиотеки

Конфигурационный скрипт, созданный autogen работает некорректно, потому что параметры для определения библиотек, которые будут слинкованы (например -lz для libz) находятся в неверной позиции. Они размещены в конце командной строки. By manually adding the correspondent parameters to the

Решение: Поправьте конфигурационный скрипт и добавьте библиоткеи для линковки вручную:

ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS -lz >&5'

Note: Добавление отладочного параметра d к autogen.sh (autoreconf -vfid) очень полезно в данной ситуации для поиска строк, которые нужно поправить.

Проблема линковки

build_geometry.cpp:206: undefined reference to `geos::geom::Coordinate::Coordinate(double, double, double)'

Решение: Поправьте build_geometry.cpp, добавив #define GEOS_INLINE


Используемые версии: libxml2-2.7.8, zlib-1.2.5, proj-4.7.0, geos-3.2.2

Mac OS X

Бинарный установщик

Сборки SVN snapshot osm2pgsql упакованы и доступны на http://dbsgeo.com/downloads/#osm2pgsql.

Использование MacPorts

Единственная заморочка этого способа в том, что по умолчанию установка Postgres 8.3 не прописывает pg_config в shell, так что вызов pg_config --includedir и pg_config --libdir будет безуспешным. В этой ситуации, либо измените эти пути в Makefile, либо добавьте pg_config себе в shell через .bashrc, etc. Например, инсталляция 8.3 обычно кладёт бинарник сюда:

/opt/local/lib/postgresql83/bin/pg_config

Использование KyngChaos binaries

PATH=$PATH:/Library/Frameworks/GEOS.framework/unix/bin/ CFLAGS="-I/Library/Frameworks/PROJ.framework/unix/include" LDFLAGS="-L/Library/Frameworks/PROJ.framework/unix/lib/" make

Из исходников (общее)

Вы можете получить исходники утилиты osm2pgsql, используя Git (около 30 Мб):

git clone https://github.com/openstreetmap/osm2pgsql.git

Вам потребуется утилита 'cmake', libtool и ряд других зависимостей. О подробностях установки для вашего дистрибутива смотрите выше.

Далее, войдите в созданную директорию, содержащую исходники утилиты:

cd osm2pgsql/

Создайте директорию для сборки, перейдите в неё и подготовьте Makefile:

mkdir build
cd build
cmake ..

Дополнительно вы можете сконфигурировать компилятор для создания более быстрого бинарника, который будет работать только на процессорах, совместимых с вашим.

sed -i 's/-g -O2/-O2 -march=native -fomit-frame-pointer/' Makefile

В завершение, скомпилируйте исходники в исполняемую программу:

make

Если вы используете старую версию GCC, вы можете получить ошибку: unrecognized option `-Wextra'. В этом случае, удалите из Makefile эту ненужную опцию.

Как избежать ловушек

osm2pgsql это специализированная утилита, и в её код зашиты некоторые особенности поведения, о которых вам нужно знать.

Береговые линии

natural=coastline теги подавляются и не импортируются, даже если вы импортируете ключ natural=*. Mapnik выводит на карту побережья из файлов shapefiles так что это и не нужно. Начиная с ревизии 24605 вы можете использовать параметр --keep-coastlines для изменения такого поведения, если желаете иметь береговые линии в своей базе данных.

Режим slim

Ряд важных операций (включая инкрементальные обновления planet diffs, первичную загрузку для заполнения трекинговых таблиц и корректную обработку мультиполигонов) работает исключительно в -slim режиме. Крайне рекомендуется всегда использовать slim режим, даже для файлов, которые легко умещаются в памяти.

Для включения данного режима используйте опцию '-s': osm2pgsql -s -d ...

Стили импорта

osm2pgsql требует иного подхода для различия линии как области и как линейного объекта, вроде дороги, так как они импортируются в разные таблицы базы данных. За этот процесс отвечает последняя колонка в файле стиля импорта. Если какие-либо из тегов данного объекта помечены как "polygon", эта линия рассматривается в качестве кандидата на рендеринг полигона. Если она замкнута, то обработается как область, если незамкнута - будет линия. Объекты, которые не удалось интерпретировать, на карте не отобразятся.

Тег area воздействует на поведение непосредственно. area=yes всегда будет делать область. Аналогично, area=no всегда будет делать линейный объект, но это не самый хороший вариант нестандартного тегирования для обхода проблем с отображением у конкретного рендерера.

В некоторых случаях определиться довольно тяжело. Например, тег highway может быть как областью (пешеходные площади), так и замкнутым линейным объектом (кольцевая дорога). На основной карте практикуется стиль импорта как для линейных объектов, и использование area=yes с площадными объектами.

Стиль по умолчанию для osm2pgsql импортирует в базу не все теги из .OSM файла. Смотрите http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/default.style для списка ключей, которые импортируются.

Доступ к БД

Не существует способа идентификации пользователя с помощью пароля в osm2pgsql. Так что вам либо придется установить механизм аутентификации для текущего пользователя/всех пользователей в значение 'trust', либо обойти его путём создания файла паролей. Смотрите PostgreSQL-документацию, чтобы узнать, как это сделать

Проблемы компиляции

Ошибка:

/usr/bin/ld: cannot find -lstdc++
collect2: ld returned 1 exit status
make: *** [osm2pgsql] Fehler 1

новая версия od gcc больше не требует lstdc++: удалите строку в 'Makefile' (или закомментируйте её):

LDFLAGS += -lstdc++

к

#LDFLAGS += -lstdc++

Оптимизация

Параметры

  • Большие объемы импорта в PostGIS очень чувствительны к конфигурации обслуживания и мониторинга: логично увеличить значение checkpoint_segments чтобы задачи autovacuum не замедляли процессы импорта.
  • osm2pgsql relies much on it's node cache during import. If the nodes do not fit into the cache it needs to do database lookups which slow down the process. Use enough cache so all nodes are cached. -C 12000 seams to do the job, even if that means you have to configure more swap space.

Альтернативы

Скорость ввода/вывода

Слабым звеном обычно являются операции ввода/вывода, когда запущен osm2pgsql в --slim режиме или даже без него. Как бы то ни было, когда используются процессоры частотой 3ГГц и быстрые (XM-25 for instance) твердотельные накопители (SSD жёсткие диски), слабым звеном становится наоборот процессор. В этом случае вы можете использовать альтернативную osm2pgsql.c библиотеку которая распространяется в исходниках с июля 2010. Она реализует сырой, но быстрый XML парсинг. Поскольку она всё ещё экспериментальная, то должна использоваться вами с осторожностью. Она требует следующие патчи для избежания засорения памяти в ситуации когда только стартовала, но не может использоваться для чтения <(bunzip2 < file.osm.bz2), наиболее вероятно это из-за того, что неверно обрабатывается операция чтения коротких блоков (операция чтения возвращает меньше байт, чем требуется).

Index: osm2pgsql.c
===================================================================
--- osm2pgsql.c (revision 22625)
+++ osm2pgsql.c (working copy)
@@ -741,6 +741,7 @@
     struct output_options options;
     PGconn *sql_conn;

+    memset(&options, '\0', sizeof(options));
     fprintf(stderr, "osm2pgsql SVN version %s\n\n", VERSION);

     while (1) {

Бенчмарк произведенный на SSD XM-25 disk и Intel(R) Xeon(R) CPU W3520 @ 2.67GHz показывает, что libxml2 парсит 30MB/s в то время как primitive_xml_parsing парсит 60MB/s. Оценка была произведена с использованием параметра -O null на несжатой версии france.osm.

Многоядерность

Для файла планеты, сжатого bzip, запустите osm2pgsql так

bunzip -c [planet.osm.bz2] | osm2pgsql [options] /dev/stdin

Одно ядро будет задействовано для распаковки bzip2, другое - для osm2pgsql. Протестировано на Ubuntu 11.04.

Бенчмарки

Смотрите /benchmarks для информации о тестировании производительности.

Обновление информации в базе данных

osm2pgsql - один из инструментов для поддержания данных OSM в вашей собственной базе данных PostgreSQL в актуальном состоянии при изменениях на серверах OpenStreetMap. Смотрите Minutely_Mapnik для дополнительной информации.

Отчеты об ошибках

Войдите в http://trac.openstreetmap.org/ создайте отчет об ошибке, указав компонент mapnik, и убедитесь, что он появился в в списке.

hstore

Hstore предназначен для хранения пар ключ/значение. Тип данных associative array, подобно hash в perl или dictionary в python.

Заполнение производится вручную, в основном для редких тегов.
C hstore вы можете использовать теги в sql запросах, вроде этого:

gis=> select count(*) FROM planet_osm_point where ((tags->'man_made') = 'tower');
 count
-------
  447
(1 Zeile)


соберите osm2pgsql из svn
вам нужно указать опцию -k

-k|--hstore		Создает дополнительное поле hstore (ключ/значение) в таблицах postgresql


установка в postgresql

postgresql до версии 9.1

$ psql -d gis -f /usr/share/postgresql/8.4/contrib/hstore.sql

Postgresql версии 9.1 и позднее

Данный sql код установит расширение в базу данных [1] :

CREATE EXTENSION hstore;

Смотрите также

  • High Road - набор запросов Postgres, упрощающий рендеринг дорог из Osm2pgsql, и улучшающий их отображение.