From f047992eced4477169838d68e3d8e78a77ccb12e Mon Sep 17 00:00:00 2001 From: tobrun Date: Thu, 5 Dec 2019 15:49:56 +0100 Subject: [android] - add hooks for bulk conversion of geographic coordinates to screen coordinates --- platform/android/src/native_map_view.cpp | 54 ++++++++++++++++++++++++++++++++ platform/android/src/native_map_view.hpp | 4 +++ 2 files changed, 58 insertions(+) diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index d475d9b0d3..617f633699 100644 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -621,10 +621,62 @@ jni::Local> NativeMapView::pixelForLatLng(JNIEnv& env, jdoub return PointF::New(env, static_cast(pixel.x), static_cast(pixel.y)); } +void NativeMapView::pixelsForLatLngs(JNIEnv& env, + const jni::Array& input, + jni::Array& output, + jfloat pixelRatio) { + jni::NullCheck(env, &input); + std::size_t len = input.Length(env); + + std::vector latLngs; + latLngs.reserve(len); + + for (std::size_t i = 0; i < len; i += 2) { + auto latLng = mbgl::LatLng(input.Get(env, i), input.Get(env, i + 1)); + latLngs.push_back(latLng); + } + + std::vector buffer; + buffer.reserve(len); + std::vector coordinates = map->pixelsForLatLngs(latLngs); + for (std::size_t i = 0; i < len / 2; i++) { + buffer.push_back(coordinates[i].x * pixelRatio); + buffer.push_back(coordinates[i].y * pixelRatio); + } + + output.SetRegion>(env, 0, buffer); +} + jni::Local> NativeMapView::latLngForPixel(JNIEnv& env, jfloat x, jfloat y) { return LatLng::New(env, map->latLngForPixel(mbgl::ScreenCoordinate(x, y))); } +void NativeMapView::latLngsForPixels(JNIEnv& env, + const jni::Array& input, + jni::Array& output, + jfloat pixelRatio) { + jni::NullCheck(env, &input); + std::size_t len = input.Length(env); + + std::vector coordinates; + coordinates.reserve(len); + + for (std::size_t i = 0; i < len; i += 2) { + auto coordinate = mbgl::ScreenCoordinate(input.Get(env, i) / pixelRatio, input.Get(env, i + 1) / pixelRatio); + coordinates.push_back(coordinate); + } + + std::vector buffer; + buffer.reserve(len); + std::vector latLngs = map->latLngsForPixels(coordinates); + for (std::size_t i = 0; i < len / 2; i++) { + buffer.push_back(latLngs[i].latitude()); + buffer.push_back(latLngs[i].longitude()); + } + + output.SetRegion>(env, 0, buffer); +} + jni::Local> NativeMapView::addPolylines(JNIEnv& env, const jni::Array>& polylines) { NullCheck(env, &polylines); std::size_t len = polylines.Length(env); @@ -1122,8 +1174,10 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::getMetersPerPixelAtLatitude, "nativeGetMetersPerPixelAtLatitude"), METHOD(&NativeMapView::projectedMetersForLatLng, "nativeProjectedMetersForLatLng"), METHOD(&NativeMapView::pixelForLatLng, "nativePixelForLatLng"), + METHOD(&NativeMapView::pixelsForLatLngs, "nativePixelsForLatLngs"), METHOD(&NativeMapView::latLngForProjectedMeters, "nativeLatLngForProjectedMeters"), METHOD(&NativeMapView::latLngForPixel, "nativeLatLngForPixel"), + METHOD(&NativeMapView::latLngsForPixels, "nativeLatLngsForPixels"), METHOD(&NativeMapView::addPolylines, "nativeAddPolylines"), METHOD(&NativeMapView::addPolygons, "nativeAddPolygons"), METHOD(&NativeMapView::updatePolyline, "nativeUpdatePolyline"), diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 11676981a2..622c454b7d 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -161,10 +161,14 @@ public: jni::Local> pixelForLatLng(JNIEnv&, jdouble, jdouble); + void pixelsForLatLngs(JNIEnv&, const jni::Array&, jni::Array&, jfloat); + jni::Local> latLngForProjectedMeters(JNIEnv&, jdouble, jdouble); jni::Local> latLngForPixel(JNIEnv&, jfloat, jfloat); + void latLngsForPixels(JNIEnv&, const jni::Array&, jni::Array&, jfloat); + jni::Local> addPolylines(JNIEnv&, const jni::Array>&); jni::Local> addPolygons(JNIEnv&, const jni::Array>&); -- cgit v1.2.1