summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormapsdroid <sprinter@Sprinter1.local>2018-02-08 21:09:40 -0500
committermapsdroid <sprinter@Sprinter1.local>2018-02-08 21:09:40 -0500
commit27497f702c6b48c87bcf9da9e08418a6ddde078c (patch)
tree239df022ef3053a0f319613aa2584e55b868cde9
parent4498917a3b9dbf6cc9728da01f479a027f27f902 (diff)
downloadqtlocation-mapboxgl-upstream/md-11108-tile-count.tar.gz
[core, android] added tileCount to OfflineRegion.upstream/md-11108-tile-count
-rw-r--r--include/mbgl/storage/offline.hpp4
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java16
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/OfflineActivity.java3
-rw-r--r--platform/android/src/offline/offline_region.cpp11
-rw-r--r--platform/android/src/offline/offline_region.hpp3
-rw-r--r--platform/default/mbgl/storage/offline.cpp22
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<String> 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<mbgl::android::LatLngBounds> 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 <jni/jni.hpp>
#include "../file_source.hpp"
+#include "../geometry/lat_lng_bounds.hpp"
#include <memory>
@@ -80,6 +81,8 @@ public:
void updateOfflineRegionMetadata(jni::JNIEnv&, jni::Array<jni::jbyte>, jni::Object<OfflineRegionUpdateMetadataCallback>);
+ jni::jlong tileCount(jni::JNIEnv&, jni::Object<mbgl::android::LatLngBounds> bounds, jni::jbyte zoom, jni::jint tileSize);
+
static jni::Object<OfflineRegion> New(jni::JNIEnv&, jni::Object<FileSource>, mbgl::OfflineRegion);
static jni::Array<jni::jbyte> 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