Leaflet 笔记六:瓦片矢量渲染

作者: brandonxiang | 来源:发表于2016-08-02 13:28 被阅读3700次

Leaflet 笔记六:瓦片矢量渲染

github源码在此,希望大家一起开发,记得点星:
https://github.com/brandonxiang/leaflet-geojson-vt

前言

结合地图瓦片整体介绍,我们可以知道如今互联网地图逐渐走向一个方向就是Canvas。减少实现传统的栅格瓦片,SVG。而是用Canvas针对数据整体绘画。优点在于效率高,可以很轻地渲染上万个点,上万条线,上万个面,不卡顿,例子参考一条数据狗的上海房价研究。所以说这是一个未来的方向。

随着leaflet进入1.0,它在一定程度下更多使用了Canvas,详情Leaflet 笔记七:Leaflet1.0的重大改变,让我们更好地享受大数据时代的快感。

问题

针对海量的矢量数据,怎样才能高效渲染呢?

结构

瓦片分片异步渲染Canvas是最最高效的一种体现。每一个256*256的格网当中,都存在一个Canvas,每个Canvas独立渲染。这依赖于Leaflet 0.7 中的L.TileLayer.Canvas或者是1.0中的L.GridLayer,所以该库分开两分支分别实现。

master        =>  0.7 leaflet
leaflet1.0.0  =>  1.0 leaflet

实现的方式依赖于mapbox/geojson-vt,它可以帮我们把geojson分解为瓦片大小的线条,我们只需要通过瓦片编号x,y,z去索引对应的格网中的矢量数据。

var tile = tileIndex.getTile(zoom, tilePoint.x, tilePoint.y);

我扩展了L.TileLayerL.GridLayer这个类,结合geojson-vt的数据,实现对应的绘画。该项目受到一个例子geojson-vt-leaflet的启发。

使用方法

首先,设置对应的参数,参数内容参考geojson-vt optionsL.geojson style

var options = {
    maxZoom: 16,
    tolerance: 3,
    debug: 0,
    style: {
        fillColor: '#1EB300',
        color: '#F2FF00',
        weight: 2
    }
};
var canvasLayer = L.tileLayer.canvas.geoJson(json, options).addTo(map);

图层设置好后,加入地图则完成瓦片矢量渲染。

优点

随着异步功能的使用,效率较高。

缺点

  1. 每个格网间失去联系。实现交互功能变得不可能。

  2. mapbox GL js使用的是整体一个canvas效率也极其高,与mapbox的设计背道而驰。

个人建议还是使用1.0的L.Canvas实现矢量渲染。

转载,请表明出处。总目录Awesome GIS

相关文章

网友评论

  • f0a77a95b12e:博主你好,我想问下,既要实现加载大数据量,又要有交互的话,有什么好的解决方案吗?本文的话可以解决数据量大的问题,但是canvas不能交互,希望指点指点
    f0a77a95b12e:@brandonxiang 用 canvas还能交互?我是说要获取每个 feature。不过这个问题已经用 geoserver解决了。
    brandonxiang:@看不见的天涯 能交互的
  • d75e531660c0:谢谢分享,想问下如何用tangram实现矢量地图的倾斜渲染,3D渲染
  • 同吢欢楽:请问你们有没有办法,把用div渲染的leaflet地图,通过js的方法,保存成为一张图片?现在我的需求是这个,但是,实现不了呀。。求大神指导。
  • 6d4ac263bbfd:您好,感谢您的文章,受益匪浅!新手入门,想要用leaflet的canvas加载geojson中的5万个点,应该如何实现呀~看了很久文档,没能明白具体的实现方法
    brandonxiang:@Marshall2000 可以,leaflet框架可以,mapbox也可以
    d5bf2fba1101:请问这个是之能支持默认的3857坐标系吗?? 有个项目发现作者的这个方法效果很不错,但是不知道其他坐标系的GEOJSON可不可以用??
    brandonxiang:@Gemma_b2ca leaflet现在是支持canvas的你可以直接用文档的方法
  • 9fa774cfeab3:我的做法是给要素建个索引,记录在不同的瓦片位置,这样就可以在瓦片间保持联系,交互也容易实现了
    brandonxiang:@冯涛0919 感觉可以做,但是要这么做很麻烦的

本文标题:Leaflet 笔记六:瓦片矢量渲染

本文链接:https://www.haomeiwen.com/subject/ifufsttx.html