GNU/Linux >> Znalost Linux >  >> Ubuntu

Nastavte OSM Nominatim Geocoding Server na Ubuntu 20.04

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 post 

Vytvořte nominatim uživatel. (Pro tohoto uživatele není třeba vytvářet heslo.)

sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim

Změň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.bz2

Extrahujte tarball.

tar xvf Nominatim-3.5.1.tar.bz2

Vytvořte build adresář.

sestavení mkdir

Přejděte do tohoto adresáře a nakonfigurujte prostředí sestavení.

cd buildcmake /srv/nominatim/Nominatim-3.5.1

Zkompilujte 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řit local.php soubor a přidejte tam naše úpravy.

sudo nano /srv/nominatim/build/settings/local.php

Př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_writes 

Uložte a zavřete soubor. Restartujte PostgreSQL, aby se změny projevily.

sudo systemctl restart postgresql

Pamatujte, že byste měli zapnout fsync a full_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.pid

Ukázkový výstup:

7031

Poté zkontrolujte hodnotu VmPeak tohoto ID procesu.

grep ^VmPeak /proc/7031/status

Ukázkový výstup:

VmPeak:16282784 kB

Toto 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 kB

Můž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.conf

Přidejte následující řádek a přidělte 7950 velkých stránek.

vm.nr_hugepages =7950

Uložte a zavřete soubor. Poté použijte změny.

sudo sysctl -p

Pokud 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 kB

Chcete-li používat velké stránky, restartujte PostgreSQL.

sudo systemctl restart postgresql

Krok 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.gz

Stá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.gz

Stáhněte si datový soubor s kódem země.

wget -O country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz

Poté 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-data

Udě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 -i

A 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.

exit

Krok 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.conf

Př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šechalias /nominatim /srv/nominatim/build/website

Uložte a zavřete soubor. Poté znovu načtěte Apache.

sudo systemctl reload apache2

Pokud 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-readline

Vytvořte virtuálního hostitele pro Nominatim.

sudo nano /etc/apache2/sites-enabled/nominatim.conf

Př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 apache2

Nyní 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 osmium

Tím se nainstaluje binární /usr/local/bin/pyosmium-get-changes . Upravte konfigurační soubor Nominatim.

sudo nano /srv/nominatim/build/settings/local.php

Př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 -i

Inicializujte proces aktualizace.

/srv/nominatim/build/utils/update.php --init-updates

Aktualizujte databázi Nominatim.

/srv/nominatim/build/utils/update.php --import-osmosis-all

Krok 7:Nastavení úlohy Cron pro automatickou aktualizaci

Upravte soubor Crontab uživatele root.

sudo crontab -e

Přidejte do tohoto souboru následující řádek.

@daily sudo -u postgres /srv/nominatim/build/utils/update.php --import-osmosis-all

Ulož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 na topleft 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

Ubuntu
  1. Jak nastavit Ubuntu/Debian LAMP Server

  2. Jak nastavit Nginx jako reverzní proxy na Ubuntu 20.04

  3. Jak nastavit TeamSpeak Server na Ubuntu 16.04

  1. Jak nastavit a nainstalovat Squid Proxy Server na Ubuntu 18.04

  2. Jak nastavit WireGuard na Ubuntu 22.04

  3. Jak nastavit server a klienta NFS na Ubuntu 20.04

  1. Jak nastavit server OpenVPN na Ubuntu 18.04

  2. Jak nastavit bloky serveru Nginx na Ubuntu 20.04

  3. Jak nastavit tiskový server CUPS na Ubuntu 20.04