Mapbox GL JS 设计浅析

这是WebGIS引擎设计浅析系列中的第一篇,之后还会发布Leaflet和OpenLayers 3的设计浅析。把自己的分析和思考共享出来供大家讨论,为我们自己F3Earth设计提供参考。

Mapbox太牛逼了,在此就不用介绍了,不了解的请google。它推出的前端GIS引擎Mapbox GL JS值得我们学习,下面就是自己的一些总结。错误和不详的地方请各位大神多多指正,谢谢。

能表达整个Map的Style文件

mapbox-gl-js目前是围绕着style文件来进行的,其内容定义如下:

{
    "version": 8,
    "name": "Mapbox
Streets",
    "sprite": "mapbox://sprites/mapbox/streets-v8",
    "glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf",
    "sources": {...},
    "layers": [...]
}

从这里可以看到, 除了基本的属性定义之外,就是sources和layers。基本属性目前还不是很多,毕竟处于开发状态,
对具体属性感兴趣的可以参见 https://www.mapbox.com/mapbox-gl-style-spec/。 因为这不是我们要讲解的重点。

重点是mapbox正在通过这样一个style的配置文件来描述整个地图。这是目前其他map都没有使用的方式。在讨论如何设计实现这个目的之前, 我们想一下这样做有什么好处?最大的好处莫过于为自定义地图提供了方便之门。使用者压根可以不写任何代码,用mapbox就能做出一个自己想要的地图。这一点很符合mapbox目前提供的服务。这点提醒我们,设计最终还是为需求和业务服务的。而不是凭空想象的。style如此之重要,以至于官网专门对style进行详细了说明, 涉及到各个参数及作用。

Map的组成

任何GIS引擎必然要处理两部分, 一个是数据来源, 一个这些数据在界面呈现的样子。在style里面包含的source和layer对应于这两部分。

Source的设计

目前source支持vector,raster, geojson, image,video。geojson的支持比较巧妙,有了这个就可以处理各种矢量类型,包括集合。而前面的vector主要解决的是矢量瓦片,raster解决的是目前常用的栅格化的瓦片。video的加入使得功能更加的现代化。 mapbox在style里面,为source定义了一个type属性,来说明这些类型。

除了这个属性之外,source其实都有一个id,被layer引用,从而让数据源和数据呈现关联在一起。 这个地方需要注意的是,source和layer之间的关系,可以是1->n, 设计如此,为什么?结合下面的Layer的设计来看就明白了。

Layer的设计

分类

再来看layer的设计,虽然也是分为几类的,但并不是直接根据source来分类的。这一点你或许没有想到吧。我只能说mapbox开启了新的一种layer样式方式。目前分为:background,fill, line, symbol, raster, circle。除了background类型的layer不需要绑定source之外。其他的都需要有source。fill类型的layer只负责填充;line类型的layer只负责线条;symbol类型的layer会处理sprite,文字等;raster类型的layer就只负责图片, circle类型的layer是更高一层的业务处理需要。

大致看一下分类方式,肯定会有点莫名其妙。为什么要这样来分类?

首先想想各种界面,不就是点线面组成的吗? layer其实代表的就是界面,只是大家通常会认为一个layer上会放置各种点,线,面。 mapbox把这种layer再细分层了更小的单元, 只包含点的layer,只负责呈现线的layer,只负责面的layer。如果把多个layer组合在一起,就和现在的通用想法的layer是一样的,source和layer的1->n关系在这个地方发挥作用了。Okay,虽然功能上是能实现,但是为什么要搞的这么细分?

原因在于这样实现上就简单了,关键是可以提高效率,能批量化的渲染。只能说mapbox团队真的很牛,能从最贴近用户的需求到实现的最底层整个过程的东西都考虑进去来进行设计。 在很多时候, 少量的规则会带来很大的收获,关键在于找到一个折中的实现。这样设计虽然可能给使用上带来一点不快,但还是能接受的。

Filter

Layer 除了上面这个牛逼的设计之外,mapbox也充分考虑了个别特殊元素的定制化显示需求:如果要对一批元素中的某些个别元素进行定制化呈现,可以在layer里面设置filter,满足条件的元素才会被呈现出来,并用layer设定的样式渲染。filter是一个很强大的功能,有效融合在设计中,可以解决很多问题。OpenLayers 3真的可以借鉴一下这个。

结束语

Mapbox GL JS设计的精彩部分基本就到此结束了。什么?就完了? API都还没有说呢? 不好意思,style文件才是核心,API只是围绕着这个核心服务的, 所以也就可想而知了, 想看看具体有哪些API, 可以参见 https://www.mapbox.com/mapbox-gl-js/api

除此之外,Mapbox GL JS还可以支持plugin,提供了对应的接口, 和leaflet类似,但这部分的精彩,还是放在Leaflet的部分来讲解吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容