В предыдущем руководстве я описал процесс установки собственного тайлового сервера OSM на Ubuntu 20.04. В этом же материале рассмотрим, как настроить сервер геокодирования Nominatim на Ubuntu 20.04. Nominatim используется для поиска по картам OpenStreetMap, что позволяет при вводе адреса в поисковую строку получить координаты с широтой и долготой.
Для настройки Nominatim для поиска по глобальной карте, рекомендуется использовать отдельный сервер, так как для работы системы потребуется 64 ГБ оперативной памяти и 1 ТБ SSD.
Содержание статьи
- 1 Установка и конфигурация PostgreSQL
- 2 Конфигурация Nominatim
- 3 Загрузка базы данных OSM
- 4 Конфигурация Apache
- 5 Обновление Nominatim базы данных
- 6 Настройте задание Cron для автоматического обновления.
- 7 Как внедрить функцию поиска на слайпп-карте.
- 8 Повышение точности реверсивного поиска
- 9 Способы обновления сервера базы данных PostgreSQL
Установка и конфигурация PostgreSQL
Если серверы тайлов OSM и Nominatim находятся на одном сервере, этот этап можно пропустить, поскольку PostgreSQL уже был установлен во время настройки сервера тайлов OSM.
Мы будем применять PostgreSQL для хранения геоданных. Разработчики PostgreSQL постоянно работают над повышением эффективности с каждым обновлением. Для установки актуальной версии PostgreSQL выполните следующие четыре команды.
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 php-cgi phpunit php-codesniffer python3-setuptools python3-dev python3-pip python3-psycopg2 python3-tidylib python3-behave python-pytest pylint git clang-tidy postgresql-server-dev-14
Создайте учетную запись пользователя 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 работает с публичным сервером https://tile.openstreetmap.org. В этом примере применяется персональный сервер.
Вы можете также ознакомиться с файлом /srv/nominatim/build/settings/settings.php и при необходимости внести свои изменения. К примеру, если планируете импортировать крупный набор данных (например, для Европы, Северной Америки или всей планеты), стоит рассмотреть возможность активации хранения узлов в плоском формате. Это позволит сохранять координаты узлов в простом файле вместо использования базы данных, что поможет сократить время импорта и снизить объем занимаемого хранилища.
@define('CONST_Osm2pgsql_Flatnode_File', '/srv/nominatim/flatnode. file');
Сохраните изменения и закройте документ.
Загрузка базы данных OSM
Загрузите резервную копию с необходимыми данными.

После завершения импорта базы данных начнется этап индексации. Будет доступно 30 рангов.

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

Выйдите из учетной записи пользователя postgres.
exit
Конфигурация Apache
Если Nominatim настроен на сервере тайлов OSM, измените файл конфигурации этого сервера.
sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf
Вставьте указанные строки между тегами VirtualHost.
<directory "/srv/nominatim/build/website">Следующие опции: FollowSymLinks, MultiViews, добавить тип application/json для.php, индекс директории search.php, требуется доступ для всех. alias /nominatim /srv/nominatim/build/website
Сохраните изменения в файле и закройте его. После этого перезапустите сервер Apache.
sudo systemctl reload apache2
При установке Nominatim на отдельном сервере необходимо выполнить установку Apache и PHP.
sudo apt install apache2 php7.4 libapache2-mod-php7.4 php-common php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-readline
Настройте виртуальный хост для Nominatim.
sudo nano /etc/apache2/sites-enabled/nominatim.conf
Включите следующие строки в данный файл.
ServerName nominatim. example.com Корневой каталог документа: /srv/nominatim/build/website<directory "/srv/nominatim/build/website">Следующие опции: FollowSymLinks, MultiViews, добавить тип application/json для.php, индекс директории search.php, требуется доступ для всех.alias /nominatim /srv/nominatim/build/website
ErrorLog $/nominatim_error.log
LogLevel warn
CustomLog $/nominatim_access.log combined
Закройте и сохраните файл, после чего перезапустите сервер Apache.
sudo systemctl restart 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.
Этот адрес является адресом для обновления.

