GNU/Linux >> Linux の 問題 >  >> Ubuntu

Ubuntu20.04でOSMNominatimGeocodingServerをセットアップする

前のチュートリアルでは、Ubuntu20.04で独自のOSMタイルサーバーを構築するプロセスについて説明しました。このチュートリアルでは、Ubuntu20.04でNominatimジオコーディングサーバーを設定する方法を説明します。 NominatimはOpenStreetMapの検索機能を提供するため、訪問者が検索ボックスに住所を入力すると、その住所の緯度/経度の場所が返されます。

注: 地球全体にNominatimをセットアップする場合は、64GBのRAMと1TBのSSDも必要になるため、Nominatim用に別のサーバーを起動する必要があります。

ステップ1:ソースからノミナティムを構築する

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 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-12

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

tarballを抽出します。

tar xvf Nominatim-3.5.1.tar.bz2

buildを作成します ディレクトリ。

mkdir build

このディレクトリに移動し、ビルド環境を構成します。

cd build

cmake /srv/nominatim/Nominatim-3.5.1

ソースコードをコンパイルします。

make

ステップ2:ノミナティムを構成する

Nominatimのデフォルトの構成ファイルは/srv/nominatim/build/settings/settings.phpです。 。 local.phpを作成できます ファイルを作成し、そこに変更を追加します。

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

ファイルに次の行を追加します。

<?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');

上記の構成は定義します

  • タイルサーバーを基準にしたNominatimインスタンスのパス。
  • デフォルトの緯度、経度、ズームレベル。
  • OSMタイルサーバーのURL。デフォルトでは、Nominatimはパブリックhttps://tile.openstreetmap.orgを使用します タイルサーバー。ここでは、独自のタイルサーバーを使用しています。

/srv/nominatim/build/settings/settings.phpもご覧ください。 必要に応じて、ファイルを作成し、独自のカスタマイズを追加します。たとえば、大規模なデータセット(ヨーロッパ、北米、惑星など)をインポートする場合は、ノードの場所のフラットノードストレージを有効にすることをお勧めします。これにより、ノードの座標は、データベースを使用して、インポート時間とディスクストレージを節約できます。

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

ファイルを保存して閉じます。

ステップ3:PostgreSQLのインストールと構成

:OSMタイルサーバーとNominatimが同じサーバーにインストールされている場合は、OSMタイルサーバーのセットアップ時にすでにこれを行っているため、この手順をスキップできます。

マップデータの保存にはPostgreSQLを使用します。 PostGISはPostgreSQLの地理空間拡張です。次のコマンドを実行してインストールします。

sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3

次に、パフォーマンスを最大化するためにPostgreSQLを調整する必要があります。メインの構成ファイルを編集します。

sudo nano /etc/postgresql/12/main/postgresql.conf

このファイルで次のパラメータを検索し、次の値を使用します。

shared_buffers = 15GB
work_mem = 1GB
maintenance_work_mem = 10GB
effective_cache_size = 24GB
synchronous_commit = off
max_wal_size = 1GB
checkpoint_timeout = 10min
checkpoint_completion_target = 0.9
fsync = off
full_page_writes = off

ファイルを保存して閉じます。変更を有効にするためにPostgreSQLを再起動します。

sudo systemctl restart postgresql

fsyncをオンにする必要があることに注意してください およびfull_page_write OSMデータベースをインポートした後、またはデータベースを破損するリスクがあります。

デフォルトでは、PostgreSQLはRAM内の巨大なページを使用しようとします。ただし、Linuxはデフォルトでは巨大なページを割り当てません。 PostgreSQLのプロセスIDを確認してください。

sudo head -1 /var/lib/postgresql/12/main/postmaster.pid

サンプル出力:

7031

次に、このプロセスIDのVmPeak値を確認します。

grep ^VmPeak /proc/7031/status

サンプル出力:

VmPeak: 16282784 kB

これは、PostgreSQLで使用されるピークメモリサイズです。次に、Linuxの巨大なページのサイズを確認します。

cat /proc/meminfo | grep -i huge

サンプル出力:

AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB

必要な巨大ページの数を計算できます。 VmPeak値を巨大なページのサイズで除算します:16282784 kB / 2048kB=7950。/etc/sysctl.confを編集します。 ファイル。

sudo nano /etc/sysctl.conf

次の行を追加して、7950の巨大なページを割り当てます。

vm.nr_hugepages = 7950

ファイルを保存して閉じます。次に、変更を適用します。

sudo sysctl -p

meminfoをもう一度確認すると、

cat /proc/meminfo | grep -i huge

利用可能な7950の巨大なページがあることがわかります。

AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:    7950
HugePages_Free:     7950
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

PostgreSQLを再起動して、巨大なページを使用します。

sudo systemctl restart postgresql

ステップ4: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のユーザーであるため、Webサーバーはデータベースへの読み取り専用アクセス権を持ちます。

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

データベースをインポートした後、インデックス作成プロセスが開始されます。全部で30のランクがあります。

完了したら、次のコマンドを実行して確認します。

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

