diff --git a/src/QmlControls/OfflineMapEditor.qml b/src/QmlControls/OfflineMapEditor.qml index ff6c6dda907a..620f5984ec66 100644 --- a/src/QmlControls/OfflineMapEditor.qml +++ b/src/QmlControls/OfflineMapEditor.qml @@ -37,6 +37,7 @@ FlightMap { property var _settings: _settingsManager ? _settingsManager.offlineMapsSettings : null property var _fmSettings: _settingsManager ? _settingsManager.flightMapSettings : null property var _appSettings: _settingsManager.appSettings + property Fact _tiandituFact: _settingsManager ? _settingsManager.appSettings.tiandituToken : null property Fact _mapboxFact: _settingsManager ? _settingsManager.appSettings.mapboxToken : null property Fact _mapboxAccountFact: _settingsManager ? _settingsManager.appSettings.mapboxAccount : null property Fact _mapboxStyleFact: _settingsManager ? _settingsManager.appSettings.mapboxStyle : null diff --git a/src/QtLocationPlugin/CMakeLists.txt b/src/QtLocationPlugin/CMakeLists.txt index 15d4a7c29a88..0101ff1beb7f 100644 --- a/src/QtLocationPlugin/CMakeLists.txt +++ b/src/QtLocationPlugin/CMakeLists.txt @@ -16,6 +16,8 @@ qt_add_plugin(QGCLocation Providers/MapboxMapProvider.h Providers/MapProvider.cpp Providers/MapProvider.h + Providers/TianDiTuProvider.cpp + Providers/TianDiTuProvider.h QGCCachedTileSet.cpp QGCCachedTileSet.h QGCCacheTile.h diff --git a/src/QtLocationPlugin/Providers/TianDiTuProvider.cpp b/src/QtLocationPlugin/Providers/TianDiTuProvider.cpp new file mode 100644 index 000000000000..fbd222c8daf0 --- /dev/null +++ b/src/QtLocationPlugin/Providers/TianDiTuProvider.cpp @@ -0,0 +1,29 @@ +/**************************************************************************** + * + * (c) 2009-2024 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "TianDiTuProvider.h" +#include "SettingsManager.h" +#include "AppSettings.h" + +QString TianDiTuProvider::_getURL(int x, int y, int zoom) const +{ + //"https://t%1.tianditu.gov.cn/DataServer?tk=%2&T=%3&x=%4&y=%5&l=%6" + const QString tiandituToken = SettingsManager::instance()->appSettings()->tiandituToken()->rawValue().toString(); + if (!tiandituToken.isEmpty()) { + return _mapUrl + .arg(_getServerNum(x, y, 8)) + .arg(tiandituToken) + .arg(_mapType) + .arg(x) + .arg(y) + .arg(zoom) + ; + } + return QString(); +} diff --git a/src/QtLocationPlugin/Providers/TianDiTuProvider.h b/src/QtLocationPlugin/Providers/TianDiTuProvider.h new file mode 100644 index 000000000000..d630a75281c4 --- /dev/null +++ b/src/QtLocationPlugin/Providers/TianDiTuProvider.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * (c) 2009-2024 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "MapProvider.h" + +static constexpr const quint32 AVERAGE_TIANDITU_STREET_MAP = 1297; +static constexpr const quint32 AVERAGE_TIANDITU_SAT_MAP = 19597; + +class TianDiTuProvider : public MapProvider +{ +protected: + TianDiTuProvider(const QString &mapName, const QString &mapTypeCode, const QString &imageFormat, quint32 averageSize, + QGeoMapType::MapStyle mapType) + : MapProvider(mapName, QStringLiteral("https://map.tianditu.gov.cn/"), imageFormat, averageSize, mapType) + , _mapType(mapTypeCode) {} + +private: + QString _getURL(int x, int y, int zoom) const final; + + const QString _mapType; + const QString _mapUrl = QStringLiteral("https://t%1.tianditu.gov.cn/DataServer?tk=%2&T=%3&x=%4&y=%5&l=%6"); +}; + +class TianDiTuRoadProvider : public TianDiTuProvider +{ +public: + TianDiTuRoadProvider() + : TianDiTuProvider( + QObject::tr("TianDiTu Road"), + QStringLiteral("cia_w"), + QStringLiteral("png"), + AVERAGE_TIANDITU_STREET_MAP, + QGeoMapType::StreetMap) {} +}; + +class TianDiTuSatelliteProvider : public TianDiTuProvider +{ +public: + TianDiTuSatelliteProvider() + : TianDiTuProvider( + QObject::tr("TianDiTu Satellite"), + QStringLiteral("img_w"), + QStringLiteral("jpg"), + AVERAGE_TIANDITU_SAT_MAP, + QGeoMapType::SatelliteMapDay) {} +}; + diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp index 4cb0a296fb20..bc0702e0e996 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp +++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp @@ -17,6 +17,7 @@ #include "GenericMapProvider.h" #include "GoogleMapProvider.h" #include "MapboxMapProvider.h" +#include "TianDiTuProvider.h" #include "QGCLoggingCategory.h" QGC_LOGGING_CATEGORY(QGCMapUrlEngineLog, "qgc.qtlocationplugin.qgcmapurlengine") @@ -33,6 +34,8 @@ const QList UrlFactory::_providers = { std::make_shared(), std::make_shared(), + std::make_shared(), + std::make_shared(), std::make_shared(), std::make_shared(), std::make_shared(), diff --git a/src/Settings/App.SettingsGroup.json b/src/Settings/App.SettingsGroup.json index 84984ad0df6a..1d38f9003a89 100644 --- a/src/Settings/App.SettingsGroup.json +++ b/src/Settings/App.SettingsGroup.json @@ -172,6 +172,13 @@ "default": false, "qgcRebootRequired": true }, +{ + "name": "tiandituToken", + "shortDesc": "Access token to TianDiTu maps", + "longDesc": "Your personal access token for TianDiTu maps", + "type": "string", + "default": "" +}, { "name": "mapboxToken", "shortDesc": "Access token to Mapbox maps", diff --git a/src/Settings/AppSettings.cc b/src/Settings/AppSettings.cc index aa21fc904679..4b479d0ba937 100644 --- a/src/Settings/AppSettings.cc +++ b/src/Settings/AppSettings.cc @@ -155,6 +155,7 @@ DECLARE_SETTINGSFACT(AppSettings, androidSaveToSDCard) DECLARE_SETTINGSFACT(AppSettings, useChecklist) DECLARE_SETTINGSFACT(AppSettings, enforceChecklist) DECLARE_SETTINGSFACT(AppSettings, enableMultiVehiclePanel) +DECLARE_SETTINGSFACT(AppSettings, tiandituToken) DECLARE_SETTINGSFACT(AppSettings, mapboxToken) DECLARE_SETTINGSFACT(AppSettings, mapboxAccount) DECLARE_SETTINGSFACT(AppSettings, mapboxStyle) diff --git a/src/Settings/AppSettings.h b/src/Settings/AppSettings.h index 26b1503503fc..2ec6a0d210a1 100644 --- a/src/Settings/AppSettings.h +++ b/src/Settings/AppSettings.h @@ -46,6 +46,7 @@ class AppSettings : public SettingsGroup DEFINE_SETTINGFACT(useChecklist) DEFINE_SETTINGFACT(enforceChecklist) DEFINE_SETTINGFACT(enableMultiVehiclePanel) + DEFINE_SETTINGFACT(tiandituToken) DEFINE_SETTINGFACT(mapboxToken) DEFINE_SETTINGFACT(mapboxAccount) DEFINE_SETTINGFACT(mapboxStyle) diff --git a/src/UI/AppSettings/MapSettings.qml b/src/UI/AppSettings/MapSettings.qml index 15f4d8cba622..d954345d82d6 100644 --- a/src/UI/AppSettings/MapSettings.qml +++ b/src/UI/AppSettings/MapSettings.qml @@ -34,6 +34,7 @@ Item { property Fact _mapProviderFact: _settingsManager.flightMapSettings.mapProvider property Fact _mapTypeFact: _settingsManager.flightMapSettings.mapType property Fact _elevationProviderFact: _settingsManager.flightMapSettings.elevationMapProvider + property Fact _tiandituFac: _settingsManager ? _settingsManager.appSettings.tiandituToken : null property Fact _mapboxFact: _settingsManager ? _settingsManager.appSettings.mapboxToken : null property Fact _mapboxAccountFact: _settingsManager ? _settingsManager.appSettings.mapboxAccount : null property Fact _mapboxStyleFact: _settingsManager ? _settingsManager.appSettings.mapboxStyle : null @@ -164,6 +165,12 @@ Item { heading: qsTr("Tokens") headingDescription: qsTr("Allows access to additional providers") + LabelledFactTextField { + textFieldPreferredWidth: _largeTextFieldWidth + label: qsTr("TianDiTu") + fact: _appSettings.tiandituToken + } + LabelledFactTextField { textFieldPreferredWidth: _largeTextFieldWidth label: qsTr("Mapbox")