mapbox.gl源码解析——基本架构与数据渲染流程

加载地图

 Mapbox GL JS是一个JavaScript库,使用WebGL渲染交互式矢量瓦片地图和栅格瓦片地图。WebGL渲染意味着高性能,MapboxGL能够渲染大量的地图要素,拥有流畅的交互以及动画效果、可以显示立体地图并且支持移动端,是一款十分优秀的WEB GIS开发框架。

在页面引入MapboxGL脚本库和样式库:

<script src=‘https://api.mapbox.com/mapbox-gl-js/v0.40.0/mapbox-gl.js‘></script><link href=‘https://api.mapbox.com/mapbox-gl-js/v0.40.0/mapbox-gl.css‘ rel=‘stylesheet‘/>

也可以在GitHub找到MapboxGL : https://github.com/mapbox/mapbox-gl-js/releases

执行上述引入脚本后即创建了mapboxgl对象,通过它可以使用MapboxGL的全部功能。 
在使用之前,需要先设置mapboxgl.accessToken。access tokens(访问令牌)可以使用API提供的示例(如下),也可以注册MapBox账号,在用户信息页查看或者创建令牌。

 接下来使用创建地图实例。主要配置项如下:

const myMap = new mapboxgl.Map({
  container: ‘<Id of Container Element>‘,
  style: ‘<Your Style Here>‘,
  center: [112.508203125, 37.97980872872457],
  zoom: 4,
  pitch: 0,
  bearing: 0,
});

基本架构

 mapbox的架构有些奇怪,接口层和逻辑层其实没有明确的区分;mapbox中style是一个比较重要的类;统辖整个数据层次;Painter中集成了draw和style两个模块

数据处理流程

数据加载与渲染流程

数据的加载与解析在source中;主要有两部分组成,逻辑部分在主线程中比如:
vector_tile_source、geojson_source中
而实际的加载解析则是在对应的worker中,比如:
vector_tile_worker_source、geojson_worker_source中

以vector_tile_source和vector_tile_worker_source为例介绍,实际的数据解析在vector_tile_worker_source中的loadTile方法,这里接收主线程中传递的参数,以及子线程的回调函数,应该是Actor中的done函数

进而进入
loadVectorData函数,getArrayBuffer是调用普通的ajax去请求二进制数据,与室内的数据方式一样。数据请求成功后,将二进制数据实例化成一个

PBF是一个协议二进制格式,他里面提供了一些方法,方便按照一定的规则来解析二进制数据。

这里是VectorTile中的一个VectorTileLayer读取到的二进制字段;这里的解析是把二进制转化成js对象,里面的数据还需要进一步转换成可用的几何数据和属性数据。

因为mabox的二进制编码使用的是谷歌的二进制编码方式,所以可以直接使用PBF这个npm包来进行解码

LoadVectorData加载完后数据进入回调函数中;

接下来进入WorkerTile中的parse方法,开始各种解析数据;这里面要看一下LayerIndex这个对象是StyleLayerIndex的一个实例,里面存放一些跟样式相关的属性

然后从sourceLayer中获取VectorTileFeature,实际也是从pbf中解析数据

接下来是创建bueket并调用bucket的populate方法

polulate可以理解为首先根据比例进行数据缩放,然后调用addFeature方法,将Feature的几何图形信息添加到bucket的vertexArray中,然后FeatureIndex记录一些信息。
不同的Bucket的polulate方法也不同,addFeature方法更不同。像SymbolBucket添加到vertexArray中的就不是单一的点信息,而是文本盒子的信息。

原文地址:https://www.cnblogs.com/dojo-lzz/p/10165817.html

时间: 2024-07-29 00:51:48

mapbox.gl源码解析——基本架构与数据渲染流程的相关文章

jQuery源码解析(架构与依赖模块)第一章 理解架构

1-1 jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及后续版本将不再支持IE6/7/8浏览器.jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用).events.实现动画效果,并且方便地为网站提供AJAX交互.jQuery还有一个比较大的优势是,它

Android View体系(八)从源码解析View的layout和draw流程

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Scroller Android View体系(五)从源码解析View的事件分发机制 Android View体系(六)从源码解析Activity的构成 Android View体系(七)从源码解析View的measure流程 前言 上一篇文章我们讲了View的measure的流程,接下来我们

mybatis源码解析之架构理解

mybatis是一个非常优秀的开源orm框架,在大型的互联网公司,基本上都会用到,而像程序员的圣地—阿里虽然用的是自己开发的一套框架,但其核心思想也无外乎这些,因此,去一些大型互联网公司面试的时候,总是会问到对于这些开源框架的理解,有没有阅读开源框架的源码,虽说是面试造火箭,工作拧螺丝,但是让你造火箭的时候,你总得能伸把手啊.所以,我们既然不能改变大厂,那只能自己去提升源码阅读的能力了. mybatis其实做的事情很简单,就是封装了对数据库的访问,我们开发的时候,只需要写接口,传参,配置数据库地

jQuery源码解析(架构与依赖模块)

回溯处理 jQuery对象栈:jQuery内部维护着一个jQuery对象栈.每个遍历方法都会找到一组新元素(一个jQuery对象),然后jQuery会把这组元素推入到栈中. 而每个jQuery对象都有三个属性:context.selector和prevObject,其中的prevObject属性就指向这个对象栈中的前一个对象,而通过这个属性可以回溯到最初的DOM元素集中. jQuery为我们操作这个内部对象栈提供个非常有用的2个方法 .end()  : 就是回溯到上一个Dom合集,因此对于链式操

2017.9.26JQuery源码解析一 架构与依赖

jq1.0: css选择符   事件处理  ajax交互 1.2.3: 引入数据缓存,解决循环引用与大数据保存问题 1.3.  : 使用全新的选择器引擎sizzle,在各个浏览器下全面超越其他同类js框架的查询速度 1.5.  : 新增延缓对象(Deferred object), 并用deferred重写了Ajax模块 1.7.  : 抽象出回调对象,提供了强大的方式来管理回调函数列表 选择器    DOM操作    事件    ajax与动画 jquery 有13个模块 单一职责SRP  :

Fresco源码解析 - DataSource怎样存储数据

datasource是一个独立的 package,与FB导入的guava包都在同一个工程内 - fbcore. datasource的类关系比较简单,一张类图基本就可以描述清楚它们间的关系. DataSource 是一个 interface, 功能与JDK中的Future类似,但是相比于Future,它的先进之处则在于 不仅仅只生产一个单一的结果,而是能够提供系列结果. Unlike Futures, DataSource can issue a series of results, rathe

Mahout推荐系统引擎UserCF中的IRStats部分源码解析

Mahout提供推荐系统引擎是模块化的,分为5个主要部分组成: 1. 数据模型 2. 相似度算法 3. 近邻算法 4. 推荐算法 5. 算法评分器 今天好好看了看关于推荐算法以及算法评分部分的源码. 以http://blog.csdn.net/jianjian1992/article/details/46582713 里边数据的为例进行实验. 整体流程的代码如下,依照上面的5个模块,看起来倒是很简单呀. public static RecommenderBuilder userRecommend

spring源码解析前瞻

IOC.AOP是spring的2个核心特性.理解这2个特性,有助于更好的解析源码. IOC:控制反转.把创建对象的权利交给框架,这有利于解耦. public class PageController { public String showPage(){ PageService page = new PageService(); return ""; } } 原先PageController中使用PageService,需要自己new创建对象,使用spring后,由容器创建PageSe

jQuery整体架构源码解析

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下