GNU/Linux >> Belajar Linux >  >> Debian

Cara Mengatur Server Geocoding OSM Nominatim di Debian 10

Dalam tutorial sebelumnya, saya menjelaskan proses membangun server ubin OSM Anda sendiri di Debian 10. Tutorial ini akan menunjukkan kepada Anda cara mengatur server Geocoding Nominatim di Debian 10. Nominatim menyediakan fungsionalitas pencarian untuk OpenStreetMap, jadi jika pengunjung masuk alamat di kotak pencarian, lokasi lintang/bujur untuk alamat tersebut akan dikembalikan.

Langkah 1:Bangun Nominatim Dari Sumber

Instal paket ketergantungan untuk membangun 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

Buat nominatim pengguna. (Tidak perlu membuat kata sandi untuk pengguna ini.)

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

Ubah ke /srv/nominatim/ direktori.

cd /srv/nominatim/

Berikan izin ke akun pengguna Anda sendiri.

sudo apt install acl

sudo setfacl -R -m u:username:rwx /srv/nominatim/

Unduh Nominatim dari situs resminya.

wget https://nominatim.org/release/Nominatim-3.5.1.tar.bz2

Ekstrak tarballnya.

tar xvf Nominatim-3.5.1.tar.bz2

Buat build direktori.

mkdir build

Ubah ke direktori ini dan konfigurasikan lingkungan build.

cd build

cmake /srv/nominatim/Nominatim-3.5.1

Kompilasi kode sumber.

make

Langkah 2:Konfigurasi Nominatim

File konfigurasi default untuk Nominatim adalah /srv/nominatim/build/settings/settings.php . Kita dapat membuat local.php file dan tambahkan modifikasi kami di sana.

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

Tambahkan baris berikut dalam file.

<?php
 @define('CONST_Website_BaseURL', '/nominatim/');
 @define('CONST_Default_Lat', 55.0);
 @define('CONST_Default_Lon', 1.0);
 @define('CONST_Default_Zoom', 6);
 @define('CONST_Map_Tile_URL', 'https://tile.linuxbabe.com/osm/{z}/{x}/{y}.png');

Konfigurasi di atas mendefinisikan

  • Jalur instance Nominatim relatif terhadap server ubin Anda.
  • Lintang, bujur, dan tingkat zoom default.
  • URL server ubin OSM Anda. Secara default, Nominatim menggunakan openstreetmap.org publik server ubin. Di sini saya menggunakan server ubin saya sendiri.

Anda juga dapat melihat /srv/nominatim/build/settings/settings.php file dan tambahkan kustomisasi Anda sendiri jika diperlukan. Misalnya, jika Anda akan mengimpor kumpulan data besar (Eropa, Amerika Utara, planet, dll.), sebaiknya aktifkan penyimpanan simpul datar dari lokasi simpul, jadi koordinat simpul akan disimpan dalam file sederhana alih-alih file database, menghemat waktu impor dan penyimpanan disk.

@define('CONST_Osm2pgsql_Flatnode_File', '/srv/nominatim/flatnode.file');

Simpan dan tutup file.

Langkah 3:Impor Basis Data OSM

Unduh file dump kepentingan Wikipedia, yang akan meningkatkan kualitas hasil pencarian Nomiatim.

cd /srv/nominatim/Nominatim-3.5.1/data

wget https://www.nominatim.org/data/wikimedia-importance.sql.gz

Unduh data kode pos AS dan Inggris.

wget https://www.nominatim.org/data/us_postcode_data.sql.gz

wget https://www.nominatim.org/data/gb_postcode_data.sql.gz

Unduh file data kode negara.

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

Kemudian Anda perlu mengunduh file OSM dan mengimpornya ke PostgreSQL. Anda dapat pergi ke http://download.geofabrik.de untuk mengunduh ekstrak yang Anda butuhkan. Anda juga dapat menggunakan file PBF selama proses penyiapan server ubin.

Buat www-data pengguna di PostgreSQL, sehingga server web akan memiliki akses read-only ke database.

sudo -u postgres createuser www-data

Berikan izin ke postgres pengguna.

sudo setfacl -R -m u:postgres:rwx /srv/nominatim/

Beralih ke postgres pengguna.

sudo -u postgres -i

Dan jalankan perintah berikut untuk mengimpor ekstrak OSM ke 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

Setelah mengimpor database, proses pengindeksan akan dimulai.

Setelah selesai, jalankan perintah berikut untuk memverifikasi.

/srv/nominatim/build/utils/check_import_finished.php

Keluar dari postgres pengguna.

