Date: Saturday, September 4, 2021 @ 11:59:43 Author: arojas Revision: 1011137
Update to 0.19.0 Modified: merkaartor/trunk/PKGBUILD Deleted: merkaartor/trunk/0001-Add-AppStream-metadata.patch merkaartor/trunk/gpsd-3.20.patch merkaartor/trunk/merkaartor-proj8.patch merkaartor/trunk/qt-5.15.patch -----------------------------------+ 0001-Add-AppStream-metadata.patch | 86 --- PKGBUILD | 33 - gpsd-3.20.patch | 52 - merkaartor-proj8.patch | 975 ------------------------------------ qt-5.15.patch | 26 5 files changed, 4 insertions(+), 1168 deletions(-) Deleted: 0001-Add-AppStream-metadata.patch =================================================================== --- 0001-Add-AppStream-metadata.patch 2021-09-04 11:58:01 UTC (rev 1011136) +++ 0001-Add-AppStream-metadata.patch 2021-09-04 11:59:43 UTC (rev 1011137) @@ -1,86 +0,0 @@ -From ce84944113745eaafb26783d765f92551da9a712 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= <[email protected]> -Date: Mon, 6 Jul 2020 16:45:27 +0200 -Subject: [PATCH] Add AppStream metadata - ---- - src/org.merkaartor.merkaartor.appdata.xml | 43 +++++++++++++++++++++++ - src/src.pro | 5 ++- - 2 files changed, 47 insertions(+), 1 deletion(-) - create mode 100644 src/org.merkaartor.merkaartor.appdata.xml - -diff --git a/src/org.merkaartor.merkaartor.appdata.xml b/src/org.merkaartor.merkaartor.appdata.xml -new file mode 100644 -index 00000000..83e51f82 ---- /dev/null -+++ b/src/org.merkaartor.merkaartor.appdata.xml -@@ -0,0 +1,43 @@ -+<?xml version="1.0" encoding="UTF-8"?> -+<component type="desktop-application"> -+ <id>org.merkaartor.merkaartor</id> -+ <launchable type="desktop-id">org.merkaartor.merkaartor.desktop</launchable> -+ <name>Merkaartor</name> -+ <summary>OpenStreetMap editor</summary> -+ <metadata_license>CC0-1.0</metadata_license> -+ <project_license>GPL-2.0</project_license> -+ <description> -+ <p>Merkaartor is a map editor for OpenStreetMap.org, the free editable map of the whole world. Features:</p> -+ <ul> -+ <li>Download from and upload to the OpenStreetMap server</li> -+ <li>Open .osm and .gpx files</li> -+ <li>Create and move trackpoints, ways, and areas</li> -+ <li>Add tags, delete features</li> -+ <li>Reverse, split and join ways</li> -+ <li>Visualize some leisure/landuse areas and road types</li> -+ <li>Displaying GPS information</li> -+ </ul> -+ </description> -+ <screenshots> -+ <screenshot type="default"> -+ <caption>Merkaartor 0.15.3 with Mapnik style</caption> -+ <image>https://wiki.openstreetmap.org/w/images/0/04/Merkaartor_0.15.3.png</image> -+ </screenshot> -+ <screenshot> -+ <caption>Merkaartor 0.15.3 with Maxspeed style</caption> -+ <image>https://wiki.openstreetmap.org/w/images/b/b4/Merkaartor_0.15.3_maxspeed.png</image> -+ </screenshot> -+ <screenshot> -+ <caption>Merkaartor 0.15.3 showing the fully localized GUI</caption> -+ <image>https://wiki.openstreetmap.org/w/images/4/48/Merkaartor_0.15.3_i18n.png</image> -+ </screenshot> -+ <screenshot> -+ <caption>Merkaartor 0.15.3 with WMS background and semi-transparent map layer</caption> -+ <image>https://wiki.openstreetmap.org/w/images/c/c9/Merkaartor_0.15.3_wms.png</image> -+ </screenshot> -+ </screenshots> -+ <url type="bugtracker">https://github.com/openstreetmap/merkaartor/issues</url> -+ <url type="homepage">http://merkaartor.be/</url> -+ <update_contact>[email protected]</update_contact> -+ <translation type="qt">merkaartor</translation> -+</component> -diff --git a/src/src.pro b/src/src.pro -index b5c3ba8d..090daddb 100644 ---- a/src/src.pro -+++ b/src/src.pro -@@ -288,6 +288,8 @@ contains(SANITIZE, 2) { - } - - unix:!macx { -+ appdata.path = $${PREFIX}/share/metainfo -+ appdata.files = org.merkaartor.merkaartor.appdata.xml - desktop.path = $${PREFIX}/share/applications - desktop.files = org.merkaartor.merkaartor.desktop - desktopicon8x8.path = $${PREFIX}/share/icons/hicolor/8x8/apps/ -@@ -324,7 +326,8 @@ unix:!macx { - desktopicon256x256.files = $$PWD/../Icons/256x256/merkaartor.png - desktopicon512x512.path = $${PREFIX}/share/icons/hicolor/512x512/apps/ - desktopicon512x512.files = $$PWD/../Icons/512x512/merkaartor.png -- INSTALLS += desktop \ -+ INSTALLS += appdata \ -+ desktop \ - desktopicon8x8 \ - desktopicon16x16 \ - desktopicon22x22 \ --- -2.27.0 - Modified: PKGBUILD =================================================================== --- PKGBUILD 2021-09-04 11:58:01 UTC (rev 1011136) +++ PKGBUILD 2021-09-04 11:59:43 UTC (rev 1011137) @@ -5,8 +5,8 @@ # Contributor: Brice Maron <brice bmaron net> pkgname=merkaartor -pkgver=0.18.4 -pkgrel=8 +pkgver=0.19.0 +pkgrel=1 pkgdesc='OpenStreetMap editor' arch=('x86_64') url='http://merkaartor.be/' @@ -13,34 +13,9 @@ license=('GPL2') depends=('exiv2' 'gdal' 'gpsd' 'hicolor-icon-theme' 'qt5-svg') makedepends=('qt5-tools') -source=("https://github.com/openstreetmap/$pkgname/archive/$pkgver/$pkgname-$pkgver.tar.gz" - 'qt-5.15.patch' - 'gpsd-3.20.patch' - 'merkaartor-proj8.patch' - '0001-Add-AppStream-metadata.patch') -sha256sums=('16e790507a5bb54e4b3c09ea063ebb095a4b014ce8ba937b771706d4c940976a' - 'e8466ebecbb9336ade8363b9badcf43d0c2b7f54d0fdad8b053c072aa3dce44e' - '6a19357c21e895e48775d0017d953e1d3b53b2cb795861d08984da3a4788005d' - '2b0acbd3d557af25a4b726ac814dd4a7e3aff094caaeac5838696245daf4abff' - 'f8e2a77c53a063349e48bc64a60a4ee22297020b2fa65ef0021b2a7105fa89e8') +source=("https://github.com/openstreetmap/$pkgname/archive/$pkgver/$pkgname-$pkgver.tar.gz") +sha256sums=('f538d1eb380005cbd5d047070b276da59c58bb7ff47218e20a080b893d0ba457') -prepare() { - cd $pkgname-$pkgver - - # Fix build with gpsd 3.20 - # https://github.com/openstreetmap/merkaartor/issues/204 - patch -Np1 -i ../gpsd-3.20.patch - - # Fix build with Qt 5.15 - patch -Np1 -i ../qt-5.15.patch - - # Fix build with proj 8 - patch -Np1 -i ../merkaartor-proj8.patch - - # Add AppStream metadata - patch -Np1 -i ../0001-Add-AppStream-metadata.patch -} - build() { cd $pkgname-$pkgver lrelease src/src.pro Deleted: gpsd-3.20.patch =================================================================== --- gpsd-3.20.patch 2021-09-04 11:58:01 UTC (rev 1011136) +++ gpsd-3.20.patch 2021-09-04 11:59:43 UTC (rev 1011137) @@ -1,52 +0,0 @@ -From 13b358fa7899bb34e277b32a4c0d92833050f2c6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ladislav=20L=C3=A1ska?= <[email protected]> -Date: Tue, 14 Jan 2020 09:20:00 +0100 -Subject: [PATCH 1/2] Added a condition to use the new timespec_t on gpsd APIs - >= 9 - ---- - src/GPS/qgpsdevice.cpp | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/src/GPS/qgpsdevice.cpp b/src/GPS/qgpsdevice.cpp -index f8d1a0cf..cb727d2d 100644 ---- a/src/GPS/qgpsdevice.cpp -+++ b/src/GPS/qgpsdevice.cpp -@@ -1052,8 +1052,13 @@ void QGPSDDevice::onDataAvailable() - qreal Heading = gpsdata->fix.track; - if (!__isnan(Heading)) - setHeading(Heading); -- if (gpsdata->fix.time) -- cur_datetime = QDateTime::fromTime_t(gpsdata->fix.time); -+#if GPSD_API_MAJOR_VERSION >= 9 -+#define FIX_TIME fix.time.tv_sec -+#else -+#define FIX_TIME fix.time -+#endif -+ if (gpsdata->FIX_TIME) -+ cur_datetime = QDateTime::fromTime_t(gpsdata->FIX_TIME); - emit updatePosition(gpsdata->fix.latitude, - gpsdata->fix.longitude, - cur_datetime, - -From 1b76301ed7719f9ec137fd77f69b5702d8be94ab Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ladislav=20L=C3=A1ska?= <[email protected]> -Date: Tue, 14 Jan 2020 10:34:09 +0100 -Subject: [PATCH 2/2] Added undef to FIX_TIME after end of its scope. - ---- - src/GPS/qgpsdevice.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/GPS/qgpsdevice.cpp b/src/GPS/qgpsdevice.cpp -index cb727d2d..93605047 100644 ---- a/src/GPS/qgpsdevice.cpp -+++ b/src/GPS/qgpsdevice.cpp -@@ -1059,6 +1059,7 @@ void QGPSDDevice::onDataAvailable() - #endif - if (gpsdata->FIX_TIME) - cur_datetime = QDateTime::fromTime_t(gpsdata->FIX_TIME); -+#undef FIX_TIME - emit updatePosition(gpsdata->fix.latitude, - gpsdata->fix.longitude, - cur_datetime, Deleted: merkaartor-proj8.patch =================================================================== --- merkaartor-proj8.patch 2021-09-04 11:58:01 UTC (rev 1011136) +++ merkaartor-proj8.patch 2021-09-04 11:59:43 UTC (rev 1011137) @@ -1,975 +0,0 @@ -diff -Nur merkaartor-0.18.4/CHANGELOG merkaartor-0.18.4-proj-remove-legacy-api/CHANGELOG ---- merkaartor-0.18.4/CHANGELOG 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/CHANGELOG 2021-03-08 11:58:40.084224018 +0100 -@@ -1,4 +1,8 @@ - This is a shortened changelog. See git commits for full list of changes. -+backported to -+v0.18.4 -+ * CHG: Projection engine no longer enables coordinate wrapping by default. -+ * CHG: Projection no longer guesses some EPSG projections only based on string contained, but rather requires it being an exact match. - - v0.18.4 - * FIX: Fixed "Create rectangular building" when panning (issue 125). -diff -Nur merkaartor-0.18.4/CMakeLists.txt merkaartor-0.18.4-proj-remove-legacy-api/CMakeLists.txt ---- merkaartor-0.18.4/CMakeLists.txt 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/CMakeLists.txt 2021-03-08 11:57:58.498796056 +0100 -@@ -2,6 +2,8 @@ - - project(merkaartor) - -+enable_testing() -+ - message(WARNING " - - CMake build is experimental and missing quite a few features (no plugins, no version string, no configurable features, etc...). Please use qmake for production builds. -@@ -189,7 +191,6 @@ - src/ImportExport/ImportGPX.cpp - src/ImportExport/ImportExportGdal.cpp - src/MainWindow.h --src/Main.cpp - src/common/UploadMapDialog.ui - src/common/GotoDialog.ui - src/common/PropertiesDialog.ui -@@ -389,7 +390,7 @@ - ) - - # Find the QtWidgets library --find_package(Qt5 COMPONENTS Svg Network Xml Core Gui Concurrent PrintSupport Widgets CONFIG REQUIRED) -+find_package(Qt5 COMPONENTS Svg Network Xml Core Gui Concurrent PrintSupport Widgets Test CONFIG REQUIRED) - find_package(PkgConfig REQUIRED) - pkg_check_modules(EXIV2 REQUIRED exiv2 gdal proj) - -@@ -397,35 +398,53 @@ - - - # Tell CMake to create the helloworld executable --add_executable(merkaartor ${merkaartor_SRCS}) -+add_executable(merkaartor ${merkaartor_SRCS} src/Main.cpp) - # Use the Widgets module from Qt 5 --target_link_libraries(merkaartor Qt5::Svg Qt5::Network Qt5::Xml Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::PrintSupport Qt5::Widgets ${EXIV2_LIBRARIES} ) -+set(MERKAARTOR_LINK_LIBS Qt5::Svg Qt5::Network Qt5::Xml Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::PrintSupport Qt5::Widgets ${EXIV2_LIBRARIES}) -+target_link_libraries(merkaartor ${MERKAARTOR_LINK_LIBS} ) - target_compile_options(merkaartor PUBLIC ${EXIV2_CFLAGS_OTHER}) - install( TARGETS merkaartor RUNTIME DESTINATION bin ) - --target_include_directories( merkaartor PUBLIC --${EXIV2_INCLUDE_DIRS} --${CMAKE_CURRENT_SOURCE_DIR}/interfaces --${CMAKE_CURRENT_SOURCE_DIR}/include --${CMAKE_CURRENT_SOURCE_DIR}/src --${CMAKE_CURRENT_SOURCE_DIR}/src/GPS --${CMAKE_CURRENT_SOURCE_DIR}/src/Backend --${CMAKE_CURRENT_SOURCE_DIR}/src/Preferences --${CMAKE_CURRENT_SOURCE_DIR}/src/Render --${CMAKE_CURRENT_SOURCE_DIR}/src/PaintStyle --${CMAKE_CURRENT_SOURCE_DIR}/src/ImportExport --${CMAKE_CURRENT_SOURCE_DIR}/src/common --${CMAKE_CURRENT_SOURCE_DIR}/src/Layers --${CMAKE_CURRENT_SOURCE_DIR}/src/Utils --${CMAKE_CURRENT_SOURCE_DIR}/src/QToolBarDialog --${CMAKE_CURRENT_SOURCE_DIR}/src/NameFinder --${CMAKE_CURRENT_SOURCE_DIR}/src/Interactions --${CMAKE_CURRENT_SOURCE_DIR}/src/Sync --${CMAKE_CURRENT_SOURCE_DIR}/src/Docks --${CMAKE_CURRENT_SOURCE_DIR}/src/Features --${CMAKE_CURRENT_SOURCE_DIR}/src/Commands --${CMAKE_CURRENT_SOURCE_DIR}/src/qextserialport --${CMAKE_CURRENT_SOURCE_DIR}/src/QMapControl --${CMAKE_CURRENT_SOURCE_DIR}/src/TagTemplate --${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication-2.6_1-opensource/src -- ) -+set(MERKAARTOR_INCLUDE_DIRECTORIES -+ ${EXIV2_INCLUDE_DIRS} -+ ${CMAKE_CURRENT_SOURCE_DIR}/interfaces -+ ${CMAKE_CURRENT_SOURCE_DIR}/include -+ ${CMAKE_CURRENT_SOURCE_DIR}/src -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/GPS -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Backend -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Preferences -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Render -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/PaintStyle -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/ImportExport -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/common -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Layers -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Utils -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/QToolBarDialog -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/NameFinder -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Interactions -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Sync -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Docks -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Features -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/Commands -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/qextserialport -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/QMapControl -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/TagTemplate -+ ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication-2.6_1-opensource/src -+) -+ -+target_include_directories( merkaartor PUBLIC ${MERKAARTOR_INCLUDE_DIRECTORIES}) -+ -+ -+############################################## -+# Only test handling goes here -+############################################## -+ -+# The test shall be placed in file "tests/<test_name>.cpp" file, followed by required includes -+function(MERK_ADD_TEST test_name) -+ add_executable(${test_name} tests/${test_name}.cpp ${ARGN}) -+ target_link_libraries(${test_name} ${MERKAARTOR_LINK_LIBS} Qt5::Test ) -+ add_test(${test_name} ${test_name}) -+ target_include_directories(${test_name} PUBLIC ${MERKAARTOR_INCLUDE_DIRECTORIES}) -+endfunction() -+ -+MERK_ADD_TEST(test-projection src/common/Projection.cpp src/common/Coord.cpp) -diff -Nur merkaartor-0.18.4/COMPILE.md merkaartor-0.18.4-proj-remove-legacy-api/COMPILE.md ---- merkaartor-0.18.4/COMPILE.md 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/COMPILE.md 2021-03-08 11:57:58.499796042 +0100 -@@ -23,8 +23,8 @@ - You will need the following packages installed: - - - Working C++ compiler -- - Qt 4.x (4.4.0 or newer) or Qt 5.x (5.3.1 or later) -- - Proj.4 -+ - Qt 5.9 or newer -+ - Proj 6.x or newer - - GDAL (2.0.0 or newer for GDAL exports) - - Exiv2 (for geoimage support) - - (For Windows Installer) NSIS-3 -@@ -37,13 +37,7 @@ - look like this: - - ``` -- $ sudo apt-get install build-essential libgdal-dev libproj-dev --``` -- --For Qt4: -- --``` -- $ sudo apt-get install qt4-default libqt4-xml libqt4-network libqt4-gui libqt4-svg libqt4-webkit libqt4-dev qt4-qmake -+ $ sudo apt-get install build-essential libgdal-dev libproj-dev libexiv2-dev - ``` - - Or for Qt5: -diff -Nur merkaartor-0.18.4/interfaces/IProjection.h merkaartor-0.18.4-proj-remove-legacy-api/interfaces/IProjection.h ---- merkaartor-0.18.4/interfaces/IProjection.h 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/interfaces/IProjection.h 2021-03-08 11:57:58.499796042 +0100 -@@ -10,7 +10,7 @@ - virtual ~IProjection(void) {}; - - virtual QPointF project(const QPointF& pt) const = 0; -- virtual QPointF inverse2Point(const QPointF& pt) const = 0; -+ virtual QPointF inverse(const QPointF& pt) const = 0; - - virtual QString getProjectionType() const = 0; - }; -diff -Nur merkaartor-0.18.4/src/common/AboutDialog.ui merkaartor-0.18.4-proj-remove-legacy-api/src/common/AboutDialog.ui ---- merkaartor-0.18.4/src/common/AboutDialog.ui 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/common/AboutDialog.ui 2021-03-08 11:57:58.499796042 +0100 -@@ -31,7 +31,7 @@ - <number>-1</number> - </property> - <item row="2" column="1"> -- <widget class="QLabel" name="Proj4Version"> -+ <widget class="QLabel" name="ProjVersion"> - <property name="styleSheet"> - <string notr="true">QLabel { font-size:small; font-weight:bold; }</string> - </property> -@@ -91,12 +91,12 @@ - </widget> - </item> - <item row="2" column="0"> -- <widget class="QLabel" name="Proj4VersionLabel"> -+ <widget class="QLabel" name="ProjVersionLabel"> - <property name="styleSheet"> - <string notr="true">QLabel { font-size: x-small; font-style: italic; }</string> - </property> - <property name="text"> -- <string>PROJ.4 version</string> -+ <string>PROJ version</string> - </property> - </widget> - </item> -diff -Nur merkaartor-0.18.4/src/common/FeatureManipulations.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/common/FeatureManipulations.cpp ---- merkaartor-0.18.4/src/common/FeatureManipulations.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/common/FeatureManipulations.cpp 2021-03-08 11:57:58.576794983 +0100 -@@ -1658,12 +1658,12 @@ - Node *n1; - Node *n2 = theWay->getNode(0); - QPointF p1; -- QPointF p2 = proj.project(n2); -+ QPointF p2 = proj.project(n2->position()); - for (int j = 0; j < theWay->size()-1; ++j, ++i) { - n1 = n2; - n2 = theWay->getNode(j + 1); - p1 = p2; -- p2 = proj.project(n2); -+ p2 = proj.project(n2->position()); - if (n1 == n2 || p1 == p2) { - qWarning() << "ERROR: duplicate nodes found during axis align in" << theWay->id().numId; - return false; -@@ -1863,7 +1863,7 @@ - Node *N = theWay->getNode(i); - if (!dups && node_pos.contains(N) && !(theWay->isClosed() && i == theWay->size()-1)) - dups = true; -- node_pos[N] = proj.project(N); -+ node_pos[N] = proj.project(N->position()); - } - } - -@@ -1983,7 +1983,7 @@ - foreach (Way *theWay, theWays) { - for (int i = 0; i < theWay->size(); ++i) { - Node *N = theWay->getNode(i); -- theList->add(new MoveNodeCommand(N, proj.inverse2Coord(node_pos[N]), theDocument->getDirtyOrOriginLayer(N->layer()))); -+ theList->add(new MoveNodeCommand(N, proj.inverse(node_pos[N]), theDocument->getDirtyOrOriginLayer(N->layer()))); - } - } - return AxisAlignSuccess; -diff -Nur merkaartor-0.18.4/src/common/MapView.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/common/MapView.cpp ---- merkaartor-0.18.4/src/common/MapView.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/common/MapView.cpp 2021-03-08 11:57:58.643794061 +0100 -@@ -514,7 +514,7 @@ - continue; - // QPoint pt = QPoint(0, p->theTransform.map(parallelLines.at(i).at(0)).y()); - QPoint ptt = pt.toPoint() + QPoint(5, -5); -- P.drawText(ptt, QString("%1").arg(p->theProjection.inverse2Coord(parallelLines.at(i).at(0)).y(), 0, 'f', 2-prec)); -+ P.drawText(ptt, QString("%1").arg(p->theProjection.inverse(parallelLines.at(i).at(0)).y(), 0, 'f', 2-prec)); - } - for (int i=0; i<medianLines.size(); ++i) { - -@@ -534,7 +534,7 @@ - continue; - // QPoint pt = QPoint(p->theTransform.map(medianLines.at(i).at(0)).x(), 0); - QPoint ptt = pt.toPoint() + QPoint(5, 10); -- P.drawText(ptt, QString("%1").arg(p->theProjection.inverse2Coord(medianLines.at(i).at(0)).x(), 0, 'f', 2-prec)); -+ P.drawText(ptt, QString("%1").arg(p->theProjection.inverse(medianLines.at(i).at(0)).x(), 0, 'f', 2-prec)); - } - - P.restore(); -@@ -760,7 +760,7 @@ - - Coord MapView::fromView(const QPoint& aPt) const - { -- return p->theProjection.inverse2Coord(p->theInvertedTransform.map(QPointF(aPt))); -+ return p->theProjection.inverse(p->theInvertedTransform.map(QPointF(aPt))); - } - - -diff -Nur merkaartor-0.18.4/src/common/Painting.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/common/Painting.cpp ---- merkaartor-0.18.4/src/common/Painting.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/common/Painting.cpp 2021-03-08 11:57:58.643794061 +0100 -@@ -160,7 +160,7 @@ - { - for (int i=0; i<R->size(); ++i) - if (R->getNode(i)->isVisible() && !R->getNode(i)->isVirtual()) -- Polygon.append(theProjection.project(R->getNode(i))); -+ Polygon.append(theProjection.project(R->getNode(i)->position())); - } - - /// draws way with oneway markers -diff -Nur merkaartor-0.18.4/src/common/Projection.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/common/Projection.cpp ---- merkaartor-0.18.4/src/common/Projection.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/common/Projection.cpp 2021-03-08 11:57:58.643794061 +0100 -@@ -12,107 +12,50 @@ - #define EQUATORIALMETERHALFCIRCUMFERENCE 20037508.34 - #define EQUATORIALMETERPERDEGREE 222638.981555556 - --#include "Node.h" -- --Projection::Projection(void) -+ProjectionBackend::ProjectionBackend(QString initProjection, std::function<QString(QString)> mapProjectionName) - : ProjectionRevision(0) - , IsMercator(false) - , IsLatLong(false) -+ , mapProjectionName(mapProjectionName) - { --#if defined(Q_OS_WIN) && !defined(_MOBILE) -+ -+ -+ projCtx = std::shared_ptr<PJ_CONTEXT>(proj_context_create(), proj_context_destroy); -+#if defined(Q_OS_WIN) - QString pdir(QDir::toNativeSeparators(qApp->applicationDirPath() + "/" STRINGIFY(SHARE_DIR) "/proj")); - const char* proj_dir = pdir.toUtf8().constData(); -- // const char* proj_dir = "E:\\cbro\\src\\merkaartor-devel\\binaries\\bin\\share\\proj"; -- pj_set_searchpath(1, &proj_dir); -+ proj_context_set_search_paths(projCtx.get(), 1, &proj_dir); - #endif // Q_OS_WIN -- -- --#ifndef _MOBILE -- theProj = NULL; -- theWGS84Proj = Projection::getProjection("+proj=longlat +ellps=WGS84 +datum=WGS84"); -- setProjectionType(M_PREFS->getProjectionType()); --#endif --} -- --Projection::~Projection(void) --{ -- /* TODO: pj_free should be called, but it segfaults if two of the same -- * Projection objects have the same projPJ. A better machinism, perhaps -- * projPJ caching, should be provided. -- * -- * In the meantime, pj_free is not called, which does little harm as it's -- * usually called at exit only. -- * */ --#ifndef _MOBILE -- if (theProj) { -- //pj_free(theProj); -- } --#endif // _MOBILE --} -- --QPointF Projection::inverse2Point(const QPointF & Map) const --{ -- if (IsLatLong) -- return latlonInverse(Map); -- else -- if (IsMercator) -- return mercatorInverse(Map); --#ifndef _MOBILE -- else -- return projInverse(Map); --#endif -- return QPointF(); -+ projTransform = std::shared_ptr<PJ>(nullptr); -+ projMutex = std::shared_ptr<QMutex>(new QMutex()); -+ setProjectionType(initProjection); - } - --QPointF Projection::project(const QPointF & Map) const -+QPointF ProjectionBackend::project(const QPointF & Map) const - { - if (IsMercator) - return mercatorProject(Map); -- else -- if (IsLatLong) -- return latlonProject(Map); --#ifndef _MOBILE -- else -- return projProject(Map); --#endif -- return QPointF(); -+ if (IsLatLong) -+ return latlonProject(Map); -+ return projProject(Map); - } - --QPointF Projection::project(Node* aNode) const -+QLineF ProjectionBackend::project(const QLineF & Map) const - { -- return project(aNode->position()); -+ return QLineF(project(Map.p1()), project(Map.p2())); - } - --QLineF Projection::project(const QLineF & Map) const --{ -- if (IsMercator) -- return QLineF (mercatorProject(Map.p1()), mercatorProject(Map.p2())); -- else -- if (IsLatLong) -- return QLineF (latlonProject(Map.p1()), latlonProject(Map.p2())); --#ifndef _MOBILE -- else -- return QLineF(projProject(Map.p1()), projProject(Map.p2())); --#endif -- return QLineF(); --} - -- --Coord Projection::inverse2Coord(const QPointF & projPoint) const -+QPointF ProjectionBackend::inverse(const QPointF & projPoint) const - { -- if (IsLatLong) -+ if (IsLatLong) - return latlonInverse(projPoint); -- else -- if (IsMercator) -- return mercatorInverse(projPoint); --#ifndef _MOBILE -- else -- return projInverse(projPoint); --#endif -- return Coord(); -+ if (IsMercator) -+ return mercatorInverse(projPoint); -+ return projInverse(projPoint); - } - --QRectF Projection::toProjectedRectF(const QRectF& Viewport, const QRect& screen) const -+QRectF ProjectionBackend::toProjectedRectF(const QRectF& Viewport, const QRect& screen) const - { - QPointF tl, br; - QRectF pViewport; -@@ -143,88 +86,55 @@ - return pViewport; - } - --CoordBox Projection::fromProjectedRectF(const QRectF& Viewport) const -+CoordBox ProjectionBackend::fromProjectedRectF(const QRectF& Viewport) const - { - Coord tl, br; - CoordBox bbox; - -- tl = inverse2Coord(Viewport.topLeft()); -- br = inverse2Coord(Viewport.bottomRight()); -+ tl = inverse(Viewport.topLeft()); -+ br = inverse(Viewport.bottomRight()); - bbox = CoordBox(tl, br); - - return bbox; - } - --#ifndef _MOBILE -- --void Projection::projTransform(ProjProjection srcdefn, -- ProjProjection dstdefn, -- long point_count, int point_offset, qreal *x, qreal *y, qreal *z ) --{ -- pj_transform(srcdefn, dstdefn, point_count, point_offset, (double *)x, (double *)y, (double *)z); --} -- --void Projection::projTransformFromWGS84(long point_count, int point_offset, qreal *x, qreal *y, qreal *z ) const --{ -- pj_transform (theWGS84Proj, theProj, point_count, point_offset, (double *)x, (double *)y, (double *)z); --} -- --void Projection::projTransformToWGS84(long point_count, int point_offset, qreal *x, qreal *y, qreal *z ) const -+QPointF ProjectionBackend::projProject(const QPointF & Map) const - { -- pj_transform(theProj, theWGS84Proj, point_count, point_offset, (double *)x, (double *)y, (double *)z); --} -- --QPointF Projection::projProject(const QPointF & Map) const --{ -- qreal x = angToRad(Map.x()); -- qreal y = angToRad(Map.y()); -- -- projTransformFromWGS84(1, 0, &x, &y, NULL); -- -- return QPointF(x, y); -+ QMutexLocker locker(projMutex.get()); -+ auto trans = proj_trans(projTransform.get(), PJ_DIRECTION::PJ_FWD, {{Map.x(), Map.y(), 0}}); -+ //qDebug() << "Project(fromWSG84, " << getProjectionType() << "): " << Map << " -> " << qSetRealNumberPrecision(20) << x << "," << y; -+ return QPointF(trans.xy.x, trans.xy.y); - } - --Coord Projection::projInverse(const QPointF & pProj) const -+Coord ProjectionBackend::projInverse(const QPointF & pProj) const - { -- qreal x = pProj.x(); -- qreal y = pProj.y(); -- -- projTransformToWGS84(1, 0, &x, &y, NULL); -- -- return Coord(radToAng(x), radToAng(y)); -+ QMutexLocker locker(projMutex.get()); -+ auto trans = proj_trans(projTransform.get(), PJ_DIRECTION::PJ_INV, {{pProj.x(), pProj.y(), 0}}); -+ return Coord(trans.xy.x, trans.xy.y); - } --#endif // _MOBILE - --bool Projection::projIsLatLong() const -+bool ProjectionBackend::projIsLatLong() const - { - return IsLatLong; - } - --//bool Projection::projIsMercator() --//{ --// return IsMercator; --//} -- -- --#ifndef _MOBILE --ProjProjection Projection::getProjection(QString projString) -+PJ* ProjectionBackend::getProjection(QString projString) - { -- ProjProjection theProj = pj_init_plus(QString("%1 +over").arg(projString).toLatin1()); -- return theProj; -+ QString WGS84("+proj=longlat +ellps=WGS84 +datum=WGS84 +xy_in=deg"); -+ PJ* proj = proj_create_crs_to_crs(projCtx.get(), WGS84.toLatin1(), projString.toLatin1(), 0); -+ if (!proj) { -+ qDebug() << "Failed to initialize projection" << WGS84 << "to" << projString << "with error:" << proj_errno_string(proj_errno(nullptr)); -+ } -+ return proj; - } --#endif // _MOBILE - --bool Projection::setProjectionType(QString aProjectionType) -+bool ProjectionBackend::setProjectionType(QString aProjectionType) - { -+ QMutexLocker locker(projMutex.get()); - if (aProjectionType == projType) - return true; - --#ifndef _MOBILE -- if (theProj) { -- pj_free(theProj); -- theProj = NULL; -- } --#endif // _MOBILE -+ projTransform = nullptr; - - ProjectionRevision++; - projType = aProjectionType; -@@ -246,77 +156,60 @@ - return true; - } - // Hardcode "lat/long " projection -- if ( -- projType.toUpper().contains("EPSG:4326") -- ) -+ if ( projType.toUpper() == "EPSG:4326" ) - { - IsLatLong = true; - projType = "EPSG:4326"; - return true; - } - --#ifndef _MOBILE -- try { -- projProj4 = M_PREFS->getProjection(aProjectionType).projection; -- theProj = getProjection(projProj4); -- if (!theProj) { -- projType = "EPSG:3857"; -- IsMercator = true; -- return false; -- } -- // else { -- // if (pj_is_latlong(theProj)) -- // projType = "EPSG:4326"; -- // IsLatLong = true; -- // } -- } catch (...) { -+ projProj4 = mapProjectionName(aProjectionType); -+ projTransform = std::shared_ptr<PJ>(getProjection(projProj4), proj_destroy); -+ if (!projTransform) { -+ // Fall back to the EPSG:3857 and return false. getProjection already logged the error into qDebug(). -+ projType = "EPSG:3857"; -+ IsMercator = true; - return false; - } -- return (theProj != NULL || IsLatLong || IsMercator); --#else -- return false; --#endif // _MOBILE -+ return (projTransform != NULL || IsLatLong || IsMercator); - } - --QString Projection::getProjectionType() const -+QString ProjectionBackend::getProjectionType() const - { - return projType; - } - --QString Projection::getProjectionProj4() const -+QString ProjectionBackend::getProjectionProj4() const - { -- if (IsLatLong) -+ QMutexLocker locker(projMutex.get()); -+ if (IsLatLong) - return "+init=EPSG:4326"; -- else if (IsMercator) -+ if (IsMercator) - return "+init=EPSG:3857"; --#ifndef _MOBILE -- else -- return QString(pj_get_def(theProj, 0)); --#endif -- return QString(); -+ return QString(proj_pj_info(projTransform.get()).definition); - } - --int Projection::projectionRevision() const -+int ProjectionBackend::projectionRevision() const - { - return ProjectionRevision; - } - - // Common routines - --qreal Projection::latAnglePerM() const -+qreal ProjectionBackend::latAnglePerM() const - { - qreal LengthOfOneDegreeLat = EQUATORIALRADIUS * M_PI / 180; - return 1 / LengthOfOneDegreeLat; - } - --qreal Projection::lonAnglePerM(qreal Lat) const -+qreal ProjectionBackend::lonAnglePerM(qreal Lat) const - { - qreal LengthOfOneDegreeLat = EQUATORIALRADIUS * M_PI / 180; - qreal LengthOfOneDegreeLon = LengthOfOneDegreeLat * fabs(cos(Lat)); - return 1 / LengthOfOneDegreeLon; - } - --bool Projection::toXML(QXmlStreamWriter& stream) -+bool ProjectionBackend::toXML(QXmlStreamWriter& stream) - { - bool OK = true; - -@@ -331,7 +224,7 @@ - return OK; - } - --void Projection::fromXML(QXmlStreamReader& stream) -+void ProjectionBackend::fromXML(QXmlStreamReader& stream) - { - if (stream.name() == "Projection") { - QString proj; -@@ -349,7 +242,7 @@ - } - } - --QPointF Projection::mercatorProject(const QPointF& c) const -+QPointF ProjectionBackend::mercatorProject(const QPointF& c) const - { - qreal x = c.x() / 180. * EQUATORIALMETERHALFCIRCUMFERENCE; - qreal y = log(tan(angToRad(c.y())) + 1/cos(angToRad(c.y()))) / M_PI * (EQUATORIALMETERHALFCIRCUMFERENCE); -@@ -357,7 +250,7 @@ - return QPointF(x, y); - } - --Coord Projection::mercatorInverse(const QPointF& point) const -+Coord ProjectionBackend::mercatorInverse(const QPointF& point) const - { - qreal longitude = point.x()*180.0/EQUATORIALMETERHALFCIRCUMFERENCE; - qreal latitude = radToAng(atan(sinh(point.y()/EQUATORIALMETERHALFCIRCUMFERENCE*M_PI))); -diff -Nur merkaartor-0.18.4/src/common/Projection.h merkaartor-0.18.4-proj-remove-legacy-api/src/common/Projection.h ---- merkaartor-0.18.4/src/common/Projection.h 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/common/Projection.h 2021-03-08 11:57:58.643794061 +0100 -@@ -4,77 +4,53 @@ - #include "IProjection.h" - #include "Coord.h" - --#include <QPointF> -- --#ifndef _MOBILE - #include "MerkaartorPreferences.h" - --/* TODO: Proj.4 version 6.0.0 introduces new API changes, but is not widely -- * available yet. Until it is available on most distros, we will keep using the legacy API. -- * A migration will eventually be necessary (more research is needed). */ --#define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H 1 --#include <proj_api.h> - --typedef projPJ ProjProjection; -- --#endif // _MOBILE -+#include <QPointF> -+#include <proj.h> -+#include <functional> -+#include <memory> - - class QRect; - class Node; - --class Projection : public IProjection -+class ProjectionBackend : public IProjection - { - public: -- Projection(void); -- virtual ~Projection(void); -+ ProjectionBackend(QString initProjection, std::function<QString(QString)> mapProjectionName); - - qreal latAnglePerM() const; - qreal lonAnglePerM(qreal Lat) const; - QLineF project(const QLineF & Map) const; - QPointF project(const QPointF& Map) const; -- Coord inverse2Coord(const QPointF& Screen) const; -- QPointF inverse2Point(const QPointF& Map) const; -+ QPointF inverse(const QPointF& Map) const; - - bool setProjectionType(QString aProjectionType); - QString getProjectionType() const; - bool projIsLatLong() const; - -- QPointF project(Node* aNode) const; - QRectF toProjectedRectF(const QRectF& Viewport, const QRect& screen) const; - CoordBox fromProjectedRectF(const QRectF& Viewport) const; - - int projectionRevision() const; - QString getProjectionProj4() const; - --#ifndef _MOBILE -- -- static ProjProjection getProjection(QString projString); -- static void projTransform(ProjProjection srcdefn, -- ProjProjection dstdefn, -- long point_count, int point_offset, qreal *x, qreal *y, qreal *z ); -- void projTransformToWGS84(long point_count, int point_offset, qreal *x, qreal *y, qreal *z ) const; -- void projTransformFromWGS84(long point_count, int point_offset, qreal *x, qreal *y, qreal *z ) const; -- --#endif - bool toXML(QXmlStreamWriter& stream); - void fromXML(QXmlStreamReader& stream); - - protected: --#ifndef _MOBILE -- ProjProjection theProj; -+ PJ* getProjection(QString projString); - QPointF projProject(const QPointF& Map) const; - Coord projInverse(const QPointF& Screen) const; - -- ProjProjection theWGS84Proj; --#endif -- - QString projType; - QString projProj4; - QRectF ProjectedViewport; - int ProjectionRevision; - bool IsMercator; - bool IsLatLong; -- -+ std::function<QString(QString)> mapProjectionName; - protected: - QPointF mercatorProject(const QPointF& c) const; - Coord mercatorInverse(const QPointF& point) const; -@@ -88,7 +64,30 @@ - { - return Coord(point.x()/*/EQUATORIALMETERPERDEGREE*/, point.y()/*/EQUATORIALMETERPERDEGREE*/); - } -+private: -+ // Note: keep the order of projCtx and projTransform, as projTransform depends on projCtx. -+ std::shared_ptr<PJ_CONTEXT> projCtx; -+ std::shared_ptr<PJ> projTransform; -+ std::shared_ptr<QMutex> projMutex; -+ // TODO: projTransform is not thread-safe by itself, so we need to protect -+ // it by a mutex. In theory, each thread could have it's own projection -+ // object, but currently the object is copied around. Until this changes, -+ // the mutex stays here. -+}; -+ -+/** -+ * Proxy class to inject M_PREFS externally and allow unit testing of ProjectionBackend itself. -+ */ -+class Projection : public ProjectionBackend { -+ public: -+ static QString mapProjectionName(QString projName) { -+ return M_PREFS->getProjection(projName).projection; -+ } - -+ Projection(void) : -+ ProjectionBackend(M_PREFS->getProjectionType(), mapProjectionName) -+ { -+ } - }; - - -diff -Nur merkaartor-0.18.4/src/Features/Node.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/Features/Node.cpp ---- merkaartor-0.18.4/src/Features/Node.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/Features/Node.cpp 2021-03-08 11:57:58.644794048 +0100 -@@ -373,7 +373,8 @@ - - if ((i = findKey("_waypoint_")) != -1) - D += "<p><b>"+QApplication::translate("MapFeature", "Waypoint")+"</b><br/>"; -- D += "<i>"+QApplication::translate("MapFeature", "coord")+": </i>" + COORD2STRING(position().y()) + " (" + Coord2Sexa(position().y()) + ") / " + COORD2STRING(position().x()) + " (" + Coord2Sexa(position().x()) + ")"; -+ D += "<i>"+QApplication::translate("MapFeature", "WGS84 coordinates")+": </i>" + COORD2STRING(position().y()) + " (" + Coord2Sexa(position().y()) + ") / " + COORD2STRING(position().x()) + " (" + Coord2Sexa(position().x()) + ")<br/>"; -+ D += "<i>"+QApplication::translate("MapFeature", "Projected coordinates")+": </i>" + COORD2STRING(projected().y()) + " / " + COORD2STRING(projected().x()); - - if ((i = findKey("_description_")) != -1) - D += "<br/><i>"+QApplication::translate("MapFeature", "description")+": </i>" + tagValue(i); -diff -Nur merkaartor-0.18.4/src/ImportExport/ImportCSVDialog.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/ImportExport/ImportCSVDialog.cpp ---- merkaartor-0.18.4/src/ImportExport/ImportCSVDialog.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/ImportExport/ImportCSVDialog.cpp 2021-03-08 11:57:58.732792837 +0100 -@@ -237,7 +237,7 @@ - if (CSVProjection.projIsLatLong()) - N->setPosition(p); - else -- N->setPosition(CSVProjection.inverse2Coord(p)); -+ N->setPosition(CSVProjection.inverse(p)); - return N; - } - -diff -Nur merkaartor-0.18.4/src/Layers/ImageMapLayer.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/Layers/ImageMapLayer.cpp ---- merkaartor-0.18.4/src/Layers/ImageMapLayer.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/Layers/ImageMapLayer.cpp 2021-03-08 11:57:58.732792837 +0100 -@@ -97,8 +97,8 @@ - - p->theProjection.setProjectionType(p->theMapAdapter->projection()); - QRectF r = p->theMapAdapter->getBoundingbox(); -- Coord tl = p->theProjection.inverse2Coord(r.topLeft()); -- Coord br = p->theProjection.inverse2Coord(r.bottomRight()); -+ Coord tl = p->theProjection.inverse(r.topLeft()); -+ Coord br = p->theProjection.inverse(r.bottomRight()); - return CoordBox(tl, br); - } - -@@ -691,8 +691,8 @@ - - MapView::transformCalc(p->theTransform, p->theProjection, 0.0, CoordBox(alignedViewport), rect); - -- CoordBox cViewport(p->theProjection.inverse2Coord(p->theTransform.inverted().map(fRect.bottomLeft())), -- p->theProjection.inverse2Coord(p->theTransform.inverted().map(fRect.topRight()))); -+ CoordBox cViewport(p->theProjection.inverse(p->theTransform.inverted().map(fRect.bottomLeft())), -+ p->theProjection.inverse(p->theTransform.inverted().map(fRect.topRight()))); - CoordBox Viewport = CoordBox(p->AlignementTransformList.at(0).mapRect(cViewport)); - QPointF bl = theView.toView(Viewport.bottomLeft()); - QPointF tr = theView.toView(Viewport.topRight()); -@@ -906,8 +906,8 @@ - QPointF vp0Center = QPointF(projVp.width()/2, -projVp.height()/2); - - Coord ulCoord, lrCoord; -- ulCoord = p->theProjection.inverse2Coord(vlm.topLeft()); -- lrCoord = p->theProjection.inverse2Coord(vlm.bottomRight()); -+ ulCoord = p->theProjection.inverse(vlm.topLeft()); -+ lrCoord = p->theProjection.inverse(vlm.bottomRight()); - - const QPointF tl = theView.transform().map(theView.projection().project(ulCoord)); - const QPointF br = theView.transform().map(theView.projection().project(lrCoord)); -diff -Nur merkaartor-0.18.4/src/Layers/OsmRenderLayer.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/Layers/OsmRenderLayer.cpp ---- merkaartor-0.18.4/src/Layers/OsmRenderLayer.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/Layers/OsmRenderLayer.cpp 2021-03-08 11:57:58.732792837 +0100 -@@ -96,8 +96,8 @@ - projR.setTop(projR.top()+dlat); - projR.setRight(projR.right()+dlon); - -- Coord tl = p->theProjection.inverse2Coord(projR.topLeft()); -- Coord br = p->theProjection.inverse2Coord(projR.bottomRight()); -+ Coord tl = p->theProjection.inverse(projR.topLeft()); -+ Coord br = p->theProjection.inverse(projR.bottomRight()); - CoordBox invalidRect(tl, br); - - QMap<RenderPriority, QSet <Feature*> > theFeatures; -diff -Nur merkaartor-0.18.4/src/Main.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/Main.cpp ---- merkaartor-0.18.4/src/Main.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/Main.cpp 2021-03-08 11:57:58.733792823 +0100 -@@ -9,10 +9,7 @@ - #include <qtsingleapplication.h> - #include "MainWindow.h" - #include "Preferences/MerkaartorPreferences.h" --#ifndef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H --#define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H --#endif --#include "proj_api.h" -+#include "proj.h" - #include "gdal_version.h" - #include "Global.h" - -@@ -140,8 +137,8 @@ - - qDebug() << "**** " << QDateTime::currentDateTime().toString(Qt::ISODate) << " -- Starting " << QString("%1 %2").arg(qApp->applicationName()).arg(STRINGIFY(VERSION)); - qDebug() << "-------" << QString("using Qt version %1 (built with %2)").arg(qVersion()).arg(QT_VERSION_STR); -- QString projVer = QString(STRINGIFY(PJ_VERSION)); -- qDebug() << "-------" << QString("using PROJ4 version %1.%2.%3").arg(projVer.left(1)).arg(projVer.mid(1, 1)).arg(projVer.right(1)); -+ PJ_INFO projVer = proj_info(); -+ qDebug() << "-------" << QString("using PROJ version %1.%2.%3").arg(projVer.major).arg(projVer.minor).arg(projVer.patch); - qDebug() << "-------" << QString("using GDAL version %1").arg(GDAL_RELEASE_NAME); - qDebug() << "-------" << "with arguments: " << QCoreApplication::arguments(); - -diff -Nur merkaartor-0.18.4/src/MainWindow.cpp merkaartor-0.18.4-proj-remove-legacy-api/src/MainWindow.cpp ---- merkaartor-0.18.4/src/MainWindow.cpp 2019-11-12 15:09:05.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/src/MainWindow.cpp 2021-03-08 11:57:58.734792809 +0100 -@@ -102,11 +102,7 @@ - #include <locale.h> - #include <limits.h> - --//For About --#ifndef ACCEPT_USE_OF_DEPRECATED_PROJ_API_H --#define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H --#endif --#include "proj_api.h" -+#include "proj.h" - #include "gdal_version.h" - - #include "Utils/SlippyMapWidget.h" -@@ -2103,8 +2099,8 @@ - dlg.setWindowFlags(dlg.windowFlags() | Qt::MSWindowsFixedSizeDialogHint); - About.Version->setText(About.Version->text().arg(STRINGIFY(REVISION))); - About.QTVersion->setText(About.QTVersion->text().arg(qVersion()).arg(QT_VERSION_STR)); -- QString projVer = QString(STRINGIFY(PJ_VERSION)); -- About.Proj4Version->setText(About.Proj4Version->text().arg(QString("%1.%2.%3").arg(projVer.left(1)).arg(projVer.mid(1, 1)).arg(projVer.right(1)))); -+ PJ_INFO projVer = proj_info(); -+ About.ProjVersion->setText(About.ProjVersion->text().arg(QString("%1.%2.%3").arg(projVer.major).arg(projVer.minor).arg(projVer.patch))); - About.GdalVersion->setText(About.GdalVersion->text().arg(GDAL_RELEASE_NAME)); - - QFile ct(":/Utils/CHANGELOG"); -diff -Nur merkaartor-0.18.4/tests/test-projection.cpp merkaartor-0.18.4-proj-remove-legacy-api/tests/test-projection.cpp ---- merkaartor-0.18.4/tests/test-projection.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ merkaartor-0.18.4-proj-remove-legacy-api/tests/test-projection.cpp 2021-03-08 11:57:58.734792809 +0100 -@@ -0,0 +1,85 @@ -+#include <QtTest/QtTest> -+ -+#include "common/Projection.h" -+ -+class TestProjection: public QObject -+{ -+ Q_OBJECT -+ private slots: -+ -+ -+ void projectionInit() { -+ ProjectionBackend proj("EPSG:3857", [](QString x) {return x;}); -+ qDebug() << proj.getProjectionType(); -+ qDebug() << proj.getProjectionProj4(); -+ QCOMPARE(proj.getProjectionType(), "EPSG:3857"); // Would not be set if init failed. -+ } -+ -+ /** -+ * This test verifies the Proj4 library is loaded and correctly identifies non-standard projection. -+ */ -+ void projectionInitProj4() { -+ ProjectionBackend proj("EPSG:5514", [](QString x) {return x;}); -+ qDebug() << proj.getProjectionType(); -+ QCOMPARE(proj.getProjectionType(), "EPSG:5514"); -+ } -+ -+ -+ void projectionWGS84toEPSG3031() { -+ ProjectionBackend proj("EPSG:3031", [](QString x) {return x;}); -+ qDebug() << proj.getProjectionProj4(); -+ } -+ -+ /** -+ * This test verifies proj4 library is able to project correctly from WGS84 to a non-standard projection. -+ */ -+ void projectionWGS84toEPSG5514() { -+ ProjectionBackend proj("+proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=greenwich +units=m +no_defs +towgs84=570.8,85.7,462.8,4.998,1.587,5.261,3.56", [](QString x) {return x;}); -+ QList<QPair<QPointF,QPointF>> list = { -+ {{14.4157,50.1038},{-742955.5923625092255,-1041158.8852684112499}}, -+ {{18.9816,50.1259},{-418013.62494312302442,-1073425.9725897577591}} -+ }; -+ for(auto& pair : list) { -+ QCOMPARE(proj.project(pair.first), pair.second); -+ //QCOMPARE(proj.inverse(pair.second), pair.first); // TODO: This projection does not seem to converge very well. -+ } -+ QBENCHMARK(proj.project(QPointF(14.4157,50.1038))); -+ } -+ -+ /** -+ * Use default "LatLong" projection, which is in fact identity. -+ */ -+ void projectionWGS84toLatLong() { -+ ProjectionBackend proj("EPSG:4326", [](QString x) {return x;}); -+ QPointF point(14.4157,50.1038); -+ QCOMPARE(proj.project(point), point); -+ QCOMPARE(proj.inverse(point), point); -+ QBENCHMARK(proj.project(point)); -+ } -+ -+ /** -+ * This test uses proj4 to do the identity projection. In process, it converts to radians from decimal degrees. -+ */ -+ void projectionWGS84toWGS84() { -+ ProjectionBackend proj("+proj=longlat +datum=WGS84", [](QString x) {return x;}); -+ QPointF point(14.4157,50.1038); -+ QCOMPARE(proj.project(point), point); -+ QCOMPARE(proj.inverse(point), point); -+ QBENCHMARK(proj.project(point)); -+ } -+ -+ /** -+ * Test the internal Mercator projection. -+ */ -+ void projectionWGS84toMercator() { -+ ProjectionBackend proj("EPSG:3857", [](QString x) {return x;}); -+ QPointF point(14.4157,50.1038); -+ QPointF projected(1604748.38320521079,6464271.615268512629); -+ QCOMPARE(proj.project(point), projected); -+ QCOMPARE(proj.inverse(projected), point); -+ QBENCHMARK(proj.project(point)); -+ } -+}; -+ -+QTEST_MAIN(TestProjection) -+#include "test-projection.moc" Deleted: qt-5.15.patch =================================================================== --- qt-5.15.patch 2021-09-04 11:58:01 UTC (rev 1011136) +++ qt-5.15.patch 2021-09-04 11:59:43 UTC (rev 1011137) @@ -1,26 +0,0 @@ -From e72553a7ea2c7ba0634cc3afcd27a9f7cfef089c Mon Sep 17 00:00:00 2001 -From: Andreas Sturmlechner <[email protected]> -Date: Sun, 14 Jun 2020 22:19:24 +0200 -Subject: [PATCH] Fix build with Qt 5.15 (missing QPainterPath include) - -Signed-off-by: Andreas Sturmlechner <[email protected]> ---- - src/Features/Feature.h | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/Features/Feature.h b/src/Features/Feature.h -index 52fd3044..f466a5a9 100644 ---- a/src/Features/Feature.h -+++ b/src/Features/Feature.h -@@ -8,8 +8,10 @@ class Feature; - #include "MapView.h" - #include "FeaturePainter.h" - --#include <QtCore/QString> - #include <QList> -+#include <QPainter> -+#include <QPainterPath> -+#include <QString> - - #define CAST_FEATURE(x) (dynamic_cast<Feature*>(x)) - #define CAST_NODE(x) (dynamic_cast<Node*>(x))
