TileMap* TileMap::create(const std::string& url, const Profile* profile, const std::string& format, int tile_width, int tile_height) { //Profile profile(type); const GeoExtent& ex = profile->getExtent(); TileMap* tileMap = new TileMap(); tileMap->setProfileType(profile->getProfileType()); //type); tileMap->setExtents(ex.xMin(), ex.yMin(), ex.xMax(), ex.yMax()); tileMap->setOrigin(ex.xMin(), ex.yMin()); tileMap->_filename = url; tileMap->_srs = getHorizSRSString(profile->getSRS()); tileMap->_vsrs = profile->getSRS()->getVertInitString(); //tileMap->_vsrs = profile->getVerticalSRS() ? profile->getVerticalSRS()->getInitString() : ""; tileMap->_format.setWidth( tile_width ); tileMap->_format.setHeight( tile_height ); tileMap->_format.setExtension( format ); profile->getNumTiles( 0, tileMap->_numTilesWide, tileMap->_numTilesHigh ); tileMap->generateTileSets(); tileMap->computeMinMaxLevel(); return tileMap; }
TileMap* TileMap::create(const std::string& url, const Profile* profile, const DataExtentList& dataExtents, const std::string& format, int tile_width, int tile_height) { const GeoExtent& ex = profile->getExtent(); TileMap* tileMap = new TileMap(); tileMap->setProfileType(profile->getProfileType()); tileMap->setExtents(ex.xMin(), ex.yMin(), ex.xMax(), ex.yMax()); tileMap->setOrigin(ex.xMin(), ex.yMin()); tileMap->_filename = url; tileMap->_srs = getHorizSRSString(profile->getSRS()); tileMap->_vsrs = profile->getSRS()->getVertInitString(); tileMap->_format.setWidth( tile_width ); tileMap->_format.setHeight( tile_height ); profile->getNumTiles( 0, tileMap->_numTilesWide, tileMap->_numTilesHigh ); // format can be a mime-type or an extension: std::string::size_type p = format.find('/'); if ( p == std::string::npos ) { tileMap->_format.setExtension(format); tileMap->_format.setMimeType( Registry::instance()->getMimeTypeForExtension(format) ); } else { tileMap->_format.setMimeType(format); tileMap->_format.setExtension( Registry::instance()->getExtensionForMimeType(format) ); } //Add the data extents tileMap->getDataExtents().insert(tileMap->getDataExtents().end(), dataExtents.begin(), dataExtents.end()); // If we have some data extents specified then make a nicer bounds than the if (!tileMap->getDataExtents().empty()) { // Get the union of all the extents GeoExtent e(tileMap->getDataExtents()[0]); for (unsigned int i = 1; i < tileMap->getDataExtents().size(); i++) { e.expandToInclude(tileMap->getDataExtents()[i]); } // Convert the bounds to the output profile GeoExtent bounds = e.transform(profile->getSRS()); tileMap->setExtents(bounds.xMin(), bounds.yMin(), bounds.xMax(), bounds.yMax()); } tileMap->generateTileSets(); tileMap->computeMinMaxLevel(); return tileMap; }
TileMap* TileMap::create(const std::string& url, const Profile* profile, const std::string& format, int tile_width, int tile_height) { const GeoExtent& ex = profile->getExtent(); TileMap* tileMap = new TileMap(); tileMap->setProfileType(profile->getProfileType()); tileMap->setExtents(ex.xMin(), ex.yMin(), ex.xMax(), ex.yMax()); tileMap->setOrigin(ex.xMin(), ex.yMin()); tileMap->_filename = url; tileMap->_srs = getHorizSRSString(profile->getSRS()); tileMap->_vsrs = profile->getSRS()->getVertInitString(); tileMap->_format.setWidth( tile_width ); tileMap->_format.setHeight( tile_height ); profile->getNumTiles( 0, tileMap->_numTilesWide, tileMap->_numTilesHigh ); // format can be a mime-type or an extension: std::string::size_type p = format.find('/'); if ( p == std::string::npos ) { tileMap->_format.setExtension(format); tileMap->_format.setMimeType( Registry::instance()->getMimeTypeForExtension(format) ); } else { tileMap->_format.setMimeType(format); tileMap->_format.setExtension( Registry::instance()->getExtensionForMimeType(format) ); } tileMap->generateTileSets(); tileMap->computeMinMaxLevel(); return tileMap; }
TileMap* TileMapReaderWriter::read( const Config& conf ) { const Config* tileMapConf = conf.find( ELEM_TILEMAP ); if ( !tileMapConf ) { OE_WARN << LC << "Could not find root TileMap element " << std::endl; return 0L; } TileMap* tileMap = new TileMap(); tileMap->setVersion ( tileMapConf->value(ATTR_VERSION) ); tileMap->setTileMapService( tileMapConf->value(ATTR_TILEMAPSERVICE) ); tileMap->setTitle ( tileMapConf->value(ELEM_TITLE) ); tileMap->setAbstract ( tileMapConf->value(ELEM_ABSTRACT) ); tileMap->setSRS ( tileMapConf->value(ELEM_SRS) ); if (tileMapConf->hasValue(ELEM_VERTICAL_SRS)) tileMap->setVerticalSRS( tileMapConf->value(ELEM_VERTICAL_SRS) ); if (tileMapConf->hasValue(ELEM_VERTICAL_DATUM)) tileMap->setVerticalSRS( tileMapConf->value(ELEM_VERTICAL_DATUM) ); const Config* bboxConf = tileMapConf->find( ELEM_BOUNDINGBOX ); if ( bboxConf ) { double minX = bboxConf->value<double>( ATTR_MINX, 0.0 ); double minY = bboxConf->value<double>( ATTR_MINY, 0.0 ); double maxX = bboxConf->value<double>( ATTR_MAXX, 0.0 ); double maxY = bboxConf->value<double>( ATTR_MAXY, 0.0 ); tileMap->setExtents( minX, minY, maxX, maxY); } //Read the origin const Config* originConf = tileMapConf->find(ELEM_ORIGIN); if ( originConf ) { tileMap->setOriginX( originConf->value<double>( ATTR_X, 0.0) ); tileMap->setOriginY( originConf->value<double>( ATTR_Y, 0.0) ); } //Read the tile format const Config* formatConf = tileMapConf->find( ELEM_TILE_FORMAT ); if ( formatConf ) { OE_DEBUG << LC << "Read TileFormat " << formatConf->value(ATTR_EXTENSION) << std::endl; tileMap->getFormat().setExtension( formatConf->value(ATTR_EXTENSION) ); tileMap->getFormat().setMimeType ( formatConf->value(ATTR_MIME_TYPE) ); tileMap->getFormat().setWidth ( formatConf->value<unsigned>(ATTR_WIDTH, 256) ); tileMap->getFormat().setHeight ( formatConf->value<unsigned>(ATTR_HEIGHT, 256) ); } else { OE_WARN << LC << "No TileFormat in TileMap!" << std::endl; } //Read the tilesets const Config* tileSetsConf = tileMapConf->find(ELEM_TILESETS); if ( tileSetsConf ) { //Read the profile std::string profile = tileSetsConf->value(ATTR_PROFILE); if (profile == "global-geodetic") tileMap->setProfileType( Profile::TYPE_GEODETIC ); else if (profile == "global-mercator") tileMap->setProfileType( Profile::TYPE_MERCATOR ); else if (profile == "local") tileMap->setProfileType( Profile::TYPE_LOCAL ); else tileMap->setProfileType( Profile::TYPE_UNKNOWN ); //Read each TileSet const ConfigSet& setConfs = tileSetsConf->children(ELEM_TILESET); for( ConfigSet::const_iterator i = setConfs.begin(); i != setConfs.end(); ++i ) { const Config& conf = *i; TileSet tileset; tileset.setHref( conf.value(ATTR_HREF) ); tileset.setOrder( conf.value<unsigned>(ATTR_ORDER, ~0) ); tileset.setUnitsPerPixel( conf.value<double>(ATTR_UNITSPERPIXEL, 0.0) ); tileMap->getTileSets().push_back(tileset); } } //Try to compute the profile based on the SRS if there was no PROFILE tag given if (tileMap->getProfileType() == Profile::TYPE_UNKNOWN && !tileMap->getSRS().empty()) { tileMap->setProfileType( Profile::getProfileTypeFromSRS(tileMap->getSRS()) ); } tileMap->computeMinMaxLevel(); tileMap->computeNumTiles(); //Read the data areas const Config* extentsConf = tileMapConf->find(ELEM_DATA_EXTENTS); if ( extentsConf ) { osg::ref_ptr< const osgEarth::Profile > profile = tileMap->createProfile(); OE_DEBUG << LC << "Found DataExtents " << std::endl; const ConfigSet& children = extentsConf->children(ELEM_DATA_EXTENT); for( ConfigSet::const_iterator i = children.begin(); i != children.end(); ++i ) { const Config& conf = *i; double minX = conf.value<double>(ATTR_MINX, 0.0); double minY = conf.value<double>(ATTR_MINY, 0.0); double maxX = conf.value<double>(ATTR_MAXX, 0.0); double maxY = conf.value<double>(ATTR_MAXY, 0.0); unsigned int maxLevel = conf.value<unsigned>(ATTR_MAX_LEVEL, 0); //OE_DEBUG << LC << "Read area " << minX << ", " << minY << ", " << maxX << ", " << maxY << ", minlevel=" << minLevel << " maxlevel=" << maxLevel << std::endl; if ( maxLevel > 0 ) tileMap->getDataExtents().push_back( DataExtent(GeoExtent(profile->getSRS(), minX, minY, maxX, maxY), 0, maxLevel)); else tileMap->getDataExtents().push_back( DataExtent(GeoExtent(profile->getSRS(), minX, minY, maxX, maxY), 0) ); } } return tileMap; }