mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-04-20 12:19:11 +02:00
Compare commits
No commits in common. "a11ba0487c63d9a03deed2d05b1f67dbb5de48de" and "f620bbc3835fbfe57313480a23bddc9c8b328826" have entirely different histories.
a11ba0487c
...
f620bbc383
@ -120,15 +120,15 @@ void VectorTile::clear()
|
|||||||
|
|
||||||
void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
||||||
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
|
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
|
||||||
MapData::PolyCache *cache, QMutex *cacheLock)
|
MapData::PolyCache *cache, QMutex *lock)
|
||||||
{
|
{
|
||||||
SubFile::Handle *rgnHdl = 0, *lblHdl = 0, *netHdl = 0, *nodHdl = 0,
|
SubFile::Handle *rgnHdl = 0, *lblHdl = 0, *netHdl = 0, *nodHdl = 0,
|
||||||
*nodHdl2 = 0;
|
*nodHdl2 = 0;
|
||||||
|
|
||||||
_lock.lock();
|
lock->lock();
|
||||||
|
|
||||||
if (_loaded < 0) {
|
if (_loaded < 0) {
|
||||||
_lock.unlock();
|
lock->unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,23 +139,18 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
nodHdl = new SubFile::Handle(file, _nod);
|
nodHdl = new SubFile::Handle(file, _nod);
|
||||||
|
|
||||||
if (!load(*rgnHdl, *lblHdl, *netHdl, *nodHdl)) {
|
if (!load(*rgnHdl, *lblHdl, *netHdl, *nodHdl)) {
|
||||||
_lock.unlock();
|
lock->unlock();
|
||||||
delete rgnHdl; delete lblHdl; delete netHdl; delete nodHdl;
|
delete rgnHdl; delete lblHdl; delete netHdl; delete nodHdl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<SubDiv*> subdivs = _tre->subdivs(file, rect, zoom);
|
QList<SubDiv*> subdivs = _tre->subdivs(file, rect, zoom);
|
||||||
|
|
||||||
cacheLock->lock();
|
|
||||||
|
|
||||||
for (int i = 0; i < subdivs.size(); i++) {
|
for (int i = 0; i < subdivs.size(); i++) {
|
||||||
SubDiv *subdiv = subdivs.at(i);
|
SubDiv *subdiv = subdivs.at(i);
|
||||||
|
|
||||||
MapData::Polys *polys = cache->object(subdiv);
|
MapData::Polys *polys = cache->object(subdiv);
|
||||||
if (!polys) {
|
if (!polys) {
|
||||||
cacheLock->unlock();
|
|
||||||
|
|
||||||
quint32 shift = _tre->shift(subdiv->bits());
|
quint32 shift = _tre->shift(subdiv->bits());
|
||||||
|
|
||||||
if (!rgnHdl) {
|
if (!rgnHdl) {
|
||||||
@ -164,10 +159,8 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
netHdl = new SubFile::Handle(file, _net);
|
netHdl = new SubFile::Handle(file, _net);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) {
|
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv))
|
||||||
cacheLock->lock();
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
polys = new MapData::Polys();
|
polys = new MapData::Polys();
|
||||||
|
|
||||||
@ -193,7 +186,6 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
if (lines)
|
if (lines)
|
||||||
copyPolys(rect, &polys->lines, lines);
|
copyPolys(rect, &polys->lines, lines);
|
||||||
|
|
||||||
cacheLock->lock();
|
|
||||||
cache->insert(subdiv, polys);
|
cache->insert(subdiv, polys);
|
||||||
} else {
|
} else {
|
||||||
copyPolys(rect, &polys->polygons, polygons);
|
copyPolys(rect, &polys->polygons, polygons);
|
||||||
@ -202,21 +194,20 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cacheLock->unlock();
|
lock->unlock();
|
||||||
_lock.unlock();
|
|
||||||
|
|
||||||
delete rgnHdl; delete lblHdl; delete netHdl; delete nodHdl; delete nodHdl2;
|
delete rgnHdl; delete lblHdl; delete netHdl; delete nodHdl; delete nodHdl2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom,
|
void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom,
|
||||||
QList<MapData::Point> *points, MapData::PointCache *cache, QMutex *cacheLock)
|
QList<MapData::Point> *points, MapData::PointCache *cache, QMutex *lock)
|
||||||
{
|
{
|
||||||
SubFile::Handle *rgnHdl = 0, *lblHdl = 0;
|
SubFile::Handle *rgnHdl = 0, *lblHdl = 0;
|
||||||
|
|
||||||
_lock.lock();
|
lock->lock();
|
||||||
|
|
||||||
if (_loaded < 0) {
|
if (_loaded < 0) {
|
||||||
_lock.unlock();
|
lock->unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,32 +218,25 @@ void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
SubFile::Handle netHdl(file, _net);
|
SubFile::Handle netHdl(file, _net);
|
||||||
|
|
||||||
if (!load(*rgnHdl, *lblHdl, netHdl, nodHdl)) {
|
if (!load(*rgnHdl, *lblHdl, netHdl, nodHdl)) {
|
||||||
_lock.unlock();
|
lock->unlock();
|
||||||
delete rgnHdl; delete lblHdl;
|
delete rgnHdl; delete lblHdl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<SubDiv*> subdivs = _tre->subdivs(file, rect, zoom);
|
QList<SubDiv*> subdivs = _tre->subdivs(file, rect, zoom);
|
||||||
|
|
||||||
cacheLock->lock();
|
|
||||||
|
|
||||||
for (int i = 0; i < subdivs.size(); i++) {
|
for (int i = 0; i < subdivs.size(); i++) {
|
||||||
SubDiv *subdiv = subdivs.at(i);
|
SubDiv *subdiv = subdivs.at(i);
|
||||||
|
|
||||||
QList<MapData::Point> *pl = cache->object(subdiv);
|
QList<MapData::Point> *pl = cache->object(subdiv);
|
||||||
if (!pl) {
|
if (!pl) {
|
||||||
cacheLock->unlock();
|
|
||||||
|
|
||||||
if (!rgnHdl) {
|
if (!rgnHdl) {
|
||||||
rgnHdl = new SubFile::Handle(file, _rgn);
|
rgnHdl = new SubFile::Handle(file, _rgn);
|
||||||
lblHdl = new SubFile::Handle(file, _lbl);
|
lblHdl = new SubFile::Handle(file, _lbl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) {
|
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv))
|
||||||
cacheLock->lock();
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
pl = new QList<MapData::Point>;
|
pl = new QList<MapData::Point>;
|
||||||
|
|
||||||
@ -264,28 +248,26 @@ void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
|
|
||||||
copyPoints(rect, pl, points);
|
copyPoints(rect, pl, points);
|
||||||
|
|
||||||
cacheLock->lock();
|
|
||||||
cache->insert(subdiv, pl);
|
cache->insert(subdiv, pl);
|
||||||
} else
|
} else
|
||||||
copyPoints(rect, pl, points);
|
copyPoints(rect, pl, points);
|
||||||
}
|
}
|
||||||
|
|
||||||
cacheLock->unlock();
|
lock->unlock();
|
||||||
_lock.unlock();
|
|
||||||
|
|
||||||
delete rgnHdl; delete lblHdl;
|
delete rgnHdl; delete lblHdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
|
void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
|
||||||
QList<MapData::Elevation> *elevations, MapData::ElevationCache *cache,
|
QList<MapData::Elevation> *elevations, MapData::ElevationCache *cache,
|
||||||
QMutex *cacheLock)
|
QMutex *lock)
|
||||||
{
|
{
|
||||||
SubFile::Handle *hdl = 0;
|
SubFile::Handle *hdl = 0;
|
||||||
|
|
||||||
_demLock.lock();
|
lock->lock();
|
||||||
|
|
||||||
if (_demLoaded < 0) {
|
if (_demLoaded < 0) {
|
||||||
_demLock.unlock();
|
lock->unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,7 +275,7 @@ void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
hdl = new SubFile::Handle(file, _dem);
|
hdl = new SubFile::Handle(file, _dem);
|
||||||
|
|
||||||
if (!loadDem(*hdl)) {
|
if (!loadDem(*hdl)) {
|
||||||
_demLock.unlock();
|
lock->unlock();
|
||||||
delete hdl;
|
delete hdl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -303,25 +285,19 @@ void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
// the given zoom (we prefer rendering quality rather than speed). For
|
// the given zoom (we prefer rendering quality rather than speed). For
|
||||||
// maps with a single level this has no effect.
|
// maps with a single level this has no effect.
|
||||||
int level = qMax(0, _dem->level(zoom) - 1);
|
int level = qMax(0, _dem->level(zoom) - 1);
|
||||||
|
|
||||||
QList<const DEMTile*> tiles(_dem->tiles(rect, level));
|
QList<const DEMTile*> tiles(_dem->tiles(rect, level));
|
||||||
|
|
||||||
cacheLock->lock();
|
|
||||||
|
|
||||||
for (int i = 0; i < tiles.size(); i++) {
|
for (int i = 0; i < tiles.size(); i++) {
|
||||||
const DEMTile *tile = tiles.at(i);
|
const DEMTile *tile = tiles.at(i);
|
||||||
|
|
||||||
MapData::Elevation *el = cache->object(tile);
|
MapData::Elevation *el = cache->object(tile);
|
||||||
if (!el) {
|
|
||||||
cacheLock->unlock();
|
|
||||||
|
|
||||||
|
if (!el) {
|
||||||
if (!hdl)
|
if (!hdl)
|
||||||
hdl = new SubFile::Handle(file, _dem);
|
hdl = new SubFile::Handle(file, _dem);
|
||||||
|
|
||||||
el = _dem->elevations(*hdl, level, tile);
|
el = _dem->elevations(*hdl, level, tile);
|
||||||
if (!el->m.isNull())
|
if (!el->m.isNull())
|
||||||
elevations->append(*el);
|
elevations->append(*el);
|
||||||
|
|
||||||
cacheLock->lock();
|
|
||||||
cache->insert(tile, el);
|
cache->insert(tile, el);
|
||||||
} else {
|
} else {
|
||||||
if (!el->m.isNull())
|
if (!el->m.isNull())
|
||||||
@ -329,8 +305,7 @@ void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cacheLock->unlock();
|
lock->unlock();
|
||||||
_demLock.unlock();
|
|
||||||
|
|
||||||
delete hdl;
|
delete hdl;
|
||||||
}
|
}
|
||||||
|
@ -32,13 +32,12 @@ public:
|
|||||||
|
|
||||||
void polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
void polys(QFile *file, const RectC &rect, const Zoom &zoom,
|
||||||
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
|
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
|
||||||
MapData::PolyCache *cache, QMutex *cacheLock);
|
MapData::PolyCache *cache, QMutex *lock);
|
||||||
void points(QFile *file, const RectC &rect, const Zoom &zoom,
|
void points(QFile *file, const RectC &rect, const Zoom &zoom,
|
||||||
QList<MapData::Point> *points, MapData::PointCache *cache,
|
QList<MapData::Point> *points, MapData::PointCache *cache, QMutex *lock);
|
||||||
QMutex *cacheLock);
|
|
||||||
void elevations(QFile *file, const RectC &rect, const Zoom &zoom,
|
void elevations(QFile *file, const RectC &rect, const Zoom &zoom,
|
||||||
QList<MapData::Elevation> *elevations, MapData::ElevationCache *cache,
|
QList<MapData::Elevation> *elevations, MapData::ElevationCache *cache,
|
||||||
QMutex *cacheLock);
|
QMutex *lock);
|
||||||
|
|
||||||
static bool isTileFile(SubFile::Type type)
|
static bool isTileFile(SubFile::Type type)
|
||||||
{
|
{
|
||||||
@ -93,7 +92,6 @@ private:
|
|||||||
SubFile *_gmp;
|
SubFile *_gmp;
|
||||||
|
|
||||||
int _loaded, _demLoaded;
|
int _loaded, _demLoaded;
|
||||||
QMutex _lock, _demLock;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -219,10 +219,10 @@ bool MapData::readTags(SubFile &subfile, int count,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapData::readSubFiles(QFile &file)
|
bool MapData::readSubFiles()
|
||||||
{
|
{
|
||||||
/* both _pointFile and _pathFile can be used here */
|
/* both _pointFile and _pathFile can be used here */
|
||||||
QDataStream stream(&file);
|
QDataStream stream(&_pointFile);
|
||||||
|
|
||||||
for (int i = 0; i < _subFiles.size(); i++) {
|
for (int i = 0; i < _subFiles.size(); i++) {
|
||||||
const SubFileInfo &f = _subFiles.at(i);
|
const SubFileInfo &f = _subFiles.at(i);
|
||||||
@ -422,7 +422,8 @@ bool MapData::readHeader(QFile &file)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
MapData::MapData(const QString &fileName) : _fileName(fileName), _valid(false)
|
MapData::MapData(const QString &fileName)
|
||||||
|
: _pointFile(fileName), _pathFile(fileName), _valid(false)
|
||||||
{
|
{
|
||||||
QFile file(fileName);
|
QFile file(fileName);
|
||||||
|
|
||||||
@ -459,13 +460,17 @@ RectC MapData::bounds() const
|
|||||||
|
|
||||||
void MapData::load()
|
void MapData::load()
|
||||||
{
|
{
|
||||||
QFile file(_fileName);
|
_pointFile.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
|
||||||
if (file.open(QIODevice::ReadOnly | QIODevice::Unbuffered))
|
_pathFile.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
|
||||||
readSubFiles(file);
|
|
||||||
|
readSubFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapData::clear()
|
void MapData::clear()
|
||||||
{
|
{
|
||||||
|
_pointFile.close();
|
||||||
|
_pathFile.close();
|
||||||
|
|
||||||
_pathCache.clear();
|
_pathCache.clear();
|
||||||
_pointCache.clear();
|
_pointCache.clear();
|
||||||
|
|
||||||
@ -489,14 +494,14 @@ void MapData::clearTiles()
|
|||||||
bool MapData::pathCb(VectorTile *tile, void *context)
|
bool MapData::pathCb(VectorTile *tile, void *context)
|
||||||
{
|
{
|
||||||
PathCTX *ctx = (PathCTX*)context;
|
PathCTX *ctx = (PathCTX*)context;
|
||||||
ctx->data->paths(ctx->file, tile, ctx->rect, ctx->zoom, ctx->list);
|
ctx->data->paths(tile, ctx->rect, ctx->zoom, ctx->list);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapData::pointCb(VectorTile *tile, void *context)
|
bool MapData::pointCb(VectorTile *tile, void *context)
|
||||||
{
|
{
|
||||||
PointCTX *ctx = (PointCTX*)context;
|
PointCTX *ctx = (PointCTX*)context;
|
||||||
ctx->data->points(ctx->file, tile, ctx->rect, ctx->zoom, ctx->list);
|
ctx->data->points(tile, ctx->rect, ctx->zoom, ctx->list);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,14 +514,13 @@ int MapData::level(int zoom) const
|
|||||||
return _subFiles.size() - 1;
|
return _subFiles.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapData::points(QFile &file, const RectC &rect, int zoom,
|
void MapData::points(const RectC &rect, int zoom, QList<Point> *list)
|
||||||
QList<Point> *list)
|
|
||||||
{
|
{
|
||||||
if (!rect.isValid())
|
if (!rect.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int l(level(zoom));
|
int l(level(zoom));
|
||||||
PointCTX ctx(file, this, rect, zoom, list);
|
PointCTX ctx(this, rect, zoom, list);
|
||||||
double min[2], max[2];
|
double min[2], max[2];
|
||||||
|
|
||||||
min[0] = rect.left();
|
min[0] = rect.left();
|
||||||
@ -527,58 +531,53 @@ void MapData::points(QFile &file, const RectC &rect, int zoom,
|
|||||||
_tiles.at(l)->Search(min, max, pointCb, &ctx);
|
_tiles.at(l)->Search(min, max, pointCb, &ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapData::points(QFile &file, VectorTile *tile, const RectC &rect,
|
void MapData::points(const VectorTile *tile, const RectC &rect, int zoom,
|
||||||
int zoom, QList<Point> *list)
|
QList<Point> *list)
|
||||||
{
|
{
|
||||||
Key key(tile, zoom);
|
Key key(tile, zoom);
|
||||||
|
|
||||||
tile->lock.lock();
|
_pointLock.lock();
|
||||||
|
|
||||||
_pointCacheLock.lock();
|
|
||||||
QList<Point> *tilePoints = _pointCache.object(key);
|
QList<Point> *tilePoints = _pointCache.object(key);
|
||||||
|
|
||||||
if (!tilePoints) {
|
if (!tilePoints) {
|
||||||
_pointCacheLock.unlock();
|
|
||||||
QList<Point> *p = new QList<Point>();
|
QList<Point> *p = new QList<Point>();
|
||||||
if (readPoints(file, tile, zoom, p)) {
|
if (readPoints(tile, zoom, p)) {
|
||||||
copyPoints(rect, p, list);
|
copyPoints(rect, p, list);
|
||||||
_pointCacheLock.lock();
|
|
||||||
_pointCache.insert(key, p);
|
_pointCache.insert(key, p);
|
||||||
_pointCacheLock.unlock();
|
|
||||||
} else
|
} else
|
||||||
delete p;
|
delete p;
|
||||||
} else {
|
} else
|
||||||
copyPoints(rect, tilePoints, list);
|
copyPoints(rect, tilePoints, list);
|
||||||
_pointCacheLock.unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
_pathCacheLock.lock();
|
_pointLock.unlock();
|
||||||
|
|
||||||
|
|
||||||
|
_pathLock.lock();
|
||||||
|
|
||||||
QList<Path> *tilePaths = _pathCache.object(key);
|
QList<Path> *tilePaths = _pathCache.object(key);
|
||||||
|
|
||||||
if (!tilePaths) {
|
if (!tilePaths) {
|
||||||
_pathCacheLock.unlock();
|
|
||||||
QList<Path> *p = new QList<Path>();
|
QList<Path> *p = new QList<Path>();
|
||||||
if (readPaths(file, tile, zoom, p)) {
|
if (readPaths(tile, zoom, p)) {
|
||||||
copyPoints(rect, p, list);
|
copyPoints(rect, p, list);
|
||||||
_pathCacheLock.lock();
|
|
||||||
_pathCache.insert(key, p);
|
_pathCache.insert(key, p);
|
||||||
_pathCacheLock.unlock();
|
|
||||||
} else
|
} else
|
||||||
delete p;
|
delete p;
|
||||||
} else {
|
} else
|
||||||
copyPoints(rect, tilePaths, list);
|
copyPoints(rect, tilePaths, list);
|
||||||
_pathCacheLock.unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
tile->lock.unlock();
|
_pathLock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapData::paths(QFile &file, const RectC &searchRect,
|
void MapData::paths(const RectC &searchRect, const RectC &boundsRect, int zoom,
|
||||||
const RectC &boundsRect, int zoom, QList<Path> *list)
|
QList<Path> *list)
|
||||||
{
|
{
|
||||||
if (!searchRect.isValid())
|
if (!searchRect.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int l(level(zoom));
|
int l(level(zoom));
|
||||||
PathCTX ctx(file, this, boundsRect, zoom, list);
|
PathCTX ctx(this, boundsRect, zoom, list);
|
||||||
double min[2], max[2];
|
double min[2], max[2];
|
||||||
|
|
||||||
min[0] = searchRect.left();
|
min[0] = searchRect.left();
|
||||||
@ -589,38 +588,32 @@ void MapData::paths(QFile &file, const RectC &searchRect,
|
|||||||
_tiles.at(l)->Search(min, max, pathCb, &ctx);
|
_tiles.at(l)->Search(min, max, pathCb, &ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapData::paths(QFile &file, VectorTile *tile, const RectC &rect, int zoom,
|
void MapData::paths(const VectorTile *tile, const RectC &rect, int zoom,
|
||||||
QList<Path> *list)
|
QList<Path> *list)
|
||||||
{
|
{
|
||||||
Key key(tile, zoom);
|
Key key(tile, zoom);
|
||||||
|
|
||||||
tile->lock.lock();
|
_pathLock.lock();
|
||||||
|
|
||||||
_pathCacheLock.lock();
|
|
||||||
QList<Path> *cached = _pathCache.object(key);
|
QList<Path> *cached = _pathCache.object(key);
|
||||||
|
|
||||||
if (!cached) {
|
if (!cached) {
|
||||||
_pathCacheLock.unlock();
|
|
||||||
QList<Path> *p = new QList<Path>();
|
QList<Path> *p = new QList<Path>();
|
||||||
if (readPaths(file, tile, zoom, p)) {
|
if (readPaths(tile, zoom, p)) {
|
||||||
copyPaths(rect, p, list);
|
copyPaths(rect, p, list);
|
||||||
_pathCacheLock.lock();
|
|
||||||
_pathCache.insert(key, p);
|
_pathCache.insert(key, p);
|
||||||
_pathCacheLock.unlock();
|
|
||||||
} else
|
} else
|
||||||
delete p;
|
delete p;
|
||||||
} else {
|
} else
|
||||||
copyPaths(rect, cached, list);
|
copyPaths(rect, cached, list);
|
||||||
_pathCacheLock.unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
tile->lock.unlock();
|
_pathLock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapData::readPaths(QFile &file, const VectorTile *tile, int zoom,
|
bool MapData::readPaths(const VectorTile *tile, int zoom, QList<Path> *list)
|
||||||
QList<Path> *list)
|
|
||||||
{
|
{
|
||||||
const SubFileInfo &info = _subFiles.at(level(zoom));
|
const SubFileInfo &info = _subFiles.at(level(zoom));
|
||||||
SubFile subfile(file, info.offset, info.size);
|
SubFile subfile(_pathFile, info.offset, info.size);
|
||||||
int rows = info.max - info.min + 1;
|
int rows = info.max - info.min + 1;
|
||||||
QVector<unsigned> paths(rows);
|
QVector<unsigned> paths(rows);
|
||||||
quint32 blocks, unused, val, cnt = 0;
|
quint32 blocks, unused, val, cnt = 0;
|
||||||
@ -705,11 +698,10 @@ bool MapData::readPaths(QFile &file, const VectorTile *tile, int zoom,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapData::readPoints(QFile &file, const VectorTile *tile, int zoom,
|
bool MapData::readPoints(const VectorTile *tile, int zoom, QList<Point> *list)
|
||||||
QList<Point> *list)
|
|
||||||
{
|
{
|
||||||
const SubFileInfo &info = _subFiles.at(level(zoom));
|
const SubFileInfo &info = _subFiles.at(level(zoom));
|
||||||
SubFile subfile(file, info.offset, info.size);
|
SubFile subfile(_pointFile, info.offset, info.size);
|
||||||
int rows = info.max - info.min + 1;
|
int rows = info.max - info.min + 1;
|
||||||
QVector<unsigned> points(rows);
|
QVector<unsigned> points(rows);
|
||||||
quint32 val, unused, cnt = 0;
|
quint32 val, unused, cnt = 0;
|
||||||
|
@ -58,15 +58,14 @@ public:
|
|||||||
{return point.layer < other.point.layer;}
|
{return point.layer < other.point.layer;}
|
||||||
};
|
};
|
||||||
|
|
||||||
const QString &fileName() const {return _fileName;}
|
|
||||||
RectC bounds() const;
|
RectC bounds() const;
|
||||||
Range zooms() const
|
Range zooms() const
|
||||||
{return Range(_subFiles.first().min, _subFiles.last().max);}
|
{return Range(_subFiles.first().min, _subFiles.last().max);}
|
||||||
int tileSize() const {return _tileSize;}
|
int tileSize() const {return _tileSize;}
|
||||||
|
|
||||||
void points(QFile &file, const RectC &rect, int zoom, QList<Point> *list);
|
void points(const RectC &rect, int zoom, QList<Point> *list);
|
||||||
void paths(QFile &file, const RectC &searchRect, const RectC &boundsRect,
|
void paths(const RectC &searchRect, const RectC &boundsRect, int zoom,
|
||||||
int zoom, QList<Path> *set);
|
QList<Path> *set);
|
||||||
unsigned tagId(const QByteArray &name) const {return _keys.value(name);}
|
unsigned tagId(const QByteArray &name) const {return _keys.value(name);}
|
||||||
|
|
||||||
void load();
|
void load();
|
||||||
@ -90,15 +89,12 @@ private:
|
|||||||
|
|
||||||
size_t offset;
|
size_t offset;
|
||||||
Coordinates pos;
|
Coordinates pos;
|
||||||
QMutex lock;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PathCTX {
|
struct PathCTX {
|
||||||
PathCTX(QFile &file, MapData *data, const RectC &rect, int zoom,
|
PathCTX(MapData *data, const RectC &rect, int zoom, QList<Path> *list)
|
||||||
QList<Path> *list)
|
: data(data), rect(rect), zoom(zoom), list(list) {}
|
||||||
: file(file), data(data), rect(rect), zoom(zoom), list(list) {}
|
|
||||||
|
|
||||||
QFile &file;
|
|
||||||
MapData *data;
|
MapData *data;
|
||||||
const RectC ▭
|
const RectC ▭
|
||||||
int zoom;
|
int zoom;
|
||||||
@ -106,11 +102,9 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct PointCTX {
|
struct PointCTX {
|
||||||
PointCTX(QFile &file, MapData *data, const RectC &rect, int zoom,
|
PointCTX(MapData *data, const RectC &rect, int zoom, QList<Point> *list)
|
||||||
QList<Point> *list)
|
: data(data), rect(rect), zoom(zoom), list(list) {}
|
||||||
: file(file), data(data), rect(rect), zoom(zoom), list(list) {}
|
|
||||||
|
|
||||||
QFile &file;
|
|
||||||
MapData *data;
|
MapData *data;
|
||||||
const RectC ▭
|
const RectC ▭
|
||||||
int zoom;
|
int zoom;
|
||||||
@ -149,18 +143,16 @@ private:
|
|||||||
bool readTagInfo(SubFile &hdr, QVector<TagSource> &tags);
|
bool readTagInfo(SubFile &hdr, QVector<TagSource> &tags);
|
||||||
bool readMapInfo(SubFile &hdr, QByteArray &projection, bool &debugMap);
|
bool readMapInfo(SubFile &hdr, QByteArray &projection, bool &debugMap);
|
||||||
bool readHeader(QFile &file);
|
bool readHeader(QFile &file);
|
||||||
bool readSubFiles(QFile &file);
|
bool readSubFiles();
|
||||||
void clearTiles();
|
void clearTiles();
|
||||||
|
|
||||||
int level(int zoom) const;
|
int level(int zoom) const;
|
||||||
void paths(QFile &file, VectorTile *tile, const RectC &rect, int zoom,
|
void paths(const VectorTile *tile, const RectC &rect, int zoom,
|
||||||
QList<Path> *list);
|
QList<Path> *list);
|
||||||
void points(QFile &file, VectorTile *tile, const RectC &rect, int zoom,
|
void points(const VectorTile *tile, const RectC &rect, int zoom,
|
||||||
QList<Point> *list);
|
|
||||||
bool readPaths(QFile &file, const VectorTile *tile, int zoom,
|
|
||||||
QList<Path> *list);
|
|
||||||
bool readPoints(QFile &file, const VectorTile *tile, int zoom,
|
|
||||||
QList<Point> *list);
|
QList<Point> *list);
|
||||||
|
bool readPaths(const VectorTile *tile, int zoom, QList<Path> *list);
|
||||||
|
bool readPoints(const VectorTile *tile, int zoom, QList<Point> *list);
|
||||||
|
|
||||||
static bool readTags(SubFile &subfile, int count,
|
static bool readTags(SubFile &subfile, int count,
|
||||||
const QVector<TagSource> &tags, QVector<Tag> &list);
|
const QVector<TagSource> &tags, QVector<Tag> &list);
|
||||||
@ -169,7 +161,7 @@ private:
|
|||||||
|
|
||||||
friend HASH_T qHash(const MapData::Key &key);
|
friend HASH_T qHash(const MapData::Key &key);
|
||||||
|
|
||||||
QString _fileName;
|
QFile _pointFile, _pathFile;
|
||||||
RectC _bounds;
|
RectC _bounds;
|
||||||
quint16 _tileSize;
|
quint16 _tileSize;
|
||||||
QVector<SubFileInfo> _subFiles;
|
QVector<SubFileInfo> _subFiles;
|
||||||
@ -179,7 +171,7 @@ private:
|
|||||||
|
|
||||||
QCache<Key, QList<Path> > _pathCache;
|
QCache<Key, QList<Path> > _pathCache;
|
||||||
QCache<Key, QList<Point> > _pointCache;
|
QCache<Key, QList<Point> > _pointCache;
|
||||||
QMutex _pathCacheLock, _pointCacheLock;
|
QMutex _pathLock, _pointLock;
|
||||||
|
|
||||||
bool _valid;
|
bool _valid;
|
||||||
QString _errorString;
|
QString _errorString;
|
||||||
|
@ -408,10 +408,6 @@ void RasterTile::fetchData(QList<MapData::Path> &paths,
|
|||||||
QList<MapData::Point> &points) const
|
QList<MapData::Point> &points) const
|
||||||
{
|
{
|
||||||
QPoint ttl(_rect.topLeft());
|
QPoint ttl(_rect.topLeft());
|
||||||
QFile file(_data->fileName());
|
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Unbuffered))
|
|
||||||
return;
|
|
||||||
|
|
||||||
QRectF pathRect(QPointF(ttl.x() - PATHS_EXTENT, ttl.y() - PATHS_EXTENT),
|
QRectF pathRect(QPointF(ttl.x() - PATHS_EXTENT, ttl.y() - PATHS_EXTENT),
|
||||||
QPointF(ttl.x() + _rect.width() + PATHS_EXTENT, ttl.y() + _rect.height()
|
QPointF(ttl.x() + _rect.width() + PATHS_EXTENT, ttl.y() + _rect.height()
|
||||||
@ -423,15 +419,15 @@ void RasterTile::fetchData(QList<MapData::Path> &paths,
|
|||||||
_transform.img2proj(pathRect.bottomRight()));
|
_transform.img2proj(pathRect.bottomRight()));
|
||||||
RectD searchRectD(_transform.img2proj(searchRect.topLeft()),
|
RectD searchRectD(_transform.img2proj(searchRect.topLeft()),
|
||||||
_transform.img2proj(searchRect.bottomRight()));
|
_transform.img2proj(searchRect.bottomRight()));
|
||||||
_data->paths(file, searchRectD.toRectC(_proj, 20),
|
_data->paths(searchRectD.toRectC(_proj, 20), pathRectD.toRectC(_proj, 20),
|
||||||
pathRectD.toRectC(_proj, 20), _zoom, &paths);
|
_zoom, &paths);
|
||||||
|
|
||||||
QRectF pointRect(QPointF(ttl.x() - TEXT_EXTENT, ttl.y() - TEXT_EXTENT),
|
QRectF pointRect(QPointF(ttl.x() - TEXT_EXTENT, ttl.y() - TEXT_EXTENT),
|
||||||
QPointF(ttl.x() + _rect.width() + TEXT_EXTENT, ttl.y() + _rect.height()
|
QPointF(ttl.x() + _rect.width() + TEXT_EXTENT, ttl.y() + _rect.height()
|
||||||
+ TEXT_EXTENT));
|
+ TEXT_EXTENT));
|
||||||
RectD pointRectD(_transform.img2proj(pointRect.topLeft()),
|
RectD pointRectD(_transform.img2proj(pointRect.topLeft()),
|
||||||
_transform.img2proj(pointRect.bottomRight()));
|
_transform.img2proj(pointRect.bottomRight()));
|
||||||
_data->points(file, pointRectD.toRectC(_proj, 20), _zoom, &points);
|
_data->points(pointRectD.toRectC(_proj, 20), _zoom, &points);
|
||||||
}
|
}
|
||||||
|
|
||||||
MatrixD RasterTile::elevation(int extend) const
|
MatrixD RasterTile::elevation(int extend) const
|
||||||
|
Loading…
x
Reference in New Issue
Block a user