构建mbtiles格式的矢量瓦片、栅格瓦片、地形瓦片以及使用OSM数据构建瓦片. 在数据处理过程中, 最难的是安装各种环境, 现在整合了一个Docker镜像, 包括 GDAL | tippecanoe | mbutil | osmium | rio-rgbify | dem2terrain | tilemaker 这些环境.
- Gitee地址: https://gitee.com/dxnima/WebGISdata.git
- Github地址: https://github.com/DXnima/WebGISdata.git
开源工具 | 说明 |
---|---|
GDAL | 一个栅格数据和矢量数据地理空间数据格式转换库 |
tippecanoe | 大量从 GeoJSON 要素集合构建mbtiles矢量切片 |
mbutil | 用于导入和导出 MBTiles 格式的实用程序 |
osmium | 一个多用途的命令行工具, 用于处理基于OpenStreetMap的数据 |
rio-rgbify | 将DEM地形影像转 Terrain-RGB 格式的影像 |
dem2terrain | 根据 DEM 数据生成地形切片工具, 支持 mapbox 和 terrarium 格式 |
tilemaker | 从OpenStreetMap制作openmaptiles规范的mbtiles矢量瓦片 |
- 矢量瓦片制作
- 矢量数据转geojson
- geojson转mbtiles矢量瓦片
- 栅格瓦片制作
- 影像数据处理
- 影像转mbtiles栅格瓦片
- DEM影像数据处理
- DEM影像转mbtiles栅格瓦片
- OSM矢量瓦片制作
- OSM数据处理
- OSM数据转openmaptiles规范的mbtiles矢量瓦片
# 拉取镜像
docker pull dxnima/webgisdata
# 使用容器
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
你的命令
git clone https://gitee.com/dxnima/WebGISdata.git
# git clone https://github.com/DXnima/WebGISdata.git
cd WebGISdata
# 构建镜像
docker build -f Dockerfile -t dxnima/webgisdata .
# 使用容器
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
你的命令
软件 | 版本 |
---|---|
GDAL | 3.5.2 |
Python | 3.8.10 |
tippecanoe | 1.36.0 |
mbutil | 0.3.0 |
rio-rgbify | 1.3.9 |
dem2terrain | 2.1.0 |
tilemaker | 2.4.0 |
ogr2osm | 1.2.0 |
# 命令拼接使用容器
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
你的命令
进入容器后相当于一个linux系统, 可以正常使用linux系统命令进行操作.
# 进入容器内部
docker run -it --rm -v /待处理数据的路径:/data dxnima/webgisdata
# 进入容器后相当于一个linux系统
root@f7865dcb49d0:/data# 你的命令
制作矢量瓦片, 源数据格式要求为EPSG:3857坐标系的geojson格式的矢量数据;因此对其他格式需要先进行坐标系转换和格式转换
主要使用ogr2ogr命令实现, 详细说明文档: https://www.osgeo.cn/gdal/programs/ogr2ogr.html
- 将shp文件的EPSG:4326转EPSG:3857命令如下:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
ogr2ogr -s_srs EPSG:4326 -t_srs EPSG:3857 -f "ESRI Shapefile" /data/output.shp /data/input.shp
- 将geojson文件的EPSG:4326转EPSG:3857命令如下:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
ogr2ogr -s_srs EPSG:4326 -t_srs EPSG:3857 -f "GeoJSON" /data/output.geojson /data/input.geojson
以此类推, 可以实现任何坐标系的任何格式的矢量数据转到EPSG:3857坐标系下.
主要使用ogr2ogr命令实现, 详细说明文档: https://www.osgeo.cn/gdal/programs/ogr2ogr.html.
- 将有中文属性的shp转为geojson
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
ogr2ogr -lco encoding=UTF-8 -f "GeoJSON" /data/output.geojson /data/input.shp
- 将KML转为geojson
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
ogr2ogr -f "GeoJSON" /data/output.geojson /data/input.kml
- 将MapInfo转为geojson
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
ogr2ogr -f "GeoJSON" /data/output.geojson /data/input.tab
- 将postgres指定表数据转geojson
#指定表转GeoJSON
docker run -it --rm -v dxnima/webgisdata ogr2ogr -f "GeoJSON" tablename.geojson PG:"host=localhost dbname=dbname user=postgres password=password" "tablename"
以此类推, 可以实现任何格式的矢量数据转为geojson文件.
要使用tippecanoe实现, 说明文档见: https://github.com/mapbox/tippecanoe
- 生成0~15级矢量瓦片命令
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
tippecanoe -f -z15 -Z0 -o /data/output.mbtiles /data/input.json
- 多文件生成矢量瓦片命令
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
sh -c 'find /data -type f \( -name "*.json" -o -name "*.geojson" \) -exec tippecanoe -f -z15 -Z0 -o /data/output.mbtiles {} +'
主要使用gdalwarp命令实现, 说明文档见: https://www.osgeo.cn/gdal/programs/gdalwarp.html
将EPSG:4326坐标系的tif格式影像转为EPSG:3857坐标系的影像, 命令如下:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdalwarp -s_srs "EPSG:4326" -t_srs "EPSG:3857" /data/input.tif /data/output.tif
以此类推实现其他坐标系影像的转换.
在影像切片之前, 需要确保影像为8bit, 不然GDAL切片会报错; 主要使用gdal_translate命令实现, 说明文档: https://www.osgeo.cn/gdal/programs/gdal_translate.html
- 例如将某影像转8bit命令
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdal_translate -ot Byte /data/input.tif /data/output.tif
- 例如转8bit并将像素转为0.1
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdal_translate -ot Byte -tr 0.1 0.1 /data/input.tif /data/output.tif
- 清除无数据的负值
MapBox支持的地形瓦片是Terrain-RGB格式, 其无法表示负值, 需要使用gdalwarp进一步处理:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdalwarp -t_srs "EPSG:3857" -r cubic -dstnodata None -co TILED=YES -co COMPRESS=DEFLATE -co BIGTIFF=IF_NEEDED /data/input.tif /data/output.tif
- 转MaoBox格式地形瓦片
MapBox支持的地形是Terrain-RGB格式, 用3个byte通过rgb三通道来表示高程, 其转换公式为: height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)
, 使用rio-rgbify实现转换命令如下, 详细说明文档: https://github.com/mapbox/rio-rgbify
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
rio rgbify -b -10000 -i 0.1 /data/input.tif /data/output_rgb.tif
- 转terrarium格式地形瓦片
terrarium格式是tangram引擎的官方地形格式,tangram是另外一款开源的webgl二三维一体化的引擎, 使用dem2terrain实现, 转换命令如下, 详细说明文档: https://github.com/FreeGIS/dem2terrain
例如: 将input.tif
转换256大小、3857坐标系的terrarium格式的mbtiles瓦片
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
dem2terrain -z 4-15 -s 256 -e terrarium -i input.tif -o output.mbtiles -c 1 -g 3857
提示: dem2terrain也支持生成MapBox支持的Terrain-RGB格式地形瓦片
- 影像直接转切片
影像直接转mbtiles主要使用命令gdal_translate, 该方法实际上是构建金字塔, 此方法无法自定义切片zoom范围, zoom范围跟影像的像素大小有关. 说明文档: https://www.osgeo.cn/gdal/programs/gdal_translate.html
- 影像转mbtiles, 此方法只会构建最大等级的mbtiles切片, 需要第二步向上构建金字塔
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdal_translate -of MBTiles -r nearest /data/input.tif /data/output.mbtiles
提示: DEM生成切片时, -r
重采样算法推荐使用bilinear
双线性插值法或cubic
双三次插值法
- mbtiles向上构建金字塔
使用gdaladdo命令完成, 说明文档: https://www.osgeo.cn/gdal/programs/gdaladdo.html
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdaladdo -r nearest /data/output.mbtiles
提示: DEM生成切片时, -r
重采样算法推荐使用bilinear
双线性插值法或cubic
双三次插值法; gdal_translate还可以通过 -co <NAME=VALUE>
控制输出瓦片的格式, 等其他命令操作, 例如生成png8格式的mbtiles栅格瓦片, 命令如下:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdal_translate -of MBTiles -co "TILE_FORMAT=PNG8" /data/input.tif /data/output.mbtiles
- 影像转切片碎片再转mbtiles
此方法支持自定义切片zoom范围, 但zoom切片越多, 需要时间越长.
- 影像转碎瓦片
主要使用命令gdal2tiles.py, 详细说明文档: https://www.osgeo.cn/gdal/programs/gdal2tiles.html
例如: 影像生成0~15级的切片命令如下:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
gdal2tiles.py -z 0-15 -r near --xyz /data/input.tif /data/outdir
提示: DEM生成切片时, -r
重采样算法推荐使用bilinear
双线性插值法或cubic
双三次插值法
- 碎瓦片转mbtiles
第一步生成的碎瓦片都在outdir文件夹内, 使用mb-util工具实现碎瓦片文件转mbtiles, 转换前需要在outdir文件夹下创建metadata.json文件, 详细说明文档: https://github.com/mapbox/mbutil
{
"name": "tif_tiles", //名称
"type": "overlay", //图层类型 可选 baselayer、overlay
"description": " tif_tiles", //别名
"version": "1.1", //版本
"format": "png", //瓦片格式, 栅格瓦片可选png、png8、jpeg
"minzoom": 0, //最小等级, 根据生成的范围填写
"maxzoom": 15 //最大等级, 根据生成的范围填写
}
运行下面命令生成mbtiles:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
mb-util /data/outdir /data/output.mbtiles
OSM数据下载地址: https://download.geofabrik.de/asia
全球海洋数据下载地址: https://osmdata.openstreetmap.de/data/water-polygons.html
- shp转osm
如果需要加入自定义数据, 可以根据需要将自定义shp数据导入osm, 使用ogr2osm实现, 详细说明文档: https://github.com/roelderickx/ogr2osm
转换input.shp为output.osm, 并定义图层为layerName, 且排除字段attribute1,attribute2:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
ogr2osm input.shp -o output.osm -nln layerName -e attribute1,attribute2
- OSM数据合并
当并不想使用全球的OSM数据, 请使用osmium进行合并, 详细说明文档: https://osmcode.org/osmium-tool/manual.html
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
osmium merge /data/china-latest.osm.pbf /data/taiwan-latest.osm.pbf -o china.all.pbf
- 设置数据边界
对OSM设置中国范围的bbox, 使用osmium进行处理:
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
osmium extract --bbox=73.41788,14.27437,134.8559,53.65559 --set-bounds --strategy=smart /data/china.all.pbf --output /data/china.pbf
使用OSM生成openmaptiles规范的矢量瓦片数据,请前往下载 config-openmaptiles.json 和 process-openmaptiles.lua 两个配置文件.
使用tilemaker进行生成命令, 详细说明文档: https://github.com/systemed/tilemaker
docker run -it --rm \
-v /待处理数据的路径:/data \
dxnima/webgisdata \
tilemaker --store --input /data/china.pbf --output /data/china.mbtiles --config /data/config-openmaptiles.json --process /data/process-openmaptiles.lua
tips
-
如果要包含全球海洋数据, 请在运行 tilemaker 的同一位置创建一个目录coastline, 既然
/待处理数据的路径/coastline
; 然后将water-polygons-split-4326.zip中的文件保存在其中, 并重命名为water_polygons.shp
, 最终目录如下/待处理数据的路径/coastline/water_polygons.shp
. -
这种方式生成的mbtiles瓦片数据支持 openmaptiles的样式
-
TileServer GL: 具有 GL 样式的矢量和栅格地图. 通过MapLibre GL Native进行服务器端渲染. MapLibre GL JS、Android、iOS、Leaflet、OpenLayers、通过WMTS的GIS等的地图瓦片服务器, 请探索.
-
MapTiler Server: 如果您需要一个设置简单、界面友好的地图服务器请探索.
QQ群:515705676