summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorMinh Nguyễn <mxn@1ec5.org>2016-08-12 15:45:18 -0700
committerJesse Bounds <jesse@rebounds.net>2016-08-12 15:45:18 -0700
commite147887e357f537a5c625fd3edda7b13d64142b3 (patch)
treeb1dbb6be088d91bb785ec599a4f62112ae6a05ea /platform
parent272ec0c30ba1b68db3b2b9ea76659ae0a489189f (diff)
downloadqtlocation-mapboxgl-e147887e357f537a5c625fd3edda7b13d64142b3.tar.gz
[core, android, ios, macos] Replaced getPointAnnotationsInBounds() w/ queryPointAnnotations() (#5165)
queryPointAnnotations() accepts a screen rectangle instead of a geographic bounding box, so marker hit testing works at the edges of a rotated, tilted map view. Fixes #5151.
Diffstat (limited to 'platform')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java13
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java24
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java2
-rwxr-xr-xplatform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java6
-rwxr-xr-xplatform/android/src/jni.cpp22
-rw-r--r--platform/ios/src/MGLMapView.mm6
-rw-r--r--platform/macos/src/MGLMapView.mm7
7 files changed, 42 insertions, 38 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java
index 682ba140c4..9631bc4ca8 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java
@@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.annotations;
import android.content.Context;
import android.graphics.PointF;
+import android.graphics.RectF;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@@ -321,7 +322,7 @@ public class MarkerViewManager {
if (!markerViewAdapters.contains(markerViewAdapter)) {
markerViewAdapters.add(markerViewAdapter);
- invalidateViewMarkersInBounds();
+ invalidateViewMarkersInVisibleRegion();
}
}
@@ -346,7 +347,7 @@ public class MarkerViewManager {
/**
* Schedule that ViewMarkers found in the viewport are invalidated.
* <p>
- * This method is rate limited, and {@link #invalidateViewMarkersInBounds} will only be called
+ * This method is rate limited, and {@link #invalidateViewMarkersInVisibleRegion} will only be called
* once each 250 ms.
* </p>
*/
@@ -356,7 +357,7 @@ public class MarkerViewManager {
if (currentTime < viewMarkerBoundsUpdateTime) {
return;
}
- invalidateViewMarkersInBounds();
+ invalidateViewMarkersInVisibleRegion();
viewMarkerBoundsUpdateTime = currentTime + 250;
}
}
@@ -368,9 +369,9 @@ public class MarkerViewManager {
* ones for each found Marker in the changed viewport.
* </p>
*/
- public void invalidateViewMarkersInBounds() {
- Projection projection = mapboxMap.getProjection();
- List<MarkerView> markers = mapView.getMarkerViewsInBounds(projection.getVisibleRegion().latLngBounds);
+ public void invalidateViewMarkersInVisibleRegion() {
+ RectF mapViewRect = new RectF(0, 0, mapView.getWidth(), mapView.getHeight());
+ List<MarkerView> markers = mapView.getMarkerViewsInRect(mapViewRect);
View convertView;
// remove old markers
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
index 54f165ac86..b17350f4f4 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
@@ -1153,13 +1153,13 @@ public class MapView extends FrameLayout {
mNativeMapView.removeAnnotations(ids);
}
- List<Marker> getMarkersInBounds(@NonNull LatLngBounds bbox) {
- if (mDestroyed || bbox == null) {
+ List<Marker> getMarkersInRect(@NonNull RectF rect) {
+ if (mDestroyed || rect == null) {
return new ArrayList<>();
}
- // TODO: filter in JNI using C++ parameter to getAnnotationsInBounds
- long[] ids = mNativeMapView.getAnnotationsInBounds(bbox);
+ // TODO: filter in JNI using C++ parameter to queryPointAnnotations
+ long[] ids = mNativeMapView.queryPointAnnotations(rect);
List<Long> idsList = new ArrayList<>(ids.length);
for (int i = 0; i < ids.length; i++) {
@@ -1179,13 +1179,13 @@ public class MapView extends FrameLayout {
return new ArrayList<>(annotations);
}
- public List<MarkerView> getMarkerViewsInBounds(@NonNull LatLngBounds bbox) {
- if (mDestroyed || bbox == null) {
+ public List<MarkerView> getMarkerViewsInRect(@NonNull RectF rect) {
+ if (mDestroyed || rect == null) {
return new ArrayList<>();
}
- // TODO: filter in JNI using C++ parameter to getAnnotationsInBounds
- long[] ids = mNativeMapView.getAnnotationsInBounds(bbox);
+ // TODO: filter in JNI using C++ parameter to queryPointAnnotations
+ long[] ids = mNativeMapView.queryPointAnnotations(rect);
List<Long> idsList = new ArrayList<>(ids.length);
for (int i = 0; i < ids.length; i++) {
@@ -1730,13 +1730,7 @@ public class MapView extends FrameLayout {
tapPoint.x + mAverageIconWidth / 2 + toleranceSides,
tapPoint.y + mAverageIconHeight / 2 + toleranceTopBottom);
- LatLngBounds.Builder builder = new LatLngBounds.Builder();
- builder.include(fromScreenLocation(new PointF(tapRect.left, tapRect.bottom)));
- builder.include(fromScreenLocation(new PointF(tapRect.left, tapRect.top)));
- builder.include(fromScreenLocation(new PointF(tapRect.right, tapRect.top)));
- builder.include(fromScreenLocation(new PointF(tapRect.right, tapRect.bottom)));
-
- List<Marker> nearbyMarkers = getMarkersInBounds(builder.build());
+ List<Marker> nearbyMarkers = getMarkersInRect(tapRect);
long newSelectedMarkerId = -1;
if (nearbyMarkers != null && nearbyMarkers.size() > 0) {
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
index 288c6feb4f..b2c48be69c 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
@@ -765,7 +765,7 @@ public class MapboxMap {
long id = mMapView.addMarker(marker);
marker.setId(id);
mAnnotations.put(id, marker);
- mMarkerViewManager.invalidateViewMarkersInBounds();
+ mMarkerViewManager.invalidateViewMarkersInVisibleRegion();
return marker;
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
index 929f515d8d..c93ac9c145 100755
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
@@ -402,8 +402,8 @@ final class NativeMapView {
nativeRemoveAnnotations(mNativeMapViewPtr, ids);
}
- public long[] getAnnotationsInBounds(LatLngBounds bbox) {
- return nativeGetAnnotationsInBounds(mNativeMapViewPtr, bbox);
+ public long[] queryPointAnnotations(RectF rect) {
+ return nativeQueryPointAnnotations(mNativeMapViewPtr, rect);
}
public void addAnnotationIcon(String symbol, int width, int height, float scale, byte[] pixels) {
@@ -641,7 +641,7 @@ final class NativeMapView {
private native void nativeRemoveAnnotations(long nativeMapViewPtr, long[] id);
- private native long[] nativeGetAnnotationsInBounds(long mNativeMapViewPtr, LatLngBounds bbox);
+ private native long[] nativeQueryPointAnnotations(long mNativeMapViewPtr, RectF rect);
private native void nativeAddAnnotationIcon(long nativeMapViewPtr, String symbol,
int width, int height, float scale, byte[] pixels);
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp
index 5907a0ff9d..89dbfe1cc2 100755
--- a/platform/android/src/jni.cpp
+++ b/platform/android/src/jni.cpp
@@ -842,20 +842,24 @@ void nativeRemoveAnnotations(JNIEnv *env, jni::jobject* obj, jlong nativeMapView
}
}
-jni::jarray<jlong>* nativeGetAnnotationsInBounds(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jni::jobject* latLngBounds_) {
- mbgl::Log::Debug(mbgl::Event::JNI, "nativeGetAnnotationsInBounds");
+jni::jarray<jlong>* nativeQueryPointAnnotations(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jni::jobject* rect) {
+ mbgl::Log::Debug(mbgl::Event::JNI, "nativeQueryPointAnnotations");
assert(nativeMapViewPtr != 0);
NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);
// Conversion
- mbgl::LatLngBounds latLngBounds = latlngbounds_from_java(env, latLngBounds_);
- if (latLngBounds.isEmpty()) {
- return nullptr;
- }
+ jfloat left = jni::GetField<jfloat>(*env, rect, *rectFLeftId);
+ jfloat right = jni::GetField<jfloat>(*env, rect, *rectFRightId);
+ jfloat top = jni::GetField<jfloat>(*env, rect, *rectFTopId);
+ jfloat bottom = jni::GetField<jfloat>(*env, rect, *rectFBottomId);
+ mbgl::ScreenBox box = {
+ { left, top },
+ { right, bottom },
+ };
// Assume only points for now
- std::vector<uint32_t> annotations = nativeMapView->getMap().getPointAnnotationsInBounds(
- latLngBounds);
+ std::vector<uint32_t> annotations = nativeMapView->getMap().queryPointAnnotations(
+ box);
return std_vector_uint_to_jobject(env, annotations);
}
@@ -1772,7 +1776,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
MAKE_NATIVE_METHOD(nativeUpdatePolygon, "(JJLcom/mapbox/mapboxsdk/annotations/Polygon;)J"),
MAKE_NATIVE_METHOD(nativeUpdatePolyline, "(JJLcom/mapbox/mapboxsdk/annotations/Polyline;)J"),
MAKE_NATIVE_METHOD(nativeRemoveAnnotations, "(J[J)V"),
- MAKE_NATIVE_METHOD(nativeGetAnnotationsInBounds, "(JLcom/mapbox/mapboxsdk/geometry/LatLngBounds;)[J"),
+ MAKE_NATIVE_METHOD(nativeQueryPointAnnotations, "(JLandroid/graphics/RectF;)[J"),
MAKE_NATIVE_METHOD(nativeAddAnnotationIcon, "(JLjava/lang/String;IIF[B)V"),
MAKE_NATIVE_METHOD(nativeSetVisibleCoordinateBounds, "(J[Lcom/mapbox/mapboxsdk/geometry/LatLng;Landroid/graphics/RectF;DJ)V"),
MAKE_NATIVE_METHOD(nativeOnLowMemory, "(J)V"),
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm
index fa885d020d..113bd2cef6 100644
--- a/platform/ios/src/MGLMapView.mm
+++ b/platform/ios/src/MGLMapView.mm
@@ -3371,8 +3371,10 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration)
/// Returns the tags of the annotations coincident with the given rectangle.
- (std::vector<MGLAnnotationTag>)annotationTagsInRect:(CGRect)rect
{
- mbgl::LatLngBounds queryBounds = [self convertRect:rect toLatLngBoundsFromView:self];
- return _mbglMap->getPointAnnotationsInBounds(queryBounds);
+ return _mbglMap->queryPointAnnotations({
+ { CGRectGetMinX(rect), CGRectGetMinY(rect) },
+ { CGRectGetMaxX(rect), CGRectGetMaxY(rect) },
+ });
}
- (id <MGLAnnotation>)selectedAnnotation
diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm
index c9f295d7e7..de127a7481 100644
--- a/platform/macos/src/MGLMapView.mm
+++ b/platform/macos/src/MGLMapView.mm
@@ -1897,8 +1897,11 @@ public:
/// Returns the tags of the annotations coincident with the given rectangle.
- (std::vector<MGLAnnotationTag>)annotationTagsInRect:(NSRect)rect {
- mbgl::LatLngBounds queryBounds = [self convertRect:rect toLatLngBoundsFromView:self];
- return _mbglMap->getPointAnnotationsInBounds(queryBounds);
+ // Cocoa origin is at the lower-left corner.
+ return _mbglMap->queryPointAnnotations({
+ { NSMinX(rect), NSHeight(self.bounds) - NSMaxY(rect) },
+ { NSMaxX(rect), NSHeight(self.bounds) - NSMinY(rect) },
+ });
}
- (id <MGLAnnotation>)selectedAnnotation {