В предыдущем руководстве я описывал, как установить собственный сервер тайлов OSM на Debian 10. В данном материале я расскажу о настройке сервера геокодирования Nominatim на Debian 10. Nominatim обеспечивает возможность поиска по OpenStreetMap, что позволяет, когда пользователь вводит адрес, получать его координаты в виде широты и долготы.
Содержание статьи
- 1 Компиляция Nominatim из исходного кода.
- 2 Конфигурация Nominatim
- 3 Загрузка базы данных OSM
- 4 Конфигурация Apache
- 5 Обновление базы данных Nominatim.
- 6 Настройка задачи Cron для автоматического обновления данных.
- 7 Способы интеграции функции поиска в слайппи-карту.
- 8 Повышение точности обратного поиска.
- 9 Поиск и решение проблем.
Компиляция Nominatim из исходного кода.
Установите необходимые зависимости для компиляции Nominatim.
sudo apt update sudo apt install build-essential cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libproj-dev apache2 php php-pgsql libapache2-mod-php php-intl python3-setuptools python3-dev python3-pip python3-psycopg2 python3-tidylib git clang-tidy postgresql-server-dev-11
Создайте пользователя с именем nominatim. (Пароль для этого пользователя не требуется.)
sudo useradd - d /srv/nominatim - s /bin/bash - m nominatim
Откройте каталог /srv/nominatim/.
cd /srv/nominatim/
Выдайте разрешения для вашей учетной записи.
sudo apt install acl sudo setfacl - R - m u:username:rwx /srv/nominatim/
Загрузите Nominatim с его официального ресурса.
wget https://nominatim. org/release/Nominatim-3.5.1.tar. bz2
Распакуйте архив.
tar xvf Nominatim-3.5.1.tar. bz2
Создайте папку для компиляции.
mkdir build
Откройте указанную папку и подготовьте среду для компиляции.
cd build cmake /srv/nominatim/Nominatim-3.5.1
Соберите исходный код.
make

Конфигурация Nominatim
Файл конфигурации по умолчанию для Nominatim располагается по пути /srv/nominatim/build/settings/settings.php. Мы можем создать файл local.php и внести в него необходимые изменения.
sudo nano /srv/nominatim/build/settings/local.php
Включите следующие строки в файл.
tile.linux16.ru
Указанная выше настройка определяет
- Отношение пути к экземпляру Nominatim к вашему серверу с плитками.
- Широта, долгота и стандартный уровень масштабирования.
- Адрес вашего сервера плиток OSM. По умолчанию Nominatim обращается к общедоступному серверу плиток openstreetmap. org. В данном случае я использую собственный сервер плиток.
Вы можете открыть файл /srv/nominatim/build/settings/settings.php и внести в него свои настройки при необходимости. Например, если вы планируете импортировать большой объем данных (например, по Европе, Северной Америке или всему миру), рекомендуется включить плоское хранилище узлов для координат. Это позволит сохранить координаты в простом файле, а не в базе данных, что существенно сократит время импорта и сэкономит дисковое пространство.
@define('CONST_Osm2pgsql_Flatnode_File', '/srv/nominatim/flatnode. file');
Сохраните изменения и закройте документ.
Загрузка базы данных OSM
Загрузите файл дампа значимости из Википедии, чтобы повысить качество поиска в Nomiatim.
cd /srv/nominatim/Nominatim-3.5.1/data wget https://www. nominatim. org/data/wikimedia-importance. sql.gz
Скачайте информацию о почтовых индексах для США и Великобритании.
wget https://www. nominatim. org/data/us_postcode_data. sql.gz wget https://www. nominatim. org/data/gb_postcode_data. sql.gz
Загрузите документ с кодами для различных стран.
wget - O country_osm_grid. sql.gz https://www. nominatim. org/data/country_grid. sql.gz
После этого необходимо загрузить файл OSM и импортировать его в postgresql.Для скачивания нужного экстракта посетите сайт http://download.geofabrik.de. Кроме того, в процессе настройки сервера плиток можно использовать файл PBF.
Создайте пользователя www-data в PostgreSQL, чтобы обеспечить веб-серверу доступ к базе данных только для чтения.
sudo - u postgres createuser www-data
Дайте права пользователю postgres.
sudo setfacl - R - m u:postgres:rwx /srv/nominatim/
Перейдите на учетную запись пользователя postgres.
sudo - u postgres - i
Используйте следующую команду для импорта данных OSM в PostgreSQL.
cd /srv/nominatim/build/ /srv/nominatim/build/utils/setup.php --osm-file /home/osm/great-britain-latest. osm. pbf --all 2>&1 | tee setup.log
Это позволит автоматически сформировать базу данных nominatim в PostgreSQL и загрузить экстракты OSM при помощи osm2pgsql.

