void TileMap::computeMinMaxLevel() { _minLevel = INT_MAX; _maxLevel = 0; for (TileSetList::iterator itr = _tileSets.begin(); itr != _tileSets.end(); ++itr) { if (itr->getOrder() < _minLevel) _minLevel = itr->getOrder(); if (itr->getOrder() > _maxLevel) _maxLevel = itr->getOrder(); } }
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 ""; }