1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qgeofiletilecachemapbox.h"
#include <QtLocation/private/qgeotilespec_p.h>
#include <QDir>
QT_BEGIN_NAMESPACE
QGeoFileTileCacheMapbox::QGeoFileTileCacheMapbox(const QList<QGeoMapType> &mapTypes,
int scaleFactor, const QString &directory,
QObject *parent)
:QGeoFileTileCache(directory, parent), m_mapTypes(mapTypes)
{
m_scaleFactor = qBound(1, scaleFactor, 2);
for (qsizetype i = 0; i < mapTypes.size(); i++)
m_mapNameToId.insert(mapTypes[i].name(), i + 1);
}
QGeoFileTileCacheMapbox::~QGeoFileTileCacheMapbox()
{
}
QString QGeoFileTileCacheMapbox::tileSpecToFilename(const QGeoTileSpec &spec, const QString &format,
const QString &directory) const
{
QString filename = spec.plugin();
filename += QLatin1String("-");
filename += m_mapTypes[spec.mapId()-1].name();
filename += QLatin1String("-");
filename += QString::number(spec.zoom());
filename += QLatin1String("-");
filename += QString::number(spec.x());
filename += QLatin1String("-");
filename += QString::number(spec.y());
//Append version if real version number to ensure backwards compatibility and eviction of old tiles
if (spec.version() != -1) {
filename += QLatin1String("-");
filename += QString::number(spec.version());
}
filename += QLatin1String("-@");
filename += QString::number(m_scaleFactor);
filename += QLatin1Char('x');
filename += QLatin1String(".");
filename += format;
QDir dir = QDir(directory);
return dir.filePath(filename);
}
QGeoTileSpec QGeoFileTileCacheMapbox::filenameToTileSpec(const QString &filename) const
{
QStringList parts = filename.split('.');
if (parts.length() != 3) // 3 because the map name has always a dot in it.
return QGeoTileSpec();
const QString name = parts.at(0) + QChar('.') + parts.at(1);
const QStringList fields = name.split('-');
const qsizetype length = fields.length();
if (length != 6 && length != 7)
return QGeoTileSpec();
const qsizetype scaleIdx = fields.last().indexOf("@");
if (scaleIdx < 0 || fields.last().size() <= (scaleIdx + 2))
return QGeoTileSpec();
const int scaleFactor = fields.last()[scaleIdx + 1].digitValue();
if (scaleFactor != m_scaleFactor)
return QGeoTileSpec();
QList<int> numbers;
bool ok = false;
for (qsizetype i = 2; i < length - 1; ++i) { // skipping -@_X
ok = false;
int value = fields.at(i).toInt(&ok);
if (!ok)
return QGeoTileSpec();
numbers.append(value);
}
//File name without version, append default
if (numbers.length() < 4)
numbers.append(-1);
return QGeoTileSpec(fields.at(0),
m_mapNameToId[fields.at(1)],
numbers.at(0),
numbers.at(1),
numbers.at(2),
numbers.at(3));
}
QT_END_NAMESPACE
|