From aa05cba0df0645b7e65a3cff8724d8adb3b922ce Mon Sep 17 00:00:00 2001 From: Tobrun Date: Wed, 3 Feb 2016 17:26:09 +0100 Subject: [android] #3758 - Projection / Visible Region implementation. [android] #3758 - add VisibleRegion + unit tests, removed boundingbox, cleanup jni, cleanup test app, renamed CoordinateSpan to LatLng. --- .../java/com/mapbox/mapboxsdk/maps/Projection.java | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Projection.java (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Projection.java') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Projection.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Projection.java new file mode 100644 index 0000000000..e53d430b69 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Projection.java @@ -0,0 +1,72 @@ +package com.mapbox.mapboxsdk.maps; + +import android.graphics.PointF; +import android.support.annotation.NonNull; + +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.geometry.LatLngBounds; +import com.mapbox.mapboxsdk.geometry.VisibleRegion; + +/** + * A projection is used to translate between on screen location and geographic coordinates on + * the surface of the Earth (LatLng). Screen location is in screen pixels (not display pixels) + * with respect to the top left corner of the map (and not necessarily of the whole screen). + */ +public class Projection { + + private MapView mMapView; + + Projection(@NonNull MapView mapView) { + this.mMapView = mapView; + } + + /** + * Returns the geographic location that corresponds to a screen location. + * The screen location is specified in screen pixels (not display pixels) relative to the + * top left of the map (not the top left of the whole screen). + * + * @param point A Point on the screen in screen pixels. + * @return The LatLng corresponding to the point on the screen, or null if the ray through + * the given screen point does not intersect the ground plane. + */ + public LatLng fromScreenLocation(PointF point) { + return mMapView.fromScreenLocation(point); + } + + /** + * Gets a projection of the viewing frustum for converting between screen coordinates and + * geo-latitude/longitude coordinates. + * + * @return The projection of the viewing frustum in its current state. + */ + public VisibleRegion getVisibleRegion() { + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + + int viewportWidth = mMapView.getWidth(); + int viewportHeight = mMapView.getHeight(); + + LatLng topLeft = fromScreenLocation(new PointF(0, 0)); + LatLng topRight = fromScreenLocation(new PointF(viewportWidth, 0)); + LatLng bottomRight = fromScreenLocation(new PointF(viewportWidth, viewportHeight)); + LatLng bottomLeft = fromScreenLocation(new PointF(0, viewportHeight)); + + builder.include(topLeft) + .include(topRight) + .include(bottomRight) + .include(bottomLeft); + + return new VisibleRegion(topLeft,topRight,bottomLeft,bottomRight,builder.build()); + } + + /** + * Returns a screen location that corresponds to a geographical coordinate (LatLng). + * The screen location is in screen pixels (not display pixels) relative to the top left + * of the map (not of the whole screen). + * + * @param location A LatLng on the map to convert to a screen location. + * @return A Point representing the screen location in screen pixels. + */ + public PointF toScreenLocation(LatLng location) { + return mMapView.toScreenLocation(location); + } +} -- cgit v1.2.1