9 #include "GeoSceneTileDataset.h"
10 #include "GeoSceneTypes.h"
11 #include "GeoSceneEquirectTileProjection.h"
12 #include "GeoSceneMercatorTileProjection.h"
14 #include "DownloadPolicy.h"
15 #include "MarbleDebug.h"
16 #include "MarbleDirs.h"
17 #include "ServerLayout.h"
26 GeoSceneTileDataset::GeoSceneTileDataset(
const QString& name )
27 : GeoSceneAbstractDataset(
name ),
30 m_storageLayoutMode(
Marble),
31 m_serverLayout( new MarbleServerLayout( this ) ),
32 m_levelZeroColumns( defaultLevelZeroColumns ),
33 m_levelZeroRows( defaultLevelZeroRows ),
34 m_minimumTileLevel(0),
35 m_maximumTileLevel( -1 ),
36 m_tileProjection(new GeoSceneEquirectTileProjection()),
39 m_nextUrl( m_downloadUrls.constEnd() )
41 m_tileProjection->setLevelZeroColumns(m_levelZeroColumns);
42 m_tileProjection->setLevelZeroRows(m_levelZeroRows);
45 GeoSceneTileDataset::~GeoSceneTileDataset()
47 qDeleteAll( m_downloadPolicies );
48 delete m_serverLayout;
49 delete m_tileProjection;
52 const char* GeoSceneTileDataset::nodeType()
const
54 return GeoSceneTypes::GeoSceneTileDatasetType;
57 QString GeoSceneTileDataset::sourceDir()
const
62 void GeoSceneTileDataset::setSourceDir(
const QString& sourceDir )
64 m_sourceDir = sourceDir;
67 QString GeoSceneTileDataset::installMap()
const
72 void GeoSceneTileDataset::setInstallMap(
const QString& installMap )
74 m_installMap = installMap;
77 GeoSceneTileDataset::StorageLayout GeoSceneTileDataset::storageLayout()
const
79 return m_storageLayoutMode;
82 void GeoSceneTileDataset::setStorageLayout(
const StorageLayout layout )
84 m_storageLayoutMode = layout;
87 void GeoSceneTileDataset::setServerLayout(
const ServerLayout *layout )
89 delete m_serverLayout;
90 m_serverLayout = layout;
93 const ServerLayout* GeoSceneTileDataset::serverLayout()
const
95 return m_serverLayout;
98 int GeoSceneTileDataset::levelZeroColumns()
const
100 return m_levelZeroColumns;
103 void GeoSceneTileDataset::setLevelZeroColumns(
const int columns )
105 m_levelZeroColumns = columns;
106 m_tileProjection->setLevelZeroColumns(m_levelZeroColumns);
109 int GeoSceneTileDataset::levelZeroRows()
const
111 return m_levelZeroRows;
114 void GeoSceneTileDataset::setLevelZeroRows(
const int rows )
116 m_levelZeroRows = rows;
117 m_tileProjection->setLevelZeroRows(m_levelZeroRows);
120 int GeoSceneTileDataset::maximumTileLevel()
const
122 return m_maximumTileLevel;
125 void GeoSceneTileDataset::setMaximumTileLevel(
const int maximumTileLevel )
127 m_maximumTileLevel = maximumTileLevel;
130 int GeoSceneTileDataset::minimumTileLevel()
const
132 return m_minimumTileLevel;
135 void GeoSceneTileDataset::setMinimumTileLevel(
int level)
137 m_minimumTileLevel =
level;
140 void GeoSceneTileDataset::setTileLevels(
const QString &tileLevels)
143 m_tileLevels.clear();
148 for(
const QString &value: values) {
149 bool canParse(
false);
150 int const tileLevel = value.trimmed().toInt(&canParse);
151 if (canParse && tileLevel >= 0 && tileLevel < 100) {
152 m_tileLevels << tileLevel;
154 mDebug() <<
"Cannot parse tile level part " << value <<
" in " << tileLevels <<
", ignoring it.";
158 if (!m_tileLevels.isEmpty()) {
159 std::sort(m_tileLevels.begin(), m_tileLevels.end());
160 m_minimumTileLevel = m_tileLevels.first();
161 m_maximumTileLevel = m_tileLevels.last();
172 return m_downloadUrls;
175 const QSize GeoSceneTileDataset::tileSize()
const
177 if ( m_tileSize.isEmpty() ) {
178 const TileId id( 0, 0, 0, 0 );
179 QString const fileName = relativeTileFileName(
id );
181 QString const path = dirInfo.isAbsolute() ? fileName : MarbleDirs::path( fileName );
185 if ( testTile.isNull() ) {
186 mDebug() <<
"Tile size is missing in dgml and no base tile found in " << themeStr();
187 mDebug() <<
"Using default tile size " << c_defaultTileSize;
188 m_tileSize =
QSize( c_defaultTileSize, c_defaultTileSize );
190 m_tileSize = testTile.size();
193 if ( m_tileSize.isEmpty() ) {
194 mDebug() <<
"Tile width or height cannot be 0. Falling back to default tile size.";
195 m_tileSize =
QSize( c_defaultTileSize, c_defaultTileSize );
199 Q_ASSERT( !m_tileSize.isEmpty() );
203 GeoDataLatLonBox GeoSceneTileDataset::latLonBox()
const
208 void GeoSceneTileDataset::setLatLonBox(
const GeoDataLatLonBox &box )
213 void GeoSceneTileDataset::setTileSize(
const QSize &tileSize )
216 mDebug() <<
"Ignoring invalid tile size " << tileSize;
218 m_tileSize = tileSize;
222 void GeoSceneTileDataset::setTileProjection(GeoSceneAbstractTileProjection::Type projectionType)
224 if (m_tileProjection->type() == projectionType) {
228 delete m_tileProjection;
229 if (projectionType == GeoSceneAbstractTileProjection::Mercator) {
230 m_tileProjection =
new GeoSceneMercatorTileProjection();
232 m_tileProjection =
new GeoSceneEquirectTileProjection();
235 m_tileProjection->setLevelZeroColumns(m_levelZeroColumns);
236 m_tileProjection->setLevelZeroRows(m_levelZeroRows);
239 const GeoSceneAbstractTileProjection * GeoSceneTileDataset::tileProjection()
const
241 return m_tileProjection;
244 GeoSceneAbstractTileProjection::Type GeoSceneTileDataset::tileProjectionType()
const
246 return m_tileProjection->type();
251 QUrl GeoSceneTileDataset::downloadUrl(
const TileId &
id )
const
254 if ( m_downloadUrls.empty() ) {
256 mDebug() <<
"No download URL specified for tiles stored in "
257 << m_sourceDir <<
", falling back to " << defaultUrl.
toString();
258 return m_serverLayout->downloadUrl(defaultUrl,
id);
259 }
else if (m_downloadUrls.size() == 1) {
260 return m_serverLayout->downloadUrl(*m_nextUrl,
id);
262 if (m_nextUrl == m_downloadUrls.constEnd()) {
265 const QUrl url = m_serverLayout->downloadUrl(*m_nextUrl,
id);
271 void GeoSceneTileDataset::addDownloadUrl(
const QUrl & url )
273 m_downloadUrls.append( url );
275 m_nextUrl = m_downloadUrls.constBegin();
278 QString GeoSceneTileDataset::relativeTileFileName(
const TileId &
id )
const
284 switch ( m_storageLayoutMode ) {
285 case GeoSceneTileDataset::Marble:
286 relFileName =
QString(
"%1/%2/%3/%3_%4.%5" )
288 .
arg(
id.zoomLevel() )
293 case GeoSceneTileDataset::OpenStreetMap:
294 relFileName =
QString(
"%1/%2/%3/%4.%5" )
296 .
arg(
id.zoomLevel() )
301 case GeoSceneTileDataset::TileMapService:
302 relFileName =
QString(
"%1/%2/%3/%4.%5" )
304 .
arg(
id.zoomLevel() )
306 .
arg( ( 1<<
id.zoomLevel() ) -
id.y() - 1 )
314 QString GeoSceneTileDataset::themeStr()
const
317 return dirInfo.isAbsolute() ? sourceDir() :
QLatin1String(
"maps/") + sourceDir();
322 return m_downloadPolicies;
325 void GeoSceneTileDataset::addDownloadPolicy(
const DownloadUsage usage,
const int maximumConnections )
327 DownloadPolicy *
const policy =
new DownloadPolicy( DownloadPolicyKey( hostNames(), usage ));
328 policy->setMaximumConnections( maximumConnections );
329 m_downloadPolicies.append( policy );
330 mDebug() <<
"added download policy" << hostNames() << usage << maximumConnections;
336 result.
reserve(m_downloadUrls.size());
340 for (; pos !=
end; ++pos )
341 result.
append( (*pos).host() );