#地址轉經緯度 #Nominatim #伺服器架設
這篇文章記錄如何利OMS-Nominatim進行離線地理編碼資料庫架設的步驟,主要參考文章為官方教學
文章目錄
[Nominatim]利用Nominatim資料庫實現離線地理編碼
先前筆者寫過兩篇文章說明如何利用現有的網路服務來將地址轉換成經緯度,介紹了常用的服務包括了Google Map API以及台灣的TGOS系統,還有如何採用Python進行爬蟲自動化轉換,有興趣的朋友可以看以下的文章,但對於轉換量大的使用者來說,Google API所費不貲,TGOS每日有限量轉換筆數,爬蟲操作則容易被網站鎖定,因此架設屬於自己的地理編碼資料庫就不受限制的進行轉換了,缺點則是對於台灣的門牌資料不如Google、TGOS等來得精細正確
步驟一:更新Ubuntu的套件庫以及安裝Nominatim依賴庫
Nominatim主要發行版本都是基於Linux系統的,這邊採用Ubuntu22版進行操作,如果採用Windows內建的WSL理論上也是可行的。
確保所有套件都是最新的,執行以下指令:
sudo apt update -qq
更新完成後可以開始裝 Nominatim 需要的所有套件:
sudo apt install -y build-essential cmake g++ libboost-dev libboost-system-dev \
libboost-filesystem-dev libexpat1-dev zlib1g-dev \
libbz2-dev libpq-dev liblua5.3-dev lua5.3 lua-dkjson \
nlohmann-json3-dev postgresql-14-postgis-3 \
postgresql-contrib-14 postgresql-14-postgis-3-scripts \
php-cli php-pgsql php-intl libicu-dev python3-dotenv \
python3-psycopg2 python3-psutil python3-jinja2 \
python3-icu python3-datrie python3-sqlalchemy \
python3-asyncpg python3-yaml
步驟二:建立Nominatim伺服器專用的使用者
官方建議最好將Nominatim安裝在獨立的使用者帳戶下。因此我們建立一個使用者名稱為 nominatim,且安裝路徑為 /srv/nominatim的專屬帳戶。要創建使用者和目錄,執行以下指令:
useradd
:這是一個用於創建新使用者帳戶的命令。-d /srv/nominatim
:這是useradd
命令的選項之一。它指定新使用者的家目錄(home directory)。在這個例子中,家目錄被設定為/srv/nominatim
。-s /bin/bash
:這是useradd
命令的另一個選項。它指定新使用者的登入shell。在這裡,使用者的登入shell被設定為/bin/bash
,這是Bash shell的路徑。-m
:這是useradd
命令的一個選項,用於創建使用者的家目錄。如果該選項被指定,useradd
將創建指定家目錄。-p '加密過的密碼'
:這是您自己添加的選項,並不是useradd
的標準選項。這是用於指定新使用者的加密過的密碼。您應該提供一個經過加密的密碼,以確保密碼的安全性。該密碼應該是已經過加密處理的,通常使用passwd
命令生成。不建議在命令行中明文指定密碼,因為這樣做可能會導致安全風險。nominatim
:這是新使用者的名稱。在這個例子中,使用者名稱被設定為nominatim
。
sudo useradd -d /srv/nominatim -s /bin/bash -p '你的密碼' -m nominatim
創建完成後我們可以透過以下命令切換使用者,並針對後續安裝常用的變數進行設定
sudo -u nominatim bash
export USERNAME=nominatim
export USERHOME=/srv/nominatim
步驟三:配置PostgreSQL資料庫參數
Nominatim針對資料庫的記憶體、緩存等設定有一定的要求,因此我們要調整 PostgreSQL 的預設配置,該配置文件位於 /etc/postgresql/14/main/postgresql.conf。有關要更改的參數,可以參考連結
更新此配置文件後,重新啟動 PostgreSQL 服務:
sudo systemctl restart postgresql
配置完成後我們需要設定兩個資料庫使用者帳號,用於數據導入還有資料讀取
sudo -u postgres createuser -s $USERNAME
sudo -u postgres createuser www-data
步驟四:安裝Nominatim主程式
這邊可以直接從官方網站提供的Github進行專案Clone,以下命令將資料下載後解壓縮到我們剛剛設定的/srv/nominatim路徑下
cd $USERHOME
wget https://nominatim.org/release/Nominatim-4.3.1.tar.bz2
tar xf Nominatim-4.3.1.tar.bz2
接下來我們可以透過make指令針對原始碼進行編譯,編譯好的Nominatim程式會被安裝在/usr/local路徑下
mkdir $USERHOME/build
cd $USERHOME/build
cmake $USERHOME/Nominatim-4.3.1
make
sudo make install
步驟五:部屬Nominatim前端
接下來可以透過PHP或是Python來部屬Nominatim的前端API,首先要先建立專案資料夾,後續會將地理編碼資料進行導入。
首先我們先創建專案資料夾,其中包含了子目錄/website
mkdir $USERHOME/nominatim-project
mkdir $USERHOME/nominatim-project/website
這邊示範採用PHP+Apache2的方式進行前端部屬,先安裝apache、php模組
sudo apt install -y apache2 libapache2-mod-php
接下來我們要在Apache2中進行Nominatim的設定,以下命令會在apache2設定檔目錄下新增nominatim.conf設定檔。
sudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF
<Directory "$USERHOME/nominatim-project/website">
Options FollowSymLinks MultiViews
AddType text/html .php
DirectoryIndex search.php
Require all granted
</Directory>
Alias /nominatim $USERHOME/nominatim-project/website
EOFAPACHECONF
步驟六 : 導入台灣的OSM資料庫
在啟動伺服器前我們先安裝台灣的OSM資料,這邊透過Geofabrik進行資料下載
cd $USERHOME/nominatim-project
wget https://download.geofabrik.de/asia/taiwan-latest.osm.pbf
下載成功後可以透過以下命令進行資料庫的導入,雖然台灣資料只有幾百MB但導入時間可能要7~8個小時。
nominatim import --osm-file taiwan-latest.osm.pbf --osm2pgsql-cache "設定可以使用的記憶體越大導入越快" 2>&1 | tee setup.log
導入完成後透過以下命令檢查資料庫狀態,如果資料庫導入失敗,可能需要進入到PostgreSQL中刪除Nominatim資料庫,再重新進行安裝。
nominatim admin --check-database
步驟六 : 運行伺服器
資料庫安裝成功後可以透過Nominatim的測試指令開啟伺服器運行,並在瀏覽器中輸入
http://localhost:8088/search.php?q=”你要查詢的地址”,一切正常的話應該可以獲得回應,
###需要注意的是Nominatim的地址格式,在xx號前需要一個空格才能查詢成功。
nominatim serve
測試成功後我們可以透過以下指令正式啟用Apach2運行Nominatim的伺服器
sudo a2enconf nominatim
sudo systemctl restart apache2
延伸閱讀
參考資料
https://download.geofabrik.de/asia/taiwan.html
https://nominatim.org/release-docs/latest/appendix/Install-on-Ubuntu-22/