exit

Langkah 4:Siapkan Apache

Edit file konfigurasi server ubin.

sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf

Tambahkan baris berikut di antara VirtualHost tag.

<Directory "/srv/nominatim/build/website">
  Options FollowSymLinks MultiViews
  AddType application/json   .php
  DirectoryIndex search.php
  Require all granted
</Directory>

alias /nominatim /srv/nominatim/build/website

Simpan dan tutup file. Kemudian muat ulang Apache.

sudo systemctl reload apache2

Sekarang kunjungi https://tile.yourdomain.com/nominatim . Anda akan melihat instance Nomiatim Anda.

File CSS terletak di /srv/nominatim/build/website/css/search.css , jika Anda ingin menyesuaikan tampilan.

Perbarui Basis Data Nominatim

Untuk menjaga agar database Nominatim tetap mutakhir, kita perlu menginstal Pyosmium . Ini tersedia dari repositori perangkat lunak default, tetapi disarankan untuk menginstal versi terbaru menggunakan pip3.

sudo pip3 install osmium

Ini akan menginstal /usr/local/bin/pyosmium-get-changes biner . Edit file konfigurasi Nominatim.

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

Tambahkan baris berikut untuk menentukan lokasi pyosmium-get-changes .

@define('CONST_Pyosmium_Binary', '/usr/local/bin/pyosmium-get-changes');

Selanjutnya, kami perlu memberi tahu Nominatim tempat mengunduh pembaruan. Secara default, ini dikonfigurasi untuk mengunduh pembaruan dari https://planet.openstreetmap.org/replication/minute . Jika Anda mengunduh file OSM PBF dari geofabrik.de, sebaiknya unduh juga pembaruan dari sana.

Untuk menemukan URL pembaruan untuk peta Anda sendiri, buka https://download.geofabrik.de/ dan temukan wilayah Anda. Kemudian temukan URL untuk .osc.gz berkas.

URL ini adalah URL pembaruan.

Tambahkan baris berikut di /srv/nominatim/build/settings/local.php mengajukan. Anda harus menggunakan URL pembaruan Anda sendiri.

// base URL of the replication service
@define('CONST_Replication_Url', 'http://download.geofabrik.de/europe/great-britain-updates');
// How often upstream publishes diffs
@define('CONST_Replication_Update_Interval', '86400');
// How long to sleep if no update found yet
@define('CONST_Replication_Recheck_Interval', '900');

Simpan dan tutup file. Berikan izin ke postgres pengguna.

sudo setfacl -R -m "u:postgres:rwx" /srv/nominatim/build/

Kemudian beralih ke postgres pengguna.

sudo -u postgres -i

Inisialisasi proses pembaruan.

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

Perbarui basis data Nominatim.

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

Siapkan Cron Job Untuk Pembaruan Otomatis

Edit file Crontab pengguna root.

sudo crontab -e

Tambahkan baris berikut dalam file ini.

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

Simpan dan tutup file.

Cara Menambahkan Fungsi Pencarian ke Slippy Map

Saya berasumsi peta slippy Anda ditampilkan menggunakan perpustakaan JavaScript Leaflet. Untuk menambahkan fungsionalitas pencarian ke peta Anda, Anda perlu menggunakan plugin geocoding Leaflet. Saya akan menunjukkan cara menggunakan Geocoder Kontrol Leaflet. Sebenarnya sangat sederhana.

Misalkan Anda menggunakan kode HTML berikut untuk menampilkan peta slippy Anda.

<html>
    <head>
        <meta charset="UTF-8">
        <title>My first osm</title>
        <link rel="stylesheet" type="text/css" href="leaflet.css"/>
        <script type="text/javascript" src="leaflet.js"></script>
        <style>
           #map{width:100%;height:100%}
        </style>
    </head>

    <body>
        <div id="map"></div>
        <script>
           var map = L.map('map').setView([54,1],6);
           L.tileLayer('https://tile.yourdomain.com/osm/{z}/{x}/{y}.png',{maxZoom:19}).addTo(map);  
         </script>
   </body>
</html>

Sekarang Anda perlu menambahkan dua baris berikut di header HTML untuk menggunakan Leaflet Control Geocoder pengaya.

<link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" />
<script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>

Kemudian tambahkan fungsi berikut ke <script>...</script> kode sehingga fungsi pencarian akan ditambahkan ke peta Anda.

L.Control.geocoder().addTo(map);

Kode HTML terakhir terlihat seperti ini:

