在Ubuntu 16.04上構建自己的OpenStreetMap Tile Server

OpenStreetMap,又名OSM,是用戶提供的世界地圖,可以自由編輯。 您可以將其視為Google Maps的開源和自託管替代方案。 本教程將向您展示如何在Ubuntu 16.04上構建自己的OpenStreetMap切片服務器,因此您不必使用專有的地圖服務。

注意:本教程有點過時了。 請在這裡閱讀我更新的教程:如何在Ubuntu 18.04上設置OpenStreetMap切片服務器。

OpenStreetMap功能

  • OpenStreetMap數據涵蓋了整個世界,可以輕鬆地為任何國家或每個國家/地區的用戶提供支持。
  • OpenStreetMap每天每一小時的每一分鐘都會更新,並且這些更新可實時提供給您。
  • OpenStreetMap數據是免費開放的–無需付費,也無需瀏覽頁面。
  • OpenStreetMap數據豐富而詳細,其中包含與地面人員(收集人員)相關的大量數據。

先決條件/硬件要求

所需的RAM和磁盤空間取決於您要使用的國家/地區的地圖。 例如,

  • 英國地圖至少需要12G RAM和60GB磁盤空間。
  • 整個星球地圖至少需要32G RAM和1TB SSD磁盤。 在整個行星地圖上使用旋轉硬盤是不可行的。

如果要預渲染圖塊以加快Web瀏覽器中的地圖加載速度,則需要更多的磁盤空間,強烈建議這樣做。 檢查此頁面以查看預渲染圖塊需要多少磁盤空間。 還要注意的另一件事是,將大的地圖數據(例如整個星球)導入PostgreSQL數據庫需要很長時間。 考慮添加更多的RAM,尤其是 使用SSD 而不是旋轉硬盤以加快導入過程。

如果您要託管整個世界地圖,建議您從Contabo購買超大VPS,它擁有

  • 10核CPU
  • 60 GB RAM
  • 1.6 TB英特爾傲騰固態硬盤

每月只需​​花費26.99歐元。

步驟1:升級軟件

sudo apt update

sudo apt upgrade

步驟2:使用PostGIS安裝PostgreSQL數據庫服務器

我們將使用PostgreSQL來存儲地圖數據。 PostGIS是PostgreSQL的地理空間擴展。 運行以下命令進行安裝。

sudo apt install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2

postgres 用戶將在安裝過程中在操作系統上創建。 它是PostgreSQL數據庫服務器的超級用戶。 默認情況下,該用戶沒有密碼,無需設置密碼,因為您可以使用 sudo 切換到 postgres 用戶:

sudo -u postgres -i

現在您可以創建一個PostgreSQL數據庫用戶 osm

createuser osm

創建一個名為的數據庫 gis 並同時使 osm 作為數據庫的所有者。 -E UTF8 指定數據庫中使用的字符編碼方案為UTF8。

createdb -E UTF8 -O osm gis

在上創建hstore和postgis擴展 gis 數據庫。

psql -c "CREATE EXTENSION hstore;" -d gis

psql -c "CREATE EXTENSION postgis;" -d gis

退出 postgres 用戶。

exit

創建 osm 操作系統上的用戶,因此平鋪服務器可以以 osm 用戶。

sudo adduser osm

步驟3:下載地圖樣式表和地圖數據

首先切換到 osm 用戶

su - osm

將最新的CartoCSS地圖樣式表下載到 osm 用戶的主目錄。

wget https://github.com/gravitystorm/openstreetmap-carto/archive/v2.41.0.tar.gz

提取它。

tar xvf v2.41.0.tar.gz

接下來,將地圖數據下載到osm用戶的主目錄。 使用以下命令下載整個星球(32G)的地圖數據。

wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf

如果要獲取單個國家或州的地圖,請訪問http://download.geofabrik.de。 此外,BBBike.org還以不同格式提供了全球200多個城市和地區的摘錄。

例如,下載英國(847M)的地圖數據。

wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf

現在從 osm 用戶。

exit

導入地圖數據之前的建議

導入地圖數據會佔用大量RAM。 如果物理內存很小,則可以輕鬆添加交換文件。 首先我們使用 fallocate 命令創建文件。 例如,在根文件系統中創建一個名為swapfile的文件,其容量為2G:

sudo fallocate -l 2G /swapfile

然後確保只有root可以讀取和寫入它。

