Skip to content

Commit 7d22787

Browse files
authored
Merge pull request #62 from vhdirk/clusterproperties
support clusterproperties
2 parents 44fe8fe + d2a1fba commit 7d22787

File tree

9 files changed

+45
-18
lines changed

9 files changed

+45
-18
lines changed

src/ui-mapbox/common.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Color, ContentView, ImageSource, Property, Trace, booleanConverter } from '@nativescript/core';
22

33
export * from './geo.utils';
4-
export * from './filter/filter-parser';
4+
export * from './expression/expression-parser';
55
export * from './layers/layer-factory';
66
export * from './layers/parser/property-parser';
77

@@ -345,6 +345,7 @@ export interface GeoJSONSource extends Source {
345345
cluster?: {
346346
radius;
347347
maxZoom;
348+
properties?: { [property: string]: [any, any] } ;
348349
};
349350
}
350351

src/ui-mapbox/filter/filter-parser.android.ts renamed to src/ui-mapbox/expression/expression-parser.android.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export class FilterParser {
1+
export class ExpressionParser {
22
static parseJson(json: any[]): com.mapbox.mapboxsdk.style.expressions.Expression {
33
const expression = com.mapbox.mapboxsdk.style.expressions.Expression.Converter.convert(JSON.stringify(json));
44
return expression;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export declare class FilterParser {
1+
export declare class ExpressionParser {
22
static parseJson(json: any[]): any;
33
static toJson(filter: any): any[];
44
}

src/ui-mapbox/filter/filter-parser.ios.ts renamed to src/ui-mapbox/expression/expression-parser.ios.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export class FilterParser {
1+
export class ExpressionParser {
22
static parseJson(json: any[]): NSPredicate {
33
const filterStr = NSString.stringWithString(JSON.stringify(json));
44
const filterData = filterStr.dataUsingEncoding(NSUTF8StringEncoding);

src/ui-mapbox/index.android.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { request } from '@nativescript-community/perms';
88
import { AndroidApplication, Application, Color, File, Http, Image, ImageSource, Trace, Utils, knownFolders, path } from '@nativescript/core';
9-
import { FilterParser } from './filter/filter-parser';
9+
import { ExpressionParser } from './expression/expression-parser';
1010
import { Layer, LayerFactory } from './layers/layer-factory';
1111
import {
1212
AddExtrusionOptions,
@@ -1610,7 +1610,7 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
16101610
const screenLocation = this._mapboxMapInstance.getProjection().toScreenLocation(mapboxPoint);
16111611

16121612
if (this._mapboxMapInstance.queryRenderedFeatures) {
1613-
const queryFilter = options.filter ? FilterParser.parseJson(options.filter) : null;
1613+
const queryFilter = options.filter ? ExpressionParser.parseJson(options.filter) : null;
16141614
const features = this._mapboxMapInstance.queryRenderedFeatures(screenLocation, queryFilter, options.layers);
16151615
const result = [];
16161616
for (let i = 0; i < features.size(); i++) {
@@ -1643,7 +1643,7 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
16431643
}
16441644

16451645
let features;
1646-
const queryFilter = options.filter ? FilterParser.parseJson(options.filter) : null;
1646+
const queryFilter = options.filter ? ExpressionParser.parseJson(options.filter) : null;
16471647
if (source instanceof com.mapbox.mapboxsdk.style.sources.GeoJsonSource) {
16481648
features = source.querySourceFeatures(queryFilter);
16491649
} else if (source instanceof com.mapbox.mapboxsdk.style.sources.VectorSource) {
@@ -2510,6 +2510,17 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
25102510
.withCluster(true)
25112511
.withClusterMaxZoom(options.cluster.maxZoom || 13)
25122512
.withClusterRadius(options.cluster.radius || 40);
2513+
2514+
if (options.cluster.properties) {
2515+
for (const property of Object.keys(options.cluster.properties)) {
2516+
const propertyValues = options.cluster.properties[property];
2517+
let operator = propertyValues[0];
2518+
if (!Array.isArray(operator)) {
2519+
operator = [operator];
2520+
}
2521+
geojsonOptions.withClusterProperty(property, ExpressionParser.parseJson(operator), ExpressionParser.parseJson(propertyValues[1]));
2522+
}
2523+
}
25132524
}
25142525

25152526
const geoJsonSource = new com.mapbox.mapboxsdk.style.sources.GeoJsonSource(id, geojsonOptions);
@@ -2679,7 +2690,7 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
26792690
throw new Error(`no source found with id: ${sId}`);
26802691
}
26812692

2682-
const lineFeatures = lineSource.querySourceFeatures(FilterParser.parseJson(['==', '$type', 'LineString']));
2693+
const lineFeatures = lineSource.querySourceFeatures(ExpressionParser.parseJson(['==', '$type', 'LineString']));
26832694

26842695
if (lineFeatures.size() === 0) {
26852696
throw new Error('no line string feature found');

src/ui-mapbox/index.ios.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
telemetryProperty
3737
} from './common';
3838
import { Layer, LayerFactory } from './layers/layer-factory';
39-
import { FilterParser } from './filter/filter-parser';
39+
import { ExpressionParser } from './expression/expression-parser';
4040

4141
/**
4242
* "Delegate" for catching mapview events
@@ -1939,7 +1939,7 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
19391939

19401940
const { x, y } = theMap.convertCoordinateToPointToView({ latitude: options.point.lat, longitude: options.point.lng }, theMap);
19411941
const queryLayerIds = options.layers ? NSSet.setWithArray<string>(Utils.ios.collections.jsArrayToNSArray(options.layers)) : null;
1942-
const queryFilter = options.filter ? FilterParser.parseJson(options.filter) : null;
1942+
const queryFilter = options.filter ? ExpressionParser.parseJson(options.filter) : null;
19431943
const features = theMap.visibleFeaturesAtPointInStyleLayersWithIdentifiersPredicate({ x, y }, queryLayerIds, queryFilter);
19441944

19451945
const result = [];
@@ -1973,7 +1973,7 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
19731973
}
19741974

19751975
let features;
1976-
const queryFilter = options.filter ? FilterParser.parseJson(options.filter) : null;
1976+
const queryFilter = options.filter ? ExpressionParser.parseJson(options.filter) : null;
19771977
if (source instanceof MGLShapeSource) {
19781978
features = source.featuresMatchingPredicate(queryFilter);
19791979
} else if (source instanceof MGLVectorTileSource) {
@@ -2778,6 +2778,19 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
27782778
sourceOptions[MGLShapeSourceOptionClustered] = true;
27792779
sourceOptions[MGLShapeSourceOptionClusterRadius] = options.cluster.radius || 40;
27802780
sourceOptions[MGLShapeSourceOptionMaximumZoomLevelForClustering] = options.cluster.maxZoom || 13;
2781+
2782+
if (options.cluster.properties) {
2783+
const clusterProperties = {};
2784+
for (const property of Object.keys(options.cluster.properties)) {
2785+
let [operator, operand] = options.cluster.properties[property];
2786+
if (!Array.isArray(operator)) {
2787+
operator = [operator];
2788+
}
2789+
const expressions = Utils.ios.collections.jsArrayToNSArray([ExpressionParser.parseJson(operator), ExpressionParser.parseJson(operand)]);
2790+
clusterProperties[property] = expressions;
2791+
}
2792+
sourceOptions[MGLShapeSourceOptionClusterProperties] = clusterProperties;
2793+
}
27812794
}
27822795

27832796
source = MGLShapeSource.alloc().initWithIdentifierShapeOptions(id, geoJsonShape, sourceOptions);
@@ -2969,7 +2982,7 @@ export class Mapbox extends MapboxCommon implements MapboxApi {
29692982
}
29702983

29712984
try {
2972-
const lineFeatures = lineSource.featuresMatchingPredicate(FilterParser.parseJson(['==', '$type', 'LineString']));
2985+
const lineFeatures = lineSource.featuresMatchingPredicate(ExpressionParser.parseJson(['==', '$type', 'LineString']));
29732986

29742987
if (lineFeatures.count === 0) {
29752988
throw new Error('no line string feature found');

src/ui-mapbox/layers/layer-factory.android.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { LayerCommon } from '../common';
2-
import { FilterParser } from '../filter/filter-parser';
2+
import { ExpressionParser } from '../expression/expression-parser';
33
import { PropertyParser } from './parser/property-parser';
44

55
export class Layer implements LayerCommon {
@@ -28,11 +28,11 @@ export class Layer implements LayerCommon {
2828
}
2929

3030
public setFilter(filter: any[]) {
31-
this.instance.setFilter(FilterParser.parseJson(filter));
31+
this.instance.setFilter(ExpressionParser.parseJson(filter));
3232
}
3333

3434
public getFilter(): any[] {
35-
return FilterParser.toJson(this.instance.getFilter());
35+
return ExpressionParser.toJson(this.instance.getFilter());
3636
}
3737

3838
public setProperty(name: string, value: any) {

src/ui-mapbox/layers/layer-factory.ios.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { LayerCommon } from '../common';
2-
import { FilterParser } from '../filter/filter-parser';
2+
import { ExpressionParser } from '../expression/expression-parser';
33
import { PropertyParser } from './parser/property-parser';
44

55
export class LayerFactory {
@@ -81,14 +81,14 @@ export class Layer implements LayerCommon {
8181
// MGLVectorStyleLayer is the base type of many layer types. Predicates only supported on vector style layers.
8282
// See https://docs.mapbox.com/ios/maps/api/6.3.0/Classes/MGLVectorStyleLayer.html
8383

84-
this.instance.predicate = FilterParser.parseJson(filter);
84+
this.instance.predicate = ExpressionParser.parseJson(filter);
8585
} else {
8686
throw new Error('Set filter only support for vector layer.');
8787
}
8888
}
8989

9090
getFilter(): any[] {
91-
return FilterParser.toJson(this.instance.predicate);
91+
return ExpressionParser.toJson(this.instance.predicate);
9292
}
9393

9494
setProperty(name: string, value: any) {

src/ui-mapbox/typings/Mapbox.ios.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2661,6 +2661,8 @@ declare var MGLShapeSourceOptionClusterRadius: string;
26612661

26622662
declare var MGLShapeSourceOptionClustered: string;
26632663

2664+
declare var MGLShapeSourceOptionClusterProperties: string;
2665+
26642666
declare var MGLShapeSourceOptionLineDistanceMetrics: string;
26652667

26662668
declare var MGLShapeSourceOptionMaximumZoomLevel: string;

0 commit comments

Comments
 (0)