mapbox中filter表达式

server/2024/9/23 5:56:04/
  • 起初让我研究的原因使一个报错:

layers.TRSA.filter[2][1][2]: string, number, or boolean expected, array found

 我很确定筛选条件没问题,那么为何报错呢?百度,找到原因:

https://docs.mapbox.com/style-spec/reference/other/#other-filter

警告
在样式规范的早期版本中,筛选器是使用下面记录的已弃用语法定义的。尽管使用此语法定义的筛选器将继续工作,但我们建议改用更灵活的表达式语法。表达式语法和下面已弃用的语法不能在单个筛选器定义中混合使用

 回到代码中看看我是如何混用了:

["all", 
["!=","ac","EUR"],
["==","0", ["get", "res"]],
["==", 'X', ["get","t"]]
]

 其中 [ "==", "0", ["get", "res"] ]  是新表达式的语法(expression语法

转为旧语法(基于属性的filter语法(property-based filter syntax))为:[  "==","res","0" ]

下面看看官方文档
1.1 property-based filter syntax 官方文档

https://docs.mapbox.com/style-spec/reference/other/#other-filter

存在过滤器

["has", key] feature[key]存在

["!has", key] feature[key]不存在

比较过滤器

["==", key, value]平等:feature[key] = value

["!=", key, value]不平等:≠feature[key]value

[">", key, value]大于:feature[key] > value

[">=", key, value]大于或等于:≥feature[key]value

["<", key, value]小于:feature[key] < value

["<=", key, value]小于或等于:≤feature[key]value

设置成员资格筛选器

["in", key, v0, ..., vn]设置包含: ∈ {, ...,feature[key]v0vn}

["!in", key, v0, ..., vn]设置排除: ∉ { , ...,feature[key]v0vn}

组合过滤器

["all", f0, ..., fn]逻辑:∧......∧ANDf0fn

["any", f0, ..., fn]逻辑:∨......∨ORf0fn

["none", f0, ..., fn]逻辑 : ¬ ∧ ...∧ ¬NORf0fn

A 必须是标识功能属性的字符串,或者是以下特殊键之一:key

  • "$type":要素类型。此键可用于,, ,和运算符。可能的值为 、 和 。"==""!=""in""!in""Point""LineString""Polygon"
  • "$id":要素标识符。此密钥可用于,, , , ,和运算符。"==""!=""has""!has""in""!in"

A(对于集合运算符,和 、...)必须是字符串、数字或布尔值,以便与属性值进行比较。valuev0vn

设置成员资格筛选器是一种紧凑而有效的方法,用于测试字段是否与多个值中的任何一个匹配。

比较和设置成员资格筛选器实现严格类型的比较;例如,以下所有计算结果均为 false:、 、 。0 &lt; "1"2 == "2""true" in [true, false]

、 和 filter 运算符用于创建复合过滤器。值 ...,本身必须是筛选器表达式。"all""any""none"f0fn

["==", "$type", "LineString"]

此过滤器要求每个要素的属性等于“street_major”、“street_minor”或“street_limited”。class

["in", "class", "street_major", "street_minor", "street_limited"]</code>

组合过滤器 “all” 采用其后面的其他三个过滤器,并要求它们都为 true 才能包含要素:要素必须等于 “street_limited”,其必须大于或等于 3,并且其类型不能为 Polygon。您可以将组合过滤器更改为“any”,以允许包含符合这些条件中的任何一个的要素 - 为面但具有不同值的要素,依此类推。classadmin_levelclass

["all",["==", "class", "street_limited"],[">=", "admin_level", 3],["!in", "$type", "Polygon"]
]
1.2 Expressions语法

https://docs.mapbox.com/style-spec/reference/expressions/#types-array

表达式

您可以将任何布局属性、绘画属性或过滤器的值定义为表达式

表达式定义一个公式,用于使用下面描述的运算符计算属性的值。Mapbox GL 提供的表达式运算符包括:

  • 用于对数值执行算术和其他运算的数学运算符
  • 用于操作布尔值和做出条件决策的逻辑运算符
  • 用于操作字符串的字符串运算符
  • 数据运算符,用于提供对源要素属性的访问
  • 相机操作员,用于提供对定义当前地图视图的参数的访问

表达式表示为 JSON 数组。表达式数组的第一个元素是命名表达式运算符的字符串,例如“*”或“case”。后面的元素(如果有)是表达式的参数。每个参数要么是文本值(字符串、数字、布尔值或),要么是另一个表达式数组。null

[expression_name, argument_0, argument_1, ...]

数据表达式

数据表达式是访问要素数据的任何表达式,即使用数据运算符之一的任何表达式:get、has、id、geometry-type、properties 或 feature-state。数据表达式允许要素的属性或状态来确定其外观。它们可用于区分同一图层中的要素并创建数据可视化。

{"circle-color": ["rgb",// red is higher when feature.properties.temperature is higher["get", "temperature"],// green is always zero0,// blue is higher when feature.properties.temperature is lower["-", 100, ["get", "temperature"]]]
}

此示例使用 get 运算符获取每个功能的值。该值用于计算 rgb 运算符的参数,根据其红色、绿色和蓝色分量定义颜色。temperature

允许将数据表达式用作筛选器属性的值,以及大多数绘制和布局属性的值。但是,某些绘制和布局属性尚不支持数据表达式。支持级别由每个属性的“SDK 支持”表的“数据驱动样式”行指示。仅允许在绘制属性上使用带有特征状态运算符的数据表达式。

类型系统

表达式的输入参数及其结果值使用与样式规范的其余部分相同的一组类型:布尔值、字符串、数字、颜色和这些类型的数组。此外,表达式是类型安全的:表达式的每次使用都具有已知的结果类型和所需的参数类型,并且 SDK 会验证表达式的结果类型是否适合使用它的上下文。例如,filter 属性中表达式的结果类型必须是布尔值,并且 + 运算符的参数必须是数字。

使用要素数据时,SDK 通常不会提前知道要素属性值的类型。为了保持类型安全,在计算数据表达式时,SDK 将检查属性值是否适合上下文。例如,如果将表达式用于 circle-color 属性,则 SDK 将验证每个要素的值是否为标识有效颜色的字符串。如果此检查失败,将以特定于 SDK 的方式(通常是日志消息)指示错误,并将改用该属性的默认值。["get", "feature-color"]feature-color

在大多数情况下,此验证将在需要的地方自动进行。但是,在某些情况下,SDK 可能无法从周围上下文中自动确定数据表达式的预期结果类型。例如,不清楚表达式是尝试比较字符串还是数字。在这种情况下,可以使用类型断言表达式运算符之一来指示数据表达式的预期类型: 。类型断言检查要素数据是否与数据表达式的预期类型匹配。如果此检查失败,则会产生错误,并导致整个表达式回退到所定义属性的默认值。断言运算符为数组、布尔值、数字和字符串。["&lt;", ["get", "a"], ["get", "b"]]["&lt;", ["number", ["get", "a"]], ["number", ["get", "b"]]]

表达式仅执行一种隐式类型转换:在需要颜色的上下文中使用的数据表达式会将颜色的字符串表示形式转换为颜色值。在所有其他情况下,如果要在类型之间进行转换,则必须使用类型转换表达式运算符之一:to-boolean、to-number、to-string 或 to-color。例如,如果具有以字符串格式存储数值的 feature 属性,并且希望将这些值用作数字而不是字符串,则可以使用诸如 .["to-number", ["get", "property-name"]]

如果表达式接受数组参数,并且用户提供数组文本,则该数组必须包装在表达式中(请参阅下面的示例)。当 GL-JS 遇到 style-spec 属性值中的数组时,它会假定该数组是一个表达式并尝试解析它;该库无法区分验证失败的表达式和数组文本,除非开发人员在运算符中明确了这种区别。如果数组是从子表达式返回的,则不需要运算符,例如 。literalliteralliteral["in", 1, ["get", "myArrayProp"]]

// will throw an error
{"circle-color": ["in", 1, [1, 2, 3]]
}// will work as expected
{"circle-color": ["in", 1, ["literal", [1, 2, 3]]]
}

  • ps:Expressions语法在Mapbox Style Spec (样式规范)各属性中通用
{  "filter": ["all", ["all", ["!=", ["get","ac"],"EUR"],["==","0", ["get","res"]],["==", 'X', ["get","t"]]],["any", ["<", -1, ["literal",0]],// [//     ">=", 'll_raw', -1// ], //旧规范[">=", -1, ["get","ll_raw"]] //新规范 表达式  新旧不能混用]],paint: {'text-color': '#fff','icon-color': [//表达式'case',['==', ['get', 'type'], 'B'],'#1E90FF','#FFA500'],},
}


http://www.ppmy.cn/server/14563.html

相关文章

探索Java设计模式:模板方法模式

探索Java设计模式&#xff1a;深入理解与实践模板方法模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改变算法整体结构的情况下重定义某些步骤。在Java编程中&#xff…

CUDA入门系列课程,从最基础着手

CUDA入门系列课程&#xff0c;从最基础着手&#xff0c;突出的就是一个字“细”&#xff01;&#xff01; github项目包含代码、博客、课件pdf下载地址&#xff1a;https://github.com/sangyc10/CUDA-code! 在这里插入图片描述 CUDA编程基础入门系列 https://github.com/sang…

【方法】如何禁止打印PDF文件?

很多时候&#xff0c;我们创建的PDF文档都包含重要信息&#xff0c;想要保护文档不能被随意打印&#xff0c;确保文档的安全及机密性&#xff0c;只要给PDF设置打印权限就可以了。下面一起来看看如何操作&#xff01; PDF的打印权限可以通过密码来实现&#xff0c;通过设置权限…

UML——类图详解

目录 1. 前言 2. 类图概述 3. 类图表示法 3.1 类的表示方式 3.2 类与类之间关系的表示方式 (1)继承(泛化)关系 (2)实现关系 (3)依赖关系 (4)一般关联关系 (5)聚合关系 (6)组合关系 1. 前言 UML全称(Unified Modeling Language)&#xff0c;译为统一建模语言&#x…

MySQL

索引优化思路 建立索引SQL优化分库分表定期清理垃圾MyISAM读InnoDB写小表驱动大表 导致索引失效的原因 左前缀法则 LIKE 前置% 计算 类型转换 没覆盖索引的情况下使用不等于 is not null、not like、not in OR左右有没走索引的 不同字符集比较前需要进行转换 在索引列上使用…

【001_音频开发-基础篇-专业术语】

001_音频开发-基础篇-专业术语 文章目录 001_音频开发-基础篇-专业术语创作背景术语表常见音源HDMI相关声音系统立体声2.1 声音系统5.1 环绕声系统5.1.2 环绕声系统7.1 环绕声系统7.1.4 环绕声系统9.1.4 环绕声系统 音质等级定义QQ音乐网易云音乐 创作背景 学历代表过去、能力…

hadoop文件操作代码实现

hadoop文件操作 目录 一、文件的上传 删除 查看 1.整体代码 2.代码运行 3.查看证实 4.具体代码解析 1&#xff09;向Hadoop传文件 2&#xff09;向本地Windows传文件 3&#xff09;删除Hadoop的文件 4&#xff09;判断文件是否存在 二、列出文件 1.整体代码 2.代码…

R可视化:分组频率分布直方图和密度图

介绍 ggplot2绘制分组频率分布直方图和密度图 加载R包 knitr::opts_chunk$set(message FALSE, warning FALSE) library(tidyverse) library(patchwork) library(ggpubr) library(rstatix)# rm(list ls()) options(stringsAsFactors F) options(future.globals.maxSize …