void QGeoTiledMappingManagerEngine::engineTileFinished(const QGeoTileSpec &spec, const QByteArray &bytes, const QString &format) { Q_D(QGeoTiledMappingManagerEngine); QSet<QGeoTiledMapData *> maps = d->tileHash_.value(spec); typedef QSet<QGeoTiledMapData *>::const_iterator map_iter; map_iter map = maps.constBegin(); map_iter mapEnd = maps.constEnd(); for (; map != mapEnd; ++map) { QSet<QGeoTileSpec> tileSet = d->mapHash_.value(*map); tileSet.remove(spec); if (tileSet.isEmpty()) d->mapHash_.remove(*map); else d->mapHash_.insert(*map, tileSet); } d->tileHash_.remove(spec); tileCache()->insert(spec, bytes, format, d->cacheHint_); map = maps.constBegin(); mapEnd = maps.constEnd(); for (; map != mapEnd; ++map) { (*map)->getRequestManager()->tileFetched(spec); } }
QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) : QGeoTiledMappingManagerEngine() { QGeoCameraCapabilities cameraCaps; cameraCaps.setMinimumZoomLevel(2.0); cameraCaps.setMaximumZoomLevel(MAX_MAP_ZOOM); cameraCaps.setSupportsBearing(true); setCameraCapabilities(cameraCaps); setTileSize(QSize(256, 256)); QList<QGeoMapType> mapTypes; mapTypes << QGeoMapType(QGeoMapType::StreetMap, tr("Google Street Map"), tr("Google street map"), false, false, OpenPilot::GoogleMap); mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Google Satellite Map"),tr("Google satellite map"), false, false, OpenPilot::GoogleSatellite); mapTypes << QGeoMapType(QGeoMapType::TerrainMap, tr("Google Terrain Map"), tr("Google terrain map"), false, false, OpenPilot::GoogleTerrain); // TODO: // Proper hybrid maps requires collecting two separate bimaps and overlaying them. //mapTypes << QGeoMapType(QGeoMapType::HybridMap, tr("Google Hybrid Map"), tr("Google hybrid map"), false, false, OpenPilot::GoogleHybrid); // Bing mapTypes << QGeoMapType(QGeoMapType::StreetMap, tr("Bing Street Map"), tr("Bing street map"), false, false, OpenPilot::BingMap); mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Bing Satellite Map"), tr("Bing satellite map"), false, false, OpenPilot::BingSatellite); mapTypes << QGeoMapType(QGeoMapType::HybridMap, tr("Bing Hybrid Map"), tr("Bing hybrid map"), false, false, OpenPilot::BingHybrid); mapTypes << QGeoMapType(QGeoMapType::StreetMap, tr("Open Street Map"), tr("Open Street map"), false, false, OpenPilot::OpenStreetMap); setSupportedMapTypes(mapTypes); QGeoTileFetcherQGC *tileFetcher = new QGeoTileFetcherQGC(this); if (parameters.contains(QStringLiteral("useragent"))) { const QByteArray ua = parameters.value(QStringLiteral("useragent")).toString().toLatin1(); tileFetcher->setUserAgent(ua); } else // QGC Default tileFetcher->setUserAgent("Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"); setTileFetcher(tileFetcher); QString cacheDir; if (parameters.contains(QStringLiteral("mapping.cache.directory"))) cacheDir = parameters.value(QStringLiteral("mapping.cache.directory")).toString(); else { cacheDir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QLatin1String("/QGCMapCache"); if(!QDir::root().mkpath(cacheDir)) { qWarning() << "Could not create mapping disk cache directory: " << cacheDir; cacheDir = QDir::homePath() + QLatin1String("/.qgcmapscache/"); } } if(!QDir::root().mkpath(cacheDir)) { qWarning() << "Could not create mapping disk cache directory: " << cacheDir; cacheDir.clear(); } //else { // qDebug() << "Mapping cache directory:" << cacheDir; //} QGeoTileCache* pTileCache = tileCache(); if(pTileCache) { int cacheLimit = 0; //-- Disk Cache if (parameters.contains(QStringLiteral("mapping.cache.disk.size"))) { bool ok = false; cacheLimit = parameters.value(QStringLiteral("mapping.cache.disk.size")).toString().toInt(&ok); if (!ok) cacheLimit = 0; } if(!cacheLimit) { #ifdef __mobile__ cacheLimit = 128 * 1024 * 1024; #else cacheLimit = 1024 * 1024 * 1024; #endif } pTileCache->setMaxDiskUsage(cacheLimit); //-- Memory Cache cacheLimit = 0; if (parameters.contains(QStringLiteral("mapping.cache.memory.size"))) { bool ok = false; cacheLimit = parameters.value(QStringLiteral("mapping.cache.memory.size")).toString().toInt(&ok); if (!ok) cacheLimit = 0; } if(!cacheLimit) { #ifdef __mobile__ cacheLimit = 16 * 1024 * 1024; #else cacheLimit = 128 * 1024 * 1024; #endif } pTileCache->setMaxMemoryUsage(cacheLimit); } *error = QGeoServiceProvider::NoError; errorString->clear(); #if QT_VERSION >= 0x050500 if (parameters.contains(QStringLiteral("mapping.copyright"))) m_customCopyright = parameters.value(QStringLiteral("mapping.copyright")).toString().toLatin1(); #endif }
int main(int argc, char **argv) { qRegisterMetaType<Cache::Key>("Key"); qRegisterMetaType<Tile>("Tile"); qRegisterMetaType<qkey>("qkey"); QCoreApplication::setOrganizationName("ZTopo"); QCoreApplication::setApplicationName("ZTopo"); QApplication app(argc, argv); #if defined(Q_WS_MAC) QApplication::instance()->setAttribute(Qt::AA_DontShowIconsInMenus); // Mac OS specific code to find resources within a bundle CFURLRef appUrlRef = CFBundleCopyBundleURL(CFBundleGetMainBundle()); CFStringRef macPath = CFURLCopyFileSystemPath(appUrlRef, kCFURLPOSIXPathStyle); const char *pathPtr = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding()); if (!pathPtr) { qFatal("Could not find Mac application bundle path!"); } QString rootPath = QString(pathPtr) % "/Contents/Resources/"; QByteArray rootPathArray = QString(rootPath % "proj4").toLatin1(); //qDebug("proj root '%s'\n", rootPathArray.data()); const char *path[] = { rootPathArray.data() }; pj_set_searchpath(1, (const char **)&path); CFRelease(appUrlRef); CFRelease(macPath); #elif defined(Q_WS_WIN) /* On Windows, use the proj4 subdirectory of the directory containing the application */ QString projPath = app.applicationDirPath() % "/proj4"; //qDebug() << "proj root" << projPath; const char *path[] = { QDir::toNativeSeparators(projPath).toLatin1().data() }; pj_set_searchpath(1, (const char **)&path); #endif // On other operating systems, we assume the proj4 library can find its own datum // shift grids. QSettings settings; QString cachePath = settings.value("cachePath", QDesktopServices::storageLocation(QDesktopServices::CacheLocation)).toString(); QDir::current().mkpath(cachePath); QNetworkAccessManager networkManager; QNetworkDiskCache diskCache; diskCache.setCacheDirectory(cachePath % "/meta"); diskCache.setMaximumCacheSize(maxDiskCacheSize); networkManager.setCache(&diskCache); RootData rootData(&networkManager); if (rootData.maps().size() == 0) { qFatal("No maps in root data file!"); } Map *map = rootData.maps().values()[0]; int maxMemCache = settings.value(settingMemCache, 64).toInt(); int maxDiskCache = settings.value(settingDiskCache, 200).toInt(); Cache::Cache tileCache(map, networkManager, maxMemCache, maxDiskCache, cachePath); MapRenderer renderer(map, tileCache); MainWindow *window = new MainWindow(rootData, map, &renderer, tileCache, networkManager); window->show(); if (rootData.majorVersion() > majorVersion || (rootData.majorVersion() == majorVersion && rootData.minorVersion() > minorVersion)) { QMessageBox mbox; mbox.setText("A new version of ZTopo is available."); mbox.setInformativeText(QString("A new version of ZTopo (%1.%2) is available for download. Would you like to open the ZTopo home page?").arg(rootData.majorVersion()).arg(rootData.minorVersion())); mbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); mbox.setDefaultButton(QMessageBox::Yes); int ret = mbox.exec(); if (ret == QMessageBox::Yes) { QDesktopServices::openUrl(QUrl(rootData.homePageUrl())); } } return app.exec(); }