summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/storage/resource.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/mbgl/storage/resource.cpp b/src/mbgl/storage/resource.cpp
index 8019e4aeb7..bb587dcc33 100644
--- a/src/mbgl/storage/resource.cpp
+++ b/src/mbgl/storage/resource.cpp
@@ -1,10 +1,44 @@
+#include <mapbox/geometry/box.hpp>
#include <mbgl/storage/resource.hpp>
+#include <mbgl/util/constants.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/util/token.hpp>
#include <mbgl/util/url.hpp>
+#include <cmath>
+
namespace mbgl {
+static std::string getQuadKey(int32_t x, int32_t y, int8_t z) {
+ std::string quadKey;
+ quadKey.reserve(z);
+ int32_t mask;
+ for (int8_t i = z; i > 0; i--) {
+ mask = 1 << (i - 1);
+ quadKey += '0' + ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));
+ }
+ return quadKey;
+}
+
+static mapbox::geometry::point<double> getMercCoord(int32_t x, int32_t y, int8_t z) {
+ double resolution = (util::M2PI * util::EARTH_RADIUS_M / 256) / std::pow(2.0f, z);
+ return {
+ x * resolution - util::M2PI * util::EARTH_RADIUS_M / 2,
+ y * resolution - util::M2PI * util::EARTH_RADIUS_M / 2,
+ };
+}
+
+static std::string getTileBBox(int32_t x, int32_t y, int8_t z) {
+ // Alter the y for the Google/OSM tile scheme.
+ y = std::pow(2.0f, z) - y - 1;
+
+ auto min = getMercCoord(x * 256, y * 256, z);
+ auto max = getMercCoord((x + 1) * 256, (y + 1) * 256, z);
+
+ return (util::toString(min.x) + "," + util::toString(min.y) + "," +
+ util::toString(max.x) + "," + util::toString(max.y));
+}
+
Resource Resource::style(const std::string& url) {
return Resource {
Resource::Kind::Style,
@@ -64,6 +98,10 @@ Resource Resource::tile(const std::string& urlTemplate,
return util::toString(x);
} else if (token == "y") {
return util::toString(y);
+ } else if (token == "quadkey") {
+ return getQuadKey(x, y, z);
+ } else if (token == "bbox-epsg-3857") {
+ return getTileBBox(x, y, z);
} else if (token == "prefix") {
std::string prefix{ 2 };
prefix[0] = "0123456789abcdef"[x % 16];