From 762dc9dd2b47f908c3739173aa1e108dd7386717 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Fri, 2 Dec 2016 18:22:12 +0100 Subject: Move the coordinate <-> item position conversion to QGeoProjection This patch simplifies the QGeoMap API removing all the API necessary to convert to and from screen. This is now demanded to a specific QGeoProjection class, that will be independent of the map, except for using the same Geo projection (currently only WebMercator, or EPSG:3857, although we use a sphere instead of an ellipsoid, i believe) The benefits are - This relieves subclasses of QGeoMap from implementing a GeoProjection API, especially since QtLocation currently supports only WebMercator, and reimplementations would have to anyway produce the same results as the inbuilt one. - This avoids the several indirection steps previously necessary to perform a map projection (qgeotiledmap -> private->mapscene-> private). Since these operation are quite frequent one per map item coordinate at every redraw, shortening the indirection chain is beneficial - It simplifies the highly complex QGeoTiledMapScene, separating all the logic that is not needed to draw the scene, but only to perform geo coordinate <-> screen coordinate conversion Change-Id: I9e3ca5280166f2d6430a32deb44c030d02d9d4e1 Reviewed-by: Alex Blasche --- tests/auto/qgeocameradata/qgeocameradata.pro | 2 +- tests/auto/qgeocameratiles/qgeocameratiles.pro | 2 +- tests/auto/qgeocameratiles/tst_qgeocameratiles.cpp | 8 ++++---- tests/auto/qgeotiledmapscene/qgeotiledmapscene.pro | 2 +- tests/auto/qgeotiledmapscene/tst_qgeotiledmapscene.cpp | 18 +++++++++++++----- 5 files changed, 20 insertions(+), 12 deletions(-) (limited to 'tests') diff --git a/tests/auto/qgeocameradata/qgeocameradata.pro b/tests/auto/qgeocameradata/qgeocameradata.pro index f2d6d5d8..80069ea1 100644 --- a/tests/auto/qgeocameradata/qgeocameradata.pro +++ b/tests/auto/qgeocameradata/qgeocameradata.pro @@ -6,4 +6,4 @@ INCLUDEPATH += ../../../src/location/maps SOURCES += tst_qgeocameradata.cpp -QT += location positioning-private testlib +QT += location-private positioning-private testlib diff --git a/tests/auto/qgeocameratiles/qgeocameratiles.pro b/tests/auto/qgeocameratiles/qgeocameratiles.pro index 816e4240..63ab2771 100644 --- a/tests/auto/qgeocameratiles/qgeocameratiles.pro +++ b/tests/auto/qgeocameratiles/qgeocameratiles.pro @@ -5,4 +5,4 @@ INCLUDEPATH += ../../../src/location/maps SOURCES += tst_qgeocameratiles.cpp -QT += location positioning-private testlib +QT += location-private positioning-private testlib diff --git a/tests/auto/qgeocameratiles/tst_qgeocameratiles.cpp b/tests/auto/qgeocameratiles/tst_qgeocameratiles.cpp index 7a3ab513..33ebda67 100644 --- a/tests/auto/qgeocameratiles/tst_qgeocameratiles.cpp +++ b/tests/auto/qgeocameratiles/tst_qgeocameratiles.cpp @@ -28,10 +28,10 @@ //TESTED_COMPONENT=src/location/maps -#include "qgeotilespec_p.h" -#include "qgeocameratiles_p.h" -#include "qgeocameradata_p.h" -#include "qgeomaptype_p.h" +#include +#include +#include +#include #include #include diff --git a/tests/auto/qgeotiledmapscene/qgeotiledmapscene.pro b/tests/auto/qgeotiledmapscene/qgeotiledmapscene.pro index c3ec6e91..0db4b544 100644 --- a/tests/auto/qgeotiledmapscene/qgeotiledmapscene.pro +++ b/tests/auto/qgeotiledmapscene/qgeotiledmapscene.pro @@ -5,4 +5,4 @@ INCLUDEPATH += ../../../src/location/maps SOURCES += tst_qgeotiledmapscene.cpp -QT += location positioning-private testlib +QT += location-private positioning-private testlib diff --git a/tests/auto/qgeotiledmapscene/tst_qgeotiledmapscene.cpp b/tests/auto/qgeotiledmapscene/tst_qgeotiledmapscene.cpp index 0935c3f7..91b3eda8 100644 --- a/tests/auto/qgeotiledmapscene/tst_qgeotiledmapscene.cpp +++ b/tests/auto/qgeotiledmapscene/tst_qgeotiledmapscene.cpp @@ -33,7 +33,7 @@ #include "qgeocameratiles_p.h" #include "qgeocameradata_p.h" #include "qabstractgeotilecache_p.h" - +#include #include #include @@ -247,8 +247,8 @@ class tst_QGeoTiledMapScene : public QObject int screenWidth; int screenHeight; QString name; - tileSize = 16; - zoom = 1.0; // 4 tiles in the map. map size = 32x32 + tileSize = 256; + zoom = 1.0; // 4 tiles in the map. map size = 2*tileSize x 2*tileSize /* ScreenWidth = t @@ -317,8 +317,12 @@ class tst_QGeoTiledMapScene : public QObject mapGeometry.setCameraData(camera); mapGeometry.setVisibleTiles(ct.createTiles()); + QGeoProjectionWebMercator projection; + projection.setViewportSize(QSize(screenWidth,screenHeight)); + projection.setCameraData(camera); + QDoubleVector2D point(screenX,screenY); - QDoubleVector2D mercartorPos = mapGeometry.itemPositionToMercator(point); + QDoubleVector2D mercartorPos = projection.unwrapMapProjection(projection.itemPositionToWrappedMapProjection(point)); QCOMPARE(mercartorPos.x(), mercatorX); QCOMPARE(mercartorPos.y(), mercatorY); @@ -358,8 +362,12 @@ class tst_QGeoTiledMapScene : public QObject mapGeometry.setCameraData(camera); mapGeometry.setVisibleTiles(ct.createTiles()); + QGeoProjectionWebMercator projection; + projection.setViewportSize(QSize(screenWidth,screenHeight)); + projection.setCameraData(camera); + QDoubleVector2D mercatorPos(mercatorX, mercatorY); - QPointF point = mapGeometry.mercatorToItemPosition(mercatorPos).toPointF(); + QPointF point = projection.wrappedMapProjectionToItemPosition(projection.wrapMapProjection(mercatorPos)).toPointF(); QVERIFY2((point.x() == screenX) || (point.x() == screenX2), qPrintable(QString("Accepted: { %1 , %2 } Actual: %3") -- cgit v1.2.1