Debian8上搭建OpenStreetMap服务器

近期的图表需求中强调了GIS地图的优先级,因此我们需要一个稳定且低成本的GIS地图服务器,对比高德和百度的商业合作解决方案后,我们决定使用开源地图OpenStreetMap。

需要强调的是OpenStreetMap的地图数据是免费开源的,但它的地图服务不是,因此如果想使用OpenStreetMap的地图服务,有两个选择:选择付费的服务提供商(例如mapbox)或自己搭建地图服务器,考虑到服务器响应速度和地图的功能需求,最终决定我们自己动手搭建OpenStreetMap瓦片服务器。

本文中使用的服务器操作系统为Debian8.8,部署过程需要root权限。

创建系统用户

1
2
sudo -iu root
adduser youdata

PostgreSQL & Postgis

PostgreSQL用来存储地图数据,PostGIS是其地理空间插件,相比MySQL,PostgreSQL拥有更好的几何类型支持和空间数据库扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# root用户安装PostgreSQL和插件
sudo -iu root
apt install postgresql-9.4-postgis-2.1 postgresql-contrib-9.4
# 切换到postgres用户编辑数据库
sudo -iu postgres
cd ~
# 创建数据库用户
createuser youdata
# 创建地图数据库
createdb -E UTF8 -O youdata gis
# 为gis数据库增加hstore和postgis扩展
psql
\c gis
CREATE EXTENSION postgis;
CREATE EXTENSION hstore;
# Should answer CREATE EXTENSION
exit

osm2pgsql

osm2pgsql的作用是将OSM数据转换并导入PostGIS里的工具

1
2
sudo -iu root
apt install osm2pgsql

Stylesheet

获取样式表

1
2
3
4
su youdata
cd ~
wget https://github.com/gravitystorm/openstreetmap-carto/archive/v2.29.1.tar.gz
tar -xzf v2.29.1.tar.gz

OSM Data

获取OSM的地图数据

http://download.geofabrik.de/index.html

http://planet.openstreetmap.org/pbf/

1
2
3
su youdata
cd ~
http://download.geofabrik.de/asia/china-latest.osm.pbf

导入地图数据

1
2
3
su youdata
cd ~
osm2pgsql --slim -d gis -C 6000 --hstore -S openstreetmap-carto-2.29.1/openstreetmap-carto.style china-latest.osm.pbf

mod_tile

mod_tile是OSM的地图瓦片服务,没有Debian8的适配版本,需要从源码进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
su youdata
cd ~
wget https://github.com/openstreetmap/mod_tile/archive/6c2cb243e4c8b047950ab8062cd66245f20a5d2f.tar.gz -O mod_tile.tar.gz
tar -xzf mod_tile.tar.gz
mv mod_tile-6c2cb243e4c8b047950ab8062cd66245f20a5d2f mod_tile
sudo -iu root
apt install autoconf libtool libmapnik-dev apache2-dev
exit
cd mod_tile
./autogen.sh
./configure
make
sudo -iu root
cd /home/youdata/mod_tile
make install
make install-mod_tile
exit

Generate Mapnik Style

服务端地图渲染

1
2
3
4
5
6
7
8
9
10
11
12
sudo -iu root
apt install curl unzip gdal-bin mapnik-utils node-carto
# 在线获取shapefiles
su youdata
cd ~/openstreetmap-carto-2.29.1/
./get-shapefiles.sh
# 修改数据库名称 本例中不用修改
# sed -i 's/"dbname": "gis"/"dbname": "mygis"/' project.mml
carto project.mml > style.xml

Font

安装地图渲染所需要的中文字体

1
2
sudo -iu root
apt-get install unifont

renderd

配置服务端地图渲染

修改/usr/local/etc/renderd.conf

1
2
3
4
5
6
7
8
9
[mapnik]
plugins_dir=/usr/lib/mapnik/2.2/input/
font_dir=/usr/share/fonts/truetype/unifont
font_dir_recurse=1
[default]
URI=/osm/
XML=/home/youdata/openstreetmap-carto-2.29.1/style.xml
HOST=localhost

修改/home/youdata/mod_tile/debian/renderd.init

1
2
3
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS=" -c /usr/local/etc/renderd.conf"
RUNASUSER=youdata
1
2
3
4
5
6
7
8
9
10
sudo -iu youdata
cd /home/youdata
cp mod_tile/debian/renderd.init /etc/init.d/renderd
chmod a+x /etc/init.d/renderd
mkdir -p /var/lib/mod_tile
chown youdata /var/lib/mod_tile
systemctl daemon-reload
service renderd start

Apache2

文件服务器

1
apt install apache2

编辑/etc/apache2/sites-enabled/000-default.conf

1
2
3
4
5
6
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

如果需要开启跨域访问的话

1
2
sudo a2enmod headers
sudo vi /etc/apache2/sites-available/000-default.conf

编辑添加:

LoadModule headers_module modules/mod_headers.so
Header set Access-Control-Allow-Origin *

1
2
3
4
5
6
7
8
<VirtualHost *:80>
LoadModule headers_module modules/mod_headers.so
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
Header set Access-Control-Allow-Origin *
</VirtualHost>

启动服务

1
2
3
4
echo "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so" > /etc/apache2/mods-available/tile.load
ln -s /etc/apache2/mods-available/tile.load /etc/apache2/mods-enabled/
service apache2 restart

测试服务是否正常

访问http://localhost/osm/0/0/0.png

通过以下命令输出日志

1
sudo tail -f /var/log/syslog | grep " TILE "

使用openstreetmap重定向测试地图服务

安装chrome重定向插件”Switcheroo Redirector”

https://chrome.google.com/webstore/detail/switcheroo-redirector/cnmciclhnghalnpfhhleggldniplelbg?hl=en

添加以下重定向:

访问http://www.openstreetmap.org/

OSM中选择”Humanitarian”图层

参考资料:

https://wiki.debian.org/OSM/tileserver/jessie#Install_mod_tile

https://switch2osm.org/manually-building-a-tile-server-16-04-2-lts/