Linux

Личный OpenStreetMap (OSM)

Последний раз наткнулся на такое сообщение: «В diaspora* wiki для подминов написано, что запуск собственного сервера diaspora* требует технических умений и времени.» Эта цитата с хабра лучше всего опишет данный мануал по установке и настройке OpenStreetMap.

Если решили установить свой OpenStreetMap, значит вам это нужно либо по работе, либо по личной цели, иных причин использовать свою карту в принципе и нет. Но раз потребность возникла, значит придется пройти трудный путь. Идею пройти данный путь подкинул azbukait, думаю без него этот мануал не появился бы на свет.

Для начала нам нужен сервер, в качестве операционной системы будем использовать Ubuntu 16.04, железная часть будет следующая:

  • Core i3
  • 8 Gb
  • SSD 256 Gb

По большей части (95%) операций будет выполняться под пользователем root.

Обновление.

Проверим обновление  для системы и при необходимости произведем обновление.

PostgreSQL и PostGIS.

Мы будем использовать PostgreSQL для хранения картографических данных. PostGIS — это геопространственное расширение для PostgreSQL.

Пользователь postgres будет создан в ОС в процессе установки. Это суперпользователь для сервера баз данных PostgreSQL. По умолчанию у этого пользователя нет пароля и нет необходимости его устанавливать, так как для переключения на пользователя postgres можно использовать sudo:

Теперь создаем пользователя базы данных PostgreSQL — osm.

Далее создаем базу данных с именем gis и одновременно с эти делаем osm владельцем базы данных. -E UTF8 определяет схему кодировки символов, которая будет использоваться в базе данных.

Создаем расширение hstore и postgis в базе данных gis.

После выходим из пользователя postgres.

Пользователь OSM.

Создаем пользователя osm в операционной системе, чтобы сервер мог работать от имени пользователя osm.

Попросит ввести личные данные и пароль для нового пользователя.

Стили и картографические данные.

Скачиваем таблицу стилей и картографические данные. Это необходимо делать под пользователем osm.

Ключ -с используется для продолжения закачки при обрыве связи.

Увеличиваем Swapfile.

Импорт картографических данных занимает много оперативной памяти. Если памяти мало, можно добавить файл подкачки. Делим память на 2 и получаем 4. После перезагрузки файл подкачки вернется в значение по умолчанию.

Настраиваем SSH.

Процесс импорта может занять некоторое время. Настроим поддержку активности SSH, чтобы не потерять подключение SSH.

Импорт картографических данных в PostgreSQL.

  • —create — очищает базу и добавляет новые данные;
  • —append — не очищает базу и добавляет новые данные;
  • —slim — указывает osm2pgsql создавать “тонкие” таблицы для хранения данных при импорте, а не пытаться хранить все в памяти. —slim также необходим, если мы хотим обновить данные;
  • —cache — больший размер кэша приводит к более быстрой скорости импорта, но нужно иметь достаточно оперативной памяти для использования кэша;
  • —number-processes — количество ядер используемых у процессора;
  • —hstore — это хранилище ключей и значений, поддерживающее произвольные ключи и значения;
  • —style — путь к файлу стиля, который сообщает osm2pgsql, какие столбцы создавать;
  • —multi-geometry — указывает osm2pgsql не разбивать мультиполигоны на отдельные полигоны. Это повышает гибкость и устраняет некоторые артефакты визуализации, но немного медленнее.

При загрузке потребуется некоторое время, чтобы построить индексы, поэтому может показаться, что в конце ничего не происходит. Проверить, что происходит в базе данных можно с помощью команды — pg_top -d (sudo apt install pgtop).

Понять, что импорт завершен, можно увидев следующее сообщение:

Импорт завершен.

Osm2pgsql took 15496s overall

Импорт занимает достаточное время, к примеру Россия занимает до 8 часов! После импорта, выходим из пользователя OSM.

Установка модуля mod_tile.

mod_tile — это модуль Apache, необходимый для обслуживания плиток карт.

Создание таблицы стилей Mapnik.

Шрифты необходимые для стилей.

sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont -y

Настройка renderd

Вносим изменения в конфигурационный файл:

В секцию [default] вносим следующие изменения:

В секцию [mapnik] вносим следующие изменения:

Сохраняем файл.

Теперь необходимо поправить настройки запуска renderd, скопировав пример.

Внесем изменения в скрипт запуска:

Создаем файл и делаем владельцем этого файла пользователя — osm.

Запускаем службу визуализации

Настройка Apache

Установка Apache web server

Создаем файл загрузки модуля.

Создаем символьную ссылку

Редактируем файл виртуальных хостов.

Вставляем в раздел <VirtualHost *:80> следующие строки:

Сохраняем файл и перезапускаем Apache

Проверка работы карты.

Открываем браузер и переходим по адресу:

server-ip/osm_tiles/0/0/0.png

Если открывается карта, то все настроено верно.

Отображение карты.

Для отображения карты OpenStretMap можно использовать два варианта — OpenLayer and Leaflet. В своем примере буду использовать Leaflet.

Делаем на всякий случай резервную копию файла index.

Удаляем старый файл index.

Создаем свою страничку с картой.

В качестве примера используем Leaflet, страну Россия, город Москва.

Строчку server-ip заменяем на адрес своего сервера. Теперь открыв адрес своего сервера в браузере можно увидеть карту:

В итоге получаем свой собственный сервер карт. Для чего он нужен? Ну тут уже каждый сам решает, как я в принципе упоминал выше. Многие скажут зачем, когда можно использовать Яндекс или Гугл, но количество запросов к карте ограниченно в бесплатной версии.

Так же можно использовать готовый скрипт с github, но как показала практика последнего использования, в нем есть ошибка. По крайней мере в версии для Ubuntu 16 она точно есть, остальные не проверял.

Osm2pqsql failed due to ERROR: Couldn’t open style file ‘/usr/local/share/maps/style/openstreetmap-carto-3.0.x/openstreetmap-carto.style’: No such file directory

Ошибка заключается в определении версии openstreetmap carto, если изменить версию на используемую в скрипте, то ошибок не будет.

26 комментариев

  • Антон

    Cпотыкается на этапе Импорте картографических данных в PostgreSQL (osm2pgsql —create —slim —cache 7000 —number-processes 4 —hstore —style openstreetmap-carto-2.41.0/openstreetmap-carto.style —multi-geometry russia.osm.pbf) выдаёт ошибку osm2pgsql version 0.94.0 (64 bit id space)
    Using built-in tag processing pipeline
    Using projection SRS 3857 (Spherical Mercator)
    Osm2pgsql failed due to ERROR: Connection to database failed: FATAL: database «osm» does not exist

  • kanitelka

    Делали все по порядку? Мне кажется следует проверить две вещи:
    1. Под каким пользователем пытаетесь загрузить.
    2. Существует ли данная база OSM.

  • Антон

    Всё делал по порядку согласно инструкции. 1) делал под su — osm. и под основной тоже пробовал. 2) Существует, но ошибка пишет обратное.

  • kanitelka

    Попробовал на виртуальной машине загрузить, все проходит без ошибок.
    Интересуют следующие вещи:
    — какая версия Ubuntu используется
    — характеристики сервера (память, количество ядер, объем жесткого диска)
    — вывод команды ls (LS) под пользователем osm

    Для ускорения процесса тестирования можно использовать не Россию, а другую страну которая меньше по размеру, к примеру Центральную Америку http://download.openstreetmap.fr/extracts/central-america.osm.pbf

  • Дмитрий

    Всё правильно, ошибка и должна возникать, т.к. в инструкции выше мы создаем базу «gis», а пытаемся дальше загрузить данные в базу без указания имени, по умолчанию «osm».
    На этапе osm2pgsql нужно дописать к команде название базы —database gis

  • Олег

    VMWare, Debian buster

    Ошибка при импорте (Ошибка сегментирования на 111060 k) — Сейчас скачал отдельно Сибирский федеральный округ для проверки.

    Ваши мысли?

  • kanitelka

    Олег, импортировали что именно? У меня весь мир так и не загрузился, грузил частями РФ. Самое просто это взять отдельный город и проверить на нем.

  • Олег

    1.
    Пытался импортировать карту России:
    http://download.openstreetmap.fr/extracts/russia.osm.pbf
    http://download.openstreetmap.fr/extracts/russia-latest.osm.pbf

    На этапе парсинга (по крайней мере как я понял) вываливает такую ошибку:

    Reading in file: russia-latest.osm.pbf
    Using PBF parser.
    Processing: Node(111110k 159.6k/s) Way(0k 0.00k/s) Relation(0 0.00/s)Ошибка сегментирования

    Хотя остальные карты (в моем случае проверял на Сибирском федеральном округе, Центральном Федеральном округе, и кавказе) грузились, хоть и долго (карты брал с того же ресурса)

    2. И вот таким макаром грузить весь мир???
    3. Дальше пока не шел, решил проверить карты и у меня как раз закончился рабочий день =)
    Сейчас попробую следующие шаги

  • kanitelka

    Олег коррективы внес! Спасибо.

    По поводу полной РФ были проблемы, как вариант пробовать грузить областями.

    Олег, а не пробовали использовать скрипт автоматической установки, который расположен на гитхабе, в конце статьи есть ссылка на него.

  • Евгений

    Спасибо за материал. Вроде всё сделал по инструкции, ошибок не было, однако

    The requested URL was not found on this server при попытке доступиться к server-ip/osm_tiles/0/0/0.png

  • Илья

    В чем может быть проблема?

    root@osm01:~/mod_tile/mod_tile# make
    depbase=echo src/daemon.o | sed 's|[^/]*$|.deps/&|;s|\.o$||';\
    gcc -DHAVE_CONFIG_H -I. -I./includes -pthread -g -O2 -MT src/daemon.o -MD -MP -MF $depbase.Tpo -c -o src/daemon.o src/daemon.c &&\
    mv -f $depbase.Tpo $depbase.Po
    src/daemon.c:47:10: fatal error: iniparser/iniparser.h: No such file or directory
    #include
    ^~~~~~~~~~~~~~~~~~~~~~~
    compilation terminated.
    Makefile:823: recipe for target ‘src/daemon.o’ failed
    make: *** [src/daemon.o] Error 1

  • Elnur

    Здраствуйте,Спасибо за гайд последний раз кто пробоват этот гайд рабочий ? Мне нужно поднять сервер карту мира ,этот гайд подойдет в моем случае

      • kanitelka

        Я бы попробовал, но гарантии нет. Смотрите дополнительно комментарии, там были дельные советы если не работает.
        Когда я делал в 2019 году, у меня часть карт работала. Полностью мир не заработал!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку Отправить комментарий Я даю согласие на обработку персональных данных.