Only add {ratio} to raster tile URLs

Thanks to @mb12 for the suggestion.
This commit is contained in:
Minh Nguyễn
2015-03-06 12:14:21 -08:00
committed by John Firebaugh
parent a3d76dad10
commit 8804c47d27
4 changed files with 26 additions and 16 deletions

View File

@@ -38,7 +38,8 @@ void TileData::request(uv::worker &worker, float pixelRatio, std::function<void(
return;
std::string url = source.tiles[(id.x + id.y) % source.tiles.size()];
url = util::replaceTokens(util::mapbox::normalizeTileURL(url, source.url), [&](const std::string &token) -> std::string {
url = util::mapbox::normalizeTileURL(url, source.url, source.type);
url = util::replaceTokens(url, [&](const std::string &token) -> std::string {
if (token == "z") return util::toString(id.z);
if (token == "x") return util::toString(id.x);
if (token == "y") return util::toString(id.y);

View File

@@ -39,23 +39,27 @@ std::string normalizeGlyphsURL(const std::string& url, const std::string& access
return normalizeURL(url, accessToken);
}
std::string normalizeTileURL(const std::string& url, const std::string& sourceURL) {
if (sourceURL.empty() || sourceURL.compare(0, mapbox.length(), mapbox) != 0)
std::string normalizeTileURL(const std::string& url, const std::string& sourceURL, SourceType sourceType) {
if (sourceURL.empty() || sourceURL.compare(0, mapbox.length(), mapbox) != 0 ||
sourceType != SourceType::Raster) {
return url;
}
std::string::size_type queryIdx = url.rfind("?");
// Trim off the right end but never touch anything before the extension dot.
std::string urlSansParams((queryIdx == std::string::npos) ? url : url.substr(0, queryIdx));
while (!urlSansParams.empty() && isdigit(urlSansParams.back()))
while (!urlSansParams.empty() && isdigit(urlSansParams.back())) {
urlSansParams.pop_back();
}
std::string::size_type extensionIdx = urlSansParams.length() - 4;
if (extensionIdx <= 0)
return url;
std::string extension = urlSansParams.substr(extensionIdx);
if (extension.compare(".png") != 0 && extension.compare(".jpg") != 0)
std::string::size_type basenameIdx = url.rfind("/");
std::string::size_type extensionIdx = url.rfind(".");
if (basenameIdx == std::string::npos || extensionIdx == std::string::npos ||
basenameIdx > extensionIdx) {
// No file extension: probably not a file name we can tack a ratio onto.
return url;
}
std::string normalizedURL(url);
normalizedURL.insert(extensionIdx, "{ratio}");

View File

@@ -2,6 +2,7 @@
#define MBGL_UTIL_MAPBOX
#include <string>
#include <mbgl/style/types.hpp>
namespace mbgl {
namespace util {
@@ -9,7 +10,7 @@ namespace mapbox {
std::string normalizeSourceURL(const std::string& url, const std::string& accessToken);
std::string normalizeGlyphsURL(const std::string& url, const std::string& accessToken);
std::string normalizeTileURL(const std::string& url, const std::string& sourceURL);
std::string normalizeTileURL(const std::string& url, const std::string& sourceURL, SourceType sourceType);
}
}

View File

@@ -19,12 +19,15 @@ TEST(Mapbox, GlyphsURL) {
TEST(Mapbox, TileURL) {
try {
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png", "mapbox://user.map"), "http://path.png/tile{ratio}.png");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png32", "mapbox://user.map"), "http://path.png/tile{ratio}.png32");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png70", "mapbox://user.map"), "http://path.png/tile{ratio}.png70");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png?access_token=foo", "mapbox://user.map"), "http://path.png/tile{ratio}.png?access_token=foo");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png", "http://path"), "http://path.png");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png", ""), "http://path.png");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png", "mapbox://user.map", SourceType::Raster), "http://path.png/tile{ratio}.png");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png32", "mapbox://user.map", SourceType::Raster), "http://path.png/tile{ratio}.png32");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png70", "mapbox://user.map", SourceType::Raster), "http://path.png/tile{ratio}.png70");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png?access_token=foo", "mapbox://user.map", SourceType::Raster), "http://path.png/tile{ratio}.png?access_token=foo");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png", "http://path", SourceType::Raster), "http://path.png");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png", "", SourceType::Raster), "http://path.png");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.png", "mapbox://user.map", SourceType::Vector), "http://path.png/tile.png");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.pbf", "mapbox://user.map", SourceType::Raster), "http://path.png/tile{ratio}.pbf");
EXPECT_EQ(mbgl::util::mapbox::normalizeTileURL("http://path.png/tile.pbf", "mapbox://user.map", SourceType::Vector), "http://path.png/tile.pbf");
} catch (const std::regex_error& e) {
std::cout << "regex_error caught: " << e.what() << '\n';
std::cout << e.code() << '\n';
@@ -57,5 +60,6 @@ TEST(Mapbox, TileURL) {
default:
break;
}
throw e;
}
}