From e028f1f0cc9389ee44633fd2d5e6ebb51139d385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=83=C2=A2=C3=82=C2=80=C3=82=C2=9Cosana=C3=83=C2=A2?= =?UTF-8?q?=C3=82=C2=80=C3=82=C2=9D?= Date: Mon, 26 Feb 2018 02:42:03 +0100 Subject: [android] union should take date line into consideration --- .../com/mapbox/mapboxsdk/geometry/LatLngBounds.java | 19 +++++++++++++++---- .../com/mapbox/mapboxsdk/geometry/LatLngSpan.java | 18 ++++++++++++++++++ .../mapbox/mapboxsdk/geometry/LatLngBoundsTest.java | 21 +++++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java index df8f764f44..fb12a76b55 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java @@ -444,10 +444,21 @@ public class LatLngBounds implements Parcelable { * @return BoundingBox */ public LatLngBounds union(final double latNorth, final double lonEast, final double latSouth, final double lonWest) { - return new LatLngBounds((this.latitudeNorth < latNorth) ? latNorth : this.latitudeNorth, - (this.longitudeEast < lonEast) ? lonEast : this.longitudeEast, - (this.latitudeSouth > latSouth) ? latSouth : this.latitudeSouth, - (this.longitudeWest > lonWest) ? lonWest : this.longitudeWest); + double north = (this.latitudeNorth < latNorth) ? latNorth : this.latitudeNorth; + double south = (this.latitudeSouth > latSouth) ? latSouth : this.latitudeSouth; + + if (LatLngSpan.getLongitudeSpan(lonEast, this.longitudeWest) + < LatLngSpan.getLongitudeSpan(this.longitudeEast, lonWest)) { + return new LatLngBounds(north, + lonEast, + south, + this.longitudeWest); + } + + return new LatLngBounds(north, + this.longitudeEast, + south, + lonWest); } /** diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngSpan.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngSpan.java index 322c7dfb74..133949f743 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngSpan.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngSpan.java @@ -4,6 +4,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; +import com.mapbox.mapboxsdk.constants.GeometryConstants; + /** * A geographical span defined by its latitude and longitude span. */ @@ -136,4 +138,20 @@ public class LatLngSpan implements Parcelable { result = 31 * result + (int) (temp ^ (temp >>> 32)); return result; } + + /** + * Get the absolute distance, in degrees, between the west and + * east boundaries of this LatLngBounds + * + * @return Span distance + */ + static double getLongitudeSpan(double east, double west) { + double longSpan = Math.abs(east - west); + if (east > west) { + return longSpan; + } + + // shortest span contains antimeridian + return GeometryConstants.LONGITUDE_SPAN - longSpan; + } } diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/geometry/LatLngBoundsTest.java b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/geometry/LatLngBoundsTest.java index 29ffd6bbbe..940fde1257 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/geometry/LatLngBoundsTest.java +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/geometry/LatLngBoundsTest.java @@ -337,6 +337,27 @@ public class LatLngBoundsTest { .build()); } + @Test + public void unionOverDateLine() { + LatLngBounds latLngBounds1 = new LatLngBounds.Builder() + .include(new LatLng(10, 170)) + .include(new LatLng(0, 160)) + .build(); + + LatLngBounds latLngBounds2 = new LatLngBounds.Builder() + .include(new LatLng(0, -170)) + .include(new LatLng(-10, -160)) + .build(); + + assertEquals("outer union should match", + latLngBounds1.union(latLngBounds2), + new LatLngBounds.Builder() + .include(new LatLng(10, 160)) + .include(new LatLng(-10, -160)) + .build()); + } + + @Test public void northWest() { double minLat = 5; -- cgit v1.2.1