1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-08 08:14:28 +02:00

Compare commits

...

48 Commits
13.22 ... 13.23

Author SHA1 Message Date
d5415179e4 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2024-07-18 16:09:15 +00:00
b6b64065fb Prefer the map DEM for track/waypoints elevation if present 2024-07-17 01:57:10 +02:00
be75165088 Added land and see areas labels 2024-07-04 00:31:26 +02:00
3e60d0c84a Fixed binary search 2024-07-01 08:58:12 +02:00
4589478957 Translated using Weblate (Swedish)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2024-06-29 08:09:27 +00:00
a4c20f8924 Improve/fix GCS search
Optimize the most common search case (improves PCS loading time)
2024-06-28 09:15:50 +02:00
09833474f1 Merge branch 'origin/master' into Weblate. 2024-06-24 08:49:00 +02:00
804c76a6b8 Translated using Weblate (Turkish)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2024-06-24 08:49:00 +02:00
21da89cad1 Optimization 2024-06-24 08:48:44 +02:00
f8deb573b0 Compute the centroids from projected coordinates 2024-06-24 08:47:46 +02:00
2bfa6b8c1b Translated using Weblate (Korean)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ko/
2024-06-23 12:09:25 +00:00
6312570d5a Translated using Weblate (Spanish)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/es/
2024-06-21 13:00:35 +02:00
raf
23391de792 Translated using Weblate (Catalan)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ca/
2024-06-20 07:09:13 +00:00
df8e8d76b8 Code cleanup 2024-06-20 05:34:13 +02:00
1034c52b39 Fixed memory leak 2024-06-20 05:31:21 +02:00
cc8704ff20 Merge branch 'origin/master' into Weblate. 2024-06-18 16:44:37 +00:00
7a9e4171f9 Fix cut-off labels 2024-06-18 18:43:54 +02:00
625451c041 Merge branch 'origin/master' into Weblate. 2024-06-18 16:13:24 +00:00
ef7b863003 Added bridge clearance rendering 2024-06-18 18:12:43 +02:00
c7f76f3009 Added missing dome symbol 2024-06-18 18:12:02 +02:00
7700ded936 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2024-06-18 12:09:20 +02:00
e8fee5e587 Translated using Weblate (Hungarian)
Currently translated at 100.0% (480 of 480 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2024-06-16 15:09:20 +02:00
450b6a3c39 Merge branch 'origin/master' into Weblate. 2024-06-16 07:05:04 +02:00
e73b9f36c5 Coe cleanup 2024-06-16 07:04:43 +02:00
0d79dca72e Version++ 2024-06-16 07:00:16 +02:00
e49b217b55 Merge branch 'origin/master' into Weblate. 2024-06-15 10:10:54 +00:00
1067ef7352 Merge branch 'origin/master' into Weblate. 2024-06-15 11:34:51 +02:00
80f3f74b47 Merge branch 'origin/master' into Weblate. 2024-06-15 11:29:27 +02:00
e741fab183 Merge branch 'origin/master' into Weblate. 2024-06-12 23:02:46 +02:00
7c434381a3 Merge branch 'origin/master' into Weblate. 2024-06-12 06:49:59 +00:00
22c2204047 Merge branch 'origin/master' into Weblate. 2024-06-12 08:48:22 +02:00
b0af165e53 Merge branch 'origin/master' into Weblate. 2024-06-10 18:37:30 +02:00
0e0dcdd721 Merge branch 'origin/master' into Weblate. 2024-06-09 11:35:44 +00:00
02a7445f86 Merge branch 'origin/master' into Weblate. 2024-06-09 07:37:09 +00:00
55cae2d0cd Merge branch 'origin/master' into Weblate. 2024-06-09 09:17:16 +02:00
9f5e09a664 Merge branch 'origin/master' into Weblate. 2024-06-07 19:30:26 +02:00
1d90ae460c Merge branch 'origin/master' into Weblate. 2024-06-06 18:51:41 +02:00
4c97b427fe Merge branch 'origin/master' into Weblate. 2024-06-05 23:11:26 +00:00
095897d016 Merge branch 'origin/master' into Weblate. 2024-06-05 10:02:02 +02:00
0596c86ea1 Merge branch 'origin/master' into Weblate. 2024-06-05 08:39:49 +02:00
33f6ce2e0e Merge branch 'origin/master' into Weblate. 2024-06-05 06:36:08 +00:00
5b2ac6cde2 Merge branch 'origin/master' into Weblate. 2024-06-04 21:25:48 +00:00
7ff8002387 Merge branch 'origin/master' into Weblate. 2024-05-31 17:50:42 +00:00
515d801e58 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (479 of 479 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/zh_Hans/
2024-05-31 13:09:20 +02:00
b75d805947 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.5% (477 of 479 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2024-05-31 13:09:19 +02:00
ae27b53eb1 Merge branch 'origin/master' into Weblate. 2024-05-29 17:01:57 +00:00
edae24f443 Merge branch 'origin/master' into Weblate. 2024-05-29 18:58:05 +02:00
d1dc4251f0 Translated using Weblate (Hungarian)
Currently translated at 100.0% (479 of 479 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2024-05-29 08:09:12 +02:00
65 changed files with 359 additions and 354 deletions

View File

@ -1,4 +1,4 @@
version: 13.22.{build} version: 13.23.{build}
configuration: configuration:
- Release - Release

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else { } else {
TARGET = GPXSee TARGET = GPXSee
} }
VERSION = 13.22 VERSION = 13.23
QT += core \ QT += core \
@ -39,12 +39,9 @@ HEADERS += src/common/config.h \
src/common/greatcircle.h \ src/common/greatcircle.h \
src/common/programpaths.h \ src/common/programpaths.h \
src/common/tifffile.h \ src/common/tifffile.h \
src/common/downloader.h \
src/common/polygon.h \ src/common/polygon.h \
src/common/color.h \ src/common/color.h \
src/common/csv.h \ src/common/csv.h \
src/common/dem.h \
src/common/demloader.h \
src/GUI/crosshairitem.h \ src/GUI/crosshairitem.h \
src/GUI/motioninfoitem.h \ src/GUI/motioninfoitem.h \
src/GUI/pluginparameters.h \ src/GUI/pluginparameters.h \
@ -122,6 +119,8 @@ HEADERS += src/common/config.h \
src/data/gpsdumpparser.h \ src/data/gpsdumpparser.h \
src/data/style.h \ src/data/style.h \
src/data/twonavparser.h \ src/data/twonavparser.h \
src/map/downloader.h \
src/map/demloader.h \
src/map/ENC/attributes.h \ src/map/ENC/attributes.h \
src/map/ENC/mapdata.h \ src/map/ENC/mapdata.h \
src/map/ENC/atlasdata.h \ src/map/ENC/atlasdata.h \
@ -196,6 +195,7 @@ HEADERS += src/common/config.h \
src/map/sqlitemap.h \ src/map/sqlitemap.h \
src/map/utm.h \ src/map/utm.h \
src/map/map.h \ src/map/map.h \
src/map/dem.h \
src/map/maplist.h \ src/map/maplist.h \
src/map/onlinemap.h \ src/map/onlinemap.h \
src/map/tile.h \ src/map/tile.h \
@ -281,10 +281,7 @@ SOURCES += src/main.cpp \
src/common/greatcircle.cpp \ src/common/greatcircle.cpp \
src/common/programpaths.cpp \ src/common/programpaths.cpp \
src/common/tifffile.cpp \ src/common/tifffile.cpp \
src/common/downloader.cpp \
src/common/csv.cpp \ src/common/csv.cpp \
src/common/dem.cpp \
src/common/demloader.cpp \
src/GUI/crosshairitem.cpp \ src/GUI/crosshairitem.cpp \
src/GUI/motioninfoitem.cpp \ src/GUI/motioninfoitem.cpp \
src/GUI/pluginparameters.cpp \ src/GUI/pluginparameters.cpp \
@ -347,6 +344,8 @@ SOURCES += src/main.cpp \
src/GUI/pngexportdialog.cpp \ src/GUI/pngexportdialog.cpp \
src/GUI/projectioncombobox.cpp \ src/GUI/projectioncombobox.cpp \
src/GUI/passwordedit.cpp \ src/GUI/passwordedit.cpp \
src/map/downloader.cpp \
src/map/demloader.cpp \
src/map/ENC/atlasdata.cpp \ src/map/ENC/atlasdata.cpp \
src/map/ENC/mapdata.cpp \ src/map/ENC/mapdata.cpp \
src/map/ENC/rastertile.cpp \ src/map/ENC/rastertile.cpp \
@ -436,6 +435,7 @@ SOURCES += src/main.cpp \
src/map/geocentric.cpp \ src/map/geocentric.cpp \
src/map/jnxmap.cpp \ src/map/jnxmap.cpp \
src/map/map.cpp \ src/map/map.cpp \
src/map/dem.cpp \
src/map/geotiffmap.cpp \ src/map/geotiffmap.cpp \
src/map/image.cpp \ src/map/image.cpp \
src/map/mbtilesmap.cpp \ src/map/mbtilesmap.cpp \

View File

@ -168,6 +168,7 @@
<file alias="deviation-dolphin.png">icons/map/marine/deviation-dolphin.png</file> <file alias="deviation-dolphin.png">icons/map/marine/deviation-dolphin.png</file>
<file alias="kelp.png">icons/map/marine/kelp.png</file> <file alias="kelp.png">icons/map/marine/kelp.png</file>
<file alias="eddies.png">icons/map/marine/eddies.png</file> <file alias="eddies.png">icons/map/marine/eddies.png</file>
<file alias="dome.png">icons/map/marine/dome.png</file>
</qresource> </qresource>
<!-- Mapsforge rendertheme --> <!-- Mapsforge rendertheme -->

BIN
icons/map/marine/dome.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

View File

@ -1894,7 +1894,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>Clarejar:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -1887,7 +1887,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>Focos:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -1870,7 +1870,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>Világosítás:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -172,7 +172,7 @@
<message> <message>
<location filename="../src/data/data.cpp" line="180"/> <location filename="../src/data/data.cpp" line="180"/>
<source>GPSDump files</source> <source>GPSDump files</source>
<translation type="unfinished"></translation> <translation>GPSDump </translation>
</message> </message>
<message> <message>
<location filename="../src/data/data.cpp" line="181"/> <location filename="../src/data/data.cpp" line="181"/>
@ -414,7 +414,7 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="276"/> <location filename="../src/GUI/gui.cpp" line="276"/>
<source>Clear list</source> <source>Clear list</source>
<translation type="unfinished"></translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="288"/> <location filename="../src/GUI/gui.cpp" line="288"/>
@ -571,12 +571,12 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="458"/> <location filename="../src/GUI/gui.cpp" line="458"/>
<source>Download data DEM</source> <source>Download data DEM</source>
<translation type="unfinished"></translation> <translation> DEM </translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="464"/> <location filename="../src/GUI/gui.cpp" line="464"/>
<source>Download map DEM</source> <source>Download map DEM</source>
<translation type="unfinished"></translation> <translation> DEM </translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="469"/> <location filename="../src/GUI/gui.cpp" line="469"/>
@ -586,7 +586,7 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="472"/> <location filename="../src/GUI/gui.cpp" line="472"/>
<source>Show hillshading</source> <source>Show hillshading</source>
<translation type="unfinished"></translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="480"/> <location filename="../src/GUI/gui.cpp" line="480"/>
@ -708,7 +708,7 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="646"/> <location filename="../src/GUI/gui.cpp" line="646"/>
<source>Open recent</source> <source>Open recent</source>
<translation type="unfinished"></translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="671"/> <location filename="../src/GUI/gui.cpp" line="671"/>
@ -1025,13 +1025,13 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="1961"/> <location filename="../src/GUI/gui.cpp" line="1961"/>
<source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source> <source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source>
<translation type="unfinished"></translation> <translation>DEM . .</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/GUI/gui.cpp" line="1964"/> <location filename="../src/GUI/gui.cpp" line="1964"/>
<source>Download %n DEM tiles?</source> <source>Download %n DEM tiles?</source>
<translation type="unfinished"> <translation>
<numerusform></numerusform> <numerusform>%n개의 DEM ?</numerusform>
</translation> </translation>
</message> </message>
<message> <message>
@ -1442,7 +1442,7 @@
<location filename="../src/GUI/optionsdialog.cpp" line="265"/> <location filename="../src/GUI/optionsdialog.cpp" line="265"/>
<location filename="../src/GUI/optionsdialog.cpp" line="628"/> <location filename="../src/GUI/optionsdialog.cpp" line="628"/>
<source>px</source> <source>px</source>
<translation type="unfinished">px</translation> <translation>px</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="163"/> <location filename="../src/GUI/optionsdialog.cpp" line="163"/>
@ -1840,27 +1840,27 @@
<location filename="../src/GUI/optionsdialog.cpp" line="306"/> <location filename="../src/GUI/optionsdialog.cpp" line="306"/>
<location filename="../src/GUI/optionsdialog.cpp" line="644"/> <location filename="../src/GUI/optionsdialog.cpp" line="644"/>
<source>Opacity:</source> <source>Opacity:</source>
<translation type="unfinished"></translation> <translation>:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="646"/> <location filename="../src/GUI/optionsdialog.cpp" line="646"/>
<source>Blur radius:</source> <source>Blur radius:</source>
<translation type="unfinished"></translation> <translation> :</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="648"/> <location filename="../src/GUI/optionsdialog.cpp" line="648"/>
<source>Azimuth:</source> <source>Azimuth:</source>
<translation type="unfinished"></translation> <translation>:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="649"/> <location filename="../src/GUI/optionsdialog.cpp" line="649"/>
<source>Altitude:</source> <source>Altitude:</source>
<translation type="unfinished"></translation> <translation>:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="650"/> <location filename="../src/GUI/optionsdialog.cpp" line="650"/>
<source>Z Factor:</source> <source>Z Factor:</source>
<translation type="unfinished"></translation> <translation>Z :</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="655"/> <location filename="../src/GUI/optionsdialog.cpp" line="655"/>
@ -1871,7 +1871,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="656"/> <location filename="../src/GUI/optionsdialog.cpp" line="656"/>
<source>Hillshading</source> <source>Hillshading</source>
<translation type="unfinished"></translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="676"/> <location filename="../src/GUI/optionsdialog.cpp" line="676"/>
@ -1892,7 +1892,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -1033,7 +1033,7 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="1961"/> <location filename="../src/GUI/gui.cpp" line="1961"/>
<source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source> <source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source>
<translation type="unfinished"></translation> <translation>Nedlastingsgrensen for DEM-fliser er overskredet. Hvis du virkelig trenger data for et stort område, last ned filene manuelt.</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="1977"/> <location filename="../src/GUI/gui.cpp" line="1977"/>
@ -1770,7 +1770,7 @@
<location filename="../src/GUI/optionsdialog.cpp" line="265"/> <location filename="../src/GUI/optionsdialog.cpp" line="265"/>
<location filename="../src/GUI/optionsdialog.cpp" line="628"/> <location filename="../src/GUI/optionsdialog.cpp" line="628"/>
<source>px</source> <source>px</source>
<translation type="unfinished">px</translation> <translation>px</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="301"/> <location filename="../src/GUI/optionsdialog.cpp" line="301"/>
@ -1887,7 +1887,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>Bleking:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -860,14 +860,14 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="1961"/> <location filename="../src/GUI/gui.cpp" line="1961"/>
<source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source> <source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source>
<translation type="unfinished"></translation> <translation>DEM-kartrutors nedladdningsgräns har överskridits. Ladda ner filer manuellt, om du verkligen behöver data för ett stort område.</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/GUI/gui.cpp" line="1964"/> <location filename="../src/GUI/gui.cpp" line="1964"/>
<source>Download %n DEM tiles?</source> <source>Download %n DEM tiles?</source>
<translation type="unfinished"> <translation>
<numerusform></numerusform> <numerusform>Vill du ladda ner %n DEM-kartruta?</numerusform>
<numerusform></numerusform> <numerusform>Vill du ladda ner %n DEM-kartrutor?</numerusform>
</translation> </translation>
</message> </message>
<message> <message>
@ -966,12 +966,12 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="458"/> <location filename="../src/GUI/gui.cpp" line="458"/>
<source>Download data DEM</source> <source>Download data DEM</source>
<translation type="unfinished"></translation> <translation>Ladda ner data DEM</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="464"/> <location filename="../src/GUI/gui.cpp" line="464"/>
<source>Download map DEM</source> <source>Download map DEM</source>
<translation type="unfinished"></translation> <translation>Ladda ner karta DEM</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="739"/> <location filename="../src/GUI/gui.cpp" line="739"/>
@ -1750,7 +1750,7 @@
<location filename="../src/GUI/optionsdialog.cpp" line="265"/> <location filename="../src/GUI/optionsdialog.cpp" line="265"/>
<location filename="../src/GUI/optionsdialog.cpp" line="628"/> <location filename="../src/GUI/optionsdialog.cpp" line="628"/>
<source>px</source> <source>px</source>
<translation type="unfinished">px</translation> <translation>px</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="175"/> <location filename="../src/GUI/optionsdialog.cpp" line="175"/>
@ -1835,27 +1835,27 @@
<location filename="../src/GUI/optionsdialog.cpp" line="306"/> <location filename="../src/GUI/optionsdialog.cpp" line="306"/>
<location filename="../src/GUI/optionsdialog.cpp" line="644"/> <location filename="../src/GUI/optionsdialog.cpp" line="644"/>
<source>Opacity:</source> <source>Opacity:</source>
<translation type="unfinished"></translation> <translation>Opacitet:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="646"/> <location filename="../src/GUI/optionsdialog.cpp" line="646"/>
<source>Blur radius:</source> <source>Blur radius:</source>
<translation type="unfinished"></translation> <translation>Oskärperadie:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="648"/> <location filename="../src/GUI/optionsdialog.cpp" line="648"/>
<source>Azimuth:</source> <source>Azimuth:</source>
<translation type="unfinished"></translation> <translation>Azimut:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="649"/> <location filename="../src/GUI/optionsdialog.cpp" line="649"/>
<source>Altitude:</source> <source>Altitude:</source>
<translation type="unfinished"></translation> <translation>Altitud:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="650"/> <location filename="../src/GUI/optionsdialog.cpp" line="650"/>
<source>Z Factor:</source> <source>Z Factor:</source>
<translation type="unfinished"></translation> <translation>Z-faktor:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="655"/> <location filename="../src/GUI/optionsdialog.cpp" line="655"/>
@ -1866,7 +1866,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="656"/> <location filename="../src/GUI/optionsdialog.cpp" line="656"/>
<source>Hillshading</source> <source>Hillshading</source>
<translation type="unfinished"></translation> <translation>Bergskuggning</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="676"/> <location filename="../src/GUI/optionsdialog.cpp" line="676"/>
@ -1887,7 +1887,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>Belysning:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -1885,7 +1885,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>ıklandırma:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -576,7 +576,7 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="472"/> <location filename="../src/GUI/gui.cpp" line="472"/>
<source>Show hillshading</source> <source>Show hillshading</source>
<translation type="unfinished"></translation> <translation>Показати затінення пагорба</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="480"/> <location filename="../src/GUI/gui.cpp" line="480"/>
@ -752,10 +752,10 @@
<message numerus="yes"> <message numerus="yes">
<location filename="../src/GUI/gui.cpp" line="1964"/> <location filename="../src/GUI/gui.cpp" line="1964"/>
<source>Download %n DEM tiles?</source> <source>Download %n DEM tiles?</source>
<translation type="unfinished"> <translation>
<numerusform></numerusform> <numerusform>Завантажити %n плитку DEM?</numerusform>
<numerusform></numerusform> <numerusform>Завантажити %n плитки DEM?</numerusform>
<numerusform></numerusform> <numerusform>Завантажити %n плиток DEM?</numerusform>
</translation> </translation>
</message> </message>
<message> <message>
@ -1034,7 +1034,7 @@
<message> <message>
<location filename="../src/GUI/gui.cpp" line="1961"/> <location filename="../src/GUI/gui.cpp" line="1961"/>
<source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source> <source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source>
<translation type="unfinished"></translation> <translation>Перевищено ліміт завантаження плиток DEM. Якщо вам дійсно потрібні дані для такої величезної території, завантажте файли вручну.</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/gui.cpp" line="1977"/> <location filename="../src/GUI/gui.cpp" line="1977"/>
@ -1753,7 +1753,7 @@
<location filename="../src/GUI/optionsdialog.cpp" line="265"/> <location filename="../src/GUI/optionsdialog.cpp" line="265"/>
<location filename="../src/GUI/optionsdialog.cpp" line="628"/> <location filename="../src/GUI/optionsdialog.cpp" line="628"/>
<source>px</source> <source>px</source>
<translation type="unfinished">px</translation> <translation>ап</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="301"/> <location filename="../src/GUI/optionsdialog.cpp" line="301"/>
@ -1822,27 +1822,27 @@
<location filename="../src/GUI/optionsdialog.cpp" line="306"/> <location filename="../src/GUI/optionsdialog.cpp" line="306"/>
<location filename="../src/GUI/optionsdialog.cpp" line="644"/> <location filename="../src/GUI/optionsdialog.cpp" line="644"/>
<source>Opacity:</source> <source>Opacity:</source>
<translation type="unfinished"></translation> <translation>Непрозорість:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="646"/> <location filename="../src/GUI/optionsdialog.cpp" line="646"/>
<source>Blur radius:</source> <source>Blur radius:</source>
<translation type="unfinished"></translation> <translation>Радіус розмиття:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="648"/> <location filename="../src/GUI/optionsdialog.cpp" line="648"/>
<source>Azimuth:</source> <source>Azimuth:</source>
<translation type="unfinished"></translation> <translation>Азимут:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="649"/> <location filename="../src/GUI/optionsdialog.cpp" line="649"/>
<source>Altitude:</source> <source>Altitude:</source>
<translation type="unfinished"></translation> <translation>Висота:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="650"/> <location filename="../src/GUI/optionsdialog.cpp" line="650"/>
<source>Z Factor:</source> <source>Z Factor:</source>
<translation type="unfinished"></translation> <translation>Фактор Z:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="655"/> <location filename="../src/GUI/optionsdialog.cpp" line="655"/>
@ -1853,7 +1853,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="656"/> <location filename="../src/GUI/optionsdialog.cpp" line="656"/>
<source>Hillshading</source> <source>Hillshading</source>
<translation type="unfinished"></translation> <translation>Затінення пагорба</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="676"/> <location filename="../src/GUI/optionsdialog.cpp" line="676"/>
@ -1874,7 +1874,7 @@
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="645"/> <location filename="../src/GUI/optionsdialog.cpp" line="645"/>
<source>Lightening:</source> <source>Lightening:</source>
<translation type="unfinished"></translation> <translation>Освітлення:</translation>
</message> </message>
<message> <message>
<location filename="../src/GUI/optionsdialog.cpp" line="702"/> <location filename="../src/GUI/optionsdialog.cpp" line="702"/>

View File

@ -37,7 +37,7 @@ Unicode true
; The name of the installer ; The name of the installer
Name "GPXSee" Name "GPXSee"
; Program version ; Program version
!define VERSION "13.22" !define VERSION "13.23"
; The file to write ; The file to write
OutFile "GPXSee-${VERSION}_x64.exe" OutFile "GPXSee-${VERSION}_x64.exe"

View File

@ -13,8 +13,8 @@
#endif // Q_OS_ANDROID #endif // Q_OS_ANDROID
#include "common/programpaths.h" #include "common/programpaths.h"
#include "common/config.h" #include "common/config.h"
#include "common/downloader.h" #include "map/downloader.h"
#include "common/dem.h" #include "map/dem.h"
#include "map/ellipsoid.h" #include "map/ellipsoid.h"
#include "map/gcs.h" #include "map/gcs.h"
#include "map/conversion.h" #include "map/conversion.h"

View File

@ -39,8 +39,9 @@ void CadenceGraph::setInfo()
clearInfo(); clearInfo();
} }
QList<GraphItem*> CadenceGraph::loadData(const Data &data) QList<GraphItem*> CadenceGraph::loadData(const Data &data, Map *map)
{ {
Q_UNUSED(map);
QList<GraphItem*> graphs; QList<GraphItem*> graphs;
for (int i = 0; i < data.tracks().count(); i++) { for (int i = 0; i < data.tracks().count(); i++) {

View File

@ -14,7 +14,7 @@ public:
~CadenceGraph(); ~CadenceGraph();
QString label() const {return tr("Cadence");} QString label() const {return tr("Cadence");}
QList<GraphItem*> loadData(const Data &data); QList<GraphItem*> loadData(const Data &data, Map *map);
void clear(); void clear();
void showTracks(bool show); void showTracks(bool show);

View File

@ -118,14 +118,14 @@ GraphItem *ElevationGraph::loadGraph(const Graph &graph, PathType type,
return gi; return gi;
} }
QList<GraphItem*> ElevationGraph::loadData(const Data &data) QList<GraphItem*> ElevationGraph::loadData(const Data &data, Map *map)
{ {
QList<GraphItem*> graphs; QList<GraphItem*> graphs;
GraphItem *primary, *secondary; GraphItem *primary, *secondary;
for (int i = 0; i < data.tracks().count(); i++) { for (int i = 0; i < data.tracks().count(); i++) {
QColor color(_palette.nextColor()); QColor color(_palette.nextColor());
const GraphPair &gp = data.tracks().at(i).elevation(); const GraphPair &gp = data.tracks().at(i).elevation(map);
primary = loadGraph(gp.primary(), TrackPath, color, true); primary = loadGraph(gp.primary(), TrackPath, color, true);
secondary = primary secondary = primary
@ -137,7 +137,7 @@ QList<GraphItem*> ElevationGraph::loadData(const Data &data)
} }
for (int i = 0; i < data.routes().count(); i++) { for (int i = 0; i < data.routes().count(); i++) {
QColor color(_palette.nextColor()); QColor color(_palette.nextColor());
const GraphPair &gp = data.routes().at(i).elevation(); const GraphPair &gp = data.routes().at(i).elevation(map);
primary = loadGraph(gp.primary(), RoutePath, color, true); primary = loadGraph(gp.primary(), RoutePath, color, true);
secondary = primary secondary = primary

View File

@ -14,7 +14,7 @@ public:
~ElevationGraph(); ~ElevationGraph();
QString label() const {return tr("Elevation");} QString label() const {return tr("Elevation");}
QList<GraphItem*> loadData(const Data &data); QList<GraphItem*> loadData(const Data &data, Map *map);
void clear(); void clear();
void setUnits(enum Units units); void setUnits(enum Units units);
void showTracks(bool show); void showTracks(bool show);

View File

@ -43,8 +43,9 @@ void GearRatioGraph::setInfo()
clearInfo(); clearInfo();
} }
QList<GraphItem*> GearRatioGraph::loadData(const Data &data) QList<GraphItem*> GearRatioGraph::loadData(const Data &data, Map *map)
{ {
Q_UNUSED(map);
QList<GraphItem*> graphs; QList<GraphItem*> graphs;
for (int i = 0; i < data.tracks().count(); i++) { for (int i = 0; i < data.tracks().count(); i++) {

View File

@ -15,7 +15,7 @@ public:
~GearRatioGraph(); ~GearRatioGraph();
QString label() const {return tr("Gear ratio");} QString label() const {return tr("Gear ratio");}
QList<GraphItem*> loadData(const Data &data); QList<GraphItem*> loadData(const Data &data, Map *map);
void clear(); void clear();
void showTracks(bool show); void showTracks(bool show);

View File

@ -7,6 +7,7 @@
#include "units.h" #include "units.h"
#include "timetype.h" #include "timetype.h"
class Map;
class Data; class Data;
class GraphItem; class GraphItem;
@ -24,7 +25,7 @@ public:
virtual ~GraphTab() {} virtual ~GraphTab() {}
virtual QString label() const = 0; virtual QString label() const = 0;
virtual QList<GraphItem*> loadData(const Data &data) = 0; virtual QList<GraphItem*> loadData(const Data &data, Map *map) = 0;
virtual void clear() {GraphView::clear();} virtual void clear() {GraphView::clear();}
virtual void setUnits(enum Units units) {GraphView::setUnits(units);} virtual void setUnits(enum Units units) {GraphView::setUnits(units);}
virtual void setGraphType(GraphType type) {GraphView::setGraphType(type);} virtual void setGraphType(GraphType type) {GraphView::setGraphType(type);}

View File

@ -29,10 +29,10 @@
#include <QGeoPositionInfoSource> #include <QGeoPositionInfoSource>
#include "common/config.h" #include "common/config.h"
#include "common/programpaths.h" #include "common/programpaths.h"
#include "common/downloader.h"
#include "common/demloader.h"
#include "data/data.h" #include "data/data.h"
#include "data/poi.h" #include "data/poi.h"
#include "map/downloader.h"
#include "map/demloader.h"
#include "map/maplist.h" #include "map/maplist.h"
#include "map/emptymap.h" #include "map/emptymap.h"
#include "map/crs.h" #include "map/crs.h"
@ -1145,7 +1145,7 @@ void GUI::loadData(const Data &data)
_pathName = QString(); _pathName = QString();
for (int i = 0; i < _tabs.count(); i++) for (int i = 0; i < _tabs.count(); i++)
graphs.append(_tabs.at(i)->loadData(data)); graphs.append(_tabs.at(i)->loadData(data, _map));
if (updateGraphTabs()) if (updateGraphTabs())
_splitter->refresh(); _splitter->refresh();
paths = _mapView->loadData(data); paths = _mapView->loadData(data);

View File

@ -39,8 +39,9 @@ void HeartRateGraph::setInfo()
clearInfo(); clearInfo();
} }
QList<GraphItem*> HeartRateGraph::loadData(const Data &data) QList<GraphItem*> HeartRateGraph::loadData(const Data &data, Map *map)
{ {
Q_UNUSED(map);
QList<GraphItem*> graphs; QList<GraphItem*> graphs;
for (int i = 0; i < data.tracks().count(); i++) { for (int i = 0; i < data.tracks().count(); i++) {

View File

@ -14,7 +14,7 @@ public:
~HeartRateGraph(); ~HeartRateGraph();
QString label() const {return tr("Heart rate");} QString label() const {return tr("Heart rate");}
QList<GraphItem*> loadData(const Data &data); QList<GraphItem*> loadData(const Data &data, Map *map);
void clear(); void clear();
void showTracks(bool show); void showTracks(bool show);

View File

@ -39,8 +39,9 @@ void PowerGraph::setInfo()
clearInfo(); clearInfo();
} }
QList<GraphItem*> PowerGraph::loadData(const Data &data) QList<GraphItem*> PowerGraph::loadData(const Data &data, Map *map)
{ {
Q_UNUSED(map);
QList<GraphItem*> graphs; QList<GraphItem*> graphs;
for (int i = 0; i < data.tracks().count(); i++) { for (int i = 0; i < data.tracks().count(); i++) {

View File

@ -14,7 +14,7 @@ public:
~PowerGraph(); ~PowerGraph();
QString label() const {return tr("Power");} QString label() const {return tr("Power");}
QList<GraphItem*> loadData(const Data &data); QList<GraphItem*> loadData(const Data &data, Map *map);
void clear(); void clear();
void showTracks(bool show); void showTracks(bool show);

View File

@ -69,8 +69,9 @@ GraphItem *SpeedGraph::loadGraph(const Graph &graph, const Track &track,
return gi; return gi;
} }
QList<GraphItem*> SpeedGraph::loadData(const Data &data) QList<GraphItem*> SpeedGraph::loadData(const Data &data, Map *map)
{ {
Q_UNUSED(map);
QList<GraphItem*> graphs; QList<GraphItem*> graphs;
for (int i = 0; i < data.tracks().count(); i++) { for (int i = 0; i < data.tracks().count(); i++) {

View File

@ -16,7 +16,7 @@ public:
~SpeedGraph(); ~SpeedGraph();
QString label() const {return tr("Speed");} QString label() const {return tr("Speed");}
QList<GraphItem*> loadData(const Data &data); QList<GraphItem*> loadData(const Data &data, Map *map);
void clear(); void clear();
void setUnits(Units units); void setUnits(Units units);
void setTimeType(TimeType type); void setTimeType(TimeType type);

View File

@ -43,8 +43,9 @@ void TemperatureGraph::setInfo()
clearInfo(); clearInfo();
} }
QList<GraphItem*> TemperatureGraph::loadData(const Data &data) QList<GraphItem*> TemperatureGraph::loadData(const Data &data, Map *map)
{ {
Q_UNUSED(map);
QList<GraphItem*> graphs; QList<GraphItem*> graphs;
for (int i = 0; i < data.tracks().count(); i++) { for (int i = 0; i < data.tracks().count(); i++) {

View File

@ -14,7 +14,7 @@ public:
~TemperatureGraph(); ~TemperatureGraph();
QString label() const {return tr("Temperature");} QString label() const {return tr("Temperature");}
QList<GraphItem*> loadData(const Data &data); QList<GraphItem*> loadData(const Data &data, Map *map);
void clear(); void clear();
void setUnits(enum Units units); void setUnits(enum Units units);
void showTracks(bool show); void showTracks(bool show);

View File

@ -25,7 +25,7 @@ ToolTip WaypointItem::info() const
tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name()); tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name());
tt.insert(qApp->translate("WaypointItem", "Coordinates"), tt.insert(qApp->translate("WaypointItem", "Coordinates"),
Format::coordinates(_waypoint.coordinates(), _format)); Format::coordinates(_waypoint.coordinates(), _format));
QPair<qreal, qreal> elevations(_waypoint.elevations()); QPair<qreal, qreal> elevations(_waypoint.elevations(_map));
if (!std::isnan(elevations.first)) { if (!std::isnan(elevations.first)) {
QString val = Format::elevation(elevations.first, _units); QString val = Format::elevation(elevations.first, _units);
if (!std::isnan(elevations.second)) if (!std::isnan(elevations.second))
@ -71,7 +71,7 @@ ToolTip WaypointItem::info() const
} }
WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map, WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
QGraphicsItem *parent) : GraphicsItem(parent) QGraphicsItem *parent) : GraphicsItem(parent), _map(map)
{ {
_waypoint = waypoint; _waypoint = waypoint;
_showLabel = false; _showLabel = false;
@ -93,6 +93,12 @@ WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
} }
void WaypointItem::setMap(Map *map)
{
_map = map;
setPos(map->ll2xy(_waypoint.coordinates()));
}
void WaypointItem::updateCache() void WaypointItem::updateCache()
{ {
QPainterPath p; QPainterPath p;

View File

@ -17,7 +17,7 @@ public:
const Waypoint &waypoint() const {return _waypoint;} const Waypoint &waypoint() const {return _waypoint;}
void setMap(Map *map) {setPos(map->ll2xy(_waypoint.coordinates()));} void setMap(Map *map);
void setSize(int size); void setSize(int size);
void setColor(const QColor &color); void setColor(const QColor &color);
void showLabel(bool show); void showLabel(bool show);
@ -51,6 +51,8 @@ private:
Waypoint _waypoint; Waypoint _waypoint;
Map *_map;
QColor _color; QColor _color;
int _size; int _size;
bool _showLabel; bool _showLabel;

View File

@ -19,9 +19,9 @@ public:
private: private:
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) || defined(Q_OS_ANDROID) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) || defined(Q_OS_ANDROID)
QTextCodec *_codec; QTextCodec *_codec;
#else // QT 6.5 #else // QT 6 || ANDROID
QStringDecoder _decoder; QStringDecoder _decoder;
#endif // QT 6.5 #endif // QT 6 || ANDROID
}; };
#endif // TEXTCODEC_H #endif // TEXTCODEC_H

View File

@ -1,7 +1,6 @@
#include <QtEndian> #include <QtEndian>
#include "fitparser.h" #include "fitparser.h"
#define FIT_MAGIC 0x5449462E // .FIT #define FIT_MAGIC 0x5449462E // .FIT
#define RECORD_MESSAGE 20 #define RECORD_MESSAGE 20
@ -10,60 +9,6 @@
#define COURSE_POINT 32 #define COURSE_POINT 32
#define TIMESTAMP_FIELD 253 #define TIMESTAMP_FIELD 253
class Event {
public:
Event() : id(0), type(0), data(0) {}
quint8 id;
quint8 type;
quint32 data;
};
struct FileHeader {
quint8 headerSize;
quint8 protocolVersion;
quint16 profileVersion;
quint32 dataSize;
quint32 magic;
};
struct FITParser::Field {
quint8 id;
quint8 size;
quint8 type;
};
class FITParser::MessageDefinition {
public:
MessageDefinition() : endian(0), globalId(0), numFields(0), fields(0),
numDevFields(0), devFields(0) {}
~MessageDefinition() {delete[] fields; delete[] devFields;}
quint8 endian;
quint16 globalId;
quint8 numFields;
Field *fields;
quint8 numDevFields;
Field *devFields;
};
class FITParser::CTX {
public:
CTX(QFile *file, QVector<Waypoint> &waypoints)
: file(file), waypoints(waypoints), len(0), endian(0), timestamp(0),
ratio(NAN) {}
QFile *file;
QVector<Waypoint> &waypoints;
quint32 len;
quint8 endian;
quint32 timestamp;
MessageDefinition defs[16];
qreal ratio;
Trackpoint trackpoint;
SegmentData segment;
};
static QMap<int, QString> coursePointSymbolsInit() static QMap<int, QString> coursePointSymbolsInit()
{ {
QMap<int, QString> map; QMap<int, QString> map;
@ -178,22 +123,14 @@ bool FITParser::skipValue(CTX &ctx, quint8 size)
bool FITParser::parseDefinitionMessage(CTX &ctx, quint8 header) bool FITParser::parseDefinitionMessage(CTX &ctx, quint8 header)
{ {
int local_id = header & 0x0f; MessageDefinition *def = &(ctx.defs[header & 0x0f]);
MessageDefinition *def = &(ctx.defs[local_id]); quint8 numFields;
quint8 i;
def->fields.clear();
if (def->fields) { def->devFields.clear();
delete[] def->fields;
def->fields = 0;
}
if (def->devFields) {
delete[] def->devFields;
def->devFields = 0;
}
// reserved/unused // reserved/unused
if (!readValue(ctx, i)) if (!skipValue(ctx, 1))
return false; return false;
// endianness // endianness
@ -209,40 +146,35 @@ bool FITParser::parseDefinitionMessage(CTX &ctx, quint8 header)
if (!readValue(ctx, def->globalId)) if (!readValue(ctx, def->globalId))
return false; return false;
// number of records // definition records
if (!readValue(ctx, def->numFields)) if (!readValue(ctx, numFields))
return false; return false;
// definition records def->fields.resize(numFields);
def->fields = new Field[def->numFields]; for (int i = 0; i < def->fields.size(); i++) {
for (i = 0; i < def->numFields; i++) { if (!readData(ctx.file, (char*)&(def->fields[i]), sizeof(Field)))
static_assert(sizeof(def->fields[i]) == 3, "Invalid Field alignment");
if (!readData(ctx.file, (char*)&(def->fields[i]),
sizeof(def->fields[i])))
return false; return false;
ctx.len -= sizeof(def->fields[i]); ctx.len -= sizeof(Field);
} }
// developer definition records // developer definition records
if (header & 0x20) { if (header & 0x20) {
if (!readValue(ctx, def->numDevFields)) if (!readValue(ctx, numFields))
return false; return false;
def->devFields = new Field[def->numDevFields]; def->devFields.resize(numFields);
for (i = 0; i < def->numDevFields; i++) { for (int i = 0; i < def->devFields.size(); i++) {
static_assert(sizeof(def->fields[i]) == 3, "Invalid Field alignment"); if (!readData(ctx.file, (char*)&(def->devFields[i]), sizeof(Field)))
if (!readData(ctx.file, (char*)&(def->devFields[i]),
sizeof(def->devFields[i])))
return false; return false;
ctx.len -= sizeof(def->devFields[i]); ctx.len -= sizeof(Field);
}
} }
} else
def->numDevFields = 0;
return true; return true;
} }
bool FITParser::readField(CTX &ctx, Field *field, QVariant &val, bool &valid) bool FITParser::readField(CTX &ctx, const Field *field, QVariant &val,
bool &valid)
{ {
bool ret; bool ret;
@ -299,22 +231,20 @@ bool FITParser::readField(CTX &ctx, Field *field, QVariant &val, bool &valid)
bool FITParser::parseData(CTX &ctx, const MessageDefinition *def) bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
{ {
Field *field;
QVariant val; QVariant val;
bool valid; bool valid;
Event event; Event event;
Waypoint waypoint; Waypoint waypoint;
if (!def->fields.size() && !def->devFields.size()) {
if (!def->fields && !def->devFields) {
_errorString = "Undefined data message"; _errorString = "Undefined data message";
return false; return false;
} }
ctx.endian = def->endian; ctx.endian = def->endian;
for (int i = 0; i < def->numFields; i++) { for (int i = 0; i < def->fields.size(); i++) {
field = &def->fields[i]; const Field *field = &def->fields.at(i);
if (!readField(ctx, field, val, valid)) if (!readField(ctx, field, val, valid))
return false; return false;
if (!valid) if (!valid)
@ -416,12 +346,9 @@ bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
} }
} }
for (int i = 0; i < def->numDevFields; i++) { for (int i = 0; i < def->devFields.size(); i++)
field = &def->devFields[i]; if (!readField(ctx, &def->devFields.at(i), val, valid))
if (!readField(ctx, field, val, valid))
return false; return false;
}
if (def->globalId == EVENT_MESSAGE) { if (def->globalId == EVENT_MESSAGE) {
if ((event.id == 42 || event.id == 43) && event.type == 3) { if ((event.id == 42 || event.id == 43) && event.type == 3) {
@ -453,15 +380,15 @@ bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
bool FITParser::parseDataMessage(CTX &ctx, quint8 header) bool FITParser::parseDataMessage(CTX &ctx, quint8 header)
{ {
int local_id = header & 0xf; int localId = header & 0xf;
MessageDefinition *def = &(ctx.defs[local_id]); MessageDefinition *def = &(ctx.defs[localId]);
return parseData(ctx, def); return parseData(ctx, def);
} }
bool FITParser::parseCompressedMessage(CTX &ctx, quint8 header) bool FITParser::parseCompressedMessage(CTX &ctx, quint8 header)
{ {
int local_id = (header >> 5) & 3; int localId = (header >> 5) & 3;
MessageDefinition *def = &(ctx.defs[local_id]); MessageDefinition *def = &(ctx.defs[localId]);
ctx.timestamp += header & 0x1f; ctx.timestamp += header & 0x1f;
return parseData(ctx, def); return parseData(ctx, def);
} }
@ -487,7 +414,6 @@ bool FITParser::parseHeader(CTX &ctx)
quint16 crc; quint16 crc;
qint64 len; qint64 len;
static_assert(sizeof(hdr) == 12, "Invalid FileHeader alignment");
len = ctx.file->read((char*)&hdr, sizeof(hdr)); len = ctx.file->read((char*)&hdr, sizeof(hdr));
if (len < 0) { if (len < 0) {
_errorString = "I/O error"; _errorString = "I/O error";
@ -515,7 +441,6 @@ bool FITParser::parse(QFile *file, QList<TrackData> &tracks,
Q_UNUSED(polygons); Q_UNUSED(polygons);
CTX ctx(file, waypoints); CTX ctx(file, waypoints);
if (!parseHeader(ctx)) if (!parseHeader(ctx))
return false; return false;

View File

@ -3,25 +3,72 @@
#include "parser.h" #include "parser.h"
class QFile;
class FITParser : public Parser class FITParser : public Parser
{ {
public: public:
FITParser()
{
static_assert(sizeof(Field) == 3, "Invalid Field alignment");
static_assert(sizeof(FileHeader) == 12, "Invalid FileHeader alignment");
}
bool parse(QFile *file, QList<TrackData> &tracks, QList<RouteData> &routes, bool parse(QFile *file, QList<TrackData> &tracks, QList<RouteData> &routes,
QList<Area> &polygons, QVector<Waypoint> &waypoints); QList<Area> &polygons, QVector<Waypoint> &waypoints);
QString errorString() const {return _errorString;} QString errorString() const {return _errorString;}
int errorLine() const {return 0;} int errorLine() const {return 0;}
private: private:
struct Field; struct Event
class MessageDefinition; {
class CTX; Event() : data(0), id(0), type(0) {}
quint32 data;
quint8 id;
quint8 type;
};
struct FileHeader
{
quint8 headerSize;
quint8 protocolVersion;
quint16 profileVersion;
quint32 dataSize;
quint32 magic;
};
struct Field
{
quint8 id;
quint8 size;
quint8 type;
};
struct MessageDefinition
{
MessageDefinition() : globalId(0), endian(0) {}
QVector<Field> fields;
QVector<Field> devFields;
quint16 globalId;
quint8 endian;
};
struct CTX {
CTX(QFile *file, QVector<Waypoint> &waypoints)
: file(file), waypoints(waypoints), len(0), endian(0), timestamp(0),
ratio(NAN) {}
QFile *file;
QVector<Waypoint> &waypoints;
quint32 len;
quint8 endian;
quint32 timestamp;
MessageDefinition defs[16];
qreal ratio;
Trackpoint trackpoint;
SegmentData segment;
};
bool readData(QFile *file, char *data, size_t size); bool readData(QFile *file, char *data, size_t size);
template<class T> bool readValue(CTX &ctx, T &val); template<class T> bool readValue(CTX &ctx, T &val);
bool skipValue(CTX &ctx, quint8 size); bool skipValue(CTX &ctx, quint8 size);
bool readField(CTX &ctx, Field *field, QVariant &val, bool &valid); bool readField(CTX &ctx, const Field *field, QVariant &val, bool &valid);
bool parseHeader(CTX &ctx); bool parseHeader(CTX &ctx);
bool parseRecord(CTX &ctx); bool parseRecord(CTX &ctx);

View File

@ -1,4 +1,4 @@
#include "common/dem.h" #include "map/map.h"
#include "route.h" #include "route.h"
bool Route::_useDEM = false; bool Route::_useDEM = false;
@ -49,19 +49,17 @@ Graph Route::gpsElevation() const
return graph; return graph;
} }
Graph Route::demElevation() const Graph Route::demElevation(Map *map) const
{ {
Graph graph; Graph graph;
QDateTime date; QDateTime date;
GraphSegment gs(date); GraphSegment gs(date);
DEM::lock();
for (int i = 0; i < _data.size(); i++) { for (int i = 0; i < _data.size(); i++) {
qreal dem = DEM::elevation(_data.at(i).coordinates()); qreal dem = map->elevation(_data.at(i).coordinates());
if (!std::isnan(dem)) if (!std::isnan(dem))
gs.append(GraphPoint(_distance.at(i), NAN, dem)); gs.append(GraphPoint(_distance.at(i), NAN, dem));
} }
DEM::unlock();
if (gs.size() >= 2) if (gs.size() >= 2)
graph.append(gs); graph.append(gs);
@ -72,18 +70,18 @@ Graph Route::demElevation() const
return graph; return graph;
} }
GraphPair Route::elevation() const GraphPair Route::elevation(Map *map) const
{ {
if (_useDEM) { if (_useDEM) {
Graph dem(demElevation()); Graph dem(demElevation(map));
return (dem.isEmpty()) return (dem.isEmpty())
? GraphPair(gpsElevation(), Graph()) ? GraphPair(gpsElevation(), Graph())
: GraphPair(dem, _show2ndElevation ? gpsElevation() : Graph()); : GraphPair(dem, _show2ndElevation ? gpsElevation() : Graph());
} else { } else {
Graph gps(gpsElevation()); Graph gps(gpsElevation());
return (gps.isEmpty()) return (gps.isEmpty())
? GraphPair(demElevation(), Graph()) ? GraphPair(demElevation(map), Graph())
: GraphPair(gps, _show2ndElevation ? demElevation() : Graph()); : GraphPair(gps, _show2ndElevation ? demElevation(map) : Graph());
} }
} }

View File

@ -6,6 +6,8 @@
#include "graph.h" #include "graph.h"
#include "path.h" #include "path.h"
class Map;
class Route class Route
{ {
public: public:
@ -13,7 +15,7 @@ public:
const RouteData &data() const {return _data;} const RouteData &data() const {return _data;}
Path path() const; Path path() const;
GraphPair elevation() const; GraphPair elevation(Map *map) const;
qreal distance() const; qreal distance() const;
const QString &name() const {return _data.name();} const QString &name() const {return _data.name();}
@ -30,7 +32,7 @@ public:
private: private:
Graph gpsElevation() const; Graph gpsElevation() const;
Graph demElevation() const; Graph demElevation(Map *map) const;
RouteData _data; RouteData _data;
QVector<qreal> _distance; QVector<qreal> _distance;

View File

@ -1,4 +1,4 @@
#include "common/dem.h" #include "map/map.h"
#include "track.h" #include "track.h"
@ -277,11 +277,10 @@ Graph Track::gpsElevation() const
return ret; return ret;
} }
Graph Track::demElevation() const Graph Track::demElevation(Map *map) const
{ {
Graph ret; Graph ret;
DEM::lock();
for (int i = 0; i < _data.size(); i++) { for (int i = 0; i < _data.size(); i++) {
const SegmentData &sd = _data.at(i); const SegmentData &sd = _data.at(i);
if (sd.size() < 2) if (sd.size() < 2)
@ -290,7 +289,7 @@ Graph Track::demElevation() const
GraphSegment gs(seg.start); GraphSegment gs(seg.start);
for (int j = 0; j < sd.size(); j++) { for (int j = 0; j < sd.size(); j++) {
qreal dem = DEM::elevation(sd.at(j).coordinates()); qreal dem = map->elevation(sd.at(j).coordinates());
if (std::isnan(dem) || seg.outliers.contains(j)) if (std::isnan(dem) || seg.outliers.contains(j))
continue; continue;
gs.append(GraphPoint(seg.distance.at(j), seg.time.at(j), dem)); gs.append(GraphPoint(seg.distance.at(j), seg.time.at(j), dem));
@ -299,7 +298,6 @@ Graph Track::demElevation() const
if (gs.size() >= 2) if (gs.size() >= 2)
ret.append(filter(gs, _elevationWindow)); ret.append(filter(gs, _elevationWindow));
} }
DEM::unlock();
if (_data.style().color().isValid()) if (_data.style().color().isValid())
ret.setColor(_data.style().color()); ret.setColor(_data.style().color());
@ -307,18 +305,18 @@ Graph Track::demElevation() const
return ret; return ret;
} }
GraphPair Track::elevation() const GraphPair Track::elevation(Map *map) const
{ {
if (_useDEM) { if (_useDEM) {
Graph dem(demElevation()); Graph dem(demElevation(map));
return (dem.isEmpty()) return (dem.isEmpty())
? GraphPair(gpsElevation(), Graph()) ? GraphPair(gpsElevation(), Graph())
: GraphPair(dem, _show2ndElevation ? gpsElevation() : Graph()); : GraphPair(dem, _show2ndElevation ? gpsElevation() : Graph());
} else { } else {
Graph gps(gpsElevation()); Graph gps(gpsElevation());
return (gps.isEmpty()) return (gps.isEmpty())
? GraphPair(demElevation(), Graph()) ? GraphPair(demElevation(map), Graph())
: GraphPair(gps, _show2ndElevation ? demElevation() : Graph()); : GraphPair(gps, _show2ndElevation ? demElevation(map) : Graph());
} }
} }

View File

@ -9,6 +9,7 @@
#include "graph.h" #include "graph.h"
#include "path.h" #include "path.h"
class Map;
class Track class Track
{ {
@ -17,7 +18,7 @@ public:
Path path() const; Path path() const;
GraphPair elevation() const; GraphPair elevation(Map *map) const;
GraphPair speed() const; GraphPair speed() const;
Graph heartRate() const; Graph heartRate() const;
Graph temperature() const; Graph temperature() const;
@ -68,7 +69,7 @@ private:
qreal lastTime(int seg); qreal lastTime(int seg);
bool discardStopPoint(const Segment &seg, int i) const; bool discardStopPoint(const Segment &seg, int i) const;
Graph demElevation() const; Graph demElevation(Map *map) const;
Graph gpsElevation() const; Graph gpsElevation() const;
Graph reportedSpeed() const; Graph reportedSpeed() const;
Graph computedSpeed() const; Graph computedSpeed() const;

View File

@ -1,18 +1,16 @@
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include "common/dem.h" #include "map/map.h"
#include "waypoint.h" #include "waypoint.h"
bool Waypoint::_useDEM = false; bool Waypoint::_useDEM = false;
bool Waypoint::_show2ndElevation = false; bool Waypoint::_show2ndElevation = false;
QHash<QString, QPixmap> Waypoint::_symbolIcons; QHash<QString, QPixmap> Waypoint::_symbolIcons;
QPair<qreal, qreal> Waypoint::elevations() const QPair<qreal, qreal> Waypoint::elevations(Map *map) const
{ {
if (_useDEM) { if (_useDEM) {
DEM::lock(); qreal dem = map->elevation(coordinates());
qreal dem = DEM::elevation(coordinates());
DEM::unlock();
if (!std::isnan(dem)) if (!std::isnan(dem))
return QPair<qreal, qreal>(dem, _show2ndElevation ? elevation() return QPair<qreal, qreal>(dem, _show2ndElevation ? elevation()
: NAN); : NAN);
@ -20,12 +18,10 @@ QPair<qreal, qreal> Waypoint::elevations() const
return QPair<qreal, qreal>(elevation(), NAN); return QPair<qreal, qreal>(elevation(), NAN);
} else { } else {
if (hasElevation()) { if (hasElevation()) {
DEM::lock(); qreal dem = _show2ndElevation ? map->elevation(coordinates()) : NAN;
qreal dem = _show2ndElevation ? DEM::elevation(coordinates()) : NAN;
DEM::unlock();
return QPair<qreal, qreal>(elevation(), dem); return QPair<qreal, qreal>(elevation(), dem);
} else } else
return QPair<qreal, qreal>(DEM::elevation(coordinates()), NAN); return QPair<qreal, qreal>(map->elevation(coordinates()), NAN);
} }
} }

View File

@ -12,6 +12,8 @@
#include "link.h" #include "link.h"
#include "style.h" #include "style.h"
class Map;
class Waypoint class Waypoint
{ {
public: public:
@ -33,7 +35,7 @@ public:
qreal elevation() const {return _elevation;} qreal elevation() const {return _elevation;}
const PointStyle &style() const {return _style;} const PointStyle &style() const {return _style;}
QPair<qreal, qreal> elevations() const; QPair<qreal, qreal> elevations(Map *map) const;
void setCoordinates(const Coordinates &coordinates) void setCoordinates(const Coordinates &coordinates)
{_coordinates = coordinates;} {_coordinates = coordinates;}

View File

@ -26,6 +26,7 @@
#define RESTRN 131 #define RESTRN 131
#define TRAFIC 172 #define TRAFIC 172
#define VALDCO 174 #define VALDCO 174
#define VERCLR 181
#define WATLEV 187 #define WATLEV 187
#define I_CATACH 17000 #define I_CATACH 17000

View File

@ -1,3 +1,4 @@
#include "GUI/units.h"
#include "objects.h" #include "objects.h"
#include "attributes.h" #include "attributes.h"
#include "mapdata.h" #include "mapdata.h"
@ -287,13 +288,22 @@ MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
} }
} }
MapData::Poly::Poly(uint type, const Polygon &path, MapData::Poly::Poly(uint type, const Polygon &path, const QString &label,
const QVector<QByteArray> &params) : _type(type), _path(path) const QVector<QByteArray> &params, uint HUNI) : _type(type), _path(path)
{ {
if (type == TYPE(DEPARE) && params.size()) if (type == TYPE(DEPARE) && params.size())
_type = SUBTYPE(DEPARE, depthLevel(params.at(0))); _type = SUBTYPE(DEPARE, depthLevel(params.at(0)));
else if (type == TYPE(TSSLPT) && params.size()) else if (type == TYPE(TSSLPT) && params.size())
_param = QVariant(params.at(0).toDouble()); _param = QVariant(params.at(0).toDouble());
else if ((type == TYPE(BRIDGE) || type == TYPE(I_BRIDGE))
&& params.size()) {
double clr = params.at(0).toDouble();
if (clr > 0) {
_label = QString::fromUtf8("\xE2\x86\x95") + UNIT_SPACE
+ QString::number(clr) + UNIT_SPACE + hUnits(HUNI);
}
} else if (type>>16 == LNDARE || type>>16 == SEAARE)
_label = label;
} }
MapData::Line::Line(uint type, const QVector<Coordinates> &path, MapData::Line::Line(uint type, const QVector<Coordinates> &path,
@ -638,6 +648,9 @@ MapData::Attr MapData::polyAttr(const ISO8211::Record &r, uint OBJL)
const QVector<QVariant> &av = ATTF->data().at(i); const QVector<QVariant> &av = ATTF->data().at(i);
uint key = av.at(0).toUInt(); uint key = av.at(0).toUInt();
if (key == OBJNAM)
label = QString::fromLatin1(av.at(1).toByteArray());
if ((OBJL == RESARE && key == CATREA) if ((OBJL == RESARE && key == CATREA)
|| (OBJL == I_RESARE && key == CATREA) || (OBJL == I_RESARE && key == CATREA)
|| (OBJL == ACHARE && key == CATACH) || (OBJL == ACHARE && key == CATACH)
@ -657,6 +670,9 @@ MapData::Attr MapData::polyAttr(const ISO8211::Record &r, uint OBJL)
if ((OBJL == TSSLPT && key == ORIENT) if ((OBJL == TSSLPT && key == ORIENT)
|| (OBJL == DEPARE && key == DRVAL1)) || (OBJL == DEPARE && key == DRVAL1))
params[0] = av.at(1).toByteArray(); params[0] = av.at(1).toByteArray();
if ((OBJL == BRIDGE && key == VERCLR)
|| (OBJL == I_BRIDGE && key == VERCLR))
params[0] = av.at(1).toByteArray();
} }
return Attr(subtype, label, params); return Attr(subtype, label, params);
@ -689,18 +705,18 @@ MapData::Line *MapData::lineObject(const ISO8211::Record &r,
} }
MapData::Poly *MapData::polyObject(const ISO8211::Record &r, MapData::Poly *MapData::polyObject(const ISO8211::Record &r,
const RecordMap &vc, const RecordMap &ve, uint COMF, uint OBJL) const RecordMap &vc, const RecordMap &ve, uint COMF, uint OBJL, uint HUNI)
{ {
Polygon path(polyGeometry(r, vc, ve, COMF)); Polygon path(polyGeometry(r, vc, ve, COMF));
Attr attr(polyAttr(r, OBJL)); Attr attr(polyAttr(r, OBJL));
return (path.isEmpty() ? 0 : new Poly(SUBTYPE(OBJL, attr.subtype()), path, return (path.isEmpty() ? 0 : new Poly(SUBTYPE(OBJL, attr.subtype()), path,
attr.params())); attr.label(), attr.params(), HUNI));
} }
bool MapData::processRecord(const ISO8211::Record &record, bool MapData::processRecord(const ISO8211::Record &record,
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve, QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
RecordMap &vf, uint &COMF, uint &SOMF) RecordMap &vf, uint &COMF, uint &SOMF, uint &HUNI)
{ {
if (record.size() < 2) if (record.size() < 2)
return false; return false;
@ -735,6 +751,8 @@ bool MapData::processRecord(const ISO8211::Record &record,
} else if (ba == "DSPM") { } else if (ba == "DSPM") {
if (!(f.subfield("COMF", &COMF) && f.subfield("SOMF", &SOMF))) if (!(f.subfield("COMF", &COMF) && f.subfield("SOMF", &SOMF)))
return false; return false;
if (!f.subfield("HUNI", &HUNI))
return false;
} }
return true; return true;
@ -746,7 +764,7 @@ MapData::MapData(const QString &path)
QVector<ISO8211::Record> fe; QVector<ISO8211::Record> fe;
ISO8211 ddf(path); ISO8211 ddf(path);
ISO8211::Record record; ISO8211::Record record;
uint PRIM, OBJL, COMF = 1, SOMF = 1; uint PRIM, OBJL, COMF = 1, SOMF = 1, HUNI = 1;
Poly *poly; Poly *poly;
Line *line; Line *line;
Point *point; Point *point;
@ -756,7 +774,7 @@ MapData::MapData(const QString &path)
if (!ddf.readDDR()) if (!ddf.readDDR())
return; return;
while (ddf.readRecord(record)) while (ddf.readRecord(record))
if (!processRecord(record, fe, vi, vc, ve, vf, COMF, SOMF)) if (!processRecord(record, fe, vi, vc, ve, vf, COMF, SOMF, HUNI))
qWarning("Invalid S-57 record"); qWarning("Invalid S-57 record");
for (int i = 0; i < fe.size(); i++) { for (int i = 0; i < fe.size(); i++) {
@ -793,7 +811,7 @@ MapData::MapData(const QString &path)
warning(f, PRIM); warning(f, PRIM);
break; break;
case PRIM_A: case PRIM_A:
if ((poly = polyObject(r, vc, ve, COMF, OBJL))) { if ((poly = polyObject(r, vc, ve, COMF, OBJL, HUNI))) {
rectcBounds(poly->bounds(), min, max); rectcBounds(poly->bounds(), min, max);
_areas.Insert(min, max, poly); _areas.Insert(min, max, poly);
} else } else

View File

@ -13,16 +13,19 @@ class MapData
public: public:
class Poly { class Poly {
public: public:
Poly(uint type, const Polygon &path, const QVector<QByteArray> &params); Poly(uint type, const Polygon &path, const QString &label,
const QVector<QByteArray> &params, uint HUNI);
RectC bounds() const {return _path.boundingRect();} RectC bounds() const {return _path.boundingRect();}
const Polygon &path() const {return _path;} const Polygon &path() const {return _path;}
uint type() const {return _type;} uint type() const {return _type;}
const QString &label() const {return _label;}
const QVariant &param() const {return _param;} const QVariant &param() const {return _param;}
private: private:
uint _type; uint _type;
Polygon _path; Polygon _path;
QString _label;
QVariant _param; QVariant _param;
}; };
@ -121,11 +124,11 @@ private:
static Line *lineObject(const ISO8211::Record &r, const RecordMap &vc, static Line *lineObject(const ISO8211::Record &r, const RecordMap &vc,
const RecordMap &ve, uint COMF, uint OBJL); const RecordMap &ve, uint COMF, uint OBJL);
static Poly *polyObject(const ISO8211::Record &r, const RecordMap &vc, static Poly *polyObject(const ISO8211::Record &r, const RecordMap &vc,
const RecordMap &ve, uint COMF,uint OBJL); const RecordMap &ve, uint COMF, uint OBJL, uint HUNI);
static bool processRecord(const ISO8211::Record &record, static bool processRecord(const ISO8211::Record &record,
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve, QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
RecordMap &vf, uint &COMF, uint &SOMF); RecordMap &vf, uint &COMF, uint &SOMF, uint &HUNI);
PolygonTree _areas; PolygonTree _areas;
LineTree _lines; LineTree _lines;

View File

@ -78,6 +78,7 @@
#define RESARE 112 #define RESARE 112
#define RIVERS 114 #define RIVERS 114
#define ROADWY 116 #define ROADWY 116
#define SEAARE 119
#define SLCONS 122 #define SLCONS 122
#define SISTAT 123 #define SISTAT 123
#define SILTNK 125 #define SILTNK 125

View File

@ -12,7 +12,7 @@
using namespace ENC; using namespace ENC;
#define TEXT_EXTENT 160 #define TEXT_EXTENT 160
#define TSSLPT_SIZE 0.005 /* ll */ #define TSSLPT_SIZE 24
typedef QSet<Coordinates> PointSet; typedef QSet<Coordinates> PointSet;
@ -20,40 +20,6 @@ static const float C1 = 0.866025f; /* sqrt(3)/2 */
static const QColor tsslptPen = QColor(0xeb, 0x49, 0xeb); static const QColor tsslptPen = QColor(0xeb, 0x49, 0xeb);
static const QColor tsslptBrush = QColor(0xeb, 0x49, 0xeb, 0x80); static const QColor tsslptBrush = QColor(0xeb, 0x49, 0xeb, 0x80);
static double area(const QVector<Coordinates> &polygon)
{
double area = 0;
for (int i = 0; i < polygon.size() - 1; i++) {
const Coordinates &pi = polygon.at(i);
const Coordinates &pj = polygon.at(i+1);
area += pi.lon() * pj.lat();
area -= pi.lat() * pj.lon();
}
area /= 2.0;
return area;
}
static Coordinates centroid(const QVector<Coordinates> &polygon)
{
Q_ASSERT(polygon.size() > 3);
Q_ASSERT(polygon.first() == polygon.last());
double cx = 0, cy = 0;
double factor = 1.0 / (6.0 * area(polygon));
for (int i = 0; i < polygon.size() - 1; i++) {
const Coordinates &pi = polygon.at(i);
const Coordinates &pj = polygon.at(i+1);
double f = (pi.lon() * pj.lat() - pj.lon() * pi.lat());
cx += (pi.lon() + pj.lon()) * f;
cy += (pi.lat() + pj.lat()) * f;
}
return Coordinates(cx * factor, cy * factor);
}
static double angle(uint type, const QVariant &param) static double angle(uint type, const QVariant &param)
{ {
uint bt = type>>16; uint bt = type>>16;
@ -75,6 +41,31 @@ static bool showLabel(const QImage *img, const Range &range, int zoom, int type)
return true; return true;
} }
QPointF RasterTile::centroid(const QVector<Coordinates> &polygon) const
{
Q_ASSERT(polygon.size() > 3);
Q_ASSERT(polygon.first() == polygon.last());
double area = 0;
double cx = 0, cy = 0;
QPointF pi;
QPointF pj(ll2xy(polygon.at(0)));
for (int i = 0; i < polygon.size() - 1; i++) {
pi = pj;
pj = ll2xy(polygon.at(i + 1));
double f = pi.x() * pj.y() - pj.x() * pi.y();
area += f;
cx += (pi.x() + pj.x()) * f;
cy += (pi.y() + pj.y()) * f;
}
double factor = 1.0 / (3.0 * area);
return QPointF(cx * factor, cy * factor);
}
QPainterPath RasterTile::painterPath(const Polygon &polygon) const QPainterPath RasterTile::painterPath(const Polygon &polygon) const
{ {
QPainterPath path; QPainterPath path;
@ -136,27 +127,26 @@ QVector<QPolygonF> RasterTile::polylineM(const QVector<Coordinates> &path) const
return polys; return polys;
} }
QPolygonF RasterTile::tsslptArrow(const Coordinates &c, qreal angle) const QPolygonF RasterTile::tsslptArrow(const QPointF &p, qreal angle) const
{ {
Coordinates t[3], r[4]; QPointF t[3], r[4];
QPolygonF polygon; QPolygonF polygon;
t[0] = c; t[0] = p;
t[1] = Coordinates(t[0].lon() - qCos(angle - M_PI/3) * TSSLPT_SIZE, t[1] = QPointF(t[0].x() - qCos(angle - M_PI/3) * TSSLPT_SIZE,
t[0].lat() - qSin(angle - M_PI/3) * TSSLPT_SIZE); t[0].y() - qSin(angle - M_PI/3) * TSSLPT_SIZE);
t[2] = Coordinates(t[0].lon() - qCos(angle - M_PI + M_PI/3) * TSSLPT_SIZE, t[2] = QPointF(t[0].x() - qCos(angle - M_PI + M_PI/3) * TSSLPT_SIZE,
t[0].lat() - qSin(angle - M_PI + M_PI/3) * TSSLPT_SIZE); t[0].y() - qSin(angle - M_PI + M_PI/3) * TSSLPT_SIZE);
LineC l(t[1], t[2]); QLineF l(t[1], t[2]);
r[0] = l.pointAt(0.25); r[0] = l.pointAt(0.25);
r[1] = l.pointAt(0.75); r[1] = l.pointAt(0.75);
r[2] = Coordinates(r[0].lon() - C1 * TSSLPT_SIZE * qCos(angle - M_PI/2), r[2] = QPointF(r[0].x() - C1 * TSSLPT_SIZE * qCos(angle - M_PI/2),
r[0].lat() - C1 * TSSLPT_SIZE * qSin(angle - M_PI/2)); r[0].y() - C1 * TSSLPT_SIZE * qSin(angle - M_PI/2));
r[3] = Coordinates(r[1].lon() - C1 * TSSLPT_SIZE * qCos(angle - M_PI/2), r[3] = QPointF(r[1].x() - C1 * TSSLPT_SIZE * qCos(angle - M_PI/2),
r[1].lat() - C1 * TSSLPT_SIZE * qSin(angle - M_PI/2)); r[1].y() - C1 * TSSLPT_SIZE * qSin(angle - M_PI/2));
polygon << ll2xy(t[0]) << ll2xy(t[2]) << ll2xy(r[1]) << ll2xy(r[3]) polygon << t[0] << t[2] << r[1] << r[3] << r[2] << r[0] << t[1];
<< ll2xy(r[2]) << ll2xy(r[0]) << ll2xy(t[1]);
return polygon; return polygon;
} }
@ -169,7 +159,7 @@ void RasterTile::drawArrows(QPainter *painter,
if (poly.type()>>16 == TSSLPT) { if (poly.type()>>16 == TSSLPT) {
QPolygonF polygon(tsslptArrow(centroid(poly.path().first()), QPolygonF polygon(tsslptArrow(centroid(poly.path().first()),
deg2rad(180 - poly.param().toDouble()))); deg2rad(poly.param().toDouble())));
painter->setPen(QPen(tsslptPen, 1)); painter->setPen(QPen(tsslptPen, 1));
painter->setBrush(QBrush(tsslptBrush)); painter->setBrush(QBrush(tsslptBrush));
@ -241,19 +231,34 @@ void RasterTile::processPolygons(const QList<MapData::Poly> &polygons,
for (int i = 0; i < polygons.size(); i++) { for (int i = 0; i < polygons.size(); i++) {
const MapData::Poly &poly = polygons.at(i); const MapData::Poly &poly = polygons.at(i);
uint type = poly.type()>>16; uint type = poly.type()>>16;
const QImage *img = 0;
const QString *label = 0;
const QFont *fnt = 0;
const QColor *color = 0, *hColor = 0;
QPoint offset(0, 0);
if (!(type == HRBFAC || type == I_TRNBSN if (!poly.label().isEmpty()) {
|| poly.type() == SUBTYPE(I_BERTHS, 6)))
continue;
const Style::Point &style = _style->point(poly.type()); const Style::Point &style = _style->point(poly.type());
const QImage *img = style.img().isNull() ? 0 : &style.img(); fnt = _style->font(style.textFontSize());
if (!img) color = &style.textColor();
hColor = style.haloColor().isValid() ? &style.haloColor() : 0;
label = &poly.label();
}
if (type == HRBFAC || type == I_TRNBSN
|| poly.type() == SUBTYPE(I_BERTHS, 6)) {
const Style::Point &style = _style->point(poly.type());
img = style.img().isNull() ? 0 : &style.img();
offset = style.offset();
}
if ((!label || !fnt) && !img)
continue; continue;
TextPointItem *item = new TextPointItem( TextPointItem *item = new TextPointItem(offset +
ll2xy(centroid(poly.path().first())).toPoint(), centroid(poly.path().first()).toPoint(), label, fnt, img, color,
0, 0, img, 0, 0, 0, 0); hColor, 0, 0);
if (item->isValid() && !item->collides(textItems)) if (item->isValid() && _rect.contains(item->boundingRect().toRect())
&& !item->collides(textItems))
textItems.append(item); textItems.append(item);
else else
delete item; delete item;
@ -379,8 +384,8 @@ void RasterTile::render()
fetchData(polygons, lines, points); fetchData(polygons, lines, points);
processPolygons(polygons, textItems);
processPoints(points, textItems, lights); processPoints(points, textItems, lights);
processPolygons(polygons, textItems);
processLines(lines, textItems); processLines(lines, textItems);
QPainter painter(&img); QPainter painter(&img);

View File

@ -41,7 +41,8 @@ private:
QPainterPath painterPath(const Polygon &polygon) const; QPainterPath painterPath(const Polygon &polygon) const;
QPolygonF polyline(const QVector<Coordinates> &path) const; QPolygonF polyline(const QVector<Coordinates> &path) const;
QVector<QPolygonF> polylineM(const QVector<Coordinates> &path) const; QVector<QPolygonF> polylineM(const QVector<Coordinates> &path) const;
QPolygonF tsslptArrow(const Coordinates &c, qreal angle) const; QPolygonF tsslptArrow(const QPointF &p, qreal angle) const;
QPointF centroid(const QVector<Coordinates> &polygon) const;
void processPoints(QList<MapData::Point> &points, void processPoints(QList<MapData::Point> &points,
QList<TextItem*> &textItems, QList<TextItem *> &lights); QList<TextItem*> &textItems, QList<TextItem *> &lights);
void processLines(const QList<MapData::Line> &lines, void processLines(const QList<MapData::Line> &lines,

View File

@ -235,6 +235,8 @@ void Style::pointStyle(qreal ratio)
_points[SUBTYPE(LNDMRK, 7)] = Point(QImage(":/marine/pylon.png"), Small); _points[SUBTYPE(LNDMRK, 7)] = Point(QImage(":/marine/pylon.png"), Small);
_points[SUBTYPE(LNDMRK, 9)] = Point(QImage(":/marine/monument.png"), Small, _points[SUBTYPE(LNDMRK, 9)] = Point(QImage(":/marine/monument.png"), Small,
QPoint(0, -7)); QPoint(0, -7));
_points[SUBTYPE(LNDMRK, 15)] = Point(QImage(":/marine/dome.png"), Small,
QPoint(0, -5));
_points[SUBTYPE(LNDMRK, 17)] = Point(QImage(":/marine/tower.png"), Small, _points[SUBTYPE(LNDMRK, 17)] = Point(QImage(":/marine/tower.png"), Small,
QPoint(0, -11)); QPoint(0, -11));
_points[SUBTYPE(LNDMRK, 18)] = Point(QImage(":/marine/windmill.png"), Small); _points[SUBTYPE(LNDMRK, 18)] = Point(QImage(":/marine/windmill.png"), Small);
@ -332,6 +334,7 @@ void Style::pointStyle(qreal ratio)
_points[TYPE(CURENT)] = Point(QImage(":/marine/current.png")); _points[TYPE(CURENT)] = Point(QImage(":/marine/current.png"));
_points[SUBTYPE(WEDKLP, 0)] = Point(QImage(":/marine/kelp.png")); _points[SUBTYPE(WEDKLP, 0)] = Point(QImage(":/marine/kelp.png"));
_points[SUBTYPE(WEDKLP, 1)] = Point(QImage(":/marine/kelp.png")); _points[SUBTYPE(WEDKLP, 1)] = Point(QImage(":/marine/kelp.png"));
_points[TYPE(SEAARE)].setHaloColor(QColor());
_points[SUBTYPE(SMCFAC, 7)] = Point(svg2img(":/POI/restaurant-11.svg", _points[SUBTYPE(SMCFAC, 7)] = Point(svg2img(":/POI/restaurant-11.svg",
ratio), Small); ratio), Small);

View File

@ -1,5 +1,5 @@
#ifndef DEMFILE_H #ifndef IMG_DEMFILE_H
#define DEMFILE_H #define IMG_DEMFILE_H
#include "common/rtree.h" #include "common/rtree.h"
#include "subfile.h" #include "subfile.h"
@ -55,4 +55,4 @@ private:
} }
#endif // DEMFILE_H #endif // IMG_DEMFILE_H

View File

@ -1,5 +1,5 @@
#ifndef DEMTILE_H #ifndef IMG_DEMTILE_H
#define DEMTILE_H #define IMG_DEMTILE_H
#include "common/rectc.h" #include "common/rectc.h"
@ -33,4 +33,4 @@ private:
} }
#endif // DEMTILE_H #endif // IMG_DEMTILE_H

View File

@ -1,7 +1,7 @@
#include <QFont> #include <QFont>
#include <QPainter> #include <QPainter>
#include <QCache> #include <QCache>
#include "common/dem.h" #include "map/dem.h"
#include "map/textpathitem.h" #include "map/textpathitem.h"
#include "map/textpointitem.h" #include "map/textpointitem.h"
#include "map/bitmapline.h" #include "map/bitmapline.h"
@ -70,33 +70,22 @@ static int minShieldZoom(Shield::Type type)
} }
} }
static qreal area(const QVector<QPointF> &polygon)
{
qreal area = 0;
for (int i = 0; i < polygon.size(); i++) {
int j = (i + 1) % polygon.size();
area += polygon.at(i).x() * polygon.at(j).y();
area -= polygon.at(i).y() * polygon.at(j).x();
}
area /= 2.0;
return area;
}
static QPointF centroid(const QVector<QPointF> &polygon) static QPointF centroid(const QVector<QPointF> &polygon)
{ {
qreal area = 0;
qreal cx = 0, cy = 0; qreal cx = 0, cy = 0;
qreal factor = 1.0 / (6.0 * area(polygon));
for (int i = 0; i < polygon.size(); i++) { for (int i = 0; i < polygon.size(); i++) {
int j = (i + 1) % polygon.size(); int j = (i == polygon.size() - 1) ? 0 : i + 1;
qreal f = (polygon.at(i).x() * polygon.at(j).y() - polygon.at(j).x() qreal f = (polygon.at(i).x() * polygon.at(j).y() - polygon.at(j).x()
* polygon.at(i).y()); * polygon.at(i).y());
area += f;
cx += (polygon.at(i).x() + polygon.at(j).x()) * f; cx += (polygon.at(i).x() + polygon.at(j).x()) * f;
cy += (polygon.at(i).y() + polygon.at(j).y()) * f; cy += (polygon.at(i).y() + polygon.at(j).y()) * f;
} }
qreal factor = 1.0 / (3.0 * area);
return QPointF(cx * factor, cy * factor); return QPointF(cx * factor, cy * factor);
} }

View File

@ -17,7 +17,7 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QLocale> #include <QLocale>
#include <private/qzipreader_p.h> #include <private/qzipreader_p.h>
#include "rectc.h" #include "common/rectc.h"
#include "dem.h" #include "dem.h"

View File

@ -197,6 +197,7 @@ bool Downloader::doDownload(const Download &dl, const QList<HTTPHeader> &headers
if (!file->open(QIODevice::WriteOnly)) { if (!file->open(QIODevice::WriteOnly)) {
qWarning("%s: %s", qPrintable(file->fileName()), qWarning("%s: %s", qPrintable(file->fileName()),
qPrintable(file->errorString())); qPrintable(file->errorString()));
delete file;
_errorDownloads.insert(url, RETRIES); _errorDownloads.insert(url, RETRIES);
return false; return false;
} }

View File

@ -7,12 +7,16 @@ class GCS::Entry {
public: public:
Entry(int id, int gd, const QString &name, const GCS &gcs) Entry(int id, int gd, const QString &name, const GCS &gcs)
: _id(id), _gd(gd), _name(name), _gcs(gcs) {} : _id(id), _gd(gd), _name(name), _gcs(gcs) {}
Entry(int id) : _id(id) {}
int id() const {return _id;} int id() const {return _id;}
int gd() const {return _gd;} int gd() const {return _gd;}
const QString &name() const {return _name;} const QString &name() const {return _name;}
const GCS &gcs() const {return _gcs;} const GCS &gcs() const {return _gcs;}
bool operator<(const Entry &other) const
{return _id < other._id;}
private: private:
int _id, _gd; int _id, _gd;
QString _name; QString _name;
@ -59,11 +63,14 @@ QList<GCS::Entry> GCS::defaults()
GCS GCS::gcs(int id) GCS GCS::gcs(int id)
{ {
for (int i = 0; i < _gcss.size(); i++) // There are GCSs without EPSG code (id = 0) in the list!
if (_gcss.at(i).id() == id) if (!id)
return _gcss.at(i).gcs();
return GCS(); return GCS();
QList<GCS::Entry>::iterator it = std::lower_bound(
_gcss.begin(), _gcss.end(), id);
return (it == _gcss.end() || id != it->id()) ? GCS() : it->gcs();
} }
GCS GCS::gcs(int geodeticDatum, int primeMeridian, int angularUnits) GCS GCS::gcs(int geodeticDatum, int primeMeridian, int angularUnits)
@ -220,6 +227,8 @@ bool GCS::loadList(const QString &path)
qPrintable(path), csv.line() - 1); qPrintable(path), csv.line() - 1);
} }
std::sort(_gcss.begin(), _gcss.end());
return true; return true;
} }
@ -229,7 +238,7 @@ QList<KV<int, QString> > GCS::list()
for (int i = 0; i < _gcss.size(); i++) { for (int i = 0; i < _gcss.size(); i++) {
const Entry &e = _gcss.at(i); const Entry &e = _gcss.at(i);
if (!e.id() || (i && e.id() == list.last().key())) if (!e.id() || (!list.isEmpty() && e.id() == list.last().key()))
continue; continue;
list.append(KV<int, QString>(e.id(), e.name() + " / Geographic 2D")); list.append(KV<int, QString>(e.id(), e.name() + " / Geographic 2D"));

View File

@ -1,6 +1,6 @@
#include <cmath> #include <cmath>
#include <QLineF> #include <QLineF>
#include "common/dem.h" #include "dem.h"
#include "map.h" #include "map.h"

View File

@ -1,7 +1,7 @@
#include <cmath> #include <cmath>
#include <QPainter> #include <QPainter>
#include <QCache> #include <QCache>
#include "common/dem.h" #include "map/dem.h"
#include "map/rectd.h" #include "map/rectd.h"
#include "map/hillshading.h" #include "map/hillshading.h"
#include "map/filter.h" #include "map/filter.h"
@ -15,33 +15,22 @@ using namespace Mapsforge;
static double LIMIT = cos(deg2rad(170)); static double LIMIT = cos(deg2rad(170));
static qreal area(const QPainterPath &polygon)
{
qreal area = 0;
for (int i = 0; i < polygon.elementCount(); i++) {
int j = (i + 1) % polygon.elementCount();
area += polygon.elementAt(i).x * polygon.elementAt(j).y;
area -= polygon.elementAt(i).y * polygon.elementAt(j).x;
}
area /= 2.0;
return area;
}
static QPointF centroid(const QPainterPath &polygon) static QPointF centroid(const QPainterPath &polygon)
{ {
qreal area = 0;
qreal cx = 0, cy = 0; qreal cx = 0, cy = 0;
qreal factor = 1.0 / (6.0 * area(polygon));
for (int i = 0; i < polygon.elementCount(); i++) { for (int i = 0; i < polygon.elementCount(); i++) {
int j = (i + 1) % polygon.elementCount(); int j = (i == polygon.elementCount() - 1) ? 0 : i + 1;
qreal f = (polygon.elementAt(i).x * polygon.elementAt(j).y qreal f = (polygon.elementAt(i).x * polygon.elementAt(j).y
- polygon.elementAt(j).x * polygon.elementAt(i).y); - polygon.elementAt(j).x * polygon.elementAt(i).y);
area += f;
cx += (polygon.elementAt(i).x + polygon.elementAt(j).x) * f; cx += (polygon.elementAt(i).x + polygon.elementAt(j).x) * f;
cy += (polygon.elementAt(i).y + polygon.elementAt(j).y) * f; cy += (polygon.elementAt(i).y + polygon.elementAt(j).y) * f;
} }
qreal factor = 1.0 / (3.0 * area);
return QPointF(cx * factor, cy * factor); return QPointF(cx * factor, cy * factor);
} }

View File

@ -5,7 +5,7 @@
#include "common/range.h" #include "common/range.h"
#include "common/rectc.h" #include "common/rectc.h"
#include "common/kv.h" #include "common/kv.h"
#include "common/downloader.h" #include "downloader.h"
#include "coordinatesystem.h" #include "coordinatesystem.h"
class Map; class Map;

View File

@ -3,7 +3,7 @@
#include <QPixmapCache> #include <QPixmapCache>
#include "common/rectc.h" #include "common/rectc.h"
#include "common/programpaths.h" #include "common/programpaths.h"
#include "common/downloader.h" #include "downloader.h"
#include "osm.h" #include "osm.h"
#include "onlinemap.h" #include "onlinemap.h"

View File

@ -3,7 +3,7 @@
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include "common/downloader.h" #include "downloader.h"
#include "rectd.h" #include "rectd.h"
class TileLoader : public QObject class TileLoader : public QObject

View File

@ -6,7 +6,7 @@
#include "common/range.h" #include "common/range.h"
#include "common/rectc.h" #include "common/rectc.h"
#include "common/kv.h" #include "common/kv.h"
#include "common/downloader.h" #include "downloader.h"
#include "projection.h" #include "projection.h"
#include "coordinatesystem.h" #include "coordinatesystem.h"

View File

@ -9,7 +9,7 @@
#include "common/hash.h" #include "common/hash.h"
#include "common/rectc.h" #include "common/rectc.h"
#include "common/kv.h" #include "common/kv.h"
#include "common/downloader.h" #include "downloader.h"
#include "projection.h" #include "projection.h"
#include "coordinatesystem.h" #include "coordinatesystem.h"