Skip to content
This repository has been archived by the owner on Jun 21, 2023. It is now read-only.

Commit

Permalink
Fix getFilter with distance expression crash. (#380)
Browse files Browse the repository at this point in the history
* Fix getFilter with distance expression crash.

* Update gl-native and test case

* Bump gl-native to maps-1.6.0

* Update review comment.
  • Loading branch information
Kevin Li committed May 14, 2020
1 parent 4c511ee commit 0010a58
Show file tree
Hide file tree
Showing 12 changed files with 609 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.mapbox.geojson.GeoJson;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.geojson.gson.GeometryGeoJson;
import com.mapbox.mapboxsdk.style.layers.PropertyFactory;
import com.mapbox.mapboxsdk.style.layers.PropertyValue;

Expand Down Expand Up @@ -1583,7 +1589,8 @@ public static Expression in(@NonNull String needle, @NonNull Expression haystack
* Currently supports `Point`, `MultiPoint`, `LineString`, `MultiLineString` geometry types.
*
* @param geoJson the target feature geoJson.
* Currently supports `Point`, `MultiPoint`, `LineString`, `MultiLineString` geometry types
* Currently supports `Point`, `MultiPoint`, `LineString`, `MultiLineString`, `Polygon`, `MultiPolygon`
* 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>
*/
Expand Down Expand Up @@ -4767,6 +4774,8 @@ public static Expression convert(@NonNull JsonArray jsonArray) {
final List<Expression> arguments = new ArrayList<>();
if (operator.equals("within")) {
return within(Polygon.fromJson(jsonArray.get(1).toString()));
} else if (operator.equals("distance")) {
return distance(GeometryGeoJson.fromJson(jsonArray.get(1).toString()));
}
for (int i = 1; i < jsonArray.size(); i++) {
JsonElement jsonElement = jsonArray.get(i);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
Expand All @@ -22,6 +28,9 @@
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;

import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* Basic smoke tests for BackgroundLayer
Expand All @@ -30,6 +39,19 @@
public class BackgroundLayerTest extends BaseLayerTest {

private BackgroundLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};

@Before
@UiThreadTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
Expand All @@ -22,6 +28,9 @@
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;

import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* Basic smoke tests for CircleLayer
Expand All @@ -30,6 +39,19 @@
public class CircleLayerTest extends BaseLayerTest {

private CircleLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};

@Before
@UiThreadTest
Expand Down Expand Up @@ -97,6 +119,60 @@ public void testFilter() {
assertEquals(layer.getFilter().toString(), filter.toString());
}

@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);

// Get initial
assertEquals(layer.getFilter(), null);

// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}

@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);

// Get initial
assertEquals(layer.getFilter(), null);

Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}


@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
Expand All @@ -22,6 +28,9 @@
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;

import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* Basic smoke tests for FillExtrusionLayer
Expand All @@ -30,6 +39,19 @@
public class FillExtrusionLayerTest extends BaseLayerTest {

private FillExtrusionLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};

@Before
@UiThreadTest
Expand Down Expand Up @@ -97,6 +119,60 @@ public void testFilter() {
assertEquals(layer.getFilter().toString(), filter.toString());
}

@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);

// Get initial
assertEquals(layer.getFilter(), null);

// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}

@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);

// Get initial
assertEquals(layer.getFilter(), null);

Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}


@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
Expand All @@ -22,6 +28,9 @@
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;

import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* Basic smoke tests for FillLayer
Expand All @@ -30,6 +39,19 @@
public class FillLayerTest extends BaseLayerTest {

private FillLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};

@Before
@UiThreadTest
Expand Down Expand Up @@ -97,6 +119,60 @@ public void testFilter() {
assertEquals(layer.getFilter().toString(), filter.toString());
}

@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);

// Get initial
assertEquals(layer.getFilter(), null);

// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());

// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}

@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);

// Get initial
assertEquals(layer.getFilter(), null);

Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}


@Test
Expand Down
Loading

0 comments on commit 0010a58

Please sign in to comment.