diff options
author | Osana Babayan <32496536+osana@users.noreply.github.com> | 2018-02-28 10:10:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-28 10:10:09 -0500 |
commit | f4833a2c4e760aac8f461110135e8180c63e0782 (patch) | |
tree | 9fe4ef6a61061a6b2ba8b673c1dea04286cb51c4 /platform/android | |
parent | ab27e24ab0dd906668d73d35cbece8768dfd02c8 (diff) | |
download | qtlocation-mapboxgl-f4833a2c4e760aac8f461110135e8180c63e0782.tar.gz |
[android] LatLngBounds.union() should take date line into account
Diffstat (limited to 'platform/android')
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 @@ -338,6 +338,27 @@ public class LatLngBoundsTest { } @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; double minLon = 6; |