[Из песочницы] Установка OpenStreetMap Nominatim для нахождения широты и долготы по введенному адресу
Хотел бы поведать свою историю об установке геокодера Nominatim на выделенный сервер. Изначально предполагалось, что эта задача займёт у меня около 5–7 часов, но не тут то было… Поэтому было решено написать статью c описанием разворачивания Nominatim на сервер до полной работоспособности сайта. Но обо всём по порядку.
ВведениеЕсть множество сервисов с геокодерами, не буду здесь их всех перечислить, отмечу, что на Хабре есть хорошие статьи по этому поводу: «Geocoding with PHP and the Google Maps API», а также «Яндекс Карты: Поиск произвольных объектов».Для тех кто не в курсе: Geocoding — это процесс нахождения широты и долготы по введенному адресу.Мой выбор пал именно на Nominatim, так как его можно развернуть на своём сервере и не ограничиваться количеством запросов, а также уже был опыт работы с OSM картами и хотелось бы его применить.
Документация Сайт с уже работающей картой можно найти по ссылке: OpenStreetMap NominatimА вот и ссылка на примеры запросов: Wiki nominatimТак же есть ссылка на установку Nominatim Installation. Но эта документация немного устарела, для установки именно по этой статье необходимо немного потанцевать с бубном. Всё ниже описанное, будет ссылаться на эту статью по установке, только без участия бубна.А так же есть докер контейнер nominatim docker. По какой-то причине, скорее всего из-за устаревших пакетов установки, этот контейнер у меня таки не запустился.Шаг 1: Создание виртуальной машины За основу была взята машина из облака Microsoft Azure серии standart D2 с характеристиками: 2 cores, 7 GB RAM, 100 GB SSD. Именно на этой машине и будет производиться установка Nominatim. 100GB на самом деле — это больше чем нужно для моей задачи, так как карта Украины не настолько большая. После установки всех необходимых компонентов осталось свободных 70%.Шаг 2: Установка необходимых пакетов sudo apt-get update sudo apt-get -y install wget sudo apt-get -y install build-essential automake sudo apt-get -y install libxml2-dev sudo apt-get -y install libgeos-dev sudo apt-get -y install libpq-dev sudo apt-get -y install libbz2-dev sudo apt-get -y install libtool libproj-dev sudo apt-get -y install libgeos++-dev sudo apt-get -y install gcc proj-bin libgeos-c1 git osmosis sudo apt-get -y install php5 php-pear php5-pgsql php5-json sudo apt-get -y install bc sudo apt-get -y install postgresql-9.4 postgresql-9.4-postgis-2.1 postgresql-contrib-9.4 postgresql-server-dev-9.4 sudo apt-get -y install libboost-chrono1.55-dev libboost-thread1.55-dev libboost-filesystem1.55-dev sudo apt-get -y install python-software-properties && add-apt-repository -y ppa: kakrueger/openstreetmap && apt-get update && apt-get --no-install-recommends install -y osm2pgsql Шаг 3: Настройка sudo -i pear install DB sudo -u username sudo mkdir -p /app/nominatim sudo -i useradd -m -p password1234 -d /app/nominatim nominatim chown nominatim: /app/nominatim cd /app/nominatim wget http://www.nominatim.org/release/Nominatim-2.4.0.tar.bz2 tar xvf Nominatim-2.4.0.tar.bz2 rm Nominatim-2.4.0.tar.bz2 mv Nominatim-2.4.0/* . rm Nominatim-2.4.0/ sudo -u nominatim ./autogen.sh ./configure && make Думаю, в этих строках команд не сложно разобраться. В случае если возникнет ошибка с получение прав доступа, установим права доступа на чтение и запуск на выполнение всем пользователям и группам chmod -R 755 /app. Хотелось бы отметить, что иногда возникала проблема при выполнении команды make. если у вас возникла эта проблема воспользуйтесь командой sudo make clean, а затем уже ./configure && make.Шаг 4: PostgreSQL Изначально, postgres настроен не для боевого сервера, так что надо его конфигурировать вот советы от wiki документации nominatim: Ubuntu location /etc/postgresql/9.x/main/postgresql.confCentOS location /var/lib/pgsql/data/postgresql.conf
shared_buffers (4GB)maintenance_work_mem (10GB)work_mem (50MB)effective_cache_size (24GB)synchronous_commit = offcheckpoint_segments = 100checkpoint_timeout = 10mincheckpoint_completion_target = 0.9The numbers in brackets behind some parameters seem to work fine for 32GB RAM machine
sudo passwd postgres sudo usermod -a -G sudo postgres service postgresql start && pg_dropcluster --stop 9.4 main service postgresql start && pg_createcluster --start -e UTF-8 9.4 main
service postgresql start && sudo -u postgres psql postgres -tAc «SELECT 1 FROM pg_roles WHERE rolname='nominatim'» | grep -q 1 || sudo -u postgres createuser -s nominatim && sudo -u postgres psql postgres -tAc «SELECT 1 FROM pg_roles WHERE rolname='www-data'» | grep -q 1 || sudo -u postgres createuser -SDR www-data && sudo -u postgres psql postgres -c «DROP DATABASE IF EXISTS nominatim» На этом самая простая часть работы с установкой закончена. А теперь начинается хардкор, потому что дальнейшие действия выполняются не всегда корректно. И после такого некорректного завершения, к сожалению, иногда приходиться выполнять действия заново на новой виртуальной машине.Шаг 5: Загрузка и установка osm карт В начале необходимо загрузить саму карту из сайта в формате *.pbf: OpenStreetMap Data Extracts. В качестве примера я загружаю карту Украины и переименовываю в data.pbf. wget --output-document=data.pbf http://download.geofabrik.de/europe/ukraine-latest.osm.pbf chown nominatim: data.pbf touch local.php /app/nominatim/settings/local.php nano /app/nominatim/settings/local.php Последняя команда открывает файл конфигураций по установке nominatim. В файл local.php нужно ввести код который описан ниже. В качестве BaseURL необходимо вписать адрес сайта, с которого будет запущен nominatim.Теперь запускаем команду установки nominatim. Эта операция занимает довольно таки длительное время, например с картой Украины установка длилась около 7 часов. В силу того, что я выполнял все команды через ssh, и являюсь подверженным переменному отключению интернета, выполнение команды установки проводится в скрине.
screen service postgresql start && sudo -u nominatim — ./utils/setup.php --osm-file /app/nominatim/data.pbf --all --threads 2 2>&1; sudo -u nominatim — ./utils/setup.php --index --create-search-indices Для выхода из скрина нужно набрать комбинации Ctrl+A затем Ctrl+D. Команда screen -r возвращает обратно в скрин.Теперь запустим сайт быстрым способом:
./utils/setup.php --create-website /var/www/html rm /var/www/html/index.html /etc/init.d/apache2 restart Я обошелся без настройки apache или работой с nginx, так как об этом вы с легкостью можете прочитать на Хабре в других статьях. Да и без настройки сайт прекрасно работает.Тестируем сайт В результате мы должны увидеть что-то подобное, как на моём скрине:
Проверим как работает api, сделав запрос: http://geocoder.cloudapp.net/? format=json&addressdetails=1&q=Odessa&format=json&limit=1Response:
[{«place_id»:»1145869», «licence»: «Data © OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright», «osm_type»: «relation», «osm_id»:»1413934», «boundingbox»:[»46.342707»,»46.6291187»,»30.6114013»,»30.8313753»], «lat»:»46.4858883», «lon»:»30.68365101101», «display_name»: «Одесса, Одесская область, Украина», «class»: «place», «type»: «city», «importance»:0.45, «icon»: «http:\/\/geocoder.cloudapp.net\/images\/mapicons\/poi_place_city.p.20.png», «address»:{«city»: «Одесса», «county»: «Одесса», «state»: «Одесская область», «country»: «Украина», «country_code»: «ua»}}] Выводы В конце хотелось бы подметить, что для загрузки карты Земли нужно сервер по мощнее, чем серия D2, если вы не хотите *неделю ждать загрузки. Эту проблему так же можно решить с помощью временного масштабирования сервера до серии D14 (16 ядер, 112 ГБ памяти). А вот время выполнение запроса поиска очень радует: в среднем поиск по Украине занимает всего 300 мс.Надеюсь, данная статья поможет другим разработчикам потратить меньше времени на разворачивание Nominatim и понять, нужно ли вам это. Может стоит взять уже готовое и использовать?
Если у кого-то из хабросообщества будет необходимость в рабочем Docker контейнере с Nominatim, или другие идеи — пишите, всегда рад пообщаться.