Skip to content

Commit e893dd5

Browse files
authored
feat: setFilter/getFilter for layers (#7)
* feat: setFilter/getFilter for layers
1 parent 5197204 commit e893dd5

5 files changed

+70
-1
lines changed

src/filter/filter-parser.android.ts

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export class FilterParser {
2+
static parseJson(json: any[]): com.mapbox.mapboxsdk.style.expressions.Expression {
3+
const expression = com.mapbox.mapboxsdk.style.expressions.Expression.Converter.convert(JSON.stringify(json));
4+
return expression;
5+
}
6+
static toJson(filter: com.mapbox.mapboxsdk.style.expressions.Expression): any[] {
7+
if (!filter) {
8+
return null;
9+
}
10+
11+
if (!(filter instanceof com.mapbox.mapboxsdk.style.expressions.Expression)) {
12+
throw new Error('Filter must be a Expression.');
13+
}
14+
15+
return JSON.parse(filter.toString());
16+
}
17+
}

src/filter/filter-parser.ios.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
export class FilterParser {
2+
static parseJson(json: any[]): NSPredicate {
3+
const filterStr = NSString.stringWithString(JSON.stringify(json));
4+
const filterData = filterStr.dataUsingEncoding(NSUTF8StringEncoding);
5+
const filterJson = NSJSONSerialization.JSONObjectWithDataOptionsError(filterData, NSJSONReadingOptions.MutableContainers);
6+
const predicateFilter = (NSPredicate as any).predicateWithMGLJSONObject(filterJson);
7+
8+
return predicateFilter;
9+
}
10+
11+
static toJson(filter: NSPredicate): any[] {
12+
if (!filter) {
13+
return null;
14+
}
15+
16+
if (!(filter instanceof NSPredicate)) {
17+
throw new Error('Filter must be a NSPredicate.');
18+
}
19+
20+
const expressionObj = (filter as any).mgl_jsonExpressionObject;
21+
const data = NSJSONSerialization.dataWithJSONObjectOptionsError(expressionObj, 0);
22+
const expression: any = NSString.alloc().initWithDataEncoding(data, NSUTF8StringEncoding);
23+
24+
return JSON.parse(expression);
25+
}
26+
}

src/mapbox.android.ts

+9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { request } from '@nativescript-community/perms';
88
import { AndroidApplication, Application, Color, File, Trace, Utils, knownFolders, path } from '@nativescript/core';
99
import { AndroidActivityBundleEventData, AndroidActivityEventData } from '@nativescript/core/application/application-interfaces';
1010
import { getImage } from '@nativescript/core/http';
11+
import { FilterParser } from './filter/filter-parser.android';
1112
import { GeoUtils } from './geo.utils';
1213
import {
1314
AddExtrusionOptions,
@@ -4282,6 +4283,14 @@ export class Layer implements LayerCommon {
42824283
public hide(): void {
42834284
this.instance.setProperties([new com.mapbox.mapboxsdk.style.layers.PropertyValue('visibility', 'none')]);
42844285
}
4286+
4287+
public setFilter(filter: any[]) {
4288+
this.instance.setFilter(FilterParser.parseJson(filter));
4289+
}
4290+
4291+
public getFilter(): any[] {
4292+
return FilterParser.toJson(this.instance.getFilter());
4293+
}
42854294
}
42864295

42874296
// END

src/mapbox.common.ts

+2
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,8 @@ export interface LayerCommon {
487487
visibility(): boolean;
488488
show(): void;
489489
hide(): void;
490+
setFilter(filter: any[]): void;
491+
getFilter(): any[];
490492
}
491493

492494
// ------------------------------------------------------------

src/mapbox.ios.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
import { GeoUtils } from './geo.utils';
4040
import { iOSNativeHelper } from '@nativescript/core/utils';
4141
import { getImage } from '@nativescript/core/http';
42+
import { FilterParser } from './filter/filter-parser.ios';
4243

4344
// Export the enums for devs not using TS
4445

@@ -3561,5 +3562,19 @@ export class Layer implements LayerCommon {
35613562
hide(): void {
35623563
this.instance.visible = false;
35633564
}
3565+
3566+
setFilter(filter: any[]) {
3567+
if (this.instance instanceof MGLVectorStyleLayer) {
3568+
// MGLVectorStyleLayer is the base type of many layer types. Predicates only supported on vector style layers.
3569+
// See https://docs.mapbox.com/ios/maps/api/6.3.0/Classes/MGLVectorStyleLayer.html
3570+
3571+
this.instance.predicate = FilterParser.parseJson(filter);
3572+
} else {
3573+
throw new Error('Set filter only support for vector layer.');
3574+
}
3575+
}
3576+
3577+
getFilter(): any[] {
3578+
return FilterParser.toJson(this.instance.predicate);
3579+
}
35643580
}
3565-

0 commit comments

Comments
 (0)