<html>
    <head>
        <meta charset="UTF-8">
        <title>My first osm</title>
        <link rel="stylesheet" type="text/css" href="leaflet.css"/>     
        <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" />
        <script type="text/javascript" src="leaflet.js"></script>
        <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
        <style>
           #map{width:100%;height:100%}
        </style>
    </head>

    <body>
        <div id="map"></div>
        <script>
           var map = L.map('map').setView([54,1],6);
           L.tileLayer('https://tile.yourdomain.com/osm/{z}/{x}/{y}.png',{maxZoom:19}).addTo(map); 
           L.Control.geocoder().addTo(map);
         </script>
   </body>
</html>

Simpan dan tutup file. Kemudian muat ulang peta di browser web Anda, Anda akan melihat tombol pencarian di sudut kanan atas.

Secara default, Leaflet Control Geocoder menggunakan https://nominatim.openstreetmap.org publik layanan geocoding. Untuk membuatnya menggunakan layanan geocoding Nominatim Anda sendiri, hapus baris berikut.

L.Control.geocoder().addTo(map);

Tambahkan baris berikut sebagai gantinya. Ganti URL dengan URL layanan geocoding Nominatim Anda. Perhatikan bahwa Anda tidak boleh meninggalkan garis miring.

      var geocoder = L.Control.Geocoder.nominatim({serviceUrl:'https://tile.yourdomain.com/nominatim/'});
      if (URLSearchParams && location.search) {
        // parse /?geocoder=nominatim from 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('Unsupported geocoder', geocoderString);
        }
      }

      var control = L.Control.geocoder({
        query: 'Moon',
        placeholder: 'Search here...',
        geocoder: geocoder
      }).addTo(map);
      var marker;

      setTimeout(function() {
        control.setQuery('Earth');
      }, 12000);

Anda juga dapat menambahkan kode berikut untuk geocoding terbalik. Saat pengunjung mengklik sebuah titik di peta, nama alamat tersebut akan muncul.

      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();
            }
          }
        });
      });

Simpan dan tutup file. Kemudian muat ulang peta di browser web Anda.

Meningkatkan Akurasi Pencarian Terbalik

Ada dua jenis pencarian di Nominatim:

  • teruskan pencarian, alias geocoding, mengembalikan garis lintang dan garis bujur untuk sebuah alamat
  • penelusuran terbalik , alias geocoding terbalik, mengembalikan alamat untuk garis lintang dan garis bujur, yaitu saat pengunjung mengeklik suatu titik di peta.

Jika Anda melakukan pencarian terbalik, pin penanda dan pop-up tidak berada di dekat posisi pada peta yang Anda klik, Anda perlu meningkatkan tingkat zoom. map.getZoom() fungsi akan mendapatkan tampilan peta saat ini , yang disetel dengan setView() berfungsi seperti itu

var map = L.map('map').setView([54,1],6);

Tingkat zoom disetel ke 6 , yang akan memberikan akurasi yang buruk untuk pencarian terbalik. Kami dapat membuat kode tingkat zoom untuk pencarian terbalik seperti ini:

geocoder.reverse(e.latlng, map.options.crs.scale(21), function(results)

yaitu mengubah map.getZoom() ke 21. Tingkat zoom maksimum untuk pencarian terbalik adalah 21. Anda dapat memilih tingkat zoom lain yang sesuai dengan kebutuhan Anda.

Pemecahan Masalah

Jika fungsi pencarian di peta Anda tidak berfungsi, Anda dapat memeriksa konsol browser web Anda untuk mencari tahu apa yang salah. Beberapa orang mungkin melihat 406 tidak dapat diterima atau CORS tidak diizinkan kesalahan. Pastikan Anda telah menyetel jenis MIME yang benar untuk .php dalam file konfigurasi Apache. Beberapa orang mungkin memiliki baris berikut, yang dapat menyebabkan kesalahan di atas.

AddType text/html .php

Seharusnya

AddType application/json .php

Setelah mengubah jenis MIME. Muat ulang Apache agar perubahan diterapkan.

sudo systemctl reload apache2

Debian
  1. Cara Mengatur Server Samba di Debian 10 Buster

  2. Cara mengatur server SFTP di Server Debian 11

  3. Cara Mengatur Server OpenVPN di Debian 10

  1. Cara Mengatur Server LAMP di Debian 10 Buster

  2. Cara Mengatur Server NFS di Debian 10 Buster

  3. Cara Mengatur Server LEMP di Debian 10 Buster

  1. Cara Menginstal Go di Debian 9

  2. Cara Mengatur Blok Server Nginx di Debian 9

  3. Cara Mengatur Server OpenVPN di Debian 9