Вставьте указанную строку в файл /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
Сохраните файл и закройте его. Если вы не желаете, чтобы база данных Nominatim обновлялась автоматически, просто уберите указанную строку из файла Crontab.
Как внедрить функцию поиска на слайпп-карте.
Я предполагаю, что для отображения вашей слайпп-карты используется библиотека JavaScript Leaflet. Чтобы интегрировать функцию поиска в вашу карту, вам понадобится воспользоваться плагином геокодирования Leaflet. Я расскажу, как применить Leaflet Control Geocoder. На самом деле это довольно просто.
Предположим, вы применили этот HTML-код для визуализации вашей слайд-карты.
Теперь необходимо включить в заголовок HTML следующие две строки для активации плагина Leaflet Control Geocoder.
После этого внедрите следующую функцию в код чтобы функция поиска была интегрирована в вашу карту.
Control.geocoder().addTo(map);
Сохраните файл и закройте его. После этого обновите страницу карты в вашем браузере, и в правом верхнем углу появится кнопка поиска.

По умолчанию 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/'>
Начальное положение установлено в правом верхнем углу. При желании вы можете переместить его в левый верхний угол.
Вы можете включить следующий код для обратного геокодирования. При нажатии посетителем на точку на карте отобразится название этого адреса.
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 not acceptable или CORS not allowed. Проверьте, что в конфигурации Apache установлен верный MIME-тип для.php. В некоторых случаях ошибку могут вызывать определённые строки в конфигурации.
AddType text/html.php
AddType application/json.php
После изменения MIME-типа перезапустите Apache для применения изменений.
sudo systemctl reload apache2
Способы обновления сервера базы данных PostgreSQL
Вот инструкции по обновлению PostgreSQL с версии 14 до версии 15 после выхода новой версии.
При выпуске новой версии PostgreSQL, вы можете обновиться для получения улучшений в производительности. Для этого выполните указанную команду, и пакетный менеджер apt установит самую актуальную версию PostgreSQL из репозитория apt. postgresql.org.
sudo apt update; sudo apt upgrade - y
Затем потребуется обновить текущие кластеры postgresql.Рекомендация: запустите сессию GNU Screen, чтобы избежать разрыва соединения, так как процесс обновления может занять продолжительное время.
screen
Откройте каталог /srv/nominatim/build.
cd /srv/nominatim/build/
Удалите все файлы и директории в данной папке.
sudo rm * - r
Удалите пакет под названием postgresql-server-dev-14.
sudo apt remove postgresql-server-dev-14
Установите пакет postgresql-server-dev-15 на вашу систему.
sudo apt remove postgresql-server-dev-15
Соберите Nomiatim из исходных файлов.
cmake /srv/nominatim/Nominatim-3.5.1 make
После этого укажите кластеры PostgreSQL.
sudo pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file 14 main 5432 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log 15 main 5433 online postgres /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log
PostgreSQL 14 работает на стандартном порту 5432, тогда как PostgreSQL 15 задействует порт 5433. Необходимо остановить сервер PostgreSQL.
sudo systemctl stop postgresql
Проверим состояние кластера ещё раз, выполнив команду: sudo pg_lsclusters. Все кластеры находятся в выключенном состоянии.
Ver Cluster Port Status Owner Data directory Log file 14 main 5432 down postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log 15 main 5433 down postgres /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log
Измените название кластера PostgreSQL 14 с main на latest_stable.
sudo pg_renamecluster 15 main latest_stable
Затем необходимо сократить размер shared_buffer в PostgreSQL.
sudo nano /etc/postgresql/14/main/postgresql.conf
Снизьте параметр, чтобы предотвратить возникновение нехватки памяти во время обновления. Например, я устанавливаю значение с 15 ГБ на 5 ГБ.
shared_buffers = 5GB
Сохраните изменения и закройте документ.
Далее произведите обновление устаревшего кластера PostgreSQL 14. Для этого необходимо скопировать базы данных из директории /var/lib/postgresql/14/main/ в директорию /var/lib/postgresql/15/main/ с использованием утилит pg_dump и pg_restore. Также будут перенесены конфигурационные файлы базы данных.
sudo pg_upgradecluster 14 main

Запустите базу данных PostgreSQL.
sudo systemctl start postgresql
Теперь убедитесь, что ваше приложение функционирует корректно. Если все в порядке, удалите прежний кластер.
sudo pg_dropcluster 14 main
Еще раз проверьте состояние кластера:
sudo pg_lsclusters
Если обновление прошло успешно, вы можете вернуть значение shared_buffer к исходному в файле /etc/postgresql/15/main/postgresql.conf.Не забудьте перезапустить PostgreSQL.