По завершении импорта базы данных будет запущен процесс индексации.

По окончании работы выполните следующую команду для проверки.
/srv/nominatim/build/utils/check_import_finished.php

Выйдите из аккаунта пользователя postgres.
exit
Конфигурация Apache
Внесите изменения в файл конфигурации сервера тайлов.
sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf
Вставьте указанные строки между тегами VirtualHost.
Сохраните изменения в файле и закройте его. После этого выполните перезагрузку Apache.
sudo systemctl reload apache2
Теперь перейдите по адресу https://tile.yourdomain.com/nominatim. Там вы сможете увидеть свой экземпляр Nominatim.

Файл стилей CSS расположен по адресу /srv/nominatim/build/website/css/search. css, если вы хотите изменить его оформление.
Обновление базы данных Nominatim.
Для обеспечения актуальности базы данных Nominatim требуется установить Pyosmium. Эта библиотека доступна в стандартном программном репозитории, однако лучше всего установить последнюю версию через pip3.
sudo pip3 install osmium
Бинарный файл будет установлен в /usr/local/bin/pyosmium-get-changes. Не забудьте внести изменения в конфигурационный файл Nominatim.
sudo nano /srv/nominatim/build/settings/local.php
Вставьте следующую строку, чтобы определить путь к pyosmium-get-changes.
@define('CONST_Pyosmium_Binary', '/usr/local/bin/pyosmium-get-changes');
Теперь необходимо указать Nominatim источник для загрузки обновлений. По умолчанию он настроен на получение данных с https://planet.openstreetmap.org/replication/minute. Если вы скачали файл OSM PBF с geofabrik. de, рекомендуется загружать обновления именно оттуда.
Для получения URL-адреса обновления вашей карты, посетите сайт https://download.geofabrik.de/ и выберите нужный регион. Далее, найдите ссылку на файл с расширением. osc.gz.
Данный URL служит для обновления.

Включите следующую строку в файл /srv/nominatim/build/settings/local.php, при этом используйте свой собственный URL-адрес для обновления.
// базовый URL службы репликации @define('CONST_Replication_Url', 'http://download.geofabrik. de/europe/great-britain-updates'); // Как часто поставщик публикует изменения @define('CONST_Replication_Update_Interval', '86400'); // Как долго ждать, если обновление еще не найдено @define('CONST_Replication_Recheck_Interval', '900');
Сохраните файл и закройте его. Дайте необходимые права пользователю postgres.
sudo setfacl - R - m "u:postgres:rwx" /srv/nominatim/build/
После этого перейдите к пользователю postgres.
sudo - u postgres - i
Запустите процедуру обновления.
/srv/nominatim/build/utils/update.php --init-updates
Обновите базу данных Nominatim.
/srv/nominatim/build/utils/update.php --import-osmosis-all
Настройка задачи Cron для автоматического обновления данных.
Измените файл Crontab для пользователя root.
sudo crontab - e
Включите данную строку в этот документ.
@daily sudo - u postgres /srv/nominatim/build/utils/update.php --import-osmosis-all
Сохраните изменения и закройте документ.
Способы интеграции функции поиска в слайппи-карту.
Скорее всего, ваша слайппи-карта построена с использованием библиотеки JavaScript Leaflet. Для внедрения функции поиска в карту вам потребуется применить плагин для геокодирования Leaflet. Я расскажу, как использовать Leaflet Control Geocoder, и это довольно просто.
Допустим, вы применили следующий HTML-код для представления вашей слайппи-карты.
Теперь необходимо включить в заголовок HTML две новые строки для использования плагина Leaflet Control Geocoder.
После этого внедрите в код следующую функцию.для добавления функциональности поиска на вашу карту.
L. Control. geocoder().addTo(map);
Итоговый код на HTML будет представлен следующим образом:
Сохраните изменения и закройте файл. После этого обновите страницу карты в вашем браузере; в правом верхнем углу должна появиться кнопка поиска.

