diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonSource.java
index f9875c724..9f957e772 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonSource.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonSource.java
@@ -1,17 +1,25 @@
package com.mapbox.mapboxsdk.style.sources;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.UiThread;
+
+import com.mapbox.mapboxsdk.style.layers.Filter;
import com.mapbox.services.commons.geojson.Feature;
import com.mapbox.services.commons.geojson.FeatureCollection;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
/**
* A GeoJson source. Exposes a {@link FeatureCollection} from Json.
*
* @see the style specification
*/
+@UiThread
public class GeoJsonSource extends Source {
/**
@@ -159,6 +167,18 @@ public class GeoJsonSource extends Source {
nativeSetUrl(url);
}
+ /**
+ * Queries the source for features.
+ *
+ * @param filter an optional filter statement to filter the returned Features
+ * @return the features
+ */
+ @NonNull
+ public List querySourceFeatures(@Nullable Filter.Statement filter) {
+ Feature[] features = querySourceFeatures(filter != null ? filter.toArray() : null);
+ return features != null ? Arrays.asList(features) : new ArrayList();
+ }
+
protected void setRawJson(String geoJson) {
// Wrap the String in a map as an Object is expected by the
// style conversion template
@@ -173,6 +193,8 @@ public class GeoJsonSource extends Source {
private native void nativeSetGeoJson(Object geoJson);
+ private native Feature[] querySourceFeatures(Object[] filter);
+
@Override
protected native void finalize() throws Throwable;
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/VectorSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/VectorSource.java
index feaca839d..68eb81b7f 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/VectorSource.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/VectorSource.java
@@ -1,12 +1,24 @@
package com.mapbox.mapboxsdk.style.sources;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.Size;
+import android.support.annotation.UiThread;
+
+import com.mapbox.mapboxsdk.style.layers.Filter;
+import com.mapbox.services.commons.geojson.Feature;
+
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
/**
* Vector source enables the use of vector tiles.
*
* @see the style specification
*/
+@UiThread
public class VectorSource extends Source {
/**
@@ -48,8 +60,28 @@ public class VectorSource extends Source {
initialize(id, tileSet.toValueObject());
}
+ /**
+ * Queries the source for features.
+ *
+ * @param sourceLayerIds the source layer identifiers. At least one must be specified.
+ * @param filter an optional filter statement to filter the returned Features
+ * @return the features
+ */
+ @NonNull
+ public List querySourceFeatures(@Size(min = 1) String[] sourceLayerIds,
+ @Nullable Filter.Statement filter) {
+ Feature[] features = querySourceFeatures(
+ sourceLayerIds,
+ filter != null ? filter.toArray() : null);
+ return features != null ? Arrays.asList(features) : new ArrayList();
+ }
+
protected native void initialize(String layerId, Object payload);
@Override
protected native void finalize() throws Throwable;
+
+ private native Feature[] querySourceFeatures(String[] sourceLayerId,
+ Object[] filter);
+
}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
index 9aeb0282b..59131d89f 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
@@ -551,6 +551,17 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FeatureOverviewActivity"/>
+
+
+
+
features = source.querySourceFeatures(Filter.eq("key1", "value1"));
+ Toast.makeText(QuerySourceFeaturesActivity.this, String.format("Found %s features",
+ features.size()), Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+ });
+
+ }
+
+ public MapboxMap getMapboxMap() {
+ return mapboxMap;
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mapView.onStart();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mapView.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mapView.onPause();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mapView.onStop();
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mapView.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mapView.onDestroy();
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ mapView.onLowMemory();
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_query_source_features.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_query_source_features.xml
new file mode 100644
index 000000000..1c439a5ec
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_query_source_features.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml
index 61d251f86..56ac712cf 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml
@@ -47,6 +47,7 @@
Count features in box
Count symbols in box
Highlight features in box
+ Query source features
Symbols
Add Custom Sprite
Android SDK View integration
@@ -99,6 +100,7 @@
Count all rendered features in box
Count all rendered symbols in box
Hightligh buildings in box
+ Query source for features
Shows a simple map
Based on zoom level
Use a local file as the style
diff --git a/platform/android/src/conversion/collection.hpp b/platform/android/src/conversion/collection.hpp
index da5eed64d..549121c7e 100644
--- a/platform/android/src/conversion/collection.hpp
+++ b/platform/android/src/conversion/collection.hpp
@@ -39,8 +39,9 @@ inline std::vector toVector(JNIEnv& env, jni::jarray&
}
inline std::vector toVector(JNIEnv& env, jni::Array array) {
- std::vector vector;
std::size_t len = array.Length(env);
+ std::vector vector;
+ vector.reserve(len);
for (std::size_t i = 0; i < len; i++) {
jni::String jstr = array.Get(env, i);
diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp
index c97bdbbfe..d6307ad80 100755
--- a/platform/android/src/native_map_view.cpp
+++ b/platform/android/src/native_map_view.cpp
@@ -36,6 +36,7 @@
// C++ -> Java conversion
#include "conversion/conversion.hpp"
#include "conversion/collection.hpp"
+#include "style/conversion/filter.hpp"
#include "geometry/conversion/feature.hpp"
#include "jni.hpp"
@@ -721,22 +722,6 @@ jni::Array NativeMapView::queryPointAnnotations(JNIEnv& env, jni::Object<
return result;
}
-static inline optional toFilter(jni::JNIEnv& env, jni::Array> jfilter) {
- using namespace mbgl::style;
- using namespace mbgl::style::conversion;
-
- mbgl::optional filter;
- if (jfilter) {
- Value filterValue(env, jfilter);
- auto converted = convert(filterValue);
- if (!converted) {
- mbgl::Log::Error(mbgl::Event::JNI, "Error setting filter: " + converted.error().message);
- }
- filter = std::move(*converted);
- }
- return filter;
-}
-
jni::Array> NativeMapView::queryRenderedFeaturesForPoint(JNIEnv& env, jni::jfloat x, jni::jfloat y,
jni::Array layerIds,
jni::Array> jfilter) {
diff --git a/platform/android/src/style/conversion/filter.hpp b/platform/android/src/style/conversion/filter.hpp
new file mode 100644
index 000000000..fc36d3a04
--- /dev/null
+++ b/platform/android/src/style/conversion/filter.hpp
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "../android_conversion.hpp"
+#include
+#include
+
+#include
+
+#include
+#include