webgis之制作地图切片方法(三) —— tippecanoe

4 篇文章 0 订阅
3 篇文章 0 订阅

相关文章

webgis之制作地图切片方法(一) —— QGIS
webgis之制作地图切片方法(二) —— gdal2tiles.py

前言
本文介绍Mapbox开源的一个非常强大的矢量切片工具应用 —— tippecanoe。通过该工具可以将geojson格式的数据切片成 xyz 形式的矢量切片 或者 mbtiles 格式的矢量切片。本文将介绍该工具简单应用方式,并通过 MapboxGL 预览切片。

  • 环境
    macOS、tippecanoe、express、MapboxGL
  • 工具安装
    本实验是macOS环境,win系统使用可以装个ubuntu虚拟机,具体方式可以参考官网
$ brew install tippecanoe

制作切片

更多配置项参考官网

1. 制作mbtiles 切片
配置项含义
-zg自动选择最大的maxZoom,平衡性能
-o输出文件
custome.json切片的文件,仅支持geojson,根据实际情况写
tippecanoe -zg -o custom.bmtiles custom.json 

2. 制作xyz切片(pbf)

(1)不压缩的pbf 切片
配置项含义
-zmaxZoom,最大的切片层级
-ZminZoom,最小的切片层级
-pC不压缩文件(gzip)
-e输出文件夹
custome.json切片的文件,仅支持geojson,根据实际情况写
tippecanoe -z10 -Z0 -pC -e xyz custom.json
  • 切片结果如下:
    在这里插入图片描述
  • MapboxGL加载切片

未压缩的切片放在服务器中以静态文件服务的形式发布,可以使用MapboxGL直接调用。

<html>

<head>
    <title>Mapbox Demo</title>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <link href="https://api.mapbox.com/mapbox-gl-js/v2.13.0/mapbox-gl.css" rel="stylesheet">
    <script src="https://api.mapbox.com/mapbox-gl-js/v2.13.0/mapbox-gl.js"></script>
</head>

<body>
    <div id="map" style="width: 100vw; height: 100vh"></div>
</body>
<script type="text/javascript">

    // Get a mapbox API access token
    mapboxgl.accessToken = 'token';

    // Initialize mapbox map
    const map = new mapboxgl.Map({
        container: 'map',
        style: 'mapbox://styles/mapbox/dark-v11',
        center: [22.324219, 42.423322],
        zoom: 4,
    });

    map.on('load', () => {

        map.addSource('myvct', {
            type: 'vector',
            tiles: ['http://localhost:3000/geoserver/{z}/{x}/{y}.pbf']
        })
        map.addLayer({
            id: 'mylayer',
            source: 'myvct',
            "source-layer": 'custom',
            type: 'fill',
            paint: {
                "fill-color": '#0080ff',
                'fill-opacity': 0.5
            }
        })
    });
</script>

</html>
  • 渲染效果
    在这里插入图片描述
    (2)gzip压缩的pbf切片
    gzip压缩是默认的切片方式,其中有一点点坑,切片集不能在像未压缩那样简单粗暴的扔到服务器调用就行,如何使用往下看吧。
  • 切片命令
tippecanoe -z10 -Z0 -e xyz custom.json
  • 问题
    将切片结果,仍然像上文那样去使用时,客户端报错了message : "Unimplemented type: 3",这个问题官方也有提到 issues,由此官网也对这个做了补充描述。
  • 解决方法
    解决方法很简单,只需要在请求切片返回头参数Response Headers加参数 Content-Encoding: gzip 就可以了。实现目的的方式多种多样,本实验使用 express 实现地图服务支持。服务端关键代码如下:
const express = require("express");
const fs = require("fs");
const path = require("path");

const app = express();
const port = 3000;

// 自定义跨域中间件
const allowCors = function (req, res, next) {
  res.header("Access-Control-Allow-Origin", req.headers.origin);
  res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
  res.header("Access-Control-Allow-Headers", "Content-Type");
  res.header("Access-Control-Allow-Credentials", "true");
  next();
};
app.use(allowCors); //使用跨域中间件

// pbf 矢量切片请求接口
app.get("/geoserver/:z/:x/:y", (req, res) => {
  const { z, x, y } = req.params;

  // 读取pbf文件
  const pbfFilePath = `./zipxyz/${z}/${x}/${y}`

  if(fs.existsSync(pbfFilePath)){
    const file = fs.createReadStream(pbfFilePath);
    // 根据pbf文件是否压缩设置相应头
    res.setHeader("Content-Encoding", "gzip");
  
    /**
     * some program block.
     */
  
    file.pipe(res);
  }
});

app.listen(port, () => {
  console.log(`server on ${port}`);
});

  • 效果
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebGIS之Leaflet全面解析》是一本针对WebGIS开发中的Leaflet库进行详细解析的PDF教程。本书内容丰富全面,适合WebGIS初学者或有一定基础的开发者学习。 首先,本书首先介绍了WebGIS的基本概念和发展趋势,让读者对WebGIS有一个整体的认识。然后,重点介绍了Leaflet库的基本知识和使用方法。Leaflet是一个轻量级的JavaScript库,用于在Web浏览器中创建地图和交互式地图应用程序。 在Leaflet的基础知识介绍之后,本书详细讲解了Leaflet库的各种功能和插件。包括地图的创建与配置、图层的添加与控制、交互操作的实现、地图样式的定制等方面。同时,本书还扩展了Leaflet库的功能,介绍了如何在Leaflet中集成常见的地理信息数据格式,如GeoJSON、WMS等。还介绍了如何使用Leaflet与其他常见的WebGIS框架和工具进行集成开发,如OpenLayers、ArcGIS API for JavaScript等。 除了技术介绍外,本书还包含了丰富的实例和案例,帮助读者快速上手并深入理解Leaflet库的使用和应用场景。通过实例的讲解,读者可以学习如何使用Leaflet库开发各种功能丰富的WebGIS应用程序,如地图展示、地理信息查询、路径规划、地理数据可视化等。 总之,《WebGIS之Leaflet全面解析》是一本内容详实、实用性强的教程,通过学习本书,读者可以全面掌握Leaflet库的使用方法和开发技巧,有助于提升WebGIS应用程序的开发水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值