Browse Source

Handle proper current google map version.

Added Bing Hybrid Map
Added Open Street Map
Set map selection menu checks (exclusive check)
Handle proper image type otherwise disk caching fails
QGC4.4
dogmaphobic 10 years ago
parent
commit
d058acae38
  1. 6
      libs/QtLocationQGC/src/OpenPilotMaps.cc
  2. 43
      libs/QtLocationQGC/src/qgeomapreplyqgc.cpp
  3. 2
      libs/QtLocationQGC/src/qgeotiledmappingmanagerengineqgc.cpp
  4. 2
      libs/QtLocationQGC/src/qgeotilefetcherqgc.cpp
  5. 13
      src/ui/flightdisplay/FlightDisplay.qml

6
libs/QtLocationQGC/src/OpenPilotMaps.cc

@ -93,7 +93,7 @@ ProviderStrings::ProviderStrings()
UrlFactory::UrlFactory() UrlFactory::UrlFactory()
: _isCorrectedGoogleVersions(false) : _isCorrectedGoogleVersions(false)
, _correctGoogleVersions(false) , _correctGoogleVersions(true)
, _timeout(5 * 1000) , _timeout(5 * 1000)
{ {
Proxy.setType(QNetworkProxy::NoProxy); Proxy.setType(QNetworkProxy::NoProxy);
@ -177,9 +177,9 @@ void UrlFactory::_tryCorrectGoogleVersions()
reg = QRegExp("\"*https://khms0.google.com/kh/v=(\\d*)", Qt::CaseInsensitive); reg = QRegExp("\"*https://khms0.google.com/kh/v=(\\d*)", Qt::CaseInsensitive);
if (reg.indexIn(html) != -1) { if (reg.indexIn(html) != -1) {
QStringList gc = reg.capturedTexts(); QStringList gc = reg.capturedTexts();
VersionGoogleSatellite = gc[1]; VersionGoogleSatellite = "s@" + gc[1];
VersionGoogleSatelliteKorea = VersionGoogleSatellite; VersionGoogleSatelliteKorea = VersionGoogleSatellite;
VersionGoogleSatelliteChina = "s@" + VersionGoogleSatellite; VersionGoogleSatelliteChina = VersionGoogleSatellite;
} }
reg = QRegExp("\"*https://mts0.google.com/vt/lyrs=t@(\\d*),r@(\\d*)", Qt::CaseInsensitive); reg = QRegExp("\"*https://mts0.google.com/vt/lyrs=t@(\\d*),r@(\\d*)", Qt::CaseInsensitive);
if (reg.indexIn(html) != -1) { if (reg.indexIn(html) != -1) {

43
libs/QtLocationQGC/src/qgeomapreplyqgc.cpp

@ -91,25 +91,36 @@ void QGeoMapReplyQGC::networkReplyFinished()
if (m_reply->error() != QNetworkReply::NoError) if (m_reply->error() != QNetworkReply::NoError)
return; return;
// qDebug() << "Map OK: " << m_reply->url().toString();
QByteArray a = m_reply->readAll(); QByteArray a = m_reply->readAll();
setMapImageData(a); setMapImageData(a);
switch ((OpenPilot::MapType)tileSpec().mapId()) { if(a.size() > 2)
case OpenPilot::GoogleMap: {
case OpenPilot::GoogleSatellite: if((char)a[0] == (char)0xff && (char)a[1] == (char)0xd8)
case OpenPilot::GoogleLabels: setMapImageFormat("jpg");
case OpenPilot::GoogleTerrain: else if((char)a[0] == (char)0x89 && (char)a[1] == (char)0x50)
case OpenPilot::GoogleHybrid:
case OpenPilot::BingMap:
setMapImageFormat("png"); setMapImageFormat("png");
break; else
case OpenPilot::BingSatellite: {
setMapImageFormat("jpeg"); switch ((OpenPilot::MapType)tileSpec().mapId()) {
break; case OpenPilot::GoogleMap:
default: case OpenPilot::GoogleLabels:
qWarning("Unknown map id %d", tileSpec().mapId()); case OpenPilot::GoogleTerrain:
break; case OpenPilot::GoogleHybrid:
case OpenPilot::BingMap:
case OpenPilot::OpenStreetMap:
setMapImageFormat("png");
break;
case OpenPilot::GoogleSatellite:
case OpenPilot::BingSatellite:
case OpenPilot::BingHybrid:
setMapImageFormat("jpg");
break;
default:
qWarning("Unknown map id %d", tileSpec().mapId());
break;
}
}
} }
setFinished(true); setFinished(true);
@ -122,8 +133,6 @@ void QGeoMapReplyQGC::networkReplyError(QNetworkReply::NetworkError error)
if (!m_reply) if (!m_reply)
return; return;
// qDebug() << "Map error: " << m_reply->url().toString();
if (error != QNetworkReply::OperationCanceledError) if (error != QNetworkReply::OperationCanceledError)
setError(QGeoTiledMapReply::CommunicationError, m_reply->errorString()); setError(QGeoTiledMapReply::CommunicationError, m_reply->errorString());

2
libs/QtLocationQGC/src/qgeotiledmappingmanagerengineqgc.cpp

@ -76,6 +76,8 @@ QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVarian
// Bing // Bing
mapTypes << QGeoMapType(QGeoMapType::StreetMap, tr("Bing Street Map"), tr("Bing street map"), false, false, OpenPilot::BingMap); 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::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); setSupportedMapTypes(mapTypes);
QGeoTileFetcherQGC *tileFetcher = new QGeoTileFetcherQGC(this); QGeoTileFetcherQGC *tileFetcher = new QGeoTileFetcherQGC(this);

2
libs/QtLocationQGC/src/qgeotilefetcherqgc.cpp

@ -75,8 +75,6 @@ QGeoTiledMapReply *QGeoTileFetcherQGC::getTileImage(const QGeoTileSpec &spec)
QNetworkRequest request; QNetworkRequest request;
QString url = m_UrlFactory.makeImageUrl((OpenPilot::MapType)spec.mapId(), QPoint(spec.x(), spec.y()), spec.zoom(), m_Language); QString url = m_UrlFactory.makeImageUrl((OpenPilot::MapType)spec.mapId(), QPoint(spec.x(), spec.y()), spec.zoom(), m_Language);
// qDebug() << "Request x" << spec.x() << "y" << spec.y() << "URL:" << url;
request.setUrl(QUrl(url)); request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", m_userAgent); request.setRawHeader("User-Agent", m_userAgent);
request.setRawHeader("Accept", "*/*"); request.setRawHeader("Accept", "*/*");

13
src/ui/flightdisplay/FlightDisplay.qml

@ -214,6 +214,7 @@ Rectangle {
Menu { Menu {
id: mapTypeMenu id: mapTypeMenu
title: "Map Type..." title: "Map Type..."
ExclusiveGroup { id: currentMapType }
function setCurrentMap(map) { function setCurrentMap(map) {
for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) { for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) {
if (map === mapBackground.mapItem.supportedMapTypes[i].name) { if (map === mapBackground.mapItem.supportedMapTypes[i].name) {
@ -223,20 +224,24 @@ Rectangle {
} }
} }
} }
function addMap(map) { function addMap(map, checked) {
var mItem = mapTypeMenu.addItem(map); var mItem = mapTypeMenu.addItem(map);
mItem.checkable = true
mItem.checked = checked
mItem.exclusiveGroup = currentMapType
var menuSlot = function() {setCurrentMap(map);}; var menuSlot = function() {setCurrentMap(map);};
mItem.triggered.connect(menuSlot); mItem.triggered.connect(menuSlot);
} }
function update() { function update() {
clear() clear()
for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) {
addMap(mapBackground.mapItem.supportedMapTypes[i].name);
}
var map = '' var map = ''
if (mapBackground.mapItem.supportedMapTypes.length > 0) if (mapBackground.mapItem.supportedMapTypes.length > 0)
map = mapBackground.mapItem.activeMapType.name; map = mapBackground.mapItem.activeMapType.name;
map = flightDisplay.loadSetting("currentMapType", map); map = flightDisplay.loadSetting("currentMapType", map);
for (var i = 0; i < mapBackground.mapItem.supportedMapTypes.length; i++) {
var name = mapBackground.mapItem.supportedMapTypes[i].name;
addMap(name, map === name);
}
if(map != '') if(map != '')
setCurrentMap(map); setCurrentMap(map);
} }

Loading…
Cancel
Save