postgresを終了します ユーザー。

exit

ステップ5:Apacheを設定する

NominatimがOSMタイルサーバーにインストールされている場合は、タイルサーバー構成ファイルを編集します。

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

VirtualHostの間に次の行を追加します タグ。

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

ファイルを保存して閉じます。次に、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

このファイルに次の行を追加します。

<VirtualHost *:80>
    ServerName nominatim.example.com

    DocumentRoot /srv/nominatim/build/website

    <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

    ErrorLog ${APACHE_LOG_DIR}/nominatim_error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/nominatim_access.log combined
</VirtualHost>

ファイルを保存して閉じます。次に、Apacheを再起動します。

sudo systemctl restart apache2

次に、https://tile.yourdomain.com/nominatimにアクセスします 。 Nomiatimインスタンスが表示されます。

CSSファイルは/srv/nominatim/build/website/css/search.cssにあります。 、外観をカスタマイズしたい場合。

ステップ6: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から更新をダウンロードするように構成されています 。 geofabrik.deからOSMPBFファイルをダウンロードした場合は、そこからアップデートもダウンロードすることをお勧めします。

自分の地図の更新URLを見つけるには、https://download.geofabrik.de/にアクセスして、お住まいの地域を見つけてください。次に、.osc.gzのURLを見つけます ファイル。

このURLは更新URLです。

/srv/nominatim/build/settings/local.phpに次の行を追加します ファイル。独自の更新URLを使用する必要があります。

// 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');

ファイルを保存して閉じます。 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

ステップ7:自動更新用のcronジョブの設定

rootユーザーのCrontabファイルを編集します。

sudo crontab -e

このファイルに次の行を追加します。

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

ファイルを保存して閉じます。 Nominatimデータベースを自動的に更新したくない場合は、Crontabファイルから上記の行を削除するだけです。

スリッピーマップに検索機能を追加する方法

滑りやすい地図はLeafletJavaScriptライブラリを使用して表示されていると思います。マップに検索機能を追加するには、Leafletジオコーディングプラグインを使用する必要があります。 LeafletControlGeocoderの使用方法を紹介します。実はとてもシンプルです。

次のHTMLコードを使用して、滑りやすい地図を表示したとします。

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

ここで、 Leaflet Control Geocoder を使用するには、HTMLヘッダーに次の2行を追加する必要があります。 プラグイン。

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

次に、次の関数を<script>...</script>に追加します。 検索機能がマップに追加されるようにコードを記述します。

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

最終的なHTMLコードは次のようになります:

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

ファイルを保存して閉じます。次に、ウェブブラウザに地図を再読み込みすると、右上隅に検索ボタンが表示されます。

デフォルトでは、 Leaflet Control Geocoder パブリックhttps://nominatim.openstreetmap.orgを使用します ジオコーディングサービス。独自のNominatimジオコーディングサービスを使用するには、次の行を削除します。

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

代わりに次の行を追加してください。 URLをNominatimジオコーディングサービスのURLに置き換えます。末尾のスラッシュを省略しないでください。

      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: 'Type Address here',
        placeholder: 'Search here...',
        geocoder: geocoder,
        position: 'topright'
      }).addTo(map);
      var marker;

      setTimeout(function() {
        control.setQuery('Type Address here');
      }, 12000);

デフォルトの位置はtoprighttopleftに変更できます よろしければ。

逆ジオコーディング用に次のコードを追加することもできます。訪問者が地図上のポイントをクリックすると、その住所の名前が表示されます。

      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には2つのタイプの検索があります:

  • 前方検索 別名ジオコーディング、住所の緯度と経度を返します
  • 逆検索 、別名逆ジオコーディングは、緯度と経度の住所を返します。つまり、訪問者が地図内のポイントをクリックしたときです。

逆検索を行う場合、マーカーピンとポップアップがクリックしたマップ上の位置のすぐ近くにないため、ズームレベルを上げる必要があります。 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に正しいMIMEタイプが設定されていることを確認してください Apache構成ファイル内。一部の人々は次の行を持っているかもしれません、それは上記のエラーを引き起こす可能性があります。

AddType text/html .php

あるべきです

AddType application/json .php

MIMEタイプを変更した後。変更を有効にするためにApacheをリロードします。

sudo systemctl reload apache2

Ubuntu
  1. Ubuntu /DebianLAMPサーバーをセットアップする方法

  2. Ubuntu20.04でリバースプロキシとしてNginxを設定する方法

  3. Ubuntu16.04でTeamSpeakサーバーをセットアップする方法

  1. Ubuntu18.04にSquidプロキシサーバーをセットアップしてインストールする方法

  2. Ubuntu22.04でWireGuardを設定する方法

  3. Ubuntu20.04でNFSサーバーとクライアントをセットアップする方法

  1. Ubuntu18.04でOpenVPNサーバーをセットアップする方法

  2. Ubuntu20.04でNginxサーバーブロックを設定する方法

  3. Ubuntu20.04でCUPSプリントサーバーを設定する方法