進(jìn)階mapbox GL之paint和filter

概述

通過前面的文章初識(shí)mapbox GL我們對(duì)mapbox GL有了一個(gè)相對(duì)比較全面的認(rèn)識(shí)煌集,本節(jié)結(jié)合一些示例垦巴,重點(diǎn)講述一下mapbox GL里面的filter和paint的用法帅刀。

說明

本文中的示例數(shù)據(jù)源是北京的區(qū)邊界數(shù)據(jù),格式為geojson惋戏,數(shù)據(jù)字段與詳情如下:


示例數(shù)據(jù)

filter

filter是layer里面的一個(gè)屬性驰徊,通過一些條件表達(dá)式實(shí)現(xiàn)僅顯示與過濾器匹配的要素,即圖層的過濾顯示惦银,其官方說明如下圖:

filter

1咆课、==和!=

==!=可實(shí)現(xiàn)根據(jù)某個(gè)字段圖層的過濾展示。如:只在地圖上展示昌平區(qū)或者在地圖上展示除昌平外的所有區(qū)域扯俱。

// 只在地圖上展示昌平區(qū)
var filter = ['==', 'name', '昌平區(qū)'];

//地圖上展示除昌平外的所有區(qū)域
var filter = ['!=', 'name', '昌平區(qū)'];
['==', 'name', '昌平區(qū)']

['!=', 'name', '昌平區(qū)']

2书蚪、>、>=迅栅、<殊校、<=

>、>=库继、<箩艺、<=是通過比較大小的方式,實(shí)現(xiàn)圖層的過濾宪萄,所以此處需要的字段得是數(shù)字類型或者通過to-number將字段轉(zhuǎn)換成數(shù)字類型艺谆。如:展示count>=10的區(qū)域。

var filter = ['>=', 'count', 10];
['>=', 'count', 10]

3拜英、in和match

inmatch都可實(shí)現(xiàn)對(duì)圖層根據(jù)某個(gè)字段進(jìn)行多值過濾静汤。如:在地圖上展示昌平區(qū)和海淀區(qū)。

// in 
var filter = [
  'in', 
  'name',
  '昌平區(qū)',
  '海淀區(qū)'
];
// match
var filter = [
  "match",
  [
    "get",
    "name"
  ],
  [
    "昌平區(qū)",
    "海淀區(qū)",
  ],
  true,
  false
]
in和match

接著上面的例子居凶,如果我們要實(shí)現(xiàn)在地圖中展示除海淀和昌平區(qū)外的其他區(qū)域虫给,我們可以直接用!in和將match的條件互換的方式來實(shí)現(xiàn),如下:

// in 
var filter = [
  '!in', 
  'name',
  '昌平區(qū)',
  '海淀區(qū)'
];
// match
var filter = [
  "match",
  [
    "get",
    "name"
  ],
  [
    "昌平區(qū)",
    "海淀區(qū)",
  ],
  false,
  true
]
!in和match

4侠碧、多條件

有時(shí)候抹估,會(huì)存在多條件的過濾,例如:我們選擇type==1并且count>10的區(qū)域弄兜,我們可以這么寫:

var filter = [
  'all',
  ['>=', 'count', 10],
  ['==', 'type', 1]
]
多條件過濾

當(dāng)然药蜻,有時(shí)我們會(huì)存在根據(jù)幾何類型來進(jìn)行過濾瓷式,此時(shí),我們可用:

var filter = [
    "==",
    ["geometry-type"],
    "LineString"
  ];

paint

paint是layer的一個(gè)屬性语泽,負(fù)責(zé)圖層的渲染與呈現(xiàn)贸典。

1、match

match通常用于枚舉型的字段渲染踱卵,如唯一值渲染廊驼。

'circle-color': [
 'match',
 ['get', 'type'],
 1, '#FFD273',
 2, '#E86D68',
 '#A880FF'
]
match

2、case

case通常用于分段數(shù)值型的字段渲染惋砂,值域是前關(guān)后開妒挎,如分級(jí)渲染。

'circle-color': [
  'case',
  ['<', ['get', 'speed'], 10.8], 'rgba(0,0,0,0)', //<10.8
  ['<', ['get', 'speed'], 17.2], 'rgba(153, 255, 153, .9)', //>=10.8 & <17.2
  ['<', ['get', 'speed'], 24.5], 'rgba(102, 204, 255, .9)',
  ['<', ['get', 'speed'], 32.7], 'rgba(255, 255, 102, .9)',
  ['<=', ['get', 'speed'], 41.5], 'rgba(253, 139, 0, .9)',
  ['<=', ['get', 'speed'], 50.1], 'rgba(255, 51, 0, .9)', //>=41.5 & <50.1
  'rgba(255, 0, 255, .9)' // 默認(rèn)值, >=50.1
]

注意

  1. 第一個(gè)的判斷是<;
  2. 中間的判斷是>=<;
  3. 最后一個(gè)判斷是>=;
    case

3班利、step

step和上面的case很類似饥漫,只是值域是前開后關(guān)的榨呆。

// <=100, 100-500, >500
"circle-color": [
  "step",
  ["get", "count"],
  "#51bbd6", 100,
  "#f1f075", 500,
  "#f28cb1" // other
]

'circle-color': [
  'step',
  ['to-number', ['get', 'CID']],
  '#0098A3',  10, 
  '#00CA8D', 20, 
  '#37C508', 30, 
  '#98F300',  40, 
  '#EFFF85'
]

說明:

  1. 對(duì)于非數(shù)值型的字段罗标,我們可以用to-number對(duì)字段進(jìn)行轉(zhuǎn)換。
    step