По умолчанию Leaflet Control Geocoder применяет публичный геокодер по адресу https://nominatim.openstreetmap.org. Если вы хотите использовать собственный сервис геокодирования Nominatim, уберите следующую строку.
L. Control. geocoder().addTo(map);
Добавьте следующие строки, заменив URL на адрес вашего сервиса геокодирования Nominatim. Убедитесь, что в конце не стоит слэш.
var geocoder = L. Control. Geocoder. nominatim(https://tile. yourdomain.com/nominatim/'>Если поддерживаются URLSearchParams и имеется строка запроса в адресе,< // parse /?geocoder=nominatim from URL var params = new URLSearchParams(location. search); var geocoderString = params. get('geocoder'); if (geocoderString && L. Control. Geocoder[geocoderString]) < console.log('Используется геокодер', geocoderString); geocoder = L. Control. Geocoder[geocoderString](); >в противном случае, если присутствует строка геокодера< console. warn('Неподдерживаемый геокодер', geocoderString); >>var control = L. Control. geocoder(< query: 'Moon', placeholder: 'Поиск здесь. ', geocoder: geocoder >Добавить на карту можно следующим образом: var marker; setTimeout(function()< control. setQuery('Earth'); >, 12000);
Вы можете включить следующий код для выполнения обратного геокодирования. При нажатии на точку на карте у посетителя отобразится название этого адреса.
map. on('click', function(e) < geocoder. reverse(e. latlng, map. options. crs. scale(map. getZoom()), function(results) < var r = results[0]; if (r) < if (marker) < marker. setLatLng(r. center).setPopupContent(r. html || r. name).openPopup(); >else < marker = L. marker(r. center).bindPopup(r. name).addTo(map).openPopup(); >> >); >);
Сохраните изменения в файле и закройте его. После этого обновите страницу с картой в вашем веб-браузере.
Повышение точности обратного поиска.
В Nominatim существуют два вида поиска:
- Прямой поиск, или геокодирование, предоставляет координаты широты и долготы для указанного адреса.
- Обратный поиск, или обратное геокодирование, предоставляет адрес, исходя из заданных координат широты и долготы, например, когда пользователь нажимает на определённую точку на карте.
При выполнении обратного поиска маркер и всплывающее окно могут быть расположены не рядом с тем местоположением на карте, на которое вы кликнули. В этом случае необходимо увеличить масштаб. Функция map. getZoom() позволяет получить текущее значение масштаба карты, которое устанавливается через функцию setView() следующим образом.
var map = L. map('map').setView([54,1],6);
Уровень масштабирования установлен на 6, что снизит точность обратного поиска. Мы можем зафиксировать уровень масштабирования для обратного поиска следующим образом:
geocoder. reverse(e. latlng, map. options. crs. scale( 21 ), function(results)
То есть, необходимо заменить map. getZoom() на 21. Уровень масштабирования для обратного поиска достигает максимума в 21. Вы также можете установить другой уровень масштабирования в зависимости от ваших потребностей.
Поиск и решение проблем.
Если функция поиска на вашей карте не функционирует, стоит заглянуть в консоль вашего браузера для выявления проблемы. Некоторые пользователи могут столкнуться с ошибкой 406 (неприемлемо) или ошибкой CORS (доступ запрещён). Убедитесь, что для файлов.php в конфигурации Apache установлен корректный MIME-тип. У некоторых пользователей может быть строка, которая вызывает описанные выше ошибки.
AddType text/html.php
AddType application/json.php
После обновления MIME-типа необходимо перезапустить Apache, чтобы новые настройки начали действовать.
sudo systemctl reload apache2

