std::string DiskCache::getFilename(const osgEarth::TileKey& key, const CacheSpec& spec ) const { unsigned int level, x, y; level = key.getLevelOfDetail() +1; key.getTileXY( x, y ); unsigned int numCols, numRows; key.getProfile()->getNumTiles(level, numCols, numRows); // need to invert the y-tile index y = numRows - y - 1; char buf[2048]; sprintf( buf, "%s/%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.%s", getPath().c_str(), spec.cacheId().c_str(), level, (x / 1000000), (x / 1000) % 1000, (x % 1000), (y / 1000000), (y / 1000) % 1000, (y % 1000), spec.format().c_str()); return buf; }
std::string TileMap::getURL(const osgEarth::TileKey& tilekey, bool invertY) { if (!intersectsKey(tilekey)) { //OE_NOTICE << LC << "No key intersection for tile key " << tilekey.str() << std::endl; return ""; } unsigned int zoom = tilekey.getLevelOfDetail(); unsigned int x, y; tilekey.getTileXY(x, y); //Some TMS like services swap the Y coordinate so 0,0 is the upper left rather than the lower left. The normal TMS //specification has 0,0 at the bottom left, so inverting Y will make 0,0 in the upper left. //http://code.google.com/apis/maps/documentation/overlays.html#Google_Maps_Coordinates if (!invertY) { unsigned int numRows, numCols; tilekey.getProfile()->getNumTiles(tilekey.getLevelOfDetail(), numCols, numRows); y = numRows - y - 1; } //OE_NOTICE << LC << "KEY: " << tilekey.str() << " level " << zoom << " ( " << x << ", " << y << ")" << std::endl; //Select the correct TileSet if ( _tileSets.size() > 0 ) { for (TileSetList::iterator itr = _tileSets.begin(); itr != _tileSets.end(); ++itr) { if (itr->getOrder() == zoom) { std::stringstream ss; std::string path = osgDB::getFilePath(_filename); ss << path << "/" << zoom << "/" << x << "/" << y << "." << _format.getExtension(); //OE_NOTICE << LC << "Returning URL " << ss.str() << std::endl; std::string ssStr; ssStr = ss.str(); return ssStr; } } } else // Just go with it. No way of knowing the max level. { std::stringstream ss; std::string path = osgDB::getFilePath(_filename); ss << path << "/" << zoom << "/" << x << "/" << y << "." << _format.getExtension(); std::string ssStr; ssStr = ss.str(); return ssStr; } return ""; }