From 9ecc0d95979ca2fa3154f4b47c8f9fa4717fe696 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 27 Jul 2016 20:18:41 +0300 Subject: GeoJSON point clustering (#5724) * add supercluster dependency * prepare GeoJSONTile for Supercluster * prepare GeoJSONSource for accepting options * try removing mbgl::GeoJSON * fix setGeoJSON types * add GeoJSONSource getURL * add geojson to include path * add Supercluster index in GeoJSONSource * fix GeoJSONSource getZoomRange * bring back mbgl::GeoJSON header * fix tidy warnings hopefully * try test-suite with enabled cluster test * fix formatting in clustering-related files --- platform/default/mbgl/storage/offline_download.cpp | 86 +++++++++++++--------- 1 file changed, 50 insertions(+), 36 deletions(-) (limited to 'platform/default') diff --git a/platform/default/mbgl/storage/offline_download.cpp b/platform/default/mbgl/storage/offline_download.cpp index 6ff605167a..dd66abf982 100644 --- a/platform/default/mbgl/storage/offline_download.cpp +++ b/platform/default/mbgl/storage/offline_download.cpp @@ -1,15 +1,15 @@ -#include -#include #include +#include +#include #include #include #include -#include #include +#include #include -#include #include #include +#include #include #include @@ -66,7 +66,8 @@ std::vector OfflineDownload::glyphResources(const style::Parser& parse if (!parser.glyphURL.empty()) { for (const auto& fontStack : parser.fontStacks()) { for (uint32_t i = 0; i < 256; i++) { - result.push_back(Resource::glyphs(parser.glyphURL, fontStack, getGlyphRange(i * 256))); + result.push_back( + Resource::glyphs(parser.glyphURL, fontStack, getGlyphRange(i * 256))); } } } @@ -74,11 +75,13 @@ std::vector OfflineDownload::glyphResources(const style::Parser& parse return result; } -std::vector OfflineDownload::tileResources(SourceType type, uint16_t tileSize, const Tileset& tileset) const { +std::vector +OfflineDownload::tileResources(SourceType type, uint16_t tileSize, const Tileset& tileset) const { std::vector result; for (const auto& tile : definition.tileCover(type, tileSize, tileset.zoomRange)) { - result.push_back(Resource::tile(tileset.tiles[0], definition.pixelRatio, tile.x, tile.y, tile.z)); + result.push_back( + Resource::tile(tileset.tiles[0], definition.pixelRatio, tile.x, tile.y, tile.z)); } return result; @@ -106,18 +109,26 @@ OfflineRegionStatus OfflineDownload::getStatus() const { switch (source->baseImpl->type) { case SourceType::Vector: case SourceType::Raster: { - style::TileSourceImpl* tileSource = static_cast(source->baseImpl.get()); + style::TileSourceImpl* tileSource = + static_cast(source->baseImpl.get()); const variant& urlOrTileset = tileSource->getURLOrTileset(); if (urlOrTileset.is()) { - result.requiredResourceCount += tileResources(source->baseImpl->type, tileSource->getTileSize(), urlOrTileset.get()).size(); + result.requiredResourceCount += + tileResources(source->baseImpl->type, tileSource->getTileSize(), + urlOrTileset.get()) + .size(); } else { result.requiredResourceCount += 1; const std::string& url = urlOrTileset.get(); optional sourceResponse = offlineDatabase.get(Resource::source(url)); if (sourceResponse) { - result.requiredResourceCount += tileResources(source->baseImpl->type, tileSource->getTileSize(), - style::TileSourceImpl::parseTileJSON(*sourceResponse->data, url, source->baseImpl->type, tileSource->getTileSize())).size(); + result.requiredResourceCount += + tileResources(source->baseImpl->type, tileSource->getTileSize(), + style::TileSourceImpl::parseTileJSON( + *sourceResponse->data, url, source->baseImpl->type, + tileSource->getTileSize())) + .size(); } else { result.requiredResourceCountIsPrecise = false; } @@ -126,10 +137,10 @@ OfflineRegionStatus OfflineDownload::getStatus() const { } case SourceType::GeoJSON: { - style::GeoJSONSource::Impl* geojsonSource = static_cast(source->baseImpl.get()); - const variant& urlOrGeoJSON = geojsonSource->getURLOrGeoJSON(); + style::GeoJSONSource::Impl* geojsonSource = + static_cast(source->baseImpl.get()); - if (urlOrGeoJSON.is()) { + if (!geojsonSource->loaded) { result.requiredResourceCount += 1; } break; @@ -153,7 +164,7 @@ void OfflineDownload::activateDownload() { requiredSourceURLs.clear(); - ensureResource(Resource::style(definition.styleURL), [&] (Response styleResponse) { + ensureResource(Resource::style(definition.styleURL), [&](Response styleResponse) { status.requiredResourceCountIsPrecise = true; style::Parser parser; @@ -165,7 +176,8 @@ void OfflineDownload::activateDownload() { switch (type) { case SourceType::Vector: case SourceType::Raster: { - const style::TileSourceImpl* tileSource = static_cast(source->baseImpl.get()); + const style::TileSourceImpl* tileSource = + static_cast(source->baseImpl.get()); const variant& urlOrTileset = tileSource->getURLOrTileset(); const uint16_t tileSize = tileSource->getTileSize(); @@ -176,8 +188,9 @@ void OfflineDownload::activateDownload() { status.requiredResourceCountIsPrecise = false; requiredSourceURLs.insert(url); - ensureResource(Resource::source(url), [=] (Response sourceResponse) { - ensureTiles(type, tileSize, style::TileSourceImpl::parseTileJSON(*sourceResponse.data, url, type, tileSize)); + ensureResource(Resource::source(url), [=](Response sourceResponse) { + ensureTiles(type, tileSize, style::TileSourceImpl::parseTileJSON( + *sourceResponse.data, url, type, tileSize)); requiredSourceURLs.erase(url); if (requiredSourceURLs.empty()) { @@ -189,11 +202,11 @@ void OfflineDownload::activateDownload() { } case SourceType::GeoJSON: { - style::GeoJSONSource::Impl* geojsonSource = static_cast(source->baseImpl.get()); - const variant& urlOrGeoJSON = geojsonSource->getURLOrGeoJSON(); + style::GeoJSONSource::Impl* geojsonSource = + static_cast(source->baseImpl.get()); - if (urlOrGeoJSON.is()) { - ensureResource(Resource::source(urlOrGeoJSON.get())); + if (!geojsonSource->loaded) { + ensureResource(Resource::source(geojsonSource->getURL())); } break; } @@ -203,7 +216,7 @@ void OfflineDownload::activateDownload() { break; } } - + for (const auto& resource : spriteResources(parser)) { ensureResource(resource); } @@ -224,14 +237,16 @@ void OfflineDownload::ensureTiles(SourceType type, uint16_t tileSize, const Tile } } -void OfflineDownload::ensureResource(const Resource& resource, std::function callback) { +void OfflineDownload::ensureResource(const Resource& resource, + std::function callback) { status.requiredResourceCount++; auto workRequestsIt = requests.insert(requests.begin(), nullptr); - *workRequestsIt = util::RunLoop::Get()->invokeCancellable([=] () { + *workRequestsIt = util::RunLoop::Get()->invokeCancellable([=]() { requests.erase(workRequestsIt); - optional> offlineResponse = offlineDatabase.getRegionResource(id, resource); + optional> offlineResponse = + offlineDatabase.getRegionResource(id, resource); if (offlineResponse) { if (callback) { callback(offlineResponse->first); @@ -243,22 +258,22 @@ void OfflineDownload::ensureResource(const Resource& resource, std::functionsecond; } - + observer->statusChanged(status); - + if (status.complete()) { setState(OfflineRegionDownloadState::Inactive); } return; } - + if (checkTileCountLimit(resource)) { return; } auto fileRequestsIt = requests.insert(requests.begin(), nullptr); - *fileRequestsIt = onlineFileSource.request(resource, [=] (Response onlineResponse) { + *fileRequestsIt = onlineFileSource.request(resource, [=](Response onlineResponse) { if (onlineResponse.error) { observer->responseError(*onlineResponse.error); return; @@ -279,11 +294,11 @@ void OfflineDownload::ensureResource(const Resource& resource, std::functionstatusChanged(status); - + if (checkTileCountLimit(resource)) { return; } - + if (status.complete()) { setState(OfflineRegionDownloadState::Inactive); } @@ -292,14 +307,13 @@ void OfflineDownload::ensureResource(const Resource& resource, std::functionmapboxTileCountLimitExceeded(offlineDatabase.getOfflineMapboxTileCountLimit()); setState(OfflineRegionDownloadState::Inactive); return true; } - + return false; } -- cgit v1.2.1