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 3c1a32516..718b790df 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 @@ -7,6 +7,7 @@ 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 com.mapbox.services.commons.geojson.Geometry; import java.net.URL; import java.util.ArrayList; @@ -126,6 +127,70 @@ public class GeoJsonSource extends Source { setGeoJson(features); } + /** + * Create a GeoJsonSource from a {@link Feature} + * + * @param id the source id + * @param feature the feature + */ + public GeoJsonSource(String id, Feature feature) { + initialize(id, null); + setGeoJson(feature); + } + + /** + * Create a GeoJsonSource from a {@link Feature} and non-default {@link GeoJsonOptions} + * + * @param id the source id + * @param feature the feature + * @param options options + */ + public GeoJsonSource(String id, Feature feature, GeoJsonOptions options) { + initialize(id, options); + setGeoJson(feature); + } + + /** + * Create a GeoJsonSource from a {@link Geometry} + * + * @param id the source id + * @param geometry the geometry + */ + public GeoJsonSource(String id, Geometry geometry) { + initialize(id, null); + setGeoJson(geometry); + } + + /** + * Create a GeoJsonSource from a {@link Geometry} and non-default {@link GeoJsonOptions} + * + * @param id the source id + * @param geometry the geometry + * @param options options + */ + public GeoJsonSource(String id, Geometry geometry, GeoJsonOptions options) { + initialize(id, options); + setGeoJson(geometry); + } + + /** + * Updates the GeoJson with a single feature + * + * @param feature the GeoJSON {@link Feature} to set + */ + public void setGeoJson(Feature feature) { + nativeSetFeature(feature); + } + + /** + * Updates the GeoJson with a single geometry + * + * @param geometry the GeoJSON {@link Geometry} to set + */ + public void setGeoJson(Geometry geometry) { + nativeSetGeometry(geometry); + } + /** * Updates the GeoJson * @@ -182,6 +247,10 @@ public class GeoJsonSource extends Source { private native void nativeSetFeatureCollection(FeatureCollection geoJson); + private native void nativeSetFeature(Feature feature); + + private native void nativeSetGeometry(Geometry geometry); + private native Feature[] querySourceFeatures(Object[] filter); @Override diff --git a/platform/android/src/style/sources/geojson_source.cpp b/platform/android/src/style/sources/geojson_source.cpp index ad5588985..c201cdade 100644 --- a/platform/android/src/style/sources/geojson_source.cpp +++ b/platform/android/src/style/sources/geojson_source.cpp @@ -72,6 +72,26 @@ namespace android { source.as()->GeoJSONSource::setGeoJSON(GeoJSON(features)); } + void GeoJSONSource::setFeature(jni::JNIEnv& env, jni::Object jFeature) { + using namespace mbgl::android::geojson; + + // Convert the jni object + auto feature = Feature::convert(env, jFeature); + + // Update the core source + source.as()->GeoJSONSource::setGeoJSON(GeoJSON(feature)); + } + + void GeoJSONSource::setGeometry(jni::JNIEnv& env, jni::Object jGeometry) { + using namespace mbgl::android::geojson; + + // Convert the jni object + auto geometry = Geometry::convert(env, jGeometry); + + // Update the core source + source.as()->GeoJSONSource::setGeoJSON(GeoJSON(geometry)); + } + void GeoJSONSource::setURL(jni::JNIEnv& env, jni::String url) { // Update the core source source.as()->GeoJSONSource::setURL(jni::Make(env, url)); @@ -108,6 +128,8 @@ namespace android { "finalize", METHOD(&GeoJSONSource::setGeoJSONString, "nativeSetGeoJsonString"), METHOD(&GeoJSONSource::setFeatureCollection, "nativeSetFeatureCollection"), + METHOD(&GeoJSONSource::setFeature, "nativeSetFeature"), + METHOD(&GeoJSONSource::setGeometry, "nativeSetGeometry"), METHOD(&GeoJSONSource::setURL, "nativeSetUrl"), METHOD(&GeoJSONSource::querySourceFeatures, "querySourceFeatures") ); diff --git a/platform/android/src/style/sources/geojson_source.hpp b/platform/android/src/style/sources/geojson_source.hpp index 98d98e26b..51ea452fb 100644 --- a/platform/android/src/style/sources/geojson_source.hpp +++ b/platform/android/src/style/sources/geojson_source.hpp @@ -2,6 +2,7 @@ #include "source.hpp" #include +#include "../../geojson/geometry.hpp" #include "../../geojson/feature.hpp" #include "../../geojson/feature_collection.hpp" #include @@ -28,6 +29,10 @@ public: void setFeatureCollection(jni::JNIEnv&, jni::Object); + void setFeature(jni::JNIEnv&, jni::Object); + + void setGeometry(jni::JNIEnv&, jni::Object); + void setURL(jni::JNIEnv&, jni::String); jni::Array> querySourceFeatures(jni::JNIEnv&,