• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
  • geodata
  • scene
GeoSceneTiled.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the Marble Virtual Globe.
3 
4  This program is free software licensed under the GNU LGPL. You can
5  find a copy of this license in LICENSE.txt in the top directory of
6  the source code.
7 
8  Copyright (C) 2008 Torsten Rahn <rahn@kde.org>
9 
10  Copyright (C) 2008 Jens-Michael Hoffmann <jensmh@gmx.de>
11 
12  Copyright 2012 Ander Pijoan <ander.pijoan@deusto.es>
13 */
14 
15 #include "GeoSceneTiled.h"
16 #include "GeoSceneTypes.h"
17 
18 #include "DownloadPolicy.h"
19 #include "MarbleDebug.h"
20 #include "MarbleDirs.h"
21 #include "ServerLayout.h"
22 #include "TileId.h"
23 
24 #include <QImage>
25 
26 namespace Marble
27 {
28 
29 GeoSceneTiled::GeoSceneTiled( const QString& name )
30  : GeoSceneAbstractDataset( name ),
31  m_sourceDir(),
32  m_installMap(),
33  m_storageLayoutMode(Marble),
34  m_serverLayout( new MarbleServerLayout( this ) ),
35  m_levelZeroColumns( defaultLevelZeroColumns ),
36  m_levelZeroRows( defaultLevelZeroRows ),
37  m_maximumTileLevel( -1 ),
38  m_projection( Equirectangular ),
39  m_blending(),
40  m_downloadUrls(),
41  m_nextUrl( m_downloadUrls.constEnd() )
42 {
43 }
44 
45 GeoSceneTiled::~GeoSceneTiled()
46 {
47  qDeleteAll( m_downloadPolicies );
48  delete m_serverLayout;
49 }
50 
51 const char* GeoSceneTiled::nodeType() const
52 {
53  return GeoSceneTypes::GeoSceneTiledType;
54 }
55 
56 QString GeoSceneTiled::sourceDir() const
57 {
58  return m_sourceDir;
59 }
60 
61 void GeoSceneTiled::setSourceDir( const QString& sourceDir )
62 {
63  m_sourceDir = sourceDir;
64 }
65 
66 QString GeoSceneTiled::installMap() const
67 {
68  return m_installMap;
69 }
70 
71 void GeoSceneTiled::setInstallMap( const QString& installMap )
72 {
73  m_installMap = installMap;
74 }
75 
76 GeoSceneTiled::StorageLayout GeoSceneTiled::storageLayout() const
77 {
78  return m_storageLayoutMode;
79 }
80 
81 void GeoSceneTiled::setStorageLayout( const StorageLayout layout )
82 {
83  m_storageLayoutMode = layout;
84 }
85 
86 void GeoSceneTiled::setServerLayout( const ServerLayout *layout )
87 {
88  delete m_serverLayout;
89  m_serverLayout = layout;
90 }
91 
92 const ServerLayout* GeoSceneTiled::serverLayout() const
93 {
94  return m_serverLayout;
95 }
96 
97 int GeoSceneTiled::levelZeroColumns() const
98 {
99  return m_levelZeroColumns;
100 }
101 
102 void GeoSceneTiled::setLevelZeroColumns( const int columns )
103 {
104  m_levelZeroColumns = columns;
105 }
106 
107 int GeoSceneTiled::levelZeroRows() const
108 {
109  return m_levelZeroRows;
110 }
111 
112 void GeoSceneTiled::setLevelZeroRows( const int rows )
113 {
114  m_levelZeroRows = rows;
115 }
116 
117 int GeoSceneTiled::maximumTileLevel() const
118 {
119  return m_maximumTileLevel;
120 }
121 
122 void GeoSceneTiled::setMaximumTileLevel( const int maximumTileLevel )
123 {
124  m_maximumTileLevel = maximumTileLevel;
125 }
126 
127 QVector<QUrl> GeoSceneTiled::downloadUrls() const
128 {
129  return m_downloadUrls;
130 }
131 
132 const QSize GeoSceneTiled::tileSize() const
133 {
134  if ( m_tileSize.isEmpty() ) {
135  const TileId id( 0, 0, 0, 0 );
136  QString const fileName = relativeTileFileName( id );
137  QFileInfo const dirInfo( fileName );
138  QString const path = dirInfo.isAbsolute() ? fileName : MarbleDirs::path( fileName );
139 
140  QImage testTile( path );
141 
142  if ( testTile.isNull() ) {
143  mDebug() << "Tile size is missing in dgml and no base tile found in " << themeStr();
144  mDebug() << "Using default tile size " << c_defaultTileSize;
145  m_tileSize = QSize( c_defaultTileSize, c_defaultTileSize );
146  } else {
147  m_tileSize = testTile.size();
148  }
149 
150  if ( m_tileSize.isEmpty() ) {
151  mDebug() << "Tile width or height cannot be 0. Falling back to default tile size.";
152  m_tileSize = QSize( c_defaultTileSize, c_defaultTileSize );
153  }
154  }
155 
156  Q_ASSERT( !m_tileSize.isEmpty() );
157  return m_tileSize;
158 }
159 
160 void GeoSceneTiled::setTileSize( const QSize &tileSize )
161 {
162  if ( tileSize.isEmpty() ) {
163  mDebug() << "Ignoring invalid tile size " << tileSize;
164  } else {
165  m_tileSize = tileSize;
166  }
167 }
168 
169 GeoSceneTiled::Projection GeoSceneTiled::projection() const
170 {
171  return m_projection;
172 }
173 
174 void GeoSceneTiled::setProjection( const Projection projection )
175 {
176  m_projection = projection;
177 }
178 
179 // Even though this method changes the internal state, it may be const
180 // because the compiler is forced to invoke this method for different TileIds.
181 QUrl GeoSceneTiled::downloadUrl( const TileId &id ) const
182 {
183  // default download url
184  if ( m_downloadUrls.empty() )
185  return m_serverLayout->downloadUrl( QUrl( "http://files.kde.org/marble/" ), id );
186 
187  if ( m_nextUrl == m_downloadUrls.constEnd() )
188  m_nextUrl = m_downloadUrls.constBegin();
189 
190  const QUrl url = m_serverLayout->downloadUrl( *m_nextUrl, id );
191 
192  ++m_nextUrl;
193 
194  return url;
195 }
196 
197 void GeoSceneTiled::addDownloadUrl( const QUrl & url )
198 {
199  m_downloadUrls.append( url );
200  // FIXME: this could be done only once
201  m_nextUrl = m_downloadUrls.constBegin();
202 }
203 
204 QString GeoSceneTiled::relativeTileFileName( const TileId &id ) const
205 {
206  const QString suffix = fileFormat().toLower();
207 
208  QString relFileName;
209 
210  switch ( m_storageLayoutMode ) {
211  default:
212  mDebug() << Q_FUNC_INFO << "Invalid storage layout mode! Falling back to default.";
213  case GeoSceneTiled::Marble:
214  relFileName = QString( "%1/%2/%3/%3_%4.%5" )
215  .arg( themeStr() )
216  .arg( id.zoomLevel() )
217  .arg( id.y(), tileDigits, 10, QChar('0') )
218  .arg( id.x(), tileDigits, 10, QChar('0') )
219  .arg( suffix );
220  break;
221  case GeoSceneTiled::OpenStreetMap:
222  relFileName = QString( "%1/%2/%3/%4.%5" )
223  .arg( themeStr() )
224  .arg( id.zoomLevel() )
225  .arg( id.x() )
226  .arg( id.y() )
227  .arg( suffix );
228  break;
229  case GeoSceneTiled::TileMapService:
230  relFileName = QString( "%1/%2/%3/%4.%5" )
231  .arg( themeStr() )
232  .arg( id.zoomLevel() )
233  .arg( id.x() )
234  .arg( ( 1<<id.zoomLevel() ) - id.y() - 1 ) //Y coord in TMS runs from bottom to top
235  .arg( suffix );
236  break;
237  }
238 
239  return relFileName;
240 }
241 
242 QString GeoSceneTiled::themeStr() const
243 {
244  QFileInfo const dirInfo( sourceDir() );
245  return dirInfo.isAbsolute() ? sourceDir() : "maps/" + sourceDir();
246 }
247 
248 QList<const DownloadPolicy *> GeoSceneTiled::downloadPolicies() const
249 {
250  return m_downloadPolicies;
251 }
252 
253 void GeoSceneTiled::addDownloadPolicy( const DownloadUsage usage, const int maximumConnections )
254 {
255  DownloadPolicy * const policy = new DownloadPolicy( DownloadPolicyKey( hostNames(), usage ));
256  policy->setMaximumConnections( maximumConnections );
257  m_downloadPolicies.append( policy );
258  mDebug() << "added download policy" << hostNames() << usage << maximumConnections;
259 }
260 
261 QStringList GeoSceneTiled::hostNames() const
262 {
263  QStringList result;
264  QVector<QUrl>::const_iterator pos = m_downloadUrls.constBegin();
265  QVector<QUrl>::const_iterator const end = m_downloadUrls.constEnd();
266  for (; pos != end; ++pos )
267  result.append( (*pos).host() );
268  return result;
269 }
270 
271 }
GeoSceneTypes.h
Marble::GeoSceneTiled::relativeTileFileName
QString relativeTileFileName(const TileId &) const
Definition: GeoSceneTiled.cpp:204
TileId.h
Marble::GeoSceneTiled::installMap
QString installMap() const
Definition: GeoSceneTiled.cpp:66
Marble::GeoSceneTypes::GeoSceneTiledType
const char * GeoSceneTiledType
Definition: GeoSceneTypes.cpp:33
Marble::DownloadPolicy
Definition: DownloadPolicy.h:55
Marble::GeoSceneTiled::setServerLayout
void setServerLayout(const ServerLayout *)
Definition: GeoSceneTiled.cpp:86
Marble::DownloadPolicy::setMaximumConnections
void setMaximumConnections(const int)
Definition: DownloadPolicy.cpp:84
Marble::MarbleDirs::path
static QString path(const QString &relativePath)
Definition: MarbleDirs.cpp:59
Marble::DownloadUsage
DownloadUsage
This enum is used to describe the type of download.
Definition: MarbleGlobal.h:164
QVector::append
void append(const T &value)
QSize::isEmpty
bool isEmpty() const
QFileInfo::isAbsolute
bool isAbsolute() const
QChar
Marble::GeoSceneTiled::Projection
Projection
Definition: GeoSceneTiled.h:47
Marble::DownloadPolicyKey
Definition: DownloadPolicy.h:27
QVector::constEnd
const_iterator constEnd() const
Marble::GeoSceneTiled::setInstallMap
void setInstallMap(const QString &installMap)
Definition: GeoSceneTiled.cpp:71
Marble::GeoSceneAbstractDataset::fileFormat
QString fileFormat() const
Definition: GeoSceneAbstractDataset.cpp:43
Marble::GeoSceneTiled::levelZeroColumns
int levelZeroColumns() const
Definition: GeoSceneTiled.cpp:97
Marble::GeoSceneTiled::TileMapService
Definition: GeoSceneTiled.h:46
Marble::GeoSceneTiled::downloadUrl
QUrl downloadUrl(const TileId &) const
Creates a download URL for the given tile id.
Definition: GeoSceneTiled.cpp:181
Marble::GeoSceneTiled::themeStr
QString themeStr() const
Definition: GeoSceneTiled.cpp:242
QImage::isNull
bool isNull() const
Marble::GeoSceneTiled::setLevelZeroColumns
void setLevelZeroColumns(const int)
Definition: GeoSceneTiled.cpp:102
Marble::GeoSceneTiled::setSourceDir
void setSourceDir(const QString &sourceDir)
Definition: GeoSceneTiled.cpp:61
Marble::GeoSceneTiled::projection
Projection projection() const
Definition: GeoSceneTiled.cpp:169
Marble::defaultLevelZeroColumns
const int defaultLevelZeroColumns
Definition: MarbleGlobal.h:198
MarbleDebug.h
Marble::GeoSceneTiled::maximumTileLevel
int maximumTileLevel() const
Definition: GeoSceneTiled.cpp:117
Marble::GeoSceneAbstractDataset
Contents used inside a layer.
Definition: GeoSceneAbstractDataset.h:37
Marble::GeoSceneTiled::downloadPolicies
QList< const DownloadPolicy * > downloadPolicies() const
Definition: GeoSceneTiled.cpp:248
Marble::Equirectangular
Flat projection ("plate carree")
Definition: MarbleGlobal.h:46
Marble::GeoSceneTiled::setProjection
void setProjection(const Projection)
Definition: GeoSceneTiled.cpp:174
DownloadPolicy.h
QList::append
void append(const T &value)
Marble::MarbleServerLayout
Definition: ServerLayout.h:47
Marble::ServerLayout::downloadUrl
virtual QUrl downloadUrl(const QUrl &prototypeUrl, const TileId &id) const =0
Translates given tile id using a prototypeUrl into an URL that can be used for downloading.
Marble::c_defaultTileSize
const unsigned int c_defaultTileSize
Definition: MarbleGlobal.h:263
Marble::GeoSceneTiled::setTileSize
void setTileSize(const QSize &tileSize)
Definition: GeoSceneTiled.cpp:160
MarbleDirs.h
QString
QList
Marble::GeoSceneTiled::Marble
Definition: GeoSceneTiled.h:46
Marble::GeoSceneTiled::setStorageLayout
void setStorageLayout(const StorageLayout)
Definition: GeoSceneTiled.cpp:81
QStringList
Marble::GeoSceneTiled::sourceDir
QString sourceDir() const
Definition: GeoSceneTiled.cpp:56
Marble::GeoSceneTiled::storageLayout
StorageLayout storageLayout() const
Definition: GeoSceneTiled.cpp:76
QFileInfo
QString::toLower
QString toLower() const
Marble::GeoSceneTiled::levelZeroRows
int levelZeroRows() const
Definition: GeoSceneTiled.cpp:107
Marble::ServerLayout
Definition: ServerLayout.h:21
QSize
QUrl
ServerLayout.h
QImage
Marble::GeoSceneTiled::tileSize
const QSize tileSize() const
Definition: GeoSceneTiled.cpp:132
QVector::constBegin
const_iterator constBegin() const
Marble::GeoSceneTiled::GeoSceneTiled
GeoSceneTiled(const QString &name)
Definition: GeoSceneTiled.cpp:29
Marble::TileId
Definition: TileId.h:27
Marble::GeoSceneTiled::~GeoSceneTiled
~GeoSceneTiled()
Definition: GeoSceneTiled.cpp:45
Marble::GeoSceneTiled::downloadUrls
QVector< QUrl > downloadUrls() const
Definition: GeoSceneTiled.cpp:127
QVector< QUrl >
Marble::tileDigits
const int tileDigits
Definition: MarbleGlobal.h:253
GeoSceneTiled.h
Marble::GeoSceneTiled::nodeType
virtual const char * nodeType() const
Definition: GeoSceneTiled.cpp:51
QImage::size
QSize size() const
Marble::GeoSceneTiled::StorageLayout
StorageLayout
Definition: GeoSceneTiled.h:46
Marble::GeoSceneTiled::OpenStreetMap
Definition: GeoSceneTiled.h:46
Marble::GeoSceneTiled::serverLayout
const ServerLayout * serverLayout() const
Definition: GeoSceneTiled.cpp:92
QVector::empty
bool empty() const
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Marble::GeoSceneTiled::addDownloadUrl
void addDownloadUrl(const QUrl &)
Definition: GeoSceneTiled.cpp:197
Marble::GeoSceneTiled::setLevelZeroRows
void setLevelZeroRows(const int)
Definition: GeoSceneTiled.cpp:112
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
Marble::GeoSceneTiled::setMaximumTileLevel
void setMaximumTileLevel(const int)
Definition: GeoSceneTiled.cpp:122
Marble::defaultLevelZeroRows
const int defaultLevelZeroRows
Definition: MarbleGlobal.h:199
Marble::GeoSceneTiled::addDownloadPolicy
void addDownloadPolicy(const DownloadUsage usage, const int maximumConnections)
Definition: GeoSceneTiled.cpp:253
usage
void usage(const QString &app)
Definition: merge_ts_po.cpp:16
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:39 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal