From 27497f702c6b48c87bcf9da9e08418a6ddde078c Mon Sep 17 00:00:00 2001 From: mapsdroid Date: Thu, 8 Feb 2018 21:09:40 -0500 Subject: [core, android] added tileCount to OfflineRegion. --- include/mbgl/storage/offline.hpp | 4 ++++ .../mapbox/mapboxsdk/offline/OfflineRegion.java | 16 ++++++++++++++++ .../testapp/activity/offline/OfflineActivity.java | 3 ++- platform/android/src/offline/offline_region.cpp | 11 ++++++++++- platform/android/src/offline/offline_region.hpp | 3 +++ platform/default/mbgl/storage/offline.cpp | 22 ++++++++++++++++++++++ 6 files changed, 57 insertions(+), 2 deletions(-) diff --git a/include/mbgl/storage/offline.hpp b/include/mbgl/storage/offline.hpp index ef4a499e83..17808d0c72 100644 --- a/include/mbgl/storage/offline.hpp +++ b/include/mbgl/storage/offline.hpp @@ -13,6 +13,7 @@ namespace mbgl { class TileID; +class LatLngBounds; /* * An offline region defined by a style URL, geographic bounding box, zoom range, and @@ -198,6 +199,9 @@ public: const OfflineRegionDefinition& getDefinition() const; const OfflineRegionMetadata& getMetadata() const; + // Compute only the count of tiles needed for tileCover + uint64_t getTileCount(const LatLngBounds&, uint8_t zoom, uint16_t tileSize) const; + private: friend class OfflineDatabase; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java index 090e9576ee..24603be688 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java @@ -8,6 +8,7 @@ import android.support.annotation.Nullable; import com.mapbox.mapboxsdk.LibraryLoader; import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.geometry.LatLngBounds; import com.mapbox.mapboxsdk.storage.FileSource; import java.lang.annotation.Retention; @@ -399,6 +400,20 @@ public class OfflineRegion { }); } + /** + * Gets the tile count. + * + * @param zoomLevel zoom level of the map (?) + * @param tileSize size of tiles (?) + * @return the tile count + */ + public long getTileCount(byte zoomLevel, int tileSize) { + if (getDefinition() == null) { + throw new RuntimeException("OfflineRegion is not loaded yet."); + } + return tileCount(getDefinition().getBounds(), zoomLevel, tileSize); + } + private native void initialize(long offlineRegionPtr, FileSource fileSource); @Override @@ -414,4 +429,5 @@ public class OfflineRegion { private native void updateOfflineRegionMetadata(byte[] metadata, OfflineRegionUpdateMetadataCallback callback); + private native long tileCount(LatLngBounds bounds, byte zoomLevel, int tileSize); } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java index 79e76168d5..d7d15a4848 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java @@ -175,7 +175,8 @@ public class OfflineActivity extends AppCompatActivity // Get regions info ArrayList offlineRegionsNames = new ArrayList<>(); for (OfflineRegion offlineRegion : offlineRegions) { - offlineRegionsNames.add(OfflineUtils.convertRegionName(offlineRegion.getMetadata())); + long tileCount = offlineRegion.getTileCount((byte) mapboxMap.getMinZoomLevel(), 256 ); + offlineRegionsNames.add(OfflineUtils.convertRegionName(offlineRegion.getMetadata()) + " TileCount: " + tileCount); } // Create args diff --git a/platform/android/src/offline/offline_region.cpp b/platform/android/src/offline/offline_region.cpp index 856434d266..a1171bfc7f 100644 --- a/platform/android/src/offline/offline_region.cpp +++ b/platform/android/src/offline/offline_region.cpp @@ -8,6 +8,7 @@ #include "offline_region_status.hpp" #include "../attach_env.hpp" #include "../jni/generic_global_ref_deleter.hpp" +#include "../geometry/lat_lng_bounds.hpp" namespace mbgl { namespace android { @@ -214,7 +215,8 @@ void OfflineRegion::registerNative(jni::JNIEnv& env) { METHOD(&OfflineRegion::setOfflineRegionDownloadState, "setOfflineRegionDownloadState"), METHOD(&OfflineRegion::getOfflineRegionStatus, "getOfflineRegionStatus"), METHOD(&OfflineRegion::deleteOfflineRegion, "deleteOfflineRegion"), - METHOD(&OfflineRegion::updateOfflineRegionMetadata, "updateOfflineRegionMetadata") + METHOD(&OfflineRegion::updateOfflineRegionMetadata, "updateOfflineRegionMetadata"), + METHOD(&OfflineRegion::tileCount, "tileCount") ); } @@ -304,5 +306,12 @@ void OfflineRegion::OfflineRegionUpdateMetadataCallback::onUpdate(jni::JNIEnv& e jni::DeleteLocalRef(env, jMetadata); } +jni::jlong OfflineRegion::tileCount(jni::JNIEnv& env, jni::Object jBounds, jni::jbyte zoom, jni::jint tileSize) { + auto bounds = LatLngBounds::getLatLngBounds(env, jBounds); + auto tileCount = region->getTileCount(bounds, zoom, tileSize); + return tileCount; +} + + } // namespace android } // namespace mbgl diff --git a/platform/android/src/offline/offline_region.hpp b/platform/android/src/offline/offline_region.hpp index c05383a91a..fdb3d0bfe4 100644 --- a/platform/android/src/offline/offline_region.hpp +++ b/platform/android/src/offline/offline_region.hpp @@ -4,6 +4,7 @@ #include #include "../file_source.hpp" +#include "../geometry/lat_lng_bounds.hpp" #include @@ -80,6 +81,8 @@ public: void updateOfflineRegionMetadata(jni::JNIEnv&, jni::Array, jni::Object); + jni::jlong tileCount(jni::JNIEnv&, jni::Object bounds, jni::jbyte zoom, jni::jint tileSize); + static jni::Object New(jni::JNIEnv&, jni::Object, mbgl::OfflineRegion); static jni::Array metadata(jni::JNIEnv&, mbgl::OfflineRegionMetadata); diff --git a/platform/default/mbgl/storage/offline.cpp b/platform/default/mbgl/storage/offline.cpp index 7670790be9..ab878a2d55 100644 --- a/platform/default/mbgl/storage/offline.cpp +++ b/platform/default/mbgl/storage/offline.cpp @@ -136,4 +136,26 @@ int64_t OfflineRegion::getID() const { return id; } +// Taken from https://github.com/mapbox/sphericalmercator#xyzbbox-zoom-tms_style-srs +// Computes the projected tiles for the lower left and upper right points of the bounds +// and uses that to compute the tile cover count +// +uint64_t OfflineRegion::getTileCount(const LatLngBounds& bounds, uint8_t zoom, uint16_t tileSize_) const { + + auto sw = Projection::project(bounds.southwest().wrapped(), zoom, tileSize_); + auto ne = Projection::project(bounds.northeast().wrapped(), zoom, tileSize_); + + auto x1 = floor(sw.x/ tileSize_); + auto x2 = floor((ne.x - 1) / tileSize_); + auto y1 = floor(sw.y/ tileSize_); + auto y2 = floor((ne.y - 1) / tileSize_); + + auto minX = ::fmax(std::min(x1, x2), 0); + auto maxX = std::max(x1, x2); + auto minY = (std::pow(2, zoom) - 1) - std::max(y1, y2); + auto maxY = (std::pow(2, zoom) - 1) - ::fmax(std::min(y1, y2), 0); + + return (maxX - minX + 1) * (maxY - minY + 1); + } + } // namespace mbgl -- cgit v1.2.1