在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的帮助下可以使用本教程。