在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