4积蜻、interpolate

interpolate闯割,中文的翻譯是“插值”,在mapbox GL中竿拆,我們可通過interpolate實(shí)現(xiàn)按照比例的插值渲染宙拉。

// <=8, 8-10, >10
"background-color": [
  "interpolate",
  ["linear"],
  ["zoom"],
  8, "rgba(0, 0, 255, 0.2)",
  10, "rgba(255, 0, 0, 0.2)"
]

// <=20, 20-60, 60-100, >100
'fill-extrusion-color': [
  'interpolate',
  ['linear'],
  ['get', 'height'],
  20, 'rgba(255,255,191, 0.65)',
  60, 'rgba(253,174,97, 0.65)',
  100, "rgba(215,25,28, 0.65)"
]

// exponential,指數(shù)
"fill-opacity": [
  "interpolate",
  ["exponential", 1.5],
  ["zoom"],
  2, 0.3,
  7, 0
]

說明:

  1. zoom是一個(gè)特殊字符丙笋,特制地圖的縮放級(jí)別谢澈,同樣的還有geometry-type,特指的是geom類型。
    interpolate

完整測試代碼如下:

var rootPath = 'http://127.0.0.1:3000/mapbox/lib/';
// var filter = ['match', ['get', 'name'],
//   ['昌平區(qū)', '海淀區(qū)'], false, true
// ];
// var filter = ['!in', 'name', '昌平區(qū)', '海淀區(qū)'];

// var filter = [
//   'all',
//   ['>=', 'count', 10],
//   ['==', 'type', 1]
// ];

var filter = ['>=', 'count', 0];
// var fillColor = 'rgba(255, 0, 0, 0.5)';

// 唯一值圖
// var fillColor = [
//   'match',
//   ['get', 'type'],
//   1, '#FFD273',
//   2, '#E86D68',
//   '#A880FF'
// ];

// 分級(jí)色彩圖
// var fillColor = [
//   'case',
//   ['<', ['get', 'count'], 10], '#FFD273',
//   ['<', ['get', 'count'], 20], '#E86D68',
//   ['<', ['get', 'count'], 30], '#A880FF',
//   ['<', ['get', 'count'], 40], '#68E0E8',
//   ['<=', ['get', 'count'], 50], '#9BFF69',
//   '#000' // 默認(rèn)值
// ];

// 比例符號(hào)圖
var fillColor = [
  'interpolate',
  ['linear'],
  ['get', 'count'],
  15, '#FFD273',
  30, '#E86D68',
  50, '#9BFF69'
];

// 步長圖
// var fillColor = [
//   'step',
//   ['get', 'count'],
//   '#0098A3',
//   10, '#00CA8D',
//   20, '#37C508',
//   30, '#98F300',
//   40, '#EFFF85'
// ]
var mapStyle = {
  "version": 8,
  "name": "Dark",
  "sources": {
    "geojson": {
      type: 'geojson',
      data: '../data/beijing.geojson'
    }
  },
  "glyphs": rootPath + "fonts/mapbox/{fontstack}/{range}.pbf",
  "layers": [{
      "id": "background",
      "type": "background",
      "paint": {
        "background-color": "#999"
      }
    },
    {
      'id': 'geojson',
      'source': 'geojson',
      'type': 'fill',
      'paint': {
        'fill-color': fillColor,
        'fill-opacity': .8
      },
      filter: filter
    },
    {
      'id': 'geojson-border',
      'source': 'geojson',
      'type': 'line',
      'paint': {
        'line-color': '#FFF',
        'line-width': 1.5
      },
      filter: filter
    },
    {
      'id': 'points',
      'type': 'symbol',
      'source': 'geojson',
      'layout': {
        'text-field': ['get', 'name'],
        "text-size": 22
      },
      paint: {
        'text-color': '#000000'
      },
      filter: filter
    }
  ]
};
map = new mapboxgl.Map({
  container: 'map',
  maxZoom: 18,
  minZoom: 6,
  zoom: 8,
  center: {
    lng: 116.6552,
    lat: 40.2482
  },
  style: mapStyle,
  attributionControl: false,
  localIdeographFontFamily: "'全新硬筆行書簡'"
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末御板,一起剝皮案震驚了整個(gè)濱河市锥忿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怠肋,老刑警劉巖敬鬓,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笙各,居然都是意外死亡钉答,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門杈抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來数尿,“玉大人,你說我怎么就攤上這事惶楼∮冶模” “怎么了虏缸?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫩实。 經(jīng)常有香客問我刽辙,道長,這世上最難降的妖魔是什么甲献? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任宰缤,我火速辦了婚禮,結(jié)果婚禮上晃洒,老公的妹妹穿的比我還像新娘慨灭。我一直安慰自己,他們只是感情好球及,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布氧骤。 她就那樣靜靜地躺著,像睡著了一般吃引。 火紅的嫁衣襯著肌膚如雪筹陵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天镊尺,我揣著相機(jī)與錄音朦佩,去河邊找鬼。 笑死庐氮,一個(gè)胖子當(dāng)著我的面吹牛语稠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弄砍,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼仙畦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了音婶?” 一聲冷哼從身側(cè)響起慨畸,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桃熄,沒想到半個(gè)月后先口,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞳收,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年碉京,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟深。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谐宙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出界弧,到底是詐尸還是另有隱情凡蜻,我是刑警寧澤搭综,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站划栓,受9級(jí)特大地震影響兑巾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忠荞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一蒋歌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧委煤,春花似錦堂油、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讥邻,卻和暖如春迫靖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背计维。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工袜香, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲫惶。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像实抡,于是被迫代替她去往敵國和親欠母。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容