V předchozím tutoriálu jsem vysvětlil proces vytváření vlastního dlaždicového serveru OSM na Ubuntu 20.04. Tento tutoriál vám ukáže, jak nastavit server Nominatim Geocoding na Ubuntu 20.04. Nominatim poskytuje funkci vyhledávání pro OpenStreetMap, takže pokud návštěvník zadá adresu do vyhledávacího pole, vrátí se zeměpisná šířka/délka pro danou adresu.
Poznámka: Pokud se chystáte nastavit Nominatim pro celou planetu, pak byste měli vytvořit další server pro Nominatim, protože bude také vyžadovat 64 GB RAM a 1 TB SSD.
Krok 1:Sestavení Nominatim ze zdroje
Nainstalujte balíčky závislostí pro sestavení Nominatim.
sudo apt updatesudo 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 phpl php-pgs php php-intl php-cgi phpunit php-codesniffer python3-setuptools python3-dev python3-pip python3-psycopg2 python3-tidylib python3-behave python-pytest pylint git git clang-devidy postVytvořte
nominatim
uživatel. (Pro tohoto uživatele není třeba vytvářet heslo.)sudo useradd -d /srv/nominatim -s /bin/bash -m nominatimZměňte na
/srv/nominatim/
adresář.cd /srv/nominatim/Udělte oprávnění svému vlastnímu uživatelskému účtu.
sudo apt install aclsudo setfacl -R -m u:username:rwx /srv/nominatim/Stáhněte si Nominatim z oficiálních stránek.
wget https://nominatim.org/release/Nominatim-3.5.1.tar.bz2Extrahujte tarball.
tar xvf Nominatim-3.5.1.tar.bz2Vytvořte
build
adresář.sestavení mkdirPřejděte do tohoto adresáře a nakonfigurujte prostředí sestavení.
cd buildcmake /srv/nominatim/Nominatim-3.5.1Zkompilujte zdrojový kód.
vyrobit
Krok 2:Konfigurace Nominatim
Výchozí konfigurační soubor pro Nominatim je
/srv/nominatim/build/settings/settings.php
. Můžeme vytvořitlocal.php
soubor a přidejte tam naše úpravy.sudo nano /srv/nominatim/build/settings/local.phpPřidejte do souboru následující řádky.
Výše uvedená konfigurace definuje
- Cesta instance Nominatim vzhledem k vašemu dlaždicovému serveru.
- Výchozí zeměpisná šířka, délka a úroveň přiblížení.
- Adresa URL vašeho dlaždicového serveru OSM. Ve výchozím nastavení Nominatim používá veřejný
https://tile.openstreetmap.org
dlaždicový server. Zde používám svůj vlastní dlaždicový server.
Můžete se také podívat na /srv/nominatim/build/settings/settings.php
soubor a v případě potřeby přidejte vlastní přizpůsobení. Pokud se například chystáte importovat velký soubor dat (Evropa, Severní Amerika, planeta atd.), je dobrým zvykem povolit ukládání umístění uzlů v plochých uzlových bodech, takže souřadnice uzlů budou uloženy v jednoduchém souboru namísto databáze, což vám ušetří čas při importu a úložiště na disku.
@define('CONST_Osm2pgsql_Flatnode_File', '/srv/nominatim/flatnode.file');
Uložte a zavřete soubor.
Krok 3:Instalace a konfigurace PostgreSQL
Poznámka :Pokud jsou dlaždicový server OSM a Nominatim nainstalovány na stejném serveru, můžete tento krok přeskočit, protože jste to již provedli při nastavování dlaždicového serveru OSM.
Pro ukládání mapových dat použijeme PostgreSQL. PostGIS je geoprostorové rozšíření PostgreSQL. Spusťte následující příkazy a nainstalujte je.
sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3
Pak musíme vyladit PostgreSQL pro maximální výkon. Upravte hlavní konfigurační soubor.
sudo nano /etc/postgresql/12/main/postgresql.conf
Najděte v tomto souboru následující parametry a použijte následující hodnoty.
shared_buffers =15GBwork_mem =1GBmaintenance_work_mem =10GBeffective_cache_size =24GBsynchronous_commit =offmax_wal_size =1GBcheckpoint_timeout =10mincheckpoint_completion_target =0,9fsync =offfull =_page_writesUložte a zavřete soubor. Restartujte PostgreSQL, aby se změny projevily.
sudo systemctl restart postgresqlPamatujte, že byste měli zapnout
fsync
afull_page_write
po importu databáze OSM, jinak riskujete poškození databáze.Ve výchozím nastavení by se PostgreSQL snažil používat velké stránky v RAM. Linux však ve výchozím nastavení nepřiděluje velké stránky. Zkontrolujte ID procesu PostgreSQL.
sudo head -1 /var/lib/postgresql/12/main/postmaster.pidUkázkový výstup:
7031Poté zkontrolujte hodnotu VmPeak tohoto ID procesu.
grep ^VmPeak /proc/7031/statusUkázkový výstup:
VmPeak:16282784 kBToto je maximální velikost paměti, kterou bude PostgreSQL používat. Nyní zkontrolujte velikost velké stránky v Linuxu.
cat /proc/meminfo | grep -i obrovskýUkázkový výstup:
AnonHugePages:0 kBShmemHugePages:0 kBHugePages_Total:0HugePages_Free:0HugePages_Rsvd:0HugePages_Surp:0Obrovská velikost stránky:2048 kB Hugetlb:0 kBMůžeme si spočítat, kolik velkých stránek potřebujeme. Vydělte hodnotu VmPeak velikostí velké stránky:16282784 kB / 2048 kB =7950. Upravit
/etc/sysctl.conf
soubor.sudo nano /etc/sysctl.confPřidejte následující řádek a přidělte 7950 velkých stránek.
vm.nr_hugepages =7950Uložte a zavřete soubor. Poté použijte změny.
sudo sysctl -pPokud znovu zkontrolujete informace o paměti,
cat /proc/meminfo | grep -i obrovskýVidíme, že je k dispozici 7950 obrovských stránek.
AnonHugePages:0 kBShmemHugePages:0 kBHugePages_Total:7950HugePages_Free:7950HugePages_Rsvd:0HugePages_Surp:0Hugepagesize:2048 kBChcete-li používat velké stránky, restartujte PostgreSQL.
sudo systemctl restart postgresqlKrok 4:Import databáze OSM
Stáhněte si soubor výpisu důležitosti Wikipedie, který zlepší kvalitu výsledků vyhledávání Nomiatim.
cd /srv/nominatim/Nominatim-3.5.1/datawget https://www.nominatim.org/data/wikimedia-importance.sql.gzStáhněte si data poštovních směrovacích čísel USA a Spojeného království.
wget https://www.nominatim.org/data/us_postcode_data.sql.gzwget https://www.nominatim.org/data/gb_postcode_data.sql.gzStáhněte si datový soubor s kódem země.
wget -O country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gzPoté si musíte stáhnout soubor OSM a importovat jej do PostgreSQL. Potřebný výpis si můžete stáhnout na http://download.geofabrik.de. Soubor PBF můžete také použít během procesu nastavení dlaždicového serveru.
Vytvořte
www-data
uživatel v PostgreSQL, takže webový server bude mít přístup k databázi pouze pro čtení.sudo -u postgres createuser www-dataUdělte oprávnění
postgres
uživatel.sudo setfacl -R -m u:postgres:rwx /srv/nominatim/Přepněte na
postgres
uživatel.sudo -u postgres -iA spusťte následující příkaz pro import OSM extraktů do 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
Po importu databáze začne proces indexování. Celkem je 30 pozic.
Po dokončení spusťte následující příkaz pro ověření.
/srv/nominatim/build/utils/check_import_finished.php
Ukončete
postgres
uživatel.exitKrok 5:Nastavení Apache
Pokud je Nominatim nainstalován na dlaždicovém serveru OSM, upravte konfigurační soubor dlaždicového serveru.
sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.confPřidejte následující řádky mezi
VirtualHost
značky.Možnosti FollowSymLinks MultiViews AddType application/json .php DirectoryIndex search.php Vyžadovat udělení všech alias /nominatim /srv/nominatim/build/websiteUložte a zavřete soubor. Poté znovu načtěte Apache.
sudo systemctl reload apache2Pokud nastavujete Nominatim na samostatném serveru, musíte nainstalovat Apache a 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-readlineVytvořte virtuálního hostitele pro Nominatim.
sudo nano /etc/apache2/sites-enabled/nominatim.confPřidejte do tohoto souboru následující řádky.
ServerName nominatim.example.com DocumentRoot /srv/nominatim/build/website Možnosti FollowSymLinks MultiViews AddType application/json .php DirectoryIndex search.php Vyžadovat všechny udělené alias /nominatim /srv/nominatim/build/website ErrorLog ${APACHE_LOG_DIR}/nominatim_error.log Varování LogLevel CustomLog ${APACHE_LOG_DIR}/nominatim_access.log kombinovanéUložte a zavřete soubor. Poté restartujte Apache.
sudo systemctl restart apache2Nyní navštivte
https://tile.yourdomain.com/nominatim
. Zobrazí se vaše instance Nomiatim.
Soubor CSS se nachází na adrese
/srv/nominatim/build/website/css/search.css
, pokud chcete upravit vzhled.Krok 6:Aktualizace databáze Nominatim
Aby byla databáze Nominatim aktuální, musíme nainstalovat
Pyosmium
. Je k dispozici z výchozího softwarového úložiště, ale doporučujeme nainstalovat nejnovější verzi pomocí pip3.instalace sudo pip3 osmiumTím se nainstaluje binární
/usr/local/bin/pyosmium-get-changes
. Upravte konfigurační soubor Nominatim.sudo nano /srv/nominatim/build/settings/local.phpPřidejte následující řádek k určení umístění
pyosmium-get-changes
.@define('CONST_Pyosmium_Binary', '/usr/local/bin/pyosmium-get-changes');Dále musíme Nominatim sdělit, kde stáhnout aktualizace. Ve výchozím nastavení je nakonfigurováno pro stahování aktualizací z
https://planet.openstreetmap.org/replication/minute
. Pokud jste si stáhli soubor OSM PBF z geofabrik.de, pak je lepší stahovat aktualizace také odtud.Chcete-li najít aktualizační URL pro svou vlastní mapu, přejděte na https://download.geofabrik.de/ a vyhledejte svůj region. Poté najděte adresu URL pro
.osc.gz
soubor.
Tato adresa URL je adresa URL aktualizace.
Přidejte následující řádek do
/srv/nominatim/build/settings/local.php
soubor. Musíte použít vlastní adresu URL pro aktualizaci.// základní adresa URL replikační služby@define('CONST_Replication_Url', 'http://download.geofabrik.de/europe/great-britain-updates');// Jak často upstream publikuje diffs@define(' CONST_Replication_Update_Interval', '86400');// Jak dlouho bude režim spánku, pokud dosud nebyla nalezena žádná aktualizace@define('CONST_Replication_Recheck_Interval', '900');Uložte a zavřete soubor. Udělte oprávnění
postgres
uživatel.sudo setfacl -R -m "u:postgres:rwx" /srv/nominatim/build/Poté přejděte k uživateli postgres.
sudo -u postgres -iInicializujte proces aktualizace.
/srv/nominatim/build/utils/update.php --init-updatesAktualizujte databázi Nominatim.
/srv/nominatim/build/utils/update.php --import-osmosis-allKrok 7:Nastavení úlohy Cron pro automatickou aktualizaci
Upravte soubor Crontab uživatele root.
sudo crontab -ePřidejte do tohoto souboru následující řádek.
@daily sudo -u postgres /srv/nominatim/build/utils/update.php --import-osmosis-allUložte a zavřete soubor. Pokud nechcete automaticky aktualizovat databázi Nominatim, jednoduše odstraňte výše uvedený řádek ze souboru Crontab.
Jak přidat funkci vyhledávání do kluzké mapy
Předpokládám, že vaše kluzká mapa je zobrazena pomocí knihovny Leaflet JavaScript. Chcete-li do mapy přidat funkci vyhledávání, musíte použít plugin pro geokódování Leaflet. Ukážu vám, jak používat Leaflet Control Geocoder. Je to vlastně velmi jednoduché.
Předpokládejme, že jste k zobrazení své kluzké mapy použili následující HTML kód.
Můj první osm Nyní musíte do záhlaví HTML přidat následující dva řádky, abyste mohli používat Geocoder pro ovládání letáku plugin.
Poté přidejte následující funkci do
<script>...</script>
kód, takže funkce vyhledávání bude přidána do vaší mapy.L.Control.geocoder().addTo(map);Finální HTML kód vypadá takto:
Můj první osm Uložte a zavřete soubor. Poté znovu načtěte mapu ve svém webovém prohlížeči, v pravém horním rohu by se mělo zobrazit tlačítko vyhledávání.
Ve výchozím nastavení Leaflet Control Geocoder používá veřejný
https://nominatim.openstreetmap.org
služba geokódování. Chcete-li, aby používal vaši vlastní geokódovací službu Nominatim, odstraňte následující řádek.L.Control.geocoder().addTo(map);Místo toho přidejte následující řádky. Nahraďte URL adresou URL vaší geokódovací služby Nominatim. Nezapomeňte, že byste neměli vynechávat koncové lomítko.
var geocoder =L.Control.Geocoder.nominatim({serviceUrl:'https://tile.yourdomain.com/nominatim/'}); if (URLSearchParams &&location.search) { // parse /?geocoder=nominatim z URL var params =new URLSearchParams(location.search); var geocoderString =params.get('geocoder'); if (geocoderString &&L.Control.Geocoder[geocoderString]) { console.log('Using geocoder', geocoderString); geocoder =L.Control.Geocoder[geocoderString](); } else if (geocoderString) { console.warn('Nepodporovaný geokodér', geocoderString); } } var control =L.Control.geocoder({ dotaz:'Sem zadejte adresu', zástupný symbol:'Hledejte zde...', geokodér:geocoder, pozice:'nahoře' }).addTo(mapa); var marker; setTimeout(function() { control.setQuery('Sem zadejte adresu'); }, 12000);Výchozí pozice je
topright
. Můžete jej změnit natopleft
pokud chcete.Můžete také přidat následující kód pro zpětné geokódování. Když návštěvník klikne na bod na mapě, zobrazí se název této adresy.
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(); } } }); });Uložte a zavřete soubor. Poté znovu načtěte mapu ve svém webovém prohlížeči.
Zlepšit přesnost zpětného vyhledávání
V Nominatim jsou dva typy vyhledávání:
- vyhledávání vpřed aka geocoding, vrací zeměpisnou šířku a délku pro adresu
- zpětné vyhledávání , neboli reverzní geokódování, vrací adresu pro zeměpisnou šířku a délku, tj. když návštěvník klikne na bod na mapě.
Pokud provedete zpětné vyhledávání, špendlík a vyskakovací okno nejsou v bezprostřední blízkosti pozice na mapě, na kterou jste klikli, musíte zvýšit úroveň přiblížení. map.getZoom() funkce získá aktuální zobrazení mapy , která se nastavuje pomocí setView() fungovat takto
var map =L.map('map').setView([54,1],6);
Úroveň přiblížení je nastavena na 6
, což bude poskytovat špatnou přesnost pro zpětné vyhledávání. Můžeme pevně zakódovat úroveň přiblížení pro zpětné vyhledávání takto:
geocoder.reverse(e.latlng, map.options.crs.scale(21 ), funkce (výsledky)
tj. změňte map.getZoom() do 21. Maximální úroveň přiblížení pro zpětné vyhledávání je 21. Můžete si vybrat jinou úroveň přiblížení, aby vyhovovala vašim potřebám.
Odstraňování problémů
Pokud funkce vyhledávání na vaší mapě nefunguje, můžete zkontrolovat konzoli webového prohlížeče a zjistit, co se pokazilo. Některým lidem se může zobrazit 406 nepřijatelné nebo CORS není povoleno chyba. Ujistěte se, že jste nastavili správný typ MIME pro .php
v konfiguračním souboru Apache. Někteří lidé mohou mít následující řádek, který může způsobit výše uvedené chyby.
AddType text/html .php
Mělo by to být
AddType application/json .php
Po změně typu MIME. Znovu načtěte Apache, aby se změny projevily.
sudo systemctl reload apache2