系列文章目录
Types
Lookup
Decision
Math
String
Color
Zoom
Heatmap
Feature data
Variable binding
Ramps, scales, curves
目录
get:从当前要素的属性或从另一个对象(如果提供了第二个自变量)中检索属性值。如果缺少所请求的属性,则返回null。
has: 测试当前要素的属性中是否存在属性值,或者如果提供第二个参数,则从另一个对象中进行测试。
前言
在上一篇中介绍了Expression以及按照types区分,本篇是将的按照 lookup区分,都是高频使用的。
Expression可以按LookUp分类
这几个方法实际上就是数组的操作
at:从数组中检索一个项目
/**
* at
*从数组中检索一个项目。
*
* ["at", number, array]: ItemType
*/
Expression at(@NonNull Number number, @NonNull Expression expression)
eg:
Expression value = Expression.at(0, Expression.literal(new int[]{10000, 10001, 10002}));
注意:at指定的number相当于数组里的index,不能超过array.length-1.
get:从当前要素的属性或从另一个对象(如果提供了第二个自变量)中检索属性值。如果缺少所请求的属性,则返回null。
/**
* get
* 从当前要素的属性或从另一个对象(如果提供了第二个自变量)中检索属性值。如果缺少所请求的属性,则返回null。
*
* ["get", string]: value
* ["get", string, object]: value
*/
Expression get(@NonNull String input)
eg:
SymbolLayer symbolLayer = new SymbolLayer("layer-id", "source-id");
symbolLayer.setProperties(
textField(get("key-to-feature"))
);
has: 测试当前要素的属性中是否存在属性值,或者如果提供第二个参数,则从另一个对象中进行测试。
/**
* has
*
*
* ["has", string]: boolean
* ["has", string, object]: boolean
*/
Expression has(@NonNull String key)
eg:
FillLayer fillLayer = new FillLayer("layer-id", "source-id");
fillLayer.setFilter(
has(get("keyToValue"))
);
in: 确定数组中是否存在项目或字符串中是否存在子字符串。
/**
* in
* 确定数组中是否存在项目或字符串中是否存在子字符串。
*
* ["in", keyword: InputType (boolean, string, or number),input: InputType (array or string)]: boolean
*/
Expression.in(Expression, Expression)
Expression in(@NonNull Number needle, @NonNull Expression haystack)
Expression in(@NonNull String needle, @NonNull Expression haystack)
eg:
FillLayer fillLayer = new FillLayer("layer-id", "source-id");
fillLayer.setFilter(
in(get("keyToValue"), Expression.literal(new int[]{10000, 10001, 10002}))
);
length:获取数组或字符串的长度。
/**
* length
* 获取数组或字符串的长度。
*
* ["length", string | array | value]: number
*/
Expression length(@NonNull Expression expression)
Expression length(@NonNull String input)
示例
老规矩,代码放这里,自己可以改动体验一下。
private static final String SOURCE_ID = "source-id";
private static final String LAYER_ID = "layer-id";
private static final String LAYER_TEXT = "layer-text";
private static final String[] STR_ARRAY = {"10000", "10001", "10002"};
private GeoJsonSource geoJsonSource;
private final List<Feature> featureList = new ArrayList<>();
private static final double LATITUDE = 39.9;
private static final double LONGITUDE = 119.6;
@Override
public int getLayoutId() {
return R.layout.activity_ex_csdn_types_demo;
}
@Override
public void onMapLoaded() {
super.onMapLoaded();
//初始化源等
initTextSource();
//批量添加文字
addTextsOnMap();
}
private void addTextsOnMap() {
for (int i = 0; i < STR_ARRAY.length; i++) {
//feature
Point point = Point.fromLngLat(LONGITUDE + i * 0.002, LATITUDE + i * 0.002);
Feature feature = Feature.fromGeometry(point);
if (i == 2) {
//2是100000,5个0
feature.addStringProperty(LAYER_TEXT, String.valueOf(100000 + i));
} else {
//其他10000
feature.addStringProperty(LAYER_TEXT, String.valueOf(10000 + i));
}
featureList.add(feature);
}
//刷新数据源
geoJsonSource.setGeoJson(FeatureCollection.fromFeatures(featureList));
//移动地图视角
mapboxMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(LATITUDE, LONGITUDE), 12));
}
private void initTextSource() {
//添加源
FeatureCollection deviceFeatureCollection = FeatureCollection.fromFeatures(featureList);
geoJsonSource = new GeoJsonSource(SOURCE_ID, deviceFeatureCollection);
style.addSource(geoJsonSource);
//添加Layer
SymbolLayer symbolLayer = new SymbolLayer(LAYER_ID, SOURCE_ID);
symbolLayer.withProperties(
textSize(18f),
textColor(Color.YELLOW),
textField(generateAtText()),
textAllowOverlap(true)
).withFilter(
//has 过滤
//has(get(LAYER_TEXT))
//in 过滤
//in(get(LAYER_TEXT), Expression.literal(strArray))
//length 过滤
eq(length(get(LAYER_TEXT)), literal(5))
);
style.addLayer(symbolLayer);
}
/**
* at版Text
*/
private Expression generateAtText() {
return Expression.toString(at(0, literal(STR_ARRAY)));
}
/**
* get版Text
*/
private Expression generateGetText() {
return Expression.get(LAYER_TEXT);
}