openstreetmap

手動安裝openstreetmap(OSM)在ubuntu 22.04

請先把ubuntu 安裝好後來更新所有軟體,且強烈建議請使用SSD並且RAM越大越好,這兩個太差,你後面渲染圖層速度真的會慢到懷疑人生(且太慢他就會直接噴404給你不出圖了,你的地圖就有時候會少一塊這樣)

1.軟體安裝

sudo apt update
sudo apt upgrade
sudo apt install screen locate libapache2-mod-tile renderd git tar unzip wget bzip2 apache2 lua5.1 mapnik-utils python3-mapnik python3-psycopg2 python3-yaml gdal-bin npm fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted fonts-unifont fonts-hanazono postgresql postgresql-contrib postgis postgresql-14-postgis-3 postgresql-14-postgis-3-scripts osm2pgsql net-tools curl

安裝完畢後,你的系統應該有自動新增了兩個使用者帳號,分別為postgres跟_renderd,您可以使用tail /etc/passwd查看它們,「postgres」用於管理我們用來保存渲染資料的資料庫。「_renderd」用於渲染守護進程,我們需要確保下面的許多命令都以該使用者身份運行。

2.建立postgis 資料庫

現在您需要建立一個 自己的postgis 資料庫。各種程式的預設值假定資料庫稱為 gis,我們將在本教程中使用相同的設定,當然你也可以變更就是,只是請注意! 下面的「_renderd」與執行 renderd 守護程式的使用者相符。

#sudo -u postgres -i
//此時使用者會切換成postgres
postgres# createuser _renderd
postgres# createdb -E UTF8 -O _renderd gis

在 PostgreSQL 資料庫上設定 PostGIS,

postgres#psql

(這會讓你看到“postgres=#”提示)

\c gis

輸入上面語法後會出現You are now connected to database “gis” as user “postgres”.

CREATE EXTENSION postgis;
CREATE EXTENSION hstore;

分別輸入上面語法後會各自出現CREATE EXTENSION一次

ALTER TABLE geometry_columns OWNER TO _renderd;
ALTER TABLE spatial_ref_sys OWNER TO _renderd;
\q

分別輸入上面語法後會各自出現ALTER TABLE一次,之後會退出psql。

3.OSM樣式表配置

這邊是要來下載,安裝地圖所需要的樣式表,我們在這裡使用的樣式是 openstreetmap.org 網站上的「標準」地圖所使用的樣式。選擇它是因為它有詳細的文檔記錄,「OpenStreetMap Carto

exit   //先跳出回到你的使用者帳號下
mkdir ~/src
cd ~/src
git clone https://github.com/gravitystorm/openstreetmap-carto
cd openstreetmap-carto

安裝合適版本的「carto」編譯器。

sudo npm install -g carto
carto -v

安裝完畢後,應該會出現carto版本為1.2.0 (目前最新是這個)

然後我們將 carto 專案轉換為 Mapnik 可以理解的內容:

carto project.mml > mapnik.xml

輸入完畢後你可能會看到很多的警告如:Warning: style/admin.mss:18:6 Styles do not match layer selector #admin-low-zoom. 這就不管他了。

4.載入地圖資料到資料庫

我們這邊測試是載入台灣地區的地圖,可以參考這邊 下載該地區的 OpenStreetMap 資料:台灣

台灣部分大小是232MB,應該是很快

mkdir ~/data
cd ~/data
wget https://download.geofabrik.de/asia/taiwan-latest.osm.pbf

接下來,我們需要確保「_renderd」使用者可以存取地圖檔。為了做到這一點,它需要存取您下載它的位置,並且預設情況下它無法存取您的主目錄。你可以輸入下面這樣更改權限,或是把檔案搬去其他的資料夾也可以(但是要確保_renderd 使用者有權限摸到他)

chmod o+rx ~
sudo -u _renderd osm2pgsql -d gis --create --slim  -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 1 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/taiwan-latest.osm.pbf

這邊應該會開始把台灣地圖load進資料庫,要看你硬碟IO速度決定可能會多久,像是我自己是花了5分40秒完成

這時候你可以來了解一下上面那些參數的意思

-d gis   #指定使用gis資料庫
--create #將資料載入到空資料庫中,而不是嘗試附加到現有資料庫中。
--slim  #osm2pgsql可以使用不同的表格佈局;「slim」表格適用於渲染。
-G  #確定如何處理多邊形
--hstore  #允許使用沒有顯式資料庫列的標籤進行渲染。
--tag-transform-script  #定義用於標籤處理的lua腳本。這是一種在樣式本身處理 OSM 標籤之前處理 OSM 標籤的簡單方法,使樣式邏輯可能更加簡單。
-C 2500 #為導入程序分配 2.5 GB 記憶體給 osm2pgsql。如果你的記憶體較少或是過程因記憶體不足而被終止,就可能要改小一點。
--number-processes 1 #使用 1 個 CPU。如果您有更多可用核心,則可以使用更多核心。
-S #在此文件中建立資料庫列(實際上這些列與“openstreetmap-carto”相同)

4.1建立索引

cd ~/src/openstreetmap-carto/
sudo -u _renderd psql -d gis -f indexes.sql

他會回傳很多次CREATE INDEX,我的回傳了16次。

4.2字體

Carto v5.6.0以上版本,需手動安裝字型,不安裝應該可能也沒差?

cd ~/src/openstreetmap-carto/
scripts/get-fonts.sh

設定網頁伺服器

Ubuntu 22.04 上「renderd」的設定檔是「/etc/renderd.conf」。你也可以使用vi編輯也沒差

sudo nano /etc/renderd.conf

在最後面新增下面這些,注意! XML路徑不要照抄! 請改成你的使用者路徑

[s2o]
URI=/hot/
XML=/home/davidou/src/openstreetmap-carto/mapnik.xml
HOST=localhost
TILESIZE=256
MAXZOOM=20

確保renderd service有在,你可以輸入下面指令,確定是否有這個檔案在,應該是要在

sudo nano /usr/lib/systemd/system/renderd.service

改完上面服務後記得服務重啟

sudo systemctl daemon-reload
sudo systemctl restart renderd
sudo systemctl restart apache2

然後這時候應該就建立好了,你可以開啟你的瀏覽器輸入你的ip 應該會先看到Apache2 Ubuntu 預設頁面

這時候你在輸入http://192.168.2.90/hot/0/0/0.png(請改成你的IP) 應該就會看到zoom最小的一張地圖出來了,

如果沒有的話你可以看一下syslog找看看renderd 相關的字樣,看一下錯誤是啥

cat  /var/log/syslog

Jan 5 15:14:32 davidou-OSM-server renderd[10019]: ** (process:10019): ERROR **: 15:14:32.472: An error occurred while loading the map layer ‘s2o’: Could not load map file: File does not exist of ‘/home/davidoue/src/openstreetmap-carto/mapnik.xml’

Jan 5 15:14:39 davidou-OSM-server renderd[10019]: ** (process:10019): ERROR **: 15:14:39.370: Received request for map layer ‘s2o’ which failed to load

像是我的就有因為我打錯字所以地圖xml設定載入失敗,修正後就可以了

Be the First to comment.

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

(若看不到驗證碼,請重新整理網頁。)