請先把ubuntu 安裝好後來更新所有軟體,且強烈建議請使用SSD並且RAM越大越好,這兩個太差,你後面渲染圖層速度真的會慢到懷疑人生(且太慢他就會直接噴404給你不出圖了,你的地圖就有時候會少一塊這樣)
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」用於渲染守護進程,我們需要確保下面的許多命令都以該使用者身份運行。
現在您需要建立一個 自己的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。
這邊是要來下載,安裝地圖所需要的樣式表,我們在這裡使用的樣式是 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. 這就不管他了。
我們這邊測試是載入台灣地區的地圖,可以參考這邊 下載該地區的 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”相同)
cd ~/src/openstreetmap-carto/
sudo -u _renderd psql -d gis -f indexes.sql
他會回傳很多次CREATE INDEX,我的回傳了16次。
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設定載入失敗,修正後就可以了