From a22825e2c31286a11881880881edb86adc249be1 Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Mon, 21 Aug 2017 13:51:36 +0200 Subject: [android] - optional geometry conversion for query rendered features --- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 17 ++++++++- .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 8 ++-- .../QueryRenderedFeaturesExecutionTimeTest.java | 44 ++++++++++++++++++++++ platform/android/src/native_map_view.cpp | 7 +++- platform/android/src/native_map_view.hpp | 3 +- 5 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/feature/QueryRenderedFeaturesExecutionTimeTest.java diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 0d1d0e03b5..f9eec0c2cb 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -1928,6 +1928,19 @@ public final class MapboxMap { nativeMapView.addSnapshotCallback(callback); } + /** + * Queries the map for rendered features + * + * @param coordinates the point to query + * @param layerIds optionally - only query these layers + * @return the list of feature + */ + @NonNull + public List queryRenderedFeatures(@NonNull PointF coordinates, boolean withGeometry, @Nullable String... + layerIds) { + return nativeMapView.queryRenderedFeatures(coordinates, layerIds, null, withGeometry); + } + /** * Queries the map for rendered features * @@ -1938,7 +1951,7 @@ public final class MapboxMap { @NonNull public List queryRenderedFeatures(@NonNull PointF coordinates, @Nullable String... layerIds) { - return nativeMapView.queryRenderedFeatures(coordinates, layerIds, null); + return nativeMapView.queryRenderedFeatures(coordinates, layerIds, null, true); } /** @@ -1953,7 +1966,7 @@ public final class MapboxMap { public List queryRenderedFeatures(@NonNull PointF coordinates, @Nullable Filter.Statement filter, @Nullable String... layerIds) { - return nativeMapView.queryRenderedFeatures(coordinates, layerIds, filter); + return nativeMapView.queryRenderedFeatures(coordinates, layerIds, filter, true); } /** diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 4f5037e4b3..2bc94f26ab 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -820,12 +820,13 @@ final class NativeMapView { @NonNull public List queryRenderedFeatures(@NonNull PointF coordinates, @Nullable String[] layerIds, - @Nullable Filter.Statement filter) { + @Nullable Filter.Statement filter, + boolean withGeometry) { if (isDestroyedOn("queryRenderedFeatures")) { return new ArrayList<>(); } Feature[] features = nativeQueryRenderedFeaturesForPoint(coordinates.x / pixelRatio, - coordinates.y / pixelRatio, layerIds, filter != null ? filter.toArray() : null); + coordinates.y / pixelRatio, layerIds, filter != null ? filter.toArray() : null, withGeometry); return features != null ? Arrays.asList(features) : new ArrayList(); } @@ -1095,7 +1096,8 @@ final class NativeMapView { private native Feature[] nativeQueryRenderedFeaturesForPoint(float x, float y, String[] layerIds, - Object[] filter); + Object[] filter, + boolean withGeometry); private native Feature[] nativeQueryRenderedFeaturesForBox(float left, float top, float right, float bottom, diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/feature/QueryRenderedFeaturesExecutionTimeTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/feature/QueryRenderedFeaturesExecutionTimeTest.java new file mode 100644 index 0000000000..534291d8ab --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/feature/QueryRenderedFeaturesExecutionTimeTest.java @@ -0,0 +1,44 @@ +package com.mapbox.mapboxsdk.testapp.feature; + +import android.graphics.PointF; +import android.support.test.espresso.UiController; + +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction; +import com.mapbox.mapboxsdk.testapp.activity.BaseActivityTest; +import com.mapbox.mapboxsdk.testapp.activity.style.CircleLayerActivity; + +import org.junit.Test; + +import timber.log.Timber; + +public class QueryRenderedFeaturesExecutionTimeTest extends BaseActivityTest { + + @Override + protected Class getActivityClass() { + return CircleLayerActivity.class; + } + + @Test + public void testQueryRenderedFeaturesExecutionTime() { + validateTestSetup(); + MapboxMapAction.invoke(mapboxMap, new MapboxMapAction.OnInvokeActionListener() { + @Override + public void onInvokeAction(UiController uiController, MapboxMap mapboxMap) { + PointF point = new PointF(519.4336f, 1086.6211f); + + long startTime = System.currentTimeMillis(); + mapboxMap.queryRenderedFeatures(point, true); + long stopTime = System.currentTimeMillis(); + long elapsedTime = stopTime - startTime; + Timber.e("Execution time with testQueryRenderedFeaturesExecutionTime: %s", elapsedTime); + + startTime = System.currentTimeMillis(); + mapboxMap.queryRenderedFeatures(point, false); + stopTime = System.currentTimeMillis(); + elapsedTime = stopTime - startTime; + Timber.e("Execution time with testQueryRenderedFeaturesWithoutGeometryExecutionTime: %s", elapsedTime); + } + }); + } +} diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index d859d929d3..bb37f18095 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -771,7 +771,8 @@ jni::Array NativeMapView::queryPointAnnotations(JNIEnv& env, jni::Object< jni::Array> NativeMapView::queryRenderedFeaturesForPoint(JNIEnv& env, jni::jfloat x, jni::jfloat y, jni::Array layerIds, - jni::Array> jfilter) { + jni::Array> jfilter, + jni::jboolean jwithGeometry) { using namespace mbgl::android::conversion; using namespace mbgl::android::geojson; @@ -781,9 +782,11 @@ jni::Array> NativeMapView::queryRenderedFeaturesFo } mapbox::geometry::point point = {x, y}; + bool withGeometry = jwithGeometry; + return *convert>, std::vector>( env, - rendererFrontend->queryRenderedFeatures(point, { layers, toFilter(env, jfilter) })); + rendererFrontend->queryRenderedFeatures(point, { layers, toFilter(env, jfilter), withGeometry})); } jni::Array> NativeMapView::queryRenderedFeaturesForBox(JNIEnv& env, jni::jfloat left, jni::jfloat top, diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 24c88f4e3f..cf1af14383 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -216,7 +216,8 @@ public: jni::Array> queryRenderedFeaturesForPoint(JNIEnv&, jni::jfloat, jni::jfloat, jni::Array, - jni::Array> jfilter); + jni::Array> jfilter, + jni::jboolean jwithGeometry); jni::Array> queryRenderedFeaturesForBox(JNIEnv&, jni::jfloat, jni::jfloat, jni::jfloat, jni::jfloat, jni::Array, -- cgit v1.2.1