进阶mapbox GL之paint和filter
概述
通过前面的文章初识mapbox GL我们对mapbox GL有了一个相对比较全面的认识,本节结合一些示例,重点讲述一下mapbox GL里面的filter和paint的用法。
说明
本文中的示例数据源是北京的区边界数据,格式为geojson,数据字段与详情如下:
filter
filter是layer里面的一个属性,通过一些条件表达式实现仅显示与过滤器匹配的要素,即图层的过滤显示,其官方说明如下图:
1、==和!=
==
和!=
可实现根据某个字段图层的过滤展示。如:只在地图上展示昌平区或者在地图上展示除昌平外的所有区域。
// 只在地图上展示昌平区
var filter = ['==', 'name', '昌平区'];//地图上展示除昌平外的所有区域
var filter = ['!=', 'name', '昌平区'];
2、>、>=、<、<=
>、>=、<、<=
是通过比较大小的方式,实现图层的过滤,所以此处需要的字段得是数字类型或者通过to-number
将字段转换成数字类型。如:展示count>=10
的区域。
var filter = ['>=', 'count', 10];
3、in和match
in
和match
都可实现对图层根据某个字段进行多值过滤。如:在地图上展示昌平区和海淀区。
// in
var filter = ['in', 'name','昌平区','海淀区'
];
// match
var filter = ["match",["get","name"],["昌平区","海淀区",],true,false
]
接着上面的例子,如果我们要实现在地图中展示除海淀和昌平区外的其他区域,我们可以直接用!in
和将match
的条件互换的方式来实现,如下:
// in
var filter = ['!in', 'name','昌平区','海淀区'
];
// match
var filter = ["match",["get","name"],["昌平区","海淀区",],false,true
]
4、多条件
有时候,会存在多条件的过滤,例如:我们选择type==1
并且count>10
的区域,我们可以这么写:
var filter = ['all',['>=', 'count', 10],['==', 'type', 1]
]
当然,有时我们会存在根据几何类型来进行过滤,此时,我们可用:
var filter = ["==",["geometry-type"],"LineString"];
paint
paint
是layer的一个属性,负责图层的渲染与呈现。
1、match
match
通常用于枚举型的字段渲染,如唯一值渲染。
'circle-color': ['match',['get', 'type'],1, '#FFD273',2, '#E86D68','#A880FF'
]
2、case
case
通常用于分段数值型的字段渲染,值域是前关后开,如分级渲染。
'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)' // 默认值, >=50.1
]
注意:
- 第一个的判断是
<
; - 中间的判断是
>=
和<
; - 最后一个判断是
>=
;
3、step
step
和上面的case
很类似,只是值域是前开后关的。
// <=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'
]
说明:
- 对于非数值型的字段,我们可以用
to-number
对字段进行转换。
4、interpolate
interpolate
,中文的翻译是“插值”,在mapbox GL中,我们可通过interpolate
实现按照比例的插值渲染。
// <=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,指数
"fill-opacity": ["interpolate",["exponential", 1.5],["zoom"],2, 0.3,7, 0
]
说明:
zoom
是一个特殊字符,特制地图的缩放级别,同样的还有geometry-type
,特指的是geom类型。
完整测试代码如下:
var rootPath = 'http://127.0.0.1:3000/mapbox/lib/';
// var filter = ['match', ['get', 'name'],
// ['昌平区', '海淀区'], false, true
// ];
// var filter = ['!in', 'name', '昌平区', '海淀区'];// 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'
// ];// 分级色彩图
// var fillColor = [
// 'case',
// ['<', ['get', 'count'], 10], '#FFD273',
// ['<', ['get', 'count'], 20], '#E86D68',
// ['<', ['get', 'count'], 30], '#A880FF',
// ['<', ['get', 'count'], 40], '#68E0E8',
// ['<=', ['get', 'count'], 50], '#9BFF69',
// '#000' // 默认值
// ];// 比例符号图
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: "'全新硬笔行书简'"
});
进阶mapbox GL之paint和filter相关推荐
- Mapbox GL可视化之热力图
本篇使用Mapbox GL JS实现数据的热力图可视化,以截止到2020-03-01日的新冠疫情作为示例数据. 一 什么是热力图 热力图使用颜色的深浅表示数值的变化,从而表示数据的分布情况,这使得用户 ...
- 初识mapbox GL
一.概述 最近由于项目的需求,借此机会对mapbox GL做了一个系统的学习,同时也对整个学习过程做一个记录,一方面留作自用,另一方面也希望看到此文的人在学习mapbox GL的时候,能够有所启发.有 ...
- Mapbox GL JS 表达式概述
表达式(expressions)是Mapbox GL JS的一个高级功能,它为数据的添加和渲染展示提供了更多的灵活性. 表达式的功能包括: 数据驱动样式:根据一个或多个数据属性指定样式规则. 算术:对 ...
- Mapbox GL JS实现移动端H5实时多边形(涂鸦)绘制
关于使用MapBox GL进行图形绘制,很多人都在使用mapbox-gl-draw.但是它只是封装了一些简单的点.线.面的绘制功能.最近的一个项目提出了要求在手机上用手指拖动实现多边形涂鸦绘制,要求实 ...
- Mapbox gl tile瓦片渲染点以及图片Icon
Mapbox gl tile瓦片渲染点以及图片Icon 1. 效果图 2. 源码 参考 1. 效果图 点效果图如下: 以图标渲染效果图如下: 注意图片要不能跨域,需要下载的下来才能正常展示. 2. 源 ...
- GIS开发:推荐Mapbox gl解决方案
在二维地图的开发中,实现类似于百度.高德地图那样加载简体的模型,使用mapbox gl是一个比较好的解决方案. https://docs.mapbox.com/mapbox-gl-js/api/ 类似 ...
- Mapbox GL JS 地图英文转中文的解决办法
Mapbox GL JS地图框架的使用者已经越来越多了.不仅仅是因为它支持矢量瓦片,它里面内置了一些非常精美的地图,并且支持自定义搭配地图.对于个人开发者而言,一般都不具备自己搭建地图服务的硬件资源, ...
- Mapbox GL JS介绍及使用
Mapbox GL JS介绍及使用:(以web端基本交互实现为例) Mapbox GL JS 是一个 JavaScript 库,它使用 WebGL,以 vector tiles 和 Mapbox st ...
- GIS开发:mapbox gl几种底图的加载
mapbox gl除了加载客户端可控制样式的底图,也能够加载常规的影像底图. 这里指发布的影像或者矢量地图切片,在线经常使用的有天地图,谷歌地图.高德百度等,底图的加载,mapbox gl中,主要是修 ...
最新文章
- 最强杀毒软件NOD32免费升级ID(保持最新)
- Oracle数据类型简介【转贴】
- Ubuntu下添加开机启动脚本
- Spark-shell进行粘贴模式
- 数据结构-二叉树层次遍历
- android 7.0 自启管理,一款不错的android6.0、7.0权限管理器推荐
- 思科 接入点 本地转发_思科路由器配置 IPv6 和 OSPFv3 路由
- 品高云产品经理邱洋:做国内云计算第一品牌
- Atitit 理财之道 attilax著 1. 融资	3 1.1. 融资账户余渠道	3 2. 风控	3 3. 	3 4. 投资	3 5. 线上财富与资源	3 5.1. Jd流量 飞猪流量	3 5.
- Java环境变量配置
- django创建模板报错:TemplateDoesNotExist at
- 储能系统下垂控制,蓄电池通过双向dc/dc变换器并联负载,变换器输出电流按虚拟电阻比例分配
- 1.4 批量生成Oracle建表语句
- Windows下安装X710网卡驱动
- 小学身高体重测试软件,儿童身高体重在线测评
- 在VC6.0下设置Unicode编译环境
- python画地图经纬度_如何用python画地图上的标注线?
- redis-shiro session 共享subject中principal 为空
- C语言合法标识符(含知识点)
- PHP微信公众平台开发高级篇--生成二维码接口