mapboxgl 地图样式 - 重分类渲染

上回,我们在《mapboxgl 地图样式 - 唯一值渲染》中了解到case、match、get等表达式,通过表达式来完成了唯一值渲染。

在实际情况下,我们还经常需要进行重分类渲染,将某范围的值重分为一类,并将另一个范围重分为其它类。

今天我们继续了解新的表达式来实现重分类渲染。

重分类效果图:

image

方式一:使用step表达式

"fill-color":[
    "step",
    ["get","population"],
    "#ffd0a6", 50,
    "#ffaa7f", 100, 
    "#ff704e", 150, 
    "#f04040", 200, 
    "#b50a09"
]

上面表达式的意思是:

  • get获取属性值population,小于50,颜色是#ffd0a6
  • 大于等于50,但小于100时,颜色是#ffaa7f
  • 大于等于100,但小于150时,颜色是#ff704e
  • 大于等于150,但小于200时,颜色是#f04040
  • 大于等于200,颜色是#b50a09

看到这里是不是奇怪step是起什么作用的?step译为步,一步一步就是分段的意思,它产生阶梯式结果,把一段值归为一类,小于50的是一类,大于等于50又小于100是一类,每一类step都会输出一个值,在效果图中展示为50万人口以下地区是一个颜色,大于等于50又小于100万人口区间的地区为另一个颜色。

我们在下篇渐变色渲染的文章中将会了解interpolate表达式,与step表达式产生的阶梯式结果相反,interpolate表达式将会产生连续结果。

翻译成js是:

function getColor(feature){  //feature是geojosn格式中的Feature
  if(feature.properties.population<50){    
    return '#ffd0a6'
  }
  else if(feature.properties.population<100){  
    return '#ffaa7f'
  }
  ...
  else{
    return '#b50a09'
  }
}

step表达式语法规则:

  1. "step"是表达式的名称
  2. ["get","adcode"]是输入值,必须为数值类型或者是数值表达式
  3. "#ffd0a6"是输出值
  4. 50是判断值
  5. ...(根据实际情况两两出现的输出值、判断值)
  6. "#b50a09"是输出值

step表达式有5个必需参数,并且不能乱序:表达式的名称、输入值、输出值、判断值,... ...,输出值(省略部分为输出值、判断值,在省略部分里如果出现了,就必须两两出现)。也就是说除了表达式的名称和输入值以外,最少还需要一个输出值、一个判断值、再加一个输出值。

//必需参数
"fill-color":[
    "step", //表达式的名称
    ["get","population"], //输入值
    "#ffd0a6",  //输出值
    50, //判断值
    "#b50a09" //输出值
]

step表达式写起来较为简洁,但需要注意的一点是判断值必须遵循升序规则

在线示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglStyleReclass2

方式二:使用 case 表达式

case表达式类似js里的if判断语句。表达式的实现效果比较依赖于属性值,通常我们先使用get表达式去获取属性值,再去判断这个属性值,以此达到在同一图层上实现不同的展示效果。

"fill-color":[
    "case",
    ['boolean',['<',["get","population"],50]],"#ffd0a6",
    ['boolean',['<',["get","population"],100]],"#ffaa7f",
    ['boolean',['<',["get","population"],150]],"#ff704e",
    ['boolean',['<',["get","population"],200]],"#f04040",
    '#b50a09'
]

上面表达式的意思是:

  • t获取属性值population,小于50,颜色是#ffd0a6

  • 大于等于50,但小于100时,颜色是#ffaa7f

  • 大于等于100,但小于150时,颜色是#ff704e

  • 大于等于150,但小于200时,颜色是#f04040

  • 大于等于200,颜色是#b50a09

在线示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglStyleReclass1

翻译成js是:

function getColor(feature){  //feature是geojosn格式中的Feature
  if(feature.properties.population<50){    
    return '#ffd0a6'
  }
  else if(feature.properties.population<100){  
    return '#ffaa7f'
  }
  ...
  else{
    return '#b50a09'
  }
}

case表达式写起来较为繁琐,但它对判断值没有升序这种要求,只要是true或false就行了。

方式三:分图层设置

{
    "id": "beijing200plus",
    "type": "fill",
    "source": "beijing",
    "paint":{
        "fill-color":"#b50a09"
    },
    "filter":['>=',["get","population"],200]
},
{
    "id": "beijing200",
    "type": "fill",
    "source": "beijing",
    "paint":{
        "fill-color":"#f04040"
    },
    "filter":['all',['<',["get","population"],200],['>=',["get","population"],150]]
},
{
    "id": "beijing150",
    "type": "fill",
    "source": "beijing",
    "paint":{
        "fill-color":"#ff704e"
    },
    "filter":['all',['<',["get","population"],150],['>=',["get","population"],100]]
},
{
    "id": "beijing100",
    "type": "fill",
    "source": "beijing",
    "paint":{
        "fill-color":"#ffaa7f"
    },
    "filter":['all',['<',["get","population"],100],['>=',["get","population"],50]]
},
{
    "id": "beijing50",
    "type": "fill",
    "source": "beijing",
    "paint":{
        "fill-color":"#ffd0a6"
    },
    "filter":['<',["get","population"],50]
}

分图层是使用filter筛选实现,上面代码里出现了新的表达式all,all表达式相当于js里的&&,当他后面的参数都为true就会返回true,否则返回false,我们举个例子:

"filter":['all',['<',["get","population"],200],['>=',["get","population"],150]]

翻译成js是:

function getFilter(feature){  //feature是geojosn格式中的Feature
  if(feature.properties.population<200 && feature.properties.population>=150){
      return true
  }else{
      return false
  }
}

filter分图层可以在maputnik中直接调颜色,但是图层会变多,不方便管理。

在线示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglStyleReclass3

最后小结:

  1. case和filter的优点都是相对于step而言的,而且case和filter写起来都避免不了繁琐这一点。
  2. 仅从“重分类”概念的角度来说,最合适的表达式是step,它本身产生分段式结果会更契合“重分类”这一概念。
  3. case和filter更适合作为一种“补充”,在某些情况下使用。因为它们并不要求判断值必须升序,更为灵活。
  4. 在mapbox里重分类更推荐使用step表达式,case表达式和filter分图层可以作为补充方法来了解。



原文地址:http://gisarmory.xyz/blog/index.html?blog=mapboxglStyleReclass

欢迎关注《GIS兵器库

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接: http://gisarmory.xyz/blog/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

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

推荐阅读更多精彩内容

  • mapboxgl 中提供了强大的地图样式编辑功能,样式表达式是其一大特色。 唯一值渲染是GIS中常见的专题图渲染方...
    GIS兵器库阅读 1,082评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,472评论 1 45
  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 8,198评论 0 22
  • github地址,欢迎大家提交更新。 express() express()用来创建一个Express的程序。ex...
    Programmer客栈阅读 2,511评论 0 1