From 60d10dd27df38ac4e97214d1cd514198c381695c Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Tue, 21 Feb 2017 18:34:45 -0800 Subject: [core] Add support for queryRenderedFeatures filter --- platform/android/src/native_map_view.cpp | 4 +-- platform/ios/src/MGLMapView.mm | 4 +-- platform/macos/src/MGLMapView.mm | 4 +-- platform/node/src/node_map.cpp | 41 ++++++++++++++++++++++++++++-- platform/node/test/suite_implementation.js | 2 +- 5 files changed, 46 insertions(+), 9 deletions(-) (limited to 'platform') diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 1930d1854d..73edc8e298 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -721,7 +721,7 @@ jni::Array> NativeMapView::queryRenderedFeaturesForPoint(JN } point point = {x, y}; - return *convert>, std::vector>(env, map->queryRenderedFeatures(point, layers)); + return *convert>, std::vector>(env, map->queryRenderedFeatures(point, { layers, {} })); } jni::Array> NativeMapView::queryRenderedFeaturesForBox(JNIEnv& env, jni::jfloat left, jni::jfloat top, jni::jfloat right, jni::jfloat bottom, jni::Array layerIds) { @@ -734,7 +734,7 @@ jni::Array> NativeMapView::queryRenderedFeaturesForBox(JNIE } box box = { point{ left, top}, point{ right, bottom } }; - return *convert>, std::vector>(env, map->queryRenderedFeatures(box, layers)); + return *convert>, std::vector>(env, map->queryRenderedFeatures(box, { layers, {} })); } jni::Array> NativeMapView::getLayers(JNIEnv& env) { diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index 58f8f407e4..2990a4e163 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -4621,7 +4621,7 @@ public: optionalLayerIDs = layerIDs; } - std::vector features = _mbglMap->queryRenderedFeatures(screenCoordinate, optionalLayerIDs); + std::vector features = _mbglMap->queryRenderedFeatures(screenCoordinate, { optionalLayerIDs, {} }); return MGLFeaturesFromMBGLFeatures(features); } @@ -4645,7 +4645,7 @@ public: optionalLayerIDs = layerIDs; } - std::vector features = _mbglMap->queryRenderedFeatures(screenBox, optionalLayerIDs); + std::vector features = _mbglMap->queryRenderedFeatures(screenBox, { optionalLayerIDs, {} }); return MGLFeaturesFromMBGLFeatures(features); } diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm index 827da35076..ff98095e15 100644 --- a/platform/macos/src/MGLMapView.mm +++ b/platform/macos/src/MGLMapView.mm @@ -2533,7 +2533,7 @@ public: optionalLayerIDs = layerIDs; } - std::vector features = _mbglMap->queryRenderedFeatures(screenCoordinate, optionalLayerIDs); + std::vector features = _mbglMap->queryRenderedFeatures(screenCoordinate, { optionalLayerIDs }); return MGLFeaturesFromMBGLFeatures(features); } @@ -2558,7 +2558,7 @@ public: optionalLayerIDs = layerIDs; } - std::vector features = _mbglMap->queryRenderedFeatures(screenBox, optionalLayerIDs); + std::vector features = _mbglMap->queryRenderedFeatures(screenBox, { optionalLayerIDs }); return MGLFeaturesFromMBGLFeatures(features); } diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index 66cdb3eda7..174db7d737 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -866,6 +867,9 @@ void NodeMap::DumpDebugLogs(const Nan::FunctionCallbackInfo& info) { } void NodeMap::QueryRenderedFeatures(const Nan::FunctionCallbackInfo& info) { + using namespace mbgl::style; + using namespace mbgl::style::conversion; + auto nodeMap = Nan::ObjectWrap::Unwrap(info.Holder()); if (!nodeMap->map) return Nan::ThrowError(releasedMessage()); @@ -878,6 +882,39 @@ void NodeMap::QueryRenderedFeatures(const Nan::FunctionCallbackInfo& return Nan::ThrowTypeError("First argument must have two components"); } + mbgl::QueryOptions queryOptions; + if (!info[1]->IsNull() && !info[1]->IsUndefined()) { + if (!info[1]->IsObject()) { + return Nan::ThrowTypeError("options argument must be an object"); + } + + auto options = Nan::To(info[1]).ToLocalChecked(); + + //Check if layers is set. If provided, it must be an array of strings + if (Nan::Has(options, Nan::New("layers").ToLocalChecked()).FromJust()) { + auto layersOption = Nan::Get(options, Nan::New("layers").ToLocalChecked()).ToLocalChecked(); + if (!layersOption->IsArray()) { + return Nan::ThrowTypeError("Requires options.layers property to be an array"); + } + auto layers = layersOption.As(); + std::vector layersVec; + for (uint32_t i=0; i < layers->Length(); i++) { + layersVec.push_back(*Nan::Utf8String(Nan::Get(layers,i).ToLocalChecked())); + } + queryOptions.layerIDs = layersVec; + } + + //Check if filter is provided. If set it must be a valid Filter object + if (Nan::Has(options, Nan::New("filter").ToLocalChecked()).FromJust()) { + auto filterOption = Nan::Get(options, Nan::New("filter").ToLocalChecked()).ToLocalChecked(); + Result converted = convert(filterOption); + if (!converted) { + return Nan::ThrowTypeError(converted.error().message.c_str()); + } + queryOptions.filter = std::move(*converted); + } + } + try { std::vector result; @@ -894,13 +931,13 @@ void NodeMap::QueryRenderedFeatures(const Nan::FunctionCallbackInfo& Nan::Get(pos1, 0).ToLocalChecked()->NumberValue(), Nan::Get(pos1, 1).ToLocalChecked()->NumberValue() } - }); + }, queryOptions); } else { result = nodeMap->map->queryRenderedFeatures(mbgl::ScreenCoordinate { Nan::Get(posOrBox, 0).ToLocalChecked()->NumberValue(), Nan::Get(posOrBox, 1).ToLocalChecked()->NumberValue() - }); + }, queryOptions); } auto array = Nan::New(); diff --git a/platform/node/test/suite_implementation.js b/platform/node/test/suite_implementation.js index 6648757a98..ef97652893 100644 --- a/platform/node/test/suite_implementation.js +++ b/platform/node/test/suite_implementation.js @@ -49,7 +49,7 @@ module.exports = function (style, options, callback) { applyOperations(options.operations, function() { map.render(options, function (err, pixels) { var results = options.queryGeometry ? - map.queryRenderedFeatures(options.queryGeometry) : + map.queryRenderedFeatures(options.queryGeometry, options.queryOptions || {}) : []; map.release(); if (timedOut) return; -- cgit v1.2.1