开放街道图OpenStreetMap,也就是osm,是一个网上地图协作计划,目的是创造一个内容自由且能让所有人都编辑的世界地图。这个教程会叫你如何搭建一个自己的OSM服务器,配置是Ubuntu16.04,2GB RAM,40GB硬盘空间。
step1:升级软件
sudo apt update
sudo apt upgrade
step2:安装PostgreSQL Database Server和PostGIS
我们会使用PostgreSQL存储地图数据。PostGIS是一个地理空间插件,使用下面的命令安装。
sudo apt install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2
用户postgres将在安装过程中创建。这允许使用对等体认证。让我们切换到postgres用户。
sudo -u postgres -i
创建一个PostgreSQL用户。
createuser osm
创建一个数据库gis
,同时令osm为数据库的所有者,设置字符编码为utf8
createdb -E UTF8 -O osm gis
创建hstore和postgis扩展。
psql -c "CREATE EXTENSION hstore;" -d gis
psql -c "CREATE EXTENSION postgis;" -d gis
从用户postgre离开。
exit
在系统上创建osm用户。
sudo adduser osm
step3:下载 Map Stylesheet和Map Data
首先切换至osm用户
su - osm
下载最新的 CartoCSS map stylesheets到osm用户的家目录
wget https://github.com/gravitystorm/openstreetmap-carto/archive/v2.41.0.tar.gz
解压
tar xvf v2.41.0.tar.gz
下载map data至osm家目录,使用下面的数据下载整个地图的地图数据。
wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf
如果只想导入某一个国家的地图数据,可以去http://download.geofabrik.de或者BBBike.org自行下载。
以英国为例(847M):
wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf
之后离开osm用户
exit
导入数据需要占用许多ram资源,如果你的物理机器ram有限,
step4:导入map data至PostgreSQL
为了导入数据,我们需要安装osm2pgsql。
sudo apt install osm2pgsql
切换至som用户。
su - osm
使用下面的命令进行导入,great-britain-latest.osm.pbf
替换成你自己的map data。
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 表示具体缓存的大小,
缓存越大导入速度也越大,但是需要你的ram有足够的空间,-S标志具体的样式文件,最终你需要指定地图数据文件。
导入完成后,退出osm用户。
exit
step:安装mod_tile
mod_tile是apache上面的一个模块用来对瓦片提供服务,Ubuntu上没有可用的二进制包,我们从github上获取。
首先安装依赖:
sudo apt install git autoconf libtool libmapnik-dev apache2-dev
clone 仓库
git clone https://github.com/openstreetmap/mod_tile.git
cd mod_tile/
编译 安装
./autogen.sh
./configure
make
sudo make install
sudo make install-mod_tile
step6:生成Mapnik Stylesheet
安装需要的包
sudo apt install curl unzip gdal-bin mapnik-utils node-carto
切换至osm用户
su - osm
切换至样式目录
cd openstreetmap-carto-2.41.0/
得到 shapefiles
./get-shapefiles.sh
构建mapnik xml 样式文件
carto project.mml > style.xml
退出osm用户
exit
step7:配置渲染
编辑渲染配置文件。
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
step8:配置apache
安装apache web server
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
在<VirtualHost *:80>粘贴下面语句。
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
浏览器访问
your-server-ip/osm_tiles/0/0/0.png