Add api and demo for expression distance (#339)
* Add api and demo for expression distance * Update test case
This commit is contained in:
@@ -8,6 +8,7 @@ import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonNull;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.mapbox.geojson.GeoJson;
|
||||
import com.mapbox.geojson.Polygon;
|
||||
import com.mapbox.mapboxsdk.style.layers.PropertyFactory;
|
||||
import com.mapbox.mapboxsdk.style.layers.PropertyValue;
|
||||
@@ -1574,6 +1575,42 @@ public class Expression {
|
||||
return new Expression("in", literal(needle), haystack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the shortest distance between two geometries.
|
||||
* The returned value can be consumed as an input into another expression for changing a paint or layout property
|
||||
* or filtering features by distance.
|
||||
*
|
||||
* @param geoJson the target feature geoJso.
|
||||
* Currently supports `Point`, `MultiPoint`, `LineString`, `MultiLineString` geometry types
|
||||
* @param unit the unit for the returned value.
|
||||
* Currently supports `metres`, `kilometers`, `miles`, `nauticalmiles`, "yards","feet","inches"。
|
||||
* @return the distance in the unit that is provided.
|
||||
* @see <a href="https://www.mapbox.com/mapbox-gl-js/style-spec/#expressions-distance">Style specification</a>
|
||||
*/
|
||||
public static Expression distance(@NonNull GeoJson geoJson, String unit) {
|
||||
Map<String, Expression> map = new HashMap<>();
|
||||
map.put("json", literal(geoJson.toJson()));
|
||||
return new Expression("distance", new ExpressionMap(map), literal(unit));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the shortest distance between two geometries.
|
||||
* The returned value can be consumed as an input into another expression for changing a paint or layout property
|
||||
* or filtering features by distance.
|
||||
* <p>
|
||||
* Currently supports `Point`, `MultiPoint`, `LineString`, `MultiLineString` geometry types.
|
||||
*
|
||||
* @param geoJson the target feature geoJson.
|
||||
* Currently supports `Point`, `MultiPoint`, `LineString`, `MultiLineString` geometry types
|
||||
* @return the distance in the unit "meters".
|
||||
* @see <a href="https://www.mapbox.com/mapbox-gl-js/style-spec/#expressions-distance">Style specification</a>
|
||||
*/
|
||||
public static Expression distance(@NonNull GeoJson geoJson) {
|
||||
Map<String, Expression> map = new HashMap<>();
|
||||
map.put("json", literal(geoJson.toJson()));
|
||||
return new Expression("distance", new ExpressionMap(map));
|
||||
}
|
||||
|
||||
public static Expression within(@NonNull Polygon polygon) {
|
||||
Map<String, Expression> map = new HashMap<>();
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ import static com.mapbox.mapboxsdk.style.expressions.Expression.color;
|
||||
import static com.mapbox.mapboxsdk.style.expressions.Expression.concat;
|
||||
import static com.mapbox.mapboxsdk.style.expressions.Expression.cos;
|
||||
import static com.mapbox.mapboxsdk.style.expressions.Expression.cubicBezier;
|
||||
import static com.mapbox.mapboxsdk.style.expressions.Expression.distance;
|
||||
import static com.mapbox.mapboxsdk.style.expressions.Expression.division;
|
||||
import static com.mapbox.mapboxsdk.style.expressions.Expression.downcase;
|
||||
import static com.mapbox.mapboxsdk.style.expressions.Expression.e;
|
||||
@@ -487,6 +488,22 @@ public class ExpressionTest {
|
||||
assertTrue("expression should match", Arrays.deepEquals(expected, actual));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testDistance() throws Exception {
|
||||
Point point = Point.fromLngLat(1, 2);
|
||||
HashMap<String, String> map = new HashMap<>();
|
||||
map.put("json", point.toJson());
|
||||
Object[] expected = new Object[] {"distance", map};
|
||||
Object[] actual = distance(point).toArray();
|
||||
assertTrue("expression should match", Arrays.deepEquals(expected, actual));
|
||||
|
||||
Object[] expectedWithUnit = new Object[] {"distance", map, "meters"};
|
||||
Object[] actualWithUnit = distance(point, "meters").toArray();
|
||||
assertTrue("expression should match", Arrays.deepEquals(expectedWithUnit, actualWithUnit));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testInArray() throws Exception {
|
||||
Object[] expected = new Object[] {"in", "one", new Object[] {"literal", new Object[] {"one", "two"}}};
|
||||
|
||||
@@ -515,6 +515,18 @@
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".activity.FeatureOverviewActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".activity.style.DistanceExpressionActivity"
|
||||
android:description="@string/description_distance_style"
|
||||
android:exported="true"
|
||||
android:label="@string/activity_distance_style">
|
||||
<meta-data
|
||||
android:name="@string/category"
|
||||
android:value="@string/category_style" />
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".activity.FeatureOverviewActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".activity.style.GradientLineActivity"
|
||||
android:description="@string/description_gradient_line"
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
package com.mapbox.mapboxsdk.testapp.activity.style
|
||||
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.os.PersistableBundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.mapbox.geojson.Point
|
||||
import com.mapbox.mapboxsdk.camera.CameraPosition
|
||||
import com.mapbox.mapboxsdk.geometry.LatLng
|
||||
import com.mapbox.mapboxsdk.maps.MapboxMap
|
||||
import com.mapbox.mapboxsdk.maps.Style
|
||||
import com.mapbox.mapboxsdk.style.expressions.Expression.distance
|
||||
import com.mapbox.mapboxsdk.style.expressions.Expression.lt
|
||||
import com.mapbox.mapboxsdk.style.layers.FillLayer
|
||||
import com.mapbox.mapboxsdk.style.layers.Property.NONE
|
||||
import com.mapbox.mapboxsdk.style.layers.PropertyFactory.*
|
||||
import com.mapbox.mapboxsdk.style.layers.SymbolLayer
|
||||
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
|
||||
import com.mapbox.mapboxsdk.testapp.R
|
||||
import com.mapbox.turf.TurfConstants
|
||||
import com.mapbox.turf.TurfTransformation
|
||||
import kotlinx.android.synthetic.main.activity_physical_circle.*
|
||||
|
||||
/**
|
||||
* An Activity that showcases the within expression to filter features outside a geometry
|
||||
*/
|
||||
class DistanceExpressionActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var mapboxMap: MapboxMap
|
||||
|
||||
private val lat = 37.78794572301525
|
||||
private val lon = -122.40752220153807
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_within_expression)
|
||||
|
||||
mapView.onCreate(savedInstanceState)
|
||||
mapView.getMapAsync { map ->
|
||||
mapboxMap = map
|
||||
|
||||
// Setup camera position above Georgetown
|
||||
mapboxMap.cameraPosition = CameraPosition.Builder()
|
||||
.target(LatLng(lat, lon))
|
||||
.zoom(16.0)
|
||||
.build()
|
||||
setupStyle()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupStyle() {
|
||||
val center = Point.fromLngLat(lon, lat)
|
||||
val circle = TurfTransformation.circle(center, 150.0, TurfConstants.UNIT_METRES)
|
||||
// Setup style with additional layers,
|
||||
// using Style.MAPBOX_STREETS as a base style
|
||||
mapboxMap.setStyle(
|
||||
Style.Builder()
|
||||
.fromUri(Style.MAPBOX_STREETS)
|
||||
.withSources(
|
||||
GeoJsonSource(
|
||||
POINT_ID, Point.fromLngLat(lon, lat)
|
||||
),
|
||||
GeoJsonSource(CIRCLE_ID, circle)
|
||||
)
|
||||
.withLayerBelow(
|
||||
FillLayer(CIRCLE_ID, CIRCLE_ID)
|
||||
.withProperties(
|
||||
fillOpacity(0.5f),
|
||||
fillColor(Color.parseColor("#3bb2d0"))
|
||||
), "poi-label"
|
||||
)
|
||||
) { style ->
|
||||
// Show only POI labels inside circle radius using distance expression
|
||||
val symbolLayer = style.getLayer("poi-label") as SymbolLayer
|
||||
symbolLayer.setFilter(lt(
|
||||
distance(
|
||||
Point.fromLngLat(lon, lat), "meters"
|
||||
), 150)
|
||||
)
|
||||
|
||||
// Hide other types of labels to highlight POI labels
|
||||
(style.getLayer("road-label") as SymbolLayer).setProperties(visibility(NONE))
|
||||
(style.getLayer("transit-label") as SymbolLayer).setProperties(visibility(NONE))
|
||||
(style.getLayer("road-number-shield") as SymbolLayer).setProperties(visibility(NONE))
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
mapView.onStart()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
mapView.onResume()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
mapView.onPause()
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
mapView.onStop()
|
||||
}
|
||||
|
||||
override fun onLowMemory() {
|
||||
super.onLowMemory()
|
||||
mapView.onLowMemory()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
mapView.onDestroy()
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle?, outPersistentState: PersistableBundle?) {
|
||||
super.onSaveInstanceState(outState, outPersistentState)
|
||||
outState?.let {
|
||||
mapView.onSaveInstanceState(it)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val POINT_ID = "point"
|
||||
const val CIRCLE_ID = "circle"
|
||||
}
|
||||
}
|
||||
@@ -34,6 +34,7 @@
|
||||
<string name="description_dynamic_info_window_adapter">Learn how to create a dynamic custom InfoWindow</string>
|
||||
<string name="description_viewpager">Use SupportMapFragments in a ViewPager</string>
|
||||
<string name="description_runtime_style">Adopt the map style on the fly</string>
|
||||
<string name="description_distance_style">Show POIs on a map with distance expression filter</string>
|
||||
<string name="description_gradient_line">Show a gradient line layer from a geojson source</string>
|
||||
<string name="description_data_driven_style">Use functions to change the map appearance</string>
|
||||
<string name="description_symbol_layer">Manipulate symbols at runtime</string>
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
<string name="activity_minmax_zoom">Min/Max Zoom</string>
|
||||
<string name="activity_viewpager">ViewPager</string>
|
||||
<string name="activity_runtime_style">Runtime Style</string>
|
||||
<string name="activity_distance_style">Distance Expression</string>
|
||||
<string name="activity_gradient_line">Gradient line layer</string>
|
||||
<string name="activity_data_driven_style">Data Driven Style</string>
|
||||
<string name="activity_circle_layer">Circle layer</string>
|
||||
|
||||
2
vendor/mapbox-gl-native
vendored
2
vendor/mapbox-gl-native
vendored
Submodule vendor/mapbox-gl-native updated: 71ce52d35f...9f8c9c61e8
Reference in New Issue
Block a user