前言

内容包括

1. 搭建openstreetmap地图服务(源自openstreetmap官方搭建教程)

2. 搭建tileserver-gl地图服务(源自openmaptiles官方搭建教程)
(没错,我就是一个官方搬运工,哈哈,不过重点不是教程,而是我在搭建过程中踩的坑,希望能对你有所帮助)

全程干货较多,阅读前建议具备以下知识:

1. openstreetmap相关知识

2. docker和docker-compose方面的知识

搭建tileserver-gl地图服务(源自openmaptiles官方搭建教程)

搭建tileserver-gl地图服务主要分为两个部分讲解:

1. 生成在线可缩放矢量切片地图数据

2. 搭建tileserver-gl地图服务

生成在线可缩放矢量切片地图数据

概述

搭建tileserver-gl地图服务,需要可以运行的.mbtiles文件,openmaptiles官方提供了一个可以生成一个开源项目openmaptiles,可以支持生成.mbtiles文件。

设置代理

由于在制作数据过程中,需要访问https://query.wikidata.org/,获取本地化数据。那么对于国内的ip,需要事先在linux上设置代理,安装一个楼梯(这样描述不知道能不能听懂,真麻烦)。

为docker设置代理

mkdir ~/.docker
vim ~/.docker/config.json
>>>
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://192.168.59.100:8118",
     "httpsProxy": "http://192.168.59.100:8118",
     "noProxy": ""
   }
 }
}
>>>

部署步骤

代理设置完成了,下面就开始进入正式的数据生成步骤:

1. 克隆openmaptiles项目并且编译

git clone https://github.com/openmaptiles/openmaptiles.git
cd openmaptiles

2. 修改生成的地图缩放级别(MAX_ZOOM参数,值越大,生成的地图数据越详细,最大为14),MAX_ZOOM默认的值为7,生成的地图数据不够详细,

vim .env

将MAX_ZOOM改为14(生成的地图数据越详细,花费的时间越久)

3. 为openmaptiles-tools设置代理

vim docker-compose.yml

在openmaptiles-tools的environment中添加设置的代理

我本机的代理是8118端口,因此就添加了

      http_proxy: http://192.168.59.100:8118
      https_proxy: http://192.168.59.100:8118
      HTTP_PROXY: http://192.168.59.100:8118
      HTTPS_PROXY: http://192.168.59.100:8118

4. 编译项目,直接执行make命令

make

5. 下载地图数据,建议去这个网站下载https://download.bbbike.org/,选择要下载的地图区域,复制链接,在迅雷中下载,下载之后将数据上传到openmaptiles/data文件夹下。当然,也可以使用官方教程中的下载方式

make download area=albania

但是这种方式下载非常慢。(如果是测试使用的话,尽量下载较小的pbf地图区域数据,否则整个执行周期会非常长)

6. 到这步之后,官方提供了一个快速开始的方式,不过不利于理解,可以跳过这一步,执行下面的非快速开始方式

./quickstart.sh <area>
#<area> 表示地图的区域,你下载的pbf是什么名字,这里就写什么名字
#e.g:./quickstart.sh albania-latest

7. 非快速开始方式

启动postgres数据库容器

make start-db

OpenStreetMapDataNatural Earth and OpenStreetMap Lake Labels导入外部数据

make import-data

将pbf数据导入数据库中

make import-osm
make import-borders

使生成地图数据支持多种语言,并且实现语言本地化,比如属于中国的地图数据在地图上显示中文(在这一步之前)

make import-wikidata

每次修改层SQL代码时,运行make和make import-sql(按着步骤运行) 

make clean
make
make import-sql

现在您可以生成矢量图块了。默认情况下,.env将整个星球BBOX指定为缩放0-7,但运行generate-dc-config会分析数据文件并设置BBOX参数以限制图块生成。

make generate-dc-config  # compute data bbox -- not needed for the whole planet
make generate-tiles      # generate tiles

剩下的就是等待命令执行完成了

通过make创建tileserver-gl地图服务

make start-tileserver

不过这样不能后台运行。

搭建tileserver-gl地图服务

创建/data/maptiler-data文件夹,将openmaptiles/data中生成的tiles.mbtiles文件移到/data/maptiler-data文件夹中

docker run --rm -d -v /data/maptiler-data:/data -p 9001:80 maptiler/tileserver-gl

访问的时候,ip和端口换成自己的

http://ip:端口/

 

前端技术支持

  • Leaflet
  • OpenLayers
  • ArcGIS
  • Mapbox GL JS

可以通过这些技术,可以让地图实现自己需要实现的效果,比如根据经纬度在地图上标记点等。

 

槽点

1. 这种方式生成.mbtiles数据超级慢,我尝试着用一个190m的pbf文件(ireland-and-northern-ireland.osm.pbf),将MAX_ZOOM设置为14,生成对应区域的.mbtiles文件,在linux系统中跑了6小时四十分钟,要知道整个全球的数据有53G。暂时不考虑数据量大了之后生成数据的效率会不会进一步变快或者变慢,也暂时屏蔽硬件带来的差异,那么将整个星球的数据跑下来需要76天左右,这还得祈祷运行过程中不能出问题。

2. 官网可以获取mbtiles格式的数据,不过面向商用是需要money的,附购买地址

3. 也可以下载官方的整个星球的免费数据,不过数据比较老,是2017年的数据,对地图数据有精确要求的不建议使用

如果不想花钱,可能的解决方案

1. 将生成的MAX_ZOOM的值调小

2. 换更好的硬件设备或许会提高转换效率

3. 对源代码进行编辑,提高转换效率

4. 查找官方文档,是否有可以提高转化效率的方法

5.下载多个国家或者州的数据,在多台服务器上跑,分别跑出对应的.mbtiles数据,然后使用tippecanoe整合到一个.mbtiles文件中。

6. 使用tilemaker生成.mbtiles文件。tilemaker也可以生成能运行的地图数据,数据的转换速率还挺快的,但是生成的数据少医院,商家等建筑图层 。同时该项目的生态不是很好,tilemaker运行过程中,可能会出现一些意想不到的问题,或者生成的数据有问题,有些图层的标签(名称)无法正常显示。tilemaker适合自己拿来研究,在他的基础上进行改进。

搭建openstreetmap地图服务

传送门

 

源码与文档地址

OpenMapTiles源码GitHub地址https://github.com/openmaptiles/openmaptile  

tileserver-gl源码GitHub地址:https://github.com/maptiler/tileserver-gl

Openstreetmap数据源1(可下载星球地图数据):https://download.bbbike.org/

openstreetmap数据源2(下载指定地区数据):https://download.geofabrik.de/

OpenMapTiles文档:https://openmaptiles.org/docs/

TileServer GL的文档:https://tileserver.readthedocs.io/en/latest/

tileserver-gl镜像地址:https://hub.docker.com/r/klokantech/tileserver-gl

openmaptiles-server镜像地址:https://hub.docker.com/r/klokantech/openmaptiles-server

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