sudo chmod 600 /swapfile

格式化以交換:

sudo mkswap /swapfile

輸出:

Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=h32b3e10-0779-4865-9ea0-6e2af8f3kea9

啟用交換文件

sudo swapon /swapfile

導入過程可能需要一些時間。 建議配置SSH保持活動狀態,以免丟失SSH連接。 這很容易做到。 只需在本地Linux計算機上打開SSH客戶端配置文件即可。

sudo nano /etc/ssh/ssh_config

並將以下文本粘貼到文件末尾。

ServerAliveInterval 60

然後保存文件並連接到Ubuntu 16.04服務器

步驟4:將地圖數據導入PostgreSQL

要導入地圖數據,我們需要安裝 osm2pgsql 它將OpenStreetMap數據轉換為啟用PostGIS的PostgreSQL數據庫。

sudo apt install osm2pgsql

切換到 osm 用戶。

su - osm

運行以下命令以加載地圖樣式表並將地圖數據映射到 gis 數據庫。 更換 great-britain-latest.osm.pbf 與您自己的地圖數據文件。

osm2pgsql --slim -d gis -C 3600 --hstore -S openstreetmap-carto-2.41.0/openstreetmap-carto.style great-britain-latest.osm.pbf

osm2gpsql 將在超薄模式下運行,建議在常規模式下使用。 -d 代表 --database-C 標誌以MB為單位指定緩存大小。 更大的緩存大小會導致更快的導入速度,但是您需要有足夠的RAM才能使用緩存。 -S 標誌指定樣式文件。 最後,您需要指定地圖數據文件。

導入完成後,從 osm 用戶。

exit

步驟5:安裝mod_tile

mod_tile是提供圖塊所需的Apache模塊。 當前沒有二進制軟件包可用於Ubuntu。 我們可以從Github倉庫中編譯它。

首先安裝構建依賴項。

sudo apt install git autoconf libtool libmapnik-dev apache2-dev

然後從Github克隆存儲庫。

git clone https://github.com/openstreetmap/mod_tile.git

cd mod_tile/

編譯安裝

./autogen.sh
./configure
make
sudo make install
sudo make install-mod_tile

第6步:生成Mapnik樣式表

安裝所需的軟件包。

sudo apt install curl unzip gdal-bin mapnik-utils node-carto

切換到osm用戶。

su - osm

將CD放入carto樣式目錄。

cd openstreetmap-carto-2.41.0/

獲取shapefile。

./get-shapefiles.sh

現在建立Mapnik xml樣式表。

carto project.mml > style.xml

退出 osm 用戶。

exit

步驟7:配置渲染

編輯渲染的配置文件。

sudo nano /usr/local/etc/renderd.conf

在裡面 [default] 部分,將XML和HOST的值更改為以下值。

XML=/home/osm/openstreetmap-carto-2.41.0/style.xml
HOST=localhost

在 [mapnik] 部分,更改plugins_dir的值。

plugins_dir=/usr/lib/mapnik/3.0/input/

保存文件。

通過複製示例初始化腳本來安裝渲染的初始化腳本。

sudo cp mod_tile/debian/renderd.init /etc/init.d/renderd

授予執行權限。

sudo chmod a+x /etc/init.d/renderd

編輯初始化腳本文件

sudo nano /etc/init.d/renderd

更改以下變量。

DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="-c /usr/local/etc/renderd.conf"
RUNASUSER=osm

保存文件。

創建以下文件,並將osm設置為所有者。

sudo mkdir -p /var/lib/mod_tile

sudo chown osm:osm /var/lib/mod_tile

然後啟動渲染服務

sudo systemctl daemon-reload

sudo systemctl start renderd

sudo systemctl enable renderd

步驟8:配置Apache

安裝Apache Web服務器

sudo apt install apache2

創建一個模塊加載文件。

sudo nano /etc/apache2/mods-available/mod_tile.load

將以下行粘貼到文件中。

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

創建一個符號鏈接。

sudo ln -s /etc/apache2/mods-available/mod_tile.load /etc/apache2/mods-enabled/

然後編輯默認的虛擬主機文件。

sudo nano /etc/apache2/sites-enabled/000-default.conf

將以下行粘貼到

LoadTileConfigFile /usr/local/etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30

保存並關閉文件。 重新啟動Apache。

sudo systemctl restart apache2

然後在您的Web瀏覽器地址欄中輸入

your-server-ip/osm_tiles/0/0/0.png

您應該看到世界地圖的磁貼。 恭喜! 您剛剛成功構建了自己的OSM切片服務器。

顯示平鋪的Web地圖

平鋪的網絡地圖也稱為 滑地圖 在OpenStreetMap術語中。 您可以將兩個免費的開源JavaScript地圖庫用於圖塊服務器: OpenLayer傳單。 Leaflet的優點在於它易於使用,並且地圖對移動設備友好。

OpenLayer

要使用OpenLayer顯示滑動地圖,請從openlayer.org下載JavaScript和CSS並將其解壓縮到Web根文件夾。

cd /var/www/html

sudo wget https://github.com/openlayers/openlayers/releases/download/v4.3.4/v4.3.4.zip

sudo unzip v4.3.4.zip

接下來,創建 index.html 文件。

sudo nano /var/www/html/index.html

將以下HTML代碼粘貼到文件中。 替換紅色文本,並根據需要調整經度,緯度和縮放級別。

<!DOCTYPE html>
<html>
<head>
<title>Accessible Map</title>
<link rel="stylesheet" href="https://www.linuxbabe.com/linux-server/http://your-ip/v4.3.4/css/ol.css" type="text/css">
<script src="https://www.linuxbabe.com/linux-server/http://your-ip/v4.3.4/build/ol.js"></script>
<style>
  a.skiplink {
    position: absolute;
    clip: rect(1px, 1px, 1px, 1px);
    padding: 0;
    border: 0;
    height: 1px;
    width: 1px;
    overflow: hidden;
  }
  a.skiplink:focus {
    clip: auto;
    height: auto;
    width: auto;
    background-color: #fff;
    padding: 0.3em;
  }
  #map:focus {
    outline: #4A74A8 solid 0.15em;
  }
</style>
</head>
<body>
  <a class="skiplink" href="https://www.linuxbabe.com/linux-server/#map">Go to map</a>
  <div id="map" class="map" tabindex="0"></div>
  <button id="zoom-out">Zoom out</button>
  <button id="zoom-in">Zoom in</button>
  <script>
    var map = new ol.Map({
      layers: [
        new ol.layer.Tile({
          source: new ol.source.OSM({
             url: 'http://your-ip/osm_tiles/{z}/{x}/{y}.png'
          })
       })
     ],
     target: 'map',
     controls: ol.control.defaults({
        attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
          collapsible: false
        })
     }),
    view: new ol.View({
       center: [244780.24508882355, 7386452.183179816],
       zoom:5
    })
 });

  document.getElementById('zoom-out').onclick = function() {
    var view = map.getView();
    var zoom = view.getZoom();
    view.setZoom(zoom - 1);
  };

  document.getElementById('zoom-in').onclick = function() {
     var view = map.getView();
     var zoom = view.getZoom();
     view.setZoom(zoom + 1);
  };
</script>
</body>
</html>

保存並關閉文件。 現在,您可以通過在瀏覽器中鍵入服務器IP地址來查看滑動地圖。

your-ip/index.html           or          your-ip

傳單

要使用Leftlet顯示滑動地圖,請從leftletjs.com下載JavaScript和CSS,然後將其解壓縮到Web根文件夾。

cd /var/www/html/

sudo wget http://cdn.leafletjs.com/leaflet/v1.2.0/leaflet.zip

sudo unzip leaflet.zip

接下來,創建 index.html 文件。

sudo nano /var/www/html/index.html

將以下HTML代碼粘貼到文件中。 替換紅色文本,並根據需要調整經度,緯度和縮放級別。

<html>
<head>
<title>My first osm</title>
<link rel="stylesheet" type="text/css" href="https://www.linuxbabe.com/linux-server/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([53.555,9.899],5);
    L.tileLayer('http://your-ip/osm_tiles/{z}/{x}/{y}.png',{maxZoom:18}).addTo(map);
</script>
</body>
</html>

保存並關閉文件。 現在,您可以通過在瀏覽器中鍵入服務器IP地址來查看滑動地圖。

your-ip/index.html           or          your-ip

要預渲染圖塊而不是即時渲染,請使用 render_list 命令。 預渲染的圖塊將緩存在 /var/lib/mod_tile 目錄。 -z-Z 標誌指定縮放級別。

render_list -m default -a -z 0 -Z 10

在Miles B. Dyson的幫助下可以使用本教程。

Sidebar