RU:Osm2pgsql

From OpenStreetMap Wiki
Jump to: navigation, search
В процессе перевода +/-
Эта страница находится в процессе перевода или помечена для этой цели, поэтому может содержать пропуски, ошибки и непереведённые фрагменты. Исходная статья – Osm2pgsql.
Если вы знаете английский, то можете помочь нам, переведя часть оригинальной статьи. Общие сведения о переводе статей на русский язык можно найти здесь.

Вы можете закончить перевод

Help
Доступные языки
Deutsch English Русский

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

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

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

в базе данных на диске. В начале 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.

Contents

Установка

Для 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

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.


Установщик "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.

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

Вот формула Homebrew для osm2pgsql. Она тянет поседнюю версию из OpenStreetMap svn и устанавливает её в /usr/local/bin с остальными бинарниками homebrew. Просто и красиво.

brew install osm2pgsql

Учтите, что эта магическая homebrew формула в данный момент ставит только бинарник osm2pgsql. [default.style], который вы, вероятно, тоже захотите, придётся получать из OpenStreetMap SVN отдельно. [Здесь об этом уже написано].

Использование 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, используя Subversion (около 180 Мб):

svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/

Если нужна поддержка формата o5m, смотрите osm2pgsql/o5m, иначе, читайте далее:

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

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

cd osm2pgsql/

Если Makefile и скрипта configure нет, сгенерируйте их:

./autogen.sh
./configure

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

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++

Оптимизация

Параметры

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

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

Слабым звеном обычно являются операции ввода/вывода, когда запущен 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;

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

  1. [1]
Personal tools
Namespaces
Variants
Actions
site
Toolbox