1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-06 15:42:51 +02:00

Compare commits

...

28 Commits
4.4 ... 4.7

Author SHA1 Message Date
f0a1acb96a Added missing libgeotrans Source Code Disclaimer 2017-05-08 20:39:42 +02:00
5f3bdb87f8 Added support for British, Irish and Swedish grid projections 2017-05-08 20:17:14 +02:00
90d062e097 Switched to latitude origin capable transverse mercator implementation 2017-05-08 19:53:50 +02:00
58b4c87d46 Fixed broken southern hemisphere reference points conversion
Fixed broken UTM zone setup
Added New Zealand TM 2000 "projection" support
2017-05-06 00:53:39 +02:00
02654ec862 Removed obsolete check 2017-05-05 09:09:32 +02:00
ff015c8714 Added missing data validity checks 2017-05-05 09:00:57 +02:00
c339116cd1 Added support for Albers Equal-Area projection 2017-05-04 20:25:47 +02:00
d8d70bfd8b Added missing MB->kB conversion 2017-05-04 00:04:28 +02:00
7d8149ace3 Fixed typo 2017-05-04 00:01:27 +02:00
4460b454c4 Added pixmap cache configuration to options. 2017-05-03 23:55:16 +02:00
211310f377 Version++ 2017-05-03 22:00:10 +02:00
1e4bcd0ac1 Added support for OZF3 map files 2017-05-03 21:34:13 +02:00
1a66ed0a36 Use the proper layer when displaying a single waypoint on an atlas. 2017-05-01 22:49:01 +02:00
273a127069 Version++ 2017-05-01 13:04:15 +02:00
1c0a0fd0b3 Fixed broken print/PDF export
(wrong map scale/waypoints size)
2017-05-01 12:59:56 +02:00
713e331b2a Some more OZFx extensions 2017-04-30 18:27:12 +02:00
96f406aad7 Removed Thunderforest map (requires API key)
Added USGS maps (topo & imagery)
2017-04-30 13:21:32 +02:00
0aedec66c4 Fixed atlas ll2xy() caching 2017-04-30 00:19:53 +02:00
b500031713 Atlas ll2xy() optimization 2017-04-29 23:15:44 +02:00
699e4f32d5 Version++ 2017-04-23 18:15:08 +02:00
992c8aaaf9 Improved error reporting 2017-04-23 13:37:17 +02:00
68a72c5809 Added proper OZF files detection 2017-04-23 12:49:40 +02:00
eace308774 Properly open all selected files (tar content/atlas structure is however still case sensitive) 2017-04-23 12:26:01 +02:00
e4e3f7d143 Added missing atlas maps unloading on atlas unload 2017-04-22 10:19:02 +02:00
acc49d015e Use only the "Map" word for maps/atlases in the GUI 2017-04-21 21:57:29 +02:00
b48652cb78 Localization update 2017-04-21 21:25:56 +02:00
0808f6679e Added "runtime" offline map loading
Offline map loading & error handling cleanup
2017-04-21 21:15:58 +02:00
610ac3d73f Fixed atlas zoom fitting algorithm 2017-04-19 00:07:01 +02:00
40 changed files with 1610 additions and 813 deletions

View File

@ -1,5 +1,5 @@
TARGET = GPXSee TARGET = GPXSee
VERSION = 4.4 VERSION = 4.7
QT += core \ QT += core \
gui \ gui \
network network
@ -23,7 +23,6 @@ HEADERS += src/config.h \
src/filebrowser.h \ src/filebrowser.h \
src/map.h \ src/map.h \
src/onlinemap.h \ src/onlinemap.h \
src/maplist.h \
src/downloader.h \ src/downloader.h \
src/units.h \ src/units.h \
src/scaleitem.h \ src/scaleitem.h \
@ -81,7 +80,6 @@ HEADERS += src/config.h \
src/timetype.h \ src/timetype.h \
src/emptymap.h \ src/emptymap.h \
src/offlinemap.h \ src/offlinemap.h \
src/mapdir.h \
src/matrix.h \ src/matrix.h \
src/tar.h \ src/tar.h \
src/atlas.h \ src/atlas.h \
@ -93,7 +91,9 @@ HEADERS += src/config.h \
src/lambertconic.h \ src/lambertconic.h \
src/ellipsoid.h \ src/ellipsoid.h \
src/ozf.h \ src/ozf.h \
src/datum.h src/datum.h \
src/maplist.h \
src/albersequal.h
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/gui.cpp \ src/gui.cpp \
src/poi.cpp \ src/poi.cpp \
@ -106,7 +106,6 @@ SOURCES += src/main.cpp \
src/sliderinfoitem.cpp \ src/sliderinfoitem.cpp \
src/filebrowser.cpp \ src/filebrowser.cpp \
src/onlinemap.cpp \ src/onlinemap.cpp \
src/maplist.cpp \
src/downloader.cpp \ src/downloader.cpp \
src/scaleitem.cpp \ src/scaleitem.cpp \
src/track.cpp \ src/track.cpp \
@ -150,7 +149,6 @@ SOURCES += src/main.cpp \
src/stylecombobox.cpp \ src/stylecombobox.cpp \
src/emptymap.cpp \ src/emptymap.cpp \
src/offlinemap.cpp \ src/offlinemap.cpp \
src/mapdir.cpp \
src/matrix.cpp \ src/matrix.cpp \
src/tar.cpp \ src/tar.cpp \
src/atlas.cpp \ src/atlas.cpp \
@ -160,7 +158,9 @@ SOURCES += src/main.cpp \
src/lambertconic.cpp \ src/lambertconic.cpp \
src/ellipsoid.cpp \ src/ellipsoid.cpp \
src/ozf.cpp \ src/ozf.cpp \
src/datum.cpp src/datum.cpp \
src/maplist.cpp \
src/albersequal.cpp
RESOURCES += gpxsee.qrc RESOURCES += gpxsee.qrc
TRANSLATIONS = lang/gpxsee_cs.ts \ TRANSLATIONS = lang/gpxsee_cs.ts \
lang/gpxsee_sv.ts \ lang/gpxsee_sv.ts \

View File

@ -190,55 +190,55 @@
<context> <context>
<name>GUI</name> <name>GUI</name>
<message> <message>
<location filename="../src/gui.cpp" line="625"/> <location filename="../src/gui.cpp" line="654"/>
<source>GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at </source> <source>GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at </source>
<translation>Program GPXSee je distribuován pod podmínkami licence GNU General Public License verze 3. Pro více informací navštivte stránky programu na adrese </translation> <translation>Program GPXSee je distribuován pod podmínkami licence GNU General Public License verze 3. Pro více informací navštivte stránky programu na adrese </translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="703"/> <location filename="../src/gui.cpp" line="732"/>
<source>Open file</source> <source>Open file</source>
<translation>Otevřít soubor</translation> <translation>Otevřít soubor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="793"/> <location filename="../src/gui.cpp" line="822"/>
<source>Open POI file</source> <source>Open POI file</source>
<translation>Otevřít POI soubor</translation> <translation>Otevřít POI soubor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="284"/> <location filename="../src/gui.cpp" line="311"/>
<source>Open</source> <source>Open</source>
<translation>Otevřít</translation> <translation>Otevřít</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="268"/> <location filename="../src/gui.cpp" line="295"/>
<source>Quit</source> <source>Quit</source>
<translation>Ukončit</translation> <translation>Ukončit</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="276"/> <location filename="../src/gui.cpp" line="303"/>
<location filename="../src/gui.cpp" line="641"/> <location filename="../src/gui.cpp" line="670"/>
<location filename="../src/gui.cpp" line="642"/> <location filename="../src/gui.cpp" line="671"/>
<source>Keyboard controls</source> <source>Keyboard controls</source>
<translation>Ovládací klávesy</translation> <translation>Ovládací klávesy</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="300"/> <location filename="../src/gui.cpp" line="327"/>
<source>Close</source> <source>Close</source>
<translation>Zavřít</translation> <translation>Zavřít</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="306"/> <location filename="../src/gui.cpp" line="333"/>
<source>Reload</source> <source>Reload</source>
<translation>Znovu načíst</translation> <translation>Znovu načíst</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="555"/> <location filename="../src/gui.cpp" line="584"/>
<source>Show</source> <source>Show</source>
<translation>Zobrazit</translation> <translation>Zobrazit</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="473"/> <location filename="../src/gui.cpp" line="501"/>
<location filename="../src/gui.cpp" line="549"/> <location filename="../src/gui.cpp" line="578"/>
<source>File</source> <source>File</source>
<translation>Soubor</translation> <translation>Soubor</translation>
</message> </message>
@ -258,242 +258,243 @@
<translation>Soubory NMEA (*.nmea)</translation> <translation>Soubory NMEA (*.nmea)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="274"/> <location filename="../src/gui.cpp" line="301"/>
<location filename="../src/gui.cpp" line="670"/> <location filename="../src/gui.cpp" line="699"/>
<location filename="../src/gui.cpp" line="671"/> <location filename="../src/gui.cpp" line="700"/>
<source>Data sources</source> <source>Data sources</source>
<translation>Zdroje dat</translation> <translation>Zdroje dat</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="314"/> <location filename="../src/gui.cpp" line="341"/>
<source>Load POI file</source> <source>Load POI file</source>
<translation>Nahrát POI soubor</translation> <translation>Nahrát POI soubor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="317"/> <location filename="../src/gui.cpp" line="344"/>
<source>Close POI files</source> <source>Close POI files</source>
<translation>Zavřit POI soubory</translation> <translation>Zavřit POI soubory</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="319"/> <location filename="../src/gui.cpp" line="346"/>
<source>Overlap POIs</source> <source>Overlap POIs</source>
<translation>Překrývat POI</translation> <translation>Překrývat POI</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="323"/> <location filename="../src/gui.cpp" line="350"/>
<source>Show POI labels</source> <source>Show POI labels</source>
<translation>Zobrazit názvy POI</translation> <translation>Zobrazit názvy POI</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="328"/> <location filename="../src/gui.cpp" line="355"/>
<source>Show POIs</source> <source>Show POIs</source>
<translation>Zobrazit POI</translation> <translation>Zobrazit POI</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="337"/> <location filename="../src/gui.cpp" line="364"/>
<source>Show map</source> <source>Show map</source>
<translation>Zobrazit mapu</translation> <translation>Zobrazit mapu</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="344"/> <location filename="../src/gui.cpp" line="371"/>
<location filename="../src/gui.cpp" line="1168"/>
<source>Load map</source>
<translation>Nahrát mapu</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="374"/>
<source>Clear tile cache</source> <source>Clear tile cache</source>
<translation>Vymazat mezipaměť dlaždic</translation> <translation>Vymazat mezipaměť dlaždic</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="353"/> <location filename="../src/gui.cpp" line="378"/>
<location filename="../src/gui.cpp" line="357"/> <location filename="../src/gui.cpp" line="382"/>
<location filename="../src/gui.cpp" line="653"/> <location filename="../src/gui.cpp" line="682"/>
<source>Next map</source> <source>Next map</source>
<translation>Následující mapa</translation> <translation>Následující mapa</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="364"/> <location filename="../src/gui.cpp" line="392"/>
<source>Show tracks</source> <source>Show tracks</source>
<translation>Zobrazit cesty</translation> <translation>Zobrazit cesty</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="368"/> <location filename="../src/gui.cpp" line="396"/>
<source>Show routes</source> <source>Show routes</source>
<translation>Zobrazit trasy</translation> <translation>Zobrazit trasy</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="372"/> <location filename="../src/gui.cpp" line="400"/>
<source>Show waypoints</source> <source>Show waypoints</source>
<translation>Zobrazit navigační body</translation> <translation>Zobrazit navigační body</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="376"/> <location filename="../src/gui.cpp" line="404"/>
<source>Waypoint labels</source> <source>Waypoint labels</source>
<translation>Názvy navigačních bodů</translation> <translation>Názvy navigačních bodů</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="387"/> <location filename="../src/gui.cpp" line="415"/>
<source>Show graphs</source> <source>Show graphs</source>
<translation>Zobrazit grafy</translation> <translation>Zobrazit grafy</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="409"/> <location filename="../src/gui.cpp" line="437"/>
<source>Show grid</source> <source>Show grid</source>
<translation>Zobrazit mřížku</translation> <translation>Zobrazit mřížku</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="415"/> <location filename="../src/gui.cpp" line="443"/>
<source>Show toolbars</source> <source>Show toolbars</source>
<translation>Zobrazovat nástrojové lišty</translation> <translation>Zobrazovat nástrojové lišty</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="421"/> <location filename="../src/gui.cpp" line="449"/>
<source>Total time</source> <source>Total time</source>
<translation>Celkový čas</translation> <translation>Celkový čas</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="426"/> <location filename="../src/gui.cpp" line="454"/>
<location filename="../src/gui.cpp" line="946"/> <location filename="../src/gui.cpp" line="977"/>
<source>Moving time</source> <source>Moving time</source>
<translation>Čistý čas</translation> <translation>Čistý čas</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="433"/> <location filename="../src/gui.cpp" line="461"/>
<source>Metric</source> <source>Metric</source>
<translation>Metrické</translation> <translation>Metrické</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="438"/> <location filename="../src/gui.cpp" line="466"/>
<source>Imperial</source> <source>Imperial</source>
<translation>Imperiální</translation> <translation>Imperiální</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="444"/> <location filename="../src/gui.cpp" line="472"/>
<source>Fullscreen mode</source> <source>Fullscreen mode</source>
<translation>Celoobrazovkový režim</translation> <translation>Celoobrazovkový režim</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="450"/> <location filename="../src/gui.cpp" line="478"/>
<source>Options...</source> <source>Options...</source>
<translation>Nastavení...</translation> <translation>Nastavení...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="455"/> <location filename="../src/gui.cpp" line="483"/>
<source>Next</source> <source>Next</source>
<translation>Následující</translation> <translation>Následující</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="458"/> <location filename="../src/gui.cpp" line="486"/>
<source>Previous</source> <source>Previous</source>
<translation>Předchozí</translation> <translation>Předchozí</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="462"/> <location filename="../src/gui.cpp" line="490"/>
<source>Last</source> <source>Last</source>
<translation>Poslední</translation> <translation>Poslední</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="465"/> <location filename="../src/gui.cpp" line="493"/>
<source>First</source> <source>First</source>
<translation>První</translation> <translation>První</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="487"/> <location filename="../src/gui.cpp" line="515"/>
<source>Map</source> <source>Map</source>
<translation>Mapa</translation> <translation>Mapa</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="494"/> <location filename="../src/gui.cpp" line="523"/>
<source>Graph</source> <source>Graph</source>
<translation>Graf</translation> <translation>Graf</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="502"/> <location filename="../src/gui.cpp" line="531"/>
<source>POI</source> <source>POI</source>
<translation>POI</translation> <translation>POI</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="503"/> <location filename="../src/gui.cpp" line="532"/>
<source>POI files</source> <source>POI files</source>
<translation>POI soubory</translation> <translation>POI soubory</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="514"/> <location filename="../src/gui.cpp" line="543"/>
<source>Data</source> <source>Data</source>
<translation>Data</translation> <translation>Data</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="515"/> <location filename="../src/gui.cpp" line="544"/>
<source>Display</source> <source>Display</source>
<translation>Zobrazit</translation> <translation>Zobrazit</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="523"/> <location filename="../src/gui.cpp" line="552"/>
<source>Settings</source> <source>Settings</source>
<translation>Nastavení</translation> <translation>Nastavení</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="527"/> <location filename="../src/gui.cpp" line="556"/>
<source>Units</source> <source>Units</source>
<translation>Jednotky</translation> <translation>Jednotky</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="536"/> <location filename="../src/gui.cpp" line="565"/>
<source>Help</source> <source>Help</source>
<translation>Nápověda</translation> <translation>Nápověda</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="651"/> <location filename="../src/gui.cpp" line="680"/>
<source>Append file</source> <source>Append file</source>
<translation>Přidat soubor</translation> <translation>Přidat soubor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="652"/> <location filename="../src/gui.cpp" line="681"/>
<source>Next/Previous</source> <source>Next/Previous</source>
<translation>Následující/Předchozí</translation> <translation>Následující/Předchozí</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="655"/> <location filename="../src/gui.cpp" line="684"/>
<source>Previous map</source> <source>Previous map</source>
<translation>Předchozí mapa</translation> <translation>Předchozí mapa</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="656"/> <location filename="../src/gui.cpp" line="685"/>
<source>Zoom in</source> <source>Zoom in</source>
<translation>Přiblížit</translation> <translation>Přiblížit</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="658"/> <location filename="../src/gui.cpp" line="687"/>
<source>Zoom out</source> <source>Zoom out</source>
<translation>Oddálit</translation> <translation>Oddálit</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="660"/> <location filename="../src/gui.cpp" line="689"/>
<source>Digital zoom</source> <source>Digital zoom</source>
<translation>Digitální zoom</translation> <translation>Digitální zoom</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="661"/> <location filename="../src/gui.cpp" line="690"/>
<source>Zoom</source> <source>Zoom</source>
<translation>Zoom</translation> <translation>Zoom</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="673"/> <location filename="../src/gui.cpp" line="702"/>
<source>Online maps</source> <source>Online maps</source>
<translation>Online mapy</translation> <translation>Online mapy</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="674"/> <location filename="../src/gui.cpp" line="703"/>
<source>Online map URLs are read on program startup from the following file:</source> <source>Online map URLs are read on program startup from the following file:</source>
<translation>URL online map jsou načteny při startu programu z následujícího souboru:</translation> <translation>URL online map jsou načteny při startu programu z následujícího souboru:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="685"/> <location filename="../src/gui.cpp" line="714"/>
<source>Offline maps are loaded on program startup from the following directory:</source> <source>Offline maps are loaded on program startup from the following directory:</source>
<translation>Offline mapy jsou načítány při startu aplikace z následujícího adresáře:</translation> <translation>Offline mapy jsou načítány při startu aplikace z následujícího adresáře:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="688"/> <location filename="../src/gui.cpp" line="1201"/>
<source>The expected structure is one map/atlas in a separate subdirectory. Supported map formats are OziExplorer image-based maps and tiled TrekBuddy maps/atlases (tared and non-tared).</source>
<translation>Očekávaná struktura je jedna mapa/atlas v samostatném podadresáři. Podporované mapové formáty jsou OziExplorer mapy a TrekBuddy mapy/atlasy (včetně tar varianty).</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="1144"/>
<source>No files loaded</source> <source>No files loaded</source>
<translation>Nejsou načteny žádné soubory</translation> <translation>Nejsou načteny žádné soubory</translation>
</message> </message>
@ -523,18 +524,28 @@
<translation>Všechny soubory (*)</translation> <translation>Všechny soubory (*)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="932"/> <location filename="../src/gui.cpp" line="963"/>
<location filename="../src/gui.cpp" line="935"/> <location filename="../src/gui.cpp" line="966"/>
<source>Date</source> <source>Date</source>
<translation>Datum</translation> <translation>Datum</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="924"/> <location filename="../src/gui.cpp" line="955"/>
<source>Routes</source> <source>Routes</source>
<translation>Trasy</translation> <translation>Trasy</translation>
</message> </message>
<message>
<location filename="../src/gui.cpp" line="1169"/>
<source>Map files (*.map *.tba *.tar)</source>
<translation>Mapové soubory (*.map *.tba *.tar)</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="1186"/>
<source>Error loading map:</source>
<translation>Mapu nelze načíst:</translation>
</message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/gui.cpp" line="1148"/> <location filename="../src/gui.cpp" line="1205"/>
<source>%n files</source> <source>%n files</source>
<translation> <translation>
<numerusform>%n soubor</numerusform> <numerusform>%n soubor</numerusform>
@ -543,32 +554,32 @@
</translation> </translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="645"/> <location filename="../src/gui.cpp" line="674"/>
<source>Next file</source> <source>Next file</source>
<translation>Následující soubor</translation> <translation>Následující soubor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="622"/> <location filename="../src/gui.cpp" line="651"/>
<source>Version </source> <source>Version </source>
<translation>Verze </translation> <translation>Verze </translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="289"/> <location filename="../src/gui.cpp" line="316"/>
<source>Print...</source> <source>Print...</source>
<translation>Tisknout...</translation> <translation>Tisknout...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="294"/> <location filename="../src/gui.cpp" line="321"/>
<source>Export to PDF...</source> <source>Export to PDF...</source>
<translation>Exportovat do PDF...</translation> <translation>Exportovat do PDF...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="926"/> <location filename="../src/gui.cpp" line="957"/>
<source>Waypoints</source> <source>Waypoints</source>
<translation>Navigační body</translation> <translation>Navigační body</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="646"/> <location filename="../src/gui.cpp" line="675"/>
<source>Previous file</source> <source>Previous file</source>
<translation>Předchozí soubor</translation> <translation>Předchozí soubor</translation>
</message> </message>
@ -578,87 +589,92 @@
<translation>Podporované soubory (*.csv *.fit *.gpx *.igc *.kml *.nmea *.tcx)</translation> <translation>Podporované soubory (*.csv *.fit *.gpx *.igc *.kml *.nmea *.tcx)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="380"/> <location filename="../src/gui.cpp" line="408"/>
<source>Route waypoints</source> <source>Route waypoints</source>
<translation>Body tras</translation> <translation>Body tras</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="648"/> <location filename="../src/gui.cpp" line="677"/>
<source>First file</source> <source>First file</source>
<translation>První soubor</translation> <translation>První soubor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="650"/> <location filename="../src/gui.cpp" line="679"/>
<source>Last file</source> <source>Last file</source>
<translation>Poslední soubor</translation> <translation>Poslední soubor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="677"/> <location filename="../src/gui.cpp" line="706"/>
<source>The file format is one map entry per line, consisting of the map name and tiles URL delimited by a TAB character. The tile X and Y coordinates are replaced with $x and $y in the URL and the zoom level is replaced with $z. An example map file could look like:</source> <source>The file format is one map entry per line, consisting of the map name and tiles URL delimited by a TAB character. The tile X and Y coordinates are replaced with $x and $y in the URL and the zoom level is replaced with $z. An example map file could look like:</source>
<translation>Formát souboru je jeden mapový záznam na řádku, kde mapový záznam sestává ze jména mapy a URL dlaždic navzájem oddělených tabulátorem. Souřadnice dlaždice jsou v URL nahrazeny řetězci $x a $y, úroven přiblížení (zoom) pak řetězcem $z. Příklad:</translation> <translation>Formát souboru je jeden mapový záznam na řádku, kde mapový záznam sestává ze jména mapy a URL dlaždic navzájem oddělených tabulátorem. Souřadnice dlaždice jsou v URL nahrazeny řetězci $x a $y, úroven přiblížení (zoom) pak řetězcem $z. Příklad:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="684"/> <location filename="../src/gui.cpp" line="713"/>
<source>Offline maps</source> <source>Offline maps</source>
<translation>Offline mapy</translation> <translation>Offline mapy</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="693"/> <location filename="../src/gui.cpp" line="717"/>
<source>The expected structure is one map/atlas in a separate subdirectory. Supported map formats are OziExplorer maps and TrekBuddy maps/atlases (tared and non-tared).</source>
<translation>Očekávaná struktura je jedna mapa/atlas v samostatném podadresáři. Podporované mapové formáty jsou OziExplorer mapy a TrekBuddy mapy/atlasy (včetně tar varianty).</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="722"/>
<source>To make GPXSee load a POI file automatically on startup, add the file to the following directory:</source> <source>To make GPXSee load a POI file automatically on startup, add the file to the following directory:</source>
<translation>POI soubory, které se mají automaticky nahrát při startu programu jsou načítány z následujícího adresáře:</translation> <translation>POI soubory, které se mají automaticky nahrát při startu programu jsou načítány z následujícího adresáře:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="782"/> <location filename="../src/gui.cpp" line="811"/>
<source>Error loading data file:</source> <source>Error loading data file:</source>
<translation>Datový soubor nelze načíst:</translation> <translation>Datový soubor nelze načíst:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="785"/> <location filename="../src/gui.cpp" line="814"/>
<location filename="../src/gui.cpp" line="810"/> <location filename="../src/gui.cpp" line="839"/>
<source>Line: %1</source> <source>Line: %1</source>
<translation>Řádka: %1</translation> <translation>Řádka: %1</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="807"/> <location filename="../src/gui.cpp" line="836"/>
<source>Error loading POI file:</source> <source>Error loading POI file:</source>
<translation>Soubor POI nelze načíst:</translation> <translation>Soubor POI nelze načíst:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="918"/> <location filename="../src/gui.cpp" line="949"/>
<source>Name</source> <source>Name</source>
<translation>Název</translation> <translation>Název</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="922"/> <location filename="../src/gui.cpp" line="953"/>
<source>Tracks</source> <source>Tracks</source>
<translation>Cesty</translation> <translation>Cesty</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="279"/> <location filename="../src/gui.cpp" line="306"/>
<location filename="../src/gui.cpp" line="621"/> <location filename="../src/gui.cpp" line="650"/>
<source>About GPXSee</source> <source>About GPXSee</source>
<translation>O aplikaci GPXSee</translation> <translation>O aplikaci GPXSee</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="560"/> <location filename="../src/gui.cpp" line="589"/>
<source>Navigation</source> <source>Navigation</source>
<translation>Navigace</translation> <translation>Navigace</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="692"/> <location filename="../src/gui.cpp" line="721"/>
<source>POIs</source> <source>POIs</source>
<translation>POI body</translation> <translation>POI body</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="395"/> <location filename="../src/gui.cpp" line="423"/>
<location filename="../src/gui.cpp" line="942"/> <location filename="../src/gui.cpp" line="973"/>
<source>Distance</source> <source>Distance</source>
<translation>Vzdálenost</translation> <translation>Vzdálenost</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="402"/> <location filename="../src/gui.cpp" line="430"/>
<location filename="../src/gui.cpp" line="524"/> <location filename="../src/gui.cpp" line="553"/>
<location filename="../src/gui.cpp" line="944"/> <location filename="../src/gui.cpp" line="975"/>
<source>Time</source> <source>Time</source>
<translation>Čas</translation> <translation>Čas</translation>
</message> </message>
@ -822,7 +838,7 @@
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="140"/> <location filename="../src/optionsdialog.cpp" line="140"/>
<location filename="../src/optionsdialog.cpp" line="224"/> <location filename="../src/optionsdialog.cpp" line="237"/>
<source>POI</source> <source>POI</source>
<translation>POI</translation> <translation>POI</translation>
</message> </message>
@ -871,24 +887,34 @@
<source>Use OpenGL</source> <source>Use OpenGL</source>
<translation>Používat OpenGL</translation> <translation>Používat OpenGL</translation>
</message> </message>
<message>
<location filename="../src/optionsdialog.cpp" line="202"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="206"/> <location filename="../src/optionsdialog.cpp" line="206"/>
<location filename="../src/optionsdialog.cpp" line="227"/> <source>Image cache size:</source>
<translation>Mezipaměť obrázků:</translation>
</message>
<message>
<location filename="../src/optionsdialog.cpp" line="219"/>
<location filename="../src/optionsdialog.cpp" line="240"/>
<source>System</source> <source>System</source>
<translation>Systém</translation> <translation>Systém</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="222"/> <location filename="../src/optionsdialog.cpp" line="235"/>
<source>Appearance</source> <source>Appearance</source>
<translation>Vzhled</translation> <translation>Vzhled</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="225"/> <location filename="../src/optionsdialog.cpp" line="238"/>
<source>Print &amp; Export</source> <source>Print &amp; Export</source>
<translation>Tisk a export</translation> <translation>Tisk a export</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="254"/> <location filename="../src/optionsdialog.cpp" line="267"/>
<source>Options</source> <source>Options</source>
<translation>Nastavení</translation> <translation>Nastavení</translation>
</message> </message>
@ -938,22 +964,22 @@
<context> <context>
<name>ScaleItem</name> <name>ScaleItem</name>
<message> <message>
<location filename="../src/scaleitem.cpp" line="81"/> <location filename="../src/scaleitem.cpp" line="83"/>
<source>mi</source> <source>mi</source>
<translation>mi</translation> <translation>mi</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="82"/> <location filename="../src/scaleitem.cpp" line="84"/>
<source>ft</source> <source>ft</source>
<translation>ft</translation> <translation>ft</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="84"/> <location filename="../src/scaleitem.cpp" line="86"/>
<source>km</source> <source>km</source>
<translation>km</translation> <translation>km</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="85"/> <location filename="../src/scaleitem.cpp" line="87"/>
<source>m</source> <source>m</source>
<translation>m</translation> <translation>m</translation>
</message> </message>
@ -1057,27 +1083,27 @@
<context> <context>
<name>WaypointItem</name> <name>WaypointItem</name>
<message> <message>
<location filename="../src/waypointitem.cpp" line="18"/> <location filename="../src/waypointitem.cpp" line="17"/>
<source>Name</source> <source>Name</source>
<translation>Název</translation> <translation>Název</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="19"/> <location filename="../src/waypointitem.cpp" line="18"/>
<source>Coordinates</source> <source>Coordinates</source>
<translation>Souřadnice</translation> <translation>Souřadnice</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="22"/> <location filename="../src/waypointitem.cpp" line="21"/>
<source>Elevation</source> <source>Elevation</source>
<translation>Výška</translation> <translation>Výška</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="25"/> <location filename="../src/waypointitem.cpp" line="24"/>
<source>Date</source> <source>Date</source>
<translation>Datum</translation> <translation>Datum</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="28"/> <location filename="../src/waypointitem.cpp" line="27"/>
<source>Description</source> <source>Description</source>
<translation>Popis</translation> <translation>Popis</translation>
</message> </message>

View File

@ -190,55 +190,55 @@
<context> <context>
<name>GUI</name> <name>GUI</name>
<message> <message>
<location filename="../src/gui.cpp" line="625"/> <location filename="../src/gui.cpp" line="654"/>
<source>GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at </source> <source>GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at </source>
<translation>GPXSee wird unter der GNU General Public License version 3 vertrieben. Mehr Informationen zu GPXSee auf der Homepage </translation> <translation>GPXSee wird unter der GNU General Public License version 3 vertrieben. Mehr Informationen zu GPXSee auf der Homepage </translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="703"/> <location filename="../src/gui.cpp" line="732"/>
<source>Open file</source> <source>Open file</source>
<translation>Datei öffnen</translation> <translation>Datei öffnen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="793"/> <location filename="../src/gui.cpp" line="822"/>
<source>Open POI file</source> <source>Open POI file</source>
<translation>POI Datei öffnen</translation> <translation>POI Datei öffnen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="284"/> <location filename="../src/gui.cpp" line="311"/>
<source>Open</source> <source>Open</source>
<translation>Öffnen</translation> <translation>Öffnen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="268"/> <location filename="../src/gui.cpp" line="295"/>
<source>Quit</source> <source>Quit</source>
<translation>Beenden</translation> <translation>Beenden</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="276"/> <location filename="../src/gui.cpp" line="303"/>
<location filename="../src/gui.cpp" line="641"/> <location filename="../src/gui.cpp" line="670"/>
<location filename="../src/gui.cpp" line="642"/> <location filename="../src/gui.cpp" line="671"/>
<source>Keyboard controls</source> <source>Keyboard controls</source>
<translation>Tastaturkürzel</translation> <translation>Tastaturkürzel</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="300"/> <location filename="../src/gui.cpp" line="327"/>
<source>Close</source> <source>Close</source>
<translation>Schließen</translation> <translation>Schließen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="306"/> <location filename="../src/gui.cpp" line="333"/>
<source>Reload</source> <source>Reload</source>
<translation>Neu Laden</translation> <translation>Neu Laden</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="555"/> <location filename="../src/gui.cpp" line="584"/>
<source>Show</source> <source>Show</source>
<translation>Ansicht</translation> <translation>Ansicht</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="473"/> <location filename="../src/gui.cpp" line="501"/>
<location filename="../src/gui.cpp" line="549"/> <location filename="../src/gui.cpp" line="578"/>
<source>File</source> <source>File</source>
<translation>Datei</translation> <translation>Datei</translation>
</message> </message>
@ -258,252 +258,263 @@
<translation>NMEA-Dateien (*.nmea)</translation> <translation>NMEA-Dateien (*.nmea)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="274"/> <location filename="../src/gui.cpp" line="301"/>
<location filename="../src/gui.cpp" line="670"/> <location filename="../src/gui.cpp" line="699"/>
<location filename="../src/gui.cpp" line="671"/> <location filename="../src/gui.cpp" line="700"/>
<source>Data sources</source> <source>Data sources</source>
<translation>Datenquellen</translation> <translation>Datenquellen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="314"/> <location filename="../src/gui.cpp" line="341"/>
<source>Load POI file</source> <source>Load POI file</source>
<translation>POI-Datei laden</translation> <translation>POI-Datei laden</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="317"/> <location filename="../src/gui.cpp" line="344"/>
<source>Close POI files</source> <source>Close POI files</source>
<translation>POI-Datei schließen</translation> <translation>POI-Datei schließen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="319"/> <location filename="../src/gui.cpp" line="346"/>
<source>Overlap POIs</source> <source>Overlap POIs</source>
<translation>POI überlappen</translation> <translation>POI überlappen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="323"/> <location filename="../src/gui.cpp" line="350"/>
<source>Show POI labels</source> <source>Show POI labels</source>
<translation>POI-Labels anzeigen</translation> <translation>POI-Labels anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="328"/> <location filename="../src/gui.cpp" line="355"/>
<source>Show POIs</source> <source>Show POIs</source>
<translation>POIs anzeigen</translation> <translation>POIs anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="337"/> <location filename="../src/gui.cpp" line="364"/>
<source>Show map</source> <source>Show map</source>
<translation>Karte anzeigen</translation> <translation>Karte anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="344"/> <location filename="../src/gui.cpp" line="371"/>
<location filename="../src/gui.cpp" line="1168"/>
<source>Load map</source>
<translation>Karte laden</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="374"/>
<source>Clear tile cache</source> <source>Clear tile cache</source>
<translation>Tile-Cache bereinigen</translation> <translation>Tile-Cache bereinigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="353"/> <location filename="../src/gui.cpp" line="378"/>
<location filename="../src/gui.cpp" line="357"/> <location filename="../src/gui.cpp" line="382"/>
<location filename="../src/gui.cpp" line="653"/> <location filename="../src/gui.cpp" line="682"/>
<source>Next map</source> <source>Next map</source>
<translation>Nächste Karte</translation> <translation>Nächste Karte</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="364"/> <location filename="../src/gui.cpp" line="392"/>
<source>Show tracks</source> <source>Show tracks</source>
<translation>Strecken anzeigen</translation> <translation>Strecken anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="368"/> <location filename="../src/gui.cpp" line="396"/>
<source>Show routes</source> <source>Show routes</source>
<translation>Routen anzeigen</translation> <translation>Routen anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="372"/> <location filename="../src/gui.cpp" line="400"/>
<source>Show waypoints</source> <source>Show waypoints</source>
<translation>Wegpunkte anzeigen</translation> <translation>Wegpunkte anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="376"/> <location filename="../src/gui.cpp" line="404"/>
<source>Waypoint labels</source> <source>Waypoint labels</source>
<translation>Wegpunkt Labels</translation> <translation>Wegpunkt Labels</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="387"/> <location filename="../src/gui.cpp" line="415"/>
<source>Show graphs</source> <source>Show graphs</source>
<translation>Graphen anzeigen</translation> <translation>Graphen anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="409"/> <location filename="../src/gui.cpp" line="437"/>
<source>Show grid</source> <source>Show grid</source>
<translation>Gitter anzeigen</translation> <translation>Gitter anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="415"/> <location filename="../src/gui.cpp" line="443"/>
<source>Show toolbars</source> <source>Show toolbars</source>
<translation>Toolbars anzeigen</translation> <translation>Toolbars anzeigen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="421"/> <location filename="../src/gui.cpp" line="449"/>
<source>Total time</source> <source>Total time</source>
<translation>Gesamtzeit</translation> <translation>Gesamtzeit</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="426"/> <location filename="../src/gui.cpp" line="454"/>
<location filename="../src/gui.cpp" line="946"/> <location filename="../src/gui.cpp" line="977"/>
<source>Moving time</source> <source>Moving time</source>
<translation>Bewegungszeit</translation> <translation>Bewegungszeit</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="433"/> <location filename="../src/gui.cpp" line="461"/>
<source>Metric</source> <source>Metric</source>
<translation>Metrisch</translation> <translation>Metrisch</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="438"/> <location filename="../src/gui.cpp" line="466"/>
<source>Imperial</source> <source>Imperial</source>
<translation>Imperial</translation> <translation>Imperial</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="444"/> <location filename="../src/gui.cpp" line="472"/>
<source>Fullscreen mode</source> <source>Fullscreen mode</source>
<translation>Vollbildmodus</translation> <translation>Vollbildmodus</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="450"/> <location filename="../src/gui.cpp" line="478"/>
<source>Options...</source> <source>Options...</source>
<translation>Einstellungen...</translation> <translation>Einstellungen...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="455"/> <location filename="../src/gui.cpp" line="483"/>
<source>Next</source> <source>Next</source>
<translation>Nächste</translation> <translation>Nächste</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="458"/> <location filename="../src/gui.cpp" line="486"/>
<source>Previous</source> <source>Previous</source>
<translation>Vorherige</translation> <translation>Vorherige</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="462"/> <location filename="../src/gui.cpp" line="490"/>
<source>Last</source> <source>Last</source>
<translation>Letzte</translation> <translation>Letzte</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="465"/> <location filename="../src/gui.cpp" line="493"/>
<source>First</source> <source>First</source>
<translation>Erste</translation> <translation>Erste</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="487"/> <location filename="../src/gui.cpp" line="515"/>
<source>Map</source> <source>Map</source>
<translation>Karte</translation> <translation>Karte</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="494"/> <location filename="../src/gui.cpp" line="523"/>
<source>Graph</source> <source>Graph</source>
<translation>Graph</translation> <translation>Graph</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="502"/> <location filename="../src/gui.cpp" line="531"/>
<source>POI</source> <source>POI</source>
<translation>POI</translation> <translation>POI</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="503"/> <location filename="../src/gui.cpp" line="532"/>
<source>POI files</source> <source>POI files</source>
<translation>POI-Dateien</translation> <translation>POI-Dateien</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="514"/> <location filename="../src/gui.cpp" line="543"/>
<source>Data</source> <source>Data</source>
<translation>Daten</translation> <translation>Daten</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="515"/> <location filename="../src/gui.cpp" line="544"/>
<source>Display</source> <source>Display</source>
<translation>Anzeige</translation> <translation>Anzeige</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="523"/> <location filename="../src/gui.cpp" line="552"/>
<source>Settings</source> <source>Settings</source>
<translation>Einstellungen</translation> <translation>Einstellungen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="527"/> <location filename="../src/gui.cpp" line="556"/>
<source>Units</source> <source>Units</source>
<translation>Einheiten</translation> <translation>Einheiten</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="536"/> <location filename="../src/gui.cpp" line="565"/>
<source>Help</source> <source>Help</source>
<translation>Hilfe</translation> <translation>Hilfe</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="651"/> <location filename="../src/gui.cpp" line="680"/>
<source>Append file</source> <source>Append file</source>
<translation>An Datei anhängen</translation> <translation>An Datei anhängen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="652"/> <location filename="../src/gui.cpp" line="681"/>
<source>Next/Previous</source> <source>Next/Previous</source>
<translation>Nächste/Vorherige</translation> <translation>Nächste/Vorherige</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="655"/> <location filename="../src/gui.cpp" line="684"/>
<source>Previous map</source> <source>Previous map</source>
<translation>Vorherige Karte</translation> <translation>Vorherige Karte</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="656"/> <location filename="../src/gui.cpp" line="685"/>
<source>Zoom in</source> <source>Zoom in</source>
<translation>Hineinzoomen</translation> <translation>Hineinzoomen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="658"/> <location filename="../src/gui.cpp" line="687"/>
<source>Zoom out</source> <source>Zoom out</source>
<translation>Herauszoomen</translation> <translation>Herauszoomen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="660"/> <location filename="../src/gui.cpp" line="689"/>
<source>Digital zoom</source> <source>Digital zoom</source>
<translation>Digitaler Zoom</translation> <translation>Digitaler Zoom</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="661"/> <location filename="../src/gui.cpp" line="690"/>
<source>Zoom</source> <source>Zoom</source>
<translation>Zoom</translation> <translation>Zoom</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="673"/> <location filename="../src/gui.cpp" line="702"/>
<source>Online maps</source> <source>Online maps</source>
<translation>Onlinekarten</translation> <translation>Onlinekarten</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="674"/> <location filename="../src/gui.cpp" line="703"/>
<source>Online map URLs are read on program startup from the following file:</source> <source>Online map URLs are read on program startup from the following file:</source>
<translation>Onlinekarten URLs werden zu Programmstart aus der folgenden Datei gelesen:</translation> <translation>Onlinekarten URLs werden zu Programmstart aus der folgenden Datei gelesen:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="684"/> <location filename="../src/gui.cpp" line="713"/>
<source>Offline maps</source> <source>Offline maps</source>
<translation>Offlinekarten</translation> <translation>Offlinekarten</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="685"/> <location filename="../src/gui.cpp" line="714"/>
<source>Offline maps are loaded on program startup from the following directory:</source> <source>Offline maps are loaded on program startup from the following directory:</source>
<translation>Offlinekarten werden zu Programmstart aus dem folgenden Verzeichnis geladen:</translation> <translation>Offlinekarten werden zu Programmstart aus dem folgenden Verzeichnis geladen:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="688"/> <location filename="../src/gui.cpp" line="1169"/>
<source>The expected structure is one map/atlas in a separate subdirectory. Supported map formats are OziExplorer image-based maps and tiled TrekBuddy maps/atlases (tared and non-tared).</source> <source>Map files (*.map *.tba *.tar)</source>
<translation>Die erwartete Struktur ist eine Karte/ein Atlas pro Unterverzeichnis. Unterstützte Kartenformate sind bildbasierte OziExplorer Karten und tile-basierte TrekBuddy Karten/Atlanten (mit oder ohne tar Kompression).</translation> <translation>Karten-Dateien (*.map *.tba *.tar)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="1144"/> <location filename="../src/gui.cpp" line="1186"/>
<source>Error loading map:</source>
<translation>Fehler beim Laden der Karte-Datei:</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="1201"/>
<source>No files loaded</source> <source>No files loaded</source>
<translation>Keine Dateien geladen</translation> <translation>Keine Dateien geladen</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/gui.cpp" line="1148"/> <location filename="../src/gui.cpp" line="1205"/>
<source>%n files</source> <source>%n files</source>
<translation> <translation>
<numerusform>%n Datei</numerusform> <numerusform>%n Datei</numerusform>
@ -536,43 +547,43 @@
<translation>Alle Dateien (*)</translation> <translation>Alle Dateien (*)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="932"/> <location filename="../src/gui.cpp" line="963"/>
<location filename="../src/gui.cpp" line="935"/> <location filename="../src/gui.cpp" line="966"/>
<source>Date</source> <source>Date</source>
<translation>Datum</translation> <translation>Datum</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="924"/> <location filename="../src/gui.cpp" line="955"/>
<source>Routes</source> <source>Routes</source>
<translation>Routen</translation> <translation>Routen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="645"/> <location filename="../src/gui.cpp" line="674"/>
<source>Next file</source> <source>Next file</source>
<translation>Nächste Datei</translation> <translation>Nächste Datei</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="622"/> <location filename="../src/gui.cpp" line="651"/>
<source>Version </source> <source>Version </source>
<translation>Version </translation> <translation>Version </translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="289"/> <location filename="../src/gui.cpp" line="316"/>
<source>Print...</source> <source>Print...</source>
<translation>Drucken...</translation> <translation>Drucken...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="294"/> <location filename="../src/gui.cpp" line="321"/>
<source>Export to PDF...</source> <source>Export to PDF...</source>
<translation>Als PDF exportieren...</translation> <translation>Als PDF exportieren...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="926"/> <location filename="../src/gui.cpp" line="957"/>
<source>Waypoints</source> <source>Waypoints</source>
<translation>Wegpunkte</translation> <translation>Wegpunkte</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="646"/> <location filename="../src/gui.cpp" line="675"/>
<source>Previous file</source> <source>Previous file</source>
<translation>Vorherige Datei</translation> <translation>Vorherige Datei</translation>
</message> </message>
@ -582,82 +593,87 @@
<translation>Unterstütze Dateien (*.csv *.fit *.gpx *.igc *.kml *.nmea *.tcx)</translation> <translation>Unterstütze Dateien (*.csv *.fit *.gpx *.igc *.kml *.nmea *.tcx)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="380"/> <location filename="../src/gui.cpp" line="408"/>
<source>Route waypoints</source> <source>Route waypoints</source>
<translation>Routen Wegpunkte</translation> <translation>Routen Wegpunkte</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="648"/> <location filename="../src/gui.cpp" line="677"/>
<source>First file</source> <source>First file</source>
<translation>Erste Datei</translation> <translation>Erste Datei</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="650"/> <location filename="../src/gui.cpp" line="679"/>
<source>Last file</source> <source>Last file</source>
<translation>Letzte Datei</translation> <translation>Letzte Datei</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="677"/> <location filename="../src/gui.cpp" line="706"/>
<source>The file format is one map entry per line, consisting of the map name and tiles URL delimited by a TAB character. The tile X and Y coordinates are replaced with $x and $y in the URL and the zoom level is replaced with $z. An example map file could look like:</source> <source>The file format is one map entry per line, consisting of the map name and tiles URL delimited by a TAB character. The tile X and Y coordinates are replaced with $x and $y in the URL and the zoom level is replaced with $z. An example map file could look like:</source>
<translation>Das Dateiformat ist eine Karte pro Linie. Jede Linie besteht aus dem Kartenname und die durch ein TAB Zeichen getrennte Tiles URL. X und Y Koordinate einer Tile werden in der URL durch $x und $y ersetzt und das Zoomlevel durch $z. Ein Beispiel einer Kartendatei könnte so aussehen:</translation> <translation>Das Dateiformat ist eine Karte pro Linie. Jede Linie besteht aus dem Kartenname und die durch ein TAB Zeichen getrennte Tiles URL. X und Y Koordinate einer Tile werden in der URL durch $x und $y ersetzt und das Zoomlevel durch $z. Ein Beispiel einer Kartendatei könnte so aussehen:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="693"/> <location filename="../src/gui.cpp" line="717"/>
<source>The expected structure is one map/atlas in a separate subdirectory. Supported map formats are OziExplorer maps and TrekBuddy maps/atlases (tared and non-tared).</source>
<translation>Die erwartete Struktur ist eine Karte/ein Atlas pro Unterverzeichnis. Unterstützte Kartenformate sind OziExplorer Karten und TrekBuddy Karten/Atlanten (mit oder ohne tar Kompression).</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="722"/>
<source>To make GPXSee load a POI file automatically on startup, add the file to the following directory:</source> <source>To make GPXSee load a POI file automatically on startup, add the file to the following directory:</source>
<translation>Damit GPXSee zu Programmstart automatisch eine POI-Datei lädt, fügen Sie diese zu folgendem Verzeichnis hinzu:</translation> <translation>Damit GPXSee zu Programmstart automatisch eine POI-Datei lädt, fügen Sie diese zu folgendem Verzeichnis hinzu:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="782"/> <location filename="../src/gui.cpp" line="811"/>
<source>Error loading data file:</source> <source>Error loading data file:</source>
<translation>Fehler beim Laden der Datei:</translation> <translation>Fehler beim Laden der Datei:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="785"/> <location filename="../src/gui.cpp" line="814"/>
<location filename="../src/gui.cpp" line="810"/> <location filename="../src/gui.cpp" line="839"/>
<source>Line: %1</source> <source>Line: %1</source>
<translation>Linie: %1</translation> <translation>Linie: %1</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="807"/> <location filename="../src/gui.cpp" line="836"/>
<source>Error loading POI file:</source> <source>Error loading POI file:</source>
<translation>Fehler beim Laden der POI-Datei:</translation> <translation>Fehler beim Laden der POI-Datei:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="918"/> <location filename="../src/gui.cpp" line="949"/>
<source>Name</source> <source>Name</source>
<translation>Name</translation> <translation>Name</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="922"/> <location filename="../src/gui.cpp" line="953"/>
<source>Tracks</source> <source>Tracks</source>
<translation>Strecken</translation> <translation>Strecken</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="279"/> <location filename="../src/gui.cpp" line="306"/>
<location filename="../src/gui.cpp" line="621"/> <location filename="../src/gui.cpp" line="650"/>
<source>About GPXSee</source> <source>About GPXSee</source>
<translation>Über GPXSee</translation> <translation>Über GPXSee</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="560"/> <location filename="../src/gui.cpp" line="589"/>
<source>Navigation</source> <source>Navigation</source>
<translation>Navigation</translation> <translation>Navigation</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="692"/> <location filename="../src/gui.cpp" line="721"/>
<source>POIs</source> <source>POIs</source>
<translation>POIs</translation> <translation>POIs</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="395"/> <location filename="../src/gui.cpp" line="423"/>
<location filename="../src/gui.cpp" line="942"/> <location filename="../src/gui.cpp" line="973"/>
<source>Distance</source> <source>Distance</source>
<translation>Distanz</translation> <translation>Distanz</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="402"/> <location filename="../src/gui.cpp" line="430"/>
<location filename="../src/gui.cpp" line="524"/> <location filename="../src/gui.cpp" line="553"/>
<location filename="../src/gui.cpp" line="944"/> <location filename="../src/gui.cpp" line="975"/>
<source>Time</source> <source>Time</source>
<translation>Zeit</translation> <translation>Zeit</translation>
</message> </message>
@ -821,7 +837,7 @@
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="140"/> <location filename="../src/optionsdialog.cpp" line="140"/>
<location filename="../src/optionsdialog.cpp" line="224"/> <location filename="../src/optionsdialog.cpp" line="237"/>
<source>POI</source> <source>POI</source>
<translation>POI</translation> <translation>POI</translation>
</message> </message>
@ -870,24 +886,34 @@
<source>Use OpenGL</source> <source>Use OpenGL</source>
<translation>OpenGL verwenden</translation> <translation>OpenGL verwenden</translation>
</message> </message>
<message>
<location filename="../src/optionsdialog.cpp" line="202"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="206"/> <location filename="../src/optionsdialog.cpp" line="206"/>
<location filename="../src/optionsdialog.cpp" line="227"/> <source>Image cache size:</source>
<translation>Bild-Cache größe:</translation>
</message>
<message>
<location filename="../src/optionsdialog.cpp" line="219"/>
<location filename="../src/optionsdialog.cpp" line="240"/>
<source>System</source> <source>System</source>
<translation>System</translation> <translation>System</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="222"/> <location filename="../src/optionsdialog.cpp" line="235"/>
<source>Appearance</source> <source>Appearance</source>
<translation>Erscheinungsbild</translation> <translation>Erscheinungsbild</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="225"/> <location filename="../src/optionsdialog.cpp" line="238"/>
<source>Print &amp; Export</source> <source>Print &amp; Export</source>
<translation>Druck &amp; Export</translation> <translation>Druck &amp; Export</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="254"/> <location filename="../src/optionsdialog.cpp" line="267"/>
<source>Options</source> <source>Options</source>
<translation>Einstellungen</translation> <translation>Einstellungen</translation>
</message> </message>
@ -937,22 +963,22 @@
<context> <context>
<name>ScaleItem</name> <name>ScaleItem</name>
<message> <message>
<location filename="../src/scaleitem.cpp" line="81"/> <location filename="../src/scaleitem.cpp" line="83"/>
<source>mi</source> <source>mi</source>
<translation>mi</translation> <translation>mi</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="82"/> <location filename="../src/scaleitem.cpp" line="84"/>
<source>ft</source> <source>ft</source>
<translation>ft</translation> <translation>ft</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="84"/> <location filename="../src/scaleitem.cpp" line="86"/>
<source>km</source> <source>km</source>
<translation>km</translation> <translation>km</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="85"/> <location filename="../src/scaleitem.cpp" line="87"/>
<source>m</source> <source>m</source>
<translation>m</translation> <translation>m</translation>
</message> </message>
@ -1056,27 +1082,27 @@
<context> <context>
<name>WaypointItem</name> <name>WaypointItem</name>
<message> <message>
<location filename="../src/waypointitem.cpp" line="18"/> <location filename="../src/waypointitem.cpp" line="17"/>
<source>Name</source> <source>Name</source>
<translation>Name</translation> <translation>Name</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="19"/> <location filename="../src/waypointitem.cpp" line="18"/>
<source>Coordinates</source> <source>Coordinates</source>
<translation>Koordinaten</translation> <translation>Koordinaten</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="22"/> <location filename="../src/waypointitem.cpp" line="21"/>
<source>Elevation</source> <source>Elevation</source>
<translation>Höhe</translation> <translation>Höhe</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="25"/> <location filename="../src/waypointitem.cpp" line="24"/>
<source>Date</source> <source>Date</source>
<translation>Datum</translation> <translation>Datum</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="28"/> <location filename="../src/waypointitem.cpp" line="27"/>
<source>Description</source> <source>Description</source>
<translation>Beschreibung</translation> <translation>Beschreibung</translation>
</message> </message>

View File

@ -190,55 +190,55 @@
<context> <context>
<name>GUI</name> <name>GUI</name>
<message> <message>
<location filename="../src/gui.cpp" line="625"/> <location filename="../src/gui.cpp" line="654"/>
<source>GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at </source> <source>GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at </source>
<translation>GPXSee distribueras under vilkoren för GNU General Public License version 3. För mer info om GPXSee, besök hemsidan </translation> <translation>GPXSee distribueras under vilkoren för GNU General Public License version 3. För mer info om GPXSee, besök hemsidan </translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="703"/> <location filename="../src/gui.cpp" line="732"/>
<source>Open file</source> <source>Open file</source>
<translation>Öppna fil</translation> <translation>Öppna fil</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="793"/> <location filename="../src/gui.cpp" line="822"/>
<source>Open POI file</source> <source>Open POI file</source>
<translation>Öppna POI-fil</translation> <translation>Öppna POI-fil</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="284"/> <location filename="../src/gui.cpp" line="311"/>
<source>Open</source> <source>Open</source>
<translation>Öppna</translation> <translation>Öppna</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="268"/> <location filename="../src/gui.cpp" line="295"/>
<source>Quit</source> <source>Quit</source>
<translation>Avsluta</translation> <translation>Avsluta</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="276"/> <location filename="../src/gui.cpp" line="303"/>
<location filename="../src/gui.cpp" line="641"/> <location filename="../src/gui.cpp" line="670"/>
<location filename="../src/gui.cpp" line="642"/> <location filename="../src/gui.cpp" line="671"/>
<source>Keyboard controls</source> <source>Keyboard controls</source>
<translation>Snabbtangenter</translation> <translation>Snabbtangenter</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="300"/> <location filename="../src/gui.cpp" line="327"/>
<source>Close</source> <source>Close</source>
<translation>Stäng</translation> <translation>Stäng</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="306"/> <location filename="../src/gui.cpp" line="333"/>
<source>Reload</source> <source>Reload</source>
<translation>Uppdatera</translation> <translation>Uppdatera</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="555"/> <location filename="../src/gui.cpp" line="584"/>
<source>Show</source> <source>Show</source>
<translation>Visa</translation> <translation>Visa</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="473"/> <location filename="../src/gui.cpp" line="501"/>
<location filename="../src/gui.cpp" line="549"/> <location filename="../src/gui.cpp" line="578"/>
<source>File</source> <source>File</source>
<translation>Arkiv</translation> <translation>Arkiv</translation>
</message> </message>
@ -258,252 +258,263 @@
<translation>NMEA-filer (*.nmea)</translation> <translation>NMEA-filer (*.nmea)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="274"/> <location filename="../src/gui.cpp" line="301"/>
<location filename="../src/gui.cpp" line="670"/> <location filename="../src/gui.cpp" line="699"/>
<location filename="../src/gui.cpp" line="671"/> <location filename="../src/gui.cpp" line="700"/>
<source>Data sources</source> <source>Data sources</source>
<translation>Datakällor</translation> <translation>Datakällor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="314"/> <location filename="../src/gui.cpp" line="341"/>
<source>Load POI file</source> <source>Load POI file</source>
<translation>Läs in POI-fil</translation> <translation>Läs in POI-fil</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="317"/> <location filename="../src/gui.cpp" line="344"/>
<source>Close POI files</source> <source>Close POI files</source>
<translation>Stäng POI-filer</translation> <translation>Stäng POI-filer</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="319"/> <location filename="../src/gui.cpp" line="346"/>
<source>Overlap POIs</source> <source>Overlap POIs</source>
<translation>Överlappa POI:er</translation> <translation>Överlappa POI:er</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="323"/> <location filename="../src/gui.cpp" line="350"/>
<source>Show POI labels</source> <source>Show POI labels</source>
<translation>Visa POI-namn</translation> <translation>Visa POI-namn</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="328"/> <location filename="../src/gui.cpp" line="355"/>
<source>Show POIs</source> <source>Show POIs</source>
<translation>Visa POI:er</translation> <translation>Visa POI:er</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="337"/> <location filename="../src/gui.cpp" line="364"/>
<source>Show map</source> <source>Show map</source>
<translation>Visa karta</translation> <translation>Visa karta</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="344"/> <location filename="../src/gui.cpp" line="371"/>
<location filename="../src/gui.cpp" line="1168"/>
<source>Load map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui.cpp" line="374"/>
<source>Clear tile cache</source> <source>Clear tile cache</source>
<translation>Rensa kart-cache</translation> <translation>Rensa kart-cache</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="353"/> <location filename="../src/gui.cpp" line="378"/>
<location filename="../src/gui.cpp" line="357"/> <location filename="../src/gui.cpp" line="382"/>
<location filename="../src/gui.cpp" line="653"/> <location filename="../src/gui.cpp" line="682"/>
<source>Next map</source> <source>Next map</source>
<translation>Nästa karta</translation> <translation>Nästa karta</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="364"/> <location filename="../src/gui.cpp" line="392"/>
<source>Show tracks</source> <source>Show tracks</source>
<translation>Visa spår</translation> <translation>Visa spår</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="368"/> <location filename="../src/gui.cpp" line="396"/>
<source>Show routes</source> <source>Show routes</source>
<translation>Visa rutter</translation> <translation>Visa rutter</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="372"/> <location filename="../src/gui.cpp" line="400"/>
<source>Show waypoints</source> <source>Show waypoints</source>
<translation>Visa vägpunkter</translation> <translation>Visa vägpunkter</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="376"/> <location filename="../src/gui.cpp" line="404"/>
<source>Waypoint labels</source> <source>Waypoint labels</source>
<translation>Vägpunktsnamn</translation> <translation>Vägpunktsnamn</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="387"/> <location filename="../src/gui.cpp" line="415"/>
<source>Show graphs</source> <source>Show graphs</source>
<translation>Visa diagram</translation> <translation>Visa diagram</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="409"/> <location filename="../src/gui.cpp" line="437"/>
<source>Show grid</source> <source>Show grid</source>
<translation>Visa stödlinjer</translation> <translation>Visa stödlinjer</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="415"/> <location filename="../src/gui.cpp" line="443"/>
<source>Show toolbars</source> <source>Show toolbars</source>
<translation>Visa verktygsfält</translation> <translation>Visa verktygsfält</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="421"/> <location filename="../src/gui.cpp" line="449"/>
<source>Total time</source> <source>Total time</source>
<translation>Total tid</translation> <translation>Total tid</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="426"/> <location filename="../src/gui.cpp" line="454"/>
<location filename="../src/gui.cpp" line="946"/> <location filename="../src/gui.cpp" line="977"/>
<source>Moving time</source> <source>Moving time</source>
<translation>Förflyttningstid</translation> <translation>Förflyttningstid</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="433"/> <location filename="../src/gui.cpp" line="461"/>
<source>Metric</source> <source>Metric</source>
<translation>Meter</translation> <translation>Meter</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="438"/> <location filename="../src/gui.cpp" line="466"/>
<source>Imperial</source> <source>Imperial</source>
<translation>Imperial</translation> <translation>Imperial</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="444"/> <location filename="../src/gui.cpp" line="472"/>
<source>Fullscreen mode</source> <source>Fullscreen mode</source>
<translation>Helskärmsläge</translation> <translation>Helskärmsläge</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="450"/> <location filename="../src/gui.cpp" line="478"/>
<source>Options...</source> <source>Options...</source>
<translation>Alternativ...</translation> <translation>Alternativ...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="455"/> <location filename="../src/gui.cpp" line="483"/>
<source>Next</source> <source>Next</source>
<translation>Nästa</translation> <translation>Nästa</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="458"/> <location filename="../src/gui.cpp" line="486"/>
<source>Previous</source> <source>Previous</source>
<translation>Föregående</translation> <translation>Föregående</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="462"/> <location filename="../src/gui.cpp" line="490"/>
<source>Last</source> <source>Last</source>
<translation>Sista</translation> <translation>Sista</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="465"/> <location filename="../src/gui.cpp" line="493"/>
<source>First</source> <source>First</source>
<translation>Första</translation> <translation>Första</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="487"/> <location filename="../src/gui.cpp" line="515"/>
<source>Map</source> <source>Map</source>
<translation>Karta</translation> <translation>Karta</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="494"/> <location filename="../src/gui.cpp" line="523"/>
<source>Graph</source> <source>Graph</source>
<translation>Diagram</translation> <translation>Diagram</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="502"/> <location filename="../src/gui.cpp" line="531"/>
<source>POI</source> <source>POI</source>
<translation>POI</translation> <translation>POI</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="503"/> <location filename="../src/gui.cpp" line="532"/>
<source>POI files</source> <source>POI files</source>
<translation>POI-filer</translation> <translation>POI-filer</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="514"/> <location filename="../src/gui.cpp" line="543"/>
<source>Data</source> <source>Data</source>
<translation>Data</translation> <translation>Data</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="515"/> <location filename="../src/gui.cpp" line="544"/>
<source>Display</source> <source>Display</source>
<translation>Visa</translation> <translation>Visa</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="523"/> <location filename="../src/gui.cpp" line="552"/>
<source>Settings</source> <source>Settings</source>
<translation>Inställningar</translation> <translation>Inställningar</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="527"/> <location filename="../src/gui.cpp" line="556"/>
<source>Units</source> <source>Units</source>
<translation>Enhet</translation> <translation>Enhet</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="536"/> <location filename="../src/gui.cpp" line="565"/>
<source>Help</source> <source>Help</source>
<translation>Hjälp</translation> <translation>Hjälp</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="651"/> <location filename="../src/gui.cpp" line="680"/>
<source>Append file</source> <source>Append file</source>
<translation>Lägg till fil</translation> <translation>Lägg till fil</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="652"/> <location filename="../src/gui.cpp" line="681"/>
<source>Next/Previous</source> <source>Next/Previous</source>
<translation>Nästa/Föregående</translation> <translation>Nästa/Föregående</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="655"/> <location filename="../src/gui.cpp" line="684"/>
<source>Previous map</source> <source>Previous map</source>
<translation>Föregående karta</translation> <translation>Föregående karta</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="656"/> <location filename="../src/gui.cpp" line="685"/>
<source>Zoom in</source> <source>Zoom in</source>
<translation>Zooma in</translation> <translation>Zooma in</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="658"/> <location filename="../src/gui.cpp" line="687"/>
<source>Zoom out</source> <source>Zoom out</source>
<translation>Zooma ut</translation> <translation>Zooma ut</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="660"/> <location filename="../src/gui.cpp" line="689"/>
<source>Digital zoom</source> <source>Digital zoom</source>
<translation>Digital zoom</translation> <translation>Digital zoom</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="661"/> <location filename="../src/gui.cpp" line="690"/>
<source>Zoom</source> <source>Zoom</source>
<translation>Zoom</translation> <translation>Zoom</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="673"/> <location filename="../src/gui.cpp" line="702"/>
<source>Online maps</source> <source>Online maps</source>
<translation>Online-kartor</translation> <translation>Online-kartor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="674"/> <location filename="../src/gui.cpp" line="703"/>
<source>Online map URLs are read on program startup from the following file:</source> <source>Online map URLs are read on program startup from the following file:</source>
<translation>Online-kartors URL:er, läses från följande fil vid programstart:</translation> <translation>Online-kartors URL:er, läses från följande fil vid programstart:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="684"/> <location filename="../src/gui.cpp" line="713"/>
<source>Offline maps</source> <source>Offline maps</source>
<translation>Offline-kartor</translation> <translation>Offline-kartor</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="685"/> <location filename="../src/gui.cpp" line="714"/>
<source>Offline maps are loaded on program startup from the following directory:</source> <source>Offline maps are loaded on program startup from the following directory:</source>
<translation>Offline-kartor läses in från följande mapp vid programstart:</translation> <translation>Offline-kartor läses in från följande mapp vid programstart:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="688"/> <location filename="../src/gui.cpp" line="1169"/>
<source>The expected structure is one map/atlas in a separate subdirectory. Supported map formats are OziExplorer image-based maps and tiled TrekBuddy maps/atlases (tared and non-tared).</source> <source>Map files (*.map *.tba *.tar)</source>
<translation>Den förväntade strukturen är en karta/atlas i en separat undermapp. Kartformat som stöds är OziExplorer bildbaserade kartor och rutindelade TrekBuddy-kartor/-kartsamlingar (tarerade och icke tarerade).</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="1144"/> <location filename="../src/gui.cpp" line="1186"/>
<source>Error loading map:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui.cpp" line="1201"/>
<source>No files loaded</source> <source>No files loaded</source>
<translation>Inga filer inlästa</translation> <translation>Inga filer inlästa</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/gui.cpp" line="1148"/> <location filename="../src/gui.cpp" line="1205"/>
<source>%n files</source> <source>%n files</source>
<translation> <translation>
<numerusform>%n filer</numerusform> <numerusform>%n filer</numerusform>
@ -536,43 +547,43 @@
<translation>Alla filer (*)</translation> <translation>Alla filer (*)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="932"/> <location filename="../src/gui.cpp" line="963"/>
<location filename="../src/gui.cpp" line="935"/> <location filename="../src/gui.cpp" line="966"/>
<source>Date</source> <source>Date</source>
<translation>Datum</translation> <translation>Datum</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="924"/> <location filename="../src/gui.cpp" line="955"/>
<source>Routes</source> <source>Routes</source>
<translation>Rutter</translation> <translation>Rutter</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="645"/> <location filename="../src/gui.cpp" line="674"/>
<source>Next file</source> <source>Next file</source>
<translation>Nästa fil</translation> <translation>Nästa fil</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="622"/> <location filename="../src/gui.cpp" line="651"/>
<source>Version </source> <source>Version </source>
<translation>Version </translation> <translation>Version </translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="289"/> <location filename="../src/gui.cpp" line="316"/>
<source>Print...</source> <source>Print...</source>
<translation>Skriv ut...</translation> <translation>Skriv ut...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="294"/> <location filename="../src/gui.cpp" line="321"/>
<source>Export to PDF...</source> <source>Export to PDF...</source>
<translation>Exportera till PDF...</translation> <translation>Exportera till PDF...</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="926"/> <location filename="../src/gui.cpp" line="957"/>
<source>Waypoints</source> <source>Waypoints</source>
<translation>Vägpunkter</translation> <translation>Vägpunkter</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="646"/> <location filename="../src/gui.cpp" line="675"/>
<source>Previous file</source> <source>Previous file</source>
<translation>Föregående fil</translation> <translation>Föregående fil</translation>
</message> </message>
@ -582,82 +593,87 @@
<translation>Filer som stöds (*.csv *.fit *.gpx *.igc *.kml *.nmea *.tcx)</translation> <translation>Filer som stöds (*.csv *.fit *.gpx *.igc *.kml *.nmea *.tcx)</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="380"/> <location filename="../src/gui.cpp" line="408"/>
<source>Route waypoints</source> <source>Route waypoints</source>
<translation>Ruttvägpunkter</translation> <translation>Ruttvägpunkter</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="648"/> <location filename="../src/gui.cpp" line="677"/>
<source>First file</source> <source>First file</source>
<translation>Första filen</translation> <translation>Första filen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="650"/> <location filename="../src/gui.cpp" line="679"/>
<source>Last file</source> <source>Last file</source>
<translation>Sista filen</translation> <translation>Sista filen</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="677"/> <location filename="../src/gui.cpp" line="706"/>
<source>The file format is one map entry per line, consisting of the map name and tiles URL delimited by a TAB character. The tile X and Y coordinates are replaced with $x and $y in the URL and the zoom level is replaced with $z. An example map file could look like:</source> <source>The file format is one map entry per line, consisting of the map name and tiles URL delimited by a TAB character. The tile X and Y coordinates are replaced with $x and $y in the URL and the zoom level is replaced with $z. An example map file could look like:</source>
<translation>Filformatet är en kartpost per rad, bestående av kartnamn och kartrutans URL, avgränsade med ett TAB-tecken. Kartrutans X- och Y-koordinater ersätts med $x och $y i URL:en och zoomnivån ersätts med $z. Exempel en kartfil kan se ut här:</translation> <translation>Filformatet är en kartpost per rad, bestående av kartnamn och kartrutans URL, avgränsade med ett TAB-tecken. Kartrutans X- och Y-koordinater ersätts med $x och $y i URL:en och zoomnivån ersätts med $z. Exempel en kartfil kan se ut här:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="693"/> <location filename="../src/gui.cpp" line="717"/>
<source>The expected structure is one map/atlas in a separate subdirectory. Supported map formats are OziExplorer maps and TrekBuddy maps/atlases (tared and non-tared).</source>
<translation>Den förväntade strukturen är en karta/atlas i en separat undermapp. Kartformat som stöds är OziExplorer kartor och TrekBuddy-kartor/-kartsamlingar (tarerade och icke tarerade).</translation>
</message>
<message>
<location filename="../src/gui.cpp" line="722"/>
<source>To make GPXSee load a POI file automatically on startup, add the file to the following directory:</source> <source>To make GPXSee load a POI file automatically on startup, add the file to the following directory:</source>
<translation>För att GPXSee skall läsa in en POI-fil automatiskt vid programstart, läggs filen i följande mapp:</translation> <translation>För att GPXSee skall läsa in en POI-fil automatiskt vid programstart, läggs filen i följande mapp:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="782"/> <location filename="../src/gui.cpp" line="811"/>
<source>Error loading data file:</source> <source>Error loading data file:</source>
<translation>Fel vid inläsning av datafil:</translation> <translation>Fel vid inläsning av datafil:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="785"/> <location filename="../src/gui.cpp" line="814"/>
<location filename="../src/gui.cpp" line="810"/> <location filename="../src/gui.cpp" line="839"/>
<source>Line: %1</source> <source>Line: %1</source>
<translation>Rad: %1</translation> <translation>Rad: %1</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="807"/> <location filename="../src/gui.cpp" line="836"/>
<source>Error loading POI file:</source> <source>Error loading POI file:</source>
<translation>Fel vid inläsning av POI-fil:</translation> <translation>Fel vid inläsning av POI-fil:</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="918"/> <location filename="../src/gui.cpp" line="949"/>
<source>Name</source> <source>Name</source>
<translation>Namn</translation> <translation>Namn</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="922"/> <location filename="../src/gui.cpp" line="953"/>
<source>Tracks</source> <source>Tracks</source>
<translation>Spår</translation> <translation>Spår</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="279"/> <location filename="../src/gui.cpp" line="306"/>
<location filename="../src/gui.cpp" line="621"/> <location filename="../src/gui.cpp" line="650"/>
<source>About GPXSee</source> <source>About GPXSee</source>
<translation>Om GPXSee</translation> <translation>Om GPXSee</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="560"/> <location filename="../src/gui.cpp" line="589"/>
<source>Navigation</source> <source>Navigation</source>
<translation>Navigation</translation> <translation>Navigation</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="692"/> <location filename="../src/gui.cpp" line="721"/>
<source>POIs</source> <source>POIs</source>
<translation>POI:er</translation> <translation>POI:er</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="395"/> <location filename="../src/gui.cpp" line="423"/>
<location filename="../src/gui.cpp" line="942"/> <location filename="../src/gui.cpp" line="973"/>
<source>Distance</source> <source>Distance</source>
<translation>Avstånd</translation> <translation>Avstånd</translation>
</message> </message>
<message> <message>
<location filename="../src/gui.cpp" line="402"/> <location filename="../src/gui.cpp" line="430"/>
<location filename="../src/gui.cpp" line="524"/> <location filename="../src/gui.cpp" line="553"/>
<location filename="../src/gui.cpp" line="944"/> <location filename="../src/gui.cpp" line="975"/>
<source>Time</source> <source>Time</source>
<translation>Tid</translation> <translation>Tid</translation>
</message> </message>
@ -821,7 +837,7 @@
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="140"/> <location filename="../src/optionsdialog.cpp" line="140"/>
<location filename="../src/optionsdialog.cpp" line="224"/> <location filename="../src/optionsdialog.cpp" line="237"/>
<source>POI</source> <source>POI</source>
<translation>POI</translation> <translation>POI</translation>
</message> </message>
@ -870,24 +886,34 @@
<source>Use OpenGL</source> <source>Use OpenGL</source>
<translation>Använd OpenGL</translation> <translation>Använd OpenGL</translation>
</message> </message>
<message>
<location filename="../src/optionsdialog.cpp" line="202"/>
<source>MB</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="206"/> <location filename="../src/optionsdialog.cpp" line="206"/>
<location filename="../src/optionsdialog.cpp" line="227"/> <source>Image cache size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/optionsdialog.cpp" line="219"/>
<location filename="../src/optionsdialog.cpp" line="240"/>
<source>System</source> <source>System</source>
<translation>System</translation> <translation>System</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="222"/> <location filename="../src/optionsdialog.cpp" line="235"/>
<source>Appearance</source> <source>Appearance</source>
<translation>Utseende</translation> <translation>Utseende</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="225"/> <location filename="../src/optionsdialog.cpp" line="238"/>
<source>Print &amp; Export</source> <source>Print &amp; Export</source>
<translation>Utskrift &amp; Export</translation> <translation>Utskrift &amp; Export</translation>
</message> </message>
<message> <message>
<location filename="../src/optionsdialog.cpp" line="254"/> <location filename="../src/optionsdialog.cpp" line="267"/>
<source>Options</source> <source>Options</source>
<translation>Alternativ</translation> <translation>Alternativ</translation>
</message> </message>
@ -937,22 +963,22 @@
<context> <context>
<name>ScaleItem</name> <name>ScaleItem</name>
<message> <message>
<location filename="../src/scaleitem.cpp" line="81"/> <location filename="../src/scaleitem.cpp" line="83"/>
<source>mi</source> <source>mi</source>
<translation>mi</translation> <translation>mi</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="82"/> <location filename="../src/scaleitem.cpp" line="84"/>
<source>ft</source> <source>ft</source>
<translation>ft</translation> <translation>ft</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="84"/> <location filename="../src/scaleitem.cpp" line="86"/>
<source>km</source> <source>km</source>
<translation>km</translation> <translation>km</translation>
</message> </message>
<message> <message>
<location filename="../src/scaleitem.cpp" line="85"/> <location filename="../src/scaleitem.cpp" line="87"/>
<source>m</source> <source>m</source>
<translation>m</translation> <translation>m</translation>
</message> </message>
@ -1056,27 +1082,27 @@
<context> <context>
<name>WaypointItem</name> <name>WaypointItem</name>
<message> <message>
<location filename="../src/waypointitem.cpp" line="18"/> <location filename="../src/waypointitem.cpp" line="17"/>
<source>Name</source> <source>Name</source>
<translation>Namn</translation> <translation>Namn</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="19"/> <location filename="../src/waypointitem.cpp" line="18"/>
<source>Coordinates</source> <source>Coordinates</source>
<translation>Koordinater</translation> <translation>Koordinater</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="22"/> <location filename="../src/waypointitem.cpp" line="21"/>
<source>Elevation</source> <source>Elevation</source>
<translation>Höjd</translation> <translation>Höjd</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="25"/> <location filename="../src/waypointitem.cpp" line="24"/>
<source>Date</source> <source>Date</source>
<translation>Datum</translation> <translation>Datum</translation>
</message> </message>
<message> <message>
<location filename="../src/waypointitem.cpp" line="28"/> <location filename="../src/waypointitem.cpp" line="27"/>
<source>Description</source> <source>Description</source>
<translation>Beskrivning</translation> <translation>Beskrivning</translation>
</message> </message>

View File

@ -5,7 +5,7 @@
; The name of the installer ; The name of the installer
Name "GPXSee" Name "GPXSee"
; Program version ; Program version
!define VERSION "4.4" !define VERSION "4.7"
; The file to write ; The file to write
OutFile "GPXSee-${VERSION}.exe" OutFile "GPXSee-${VERSION}.exe"

View File

@ -5,7 +5,7 @@
; The name of the installer ; The name of the installer
Name "GPXSee" Name "GPXSee"
; Program version ; Program version
!define VERSION "4.4" !define VERSION "4.7"
; The file to write ; The file to write
OutFile "GPXSee-${VERSION}_x64.exe" OutFile "GPXSee-${VERSION}_x64.exe"

View File

@ -1,3 +1,4 @@
Open Topo Map https://a.tile.opentopomap.org/$z/$x/$y.png Open Topo Map https://a.tile.opentopomap.org/$z/$x/$y.png
Thunderforest http://tile.thunderforest.com/outdoors/$z/$x/$y.png
Open Street Map http://tile.openstreetmap.org/$z/$x/$y.png Open Street Map http://tile.openstreetmap.org/$z/$x/$y.png
USGS Topo https://navigator.er.usgs.gov/tiles/tcr.cgi/$z/$x/$y.png
USGS Imagery https://navigator.er.usgs.gov/tiles/aerial_Imagery.cgi/$z/$x/$y

230
src/albersequal.cpp Normal file
View File

@ -0,0 +1,230 @@
/*
* Based on libgeotrans with the following Source Code Disclaimer:
1. The GEOTRANS source code ("the software") is provided free of charge by
the National Imagery and Mapping Agency (NIMA) of the United States
Department of Defense. Although NIMA makes no copyright claim under Title 17
U.S.C., NIMA claims copyrights in the source code under other legal regimes.
NIMA hereby grants to each user of the software a license to use and
distribute the software, and develop derivative works.
2. Warranty Disclaimer: The software was developed to meet only the internal
requirements of the U.S. National Imagery and Mapping Agency. The software
is provided "as is," and no warranty, express or implied, including but not
limited to the implied warranties of merchantability and fitness for
particular purpose or arising by statute or otherwise in law or from a
course of dealing or usage in trade, is made by NIMA as to the accuracy and
functioning of the software.
3. NIMA and its personnel are not required to provide technical support or
general assistance with respect to the software.
4. Neither NIMA nor its personnel will be liable for any claims, losses, or
damages arising from or connected with the use of the software. The user
agrees to hold harmless the United States National Imagery and Mapping
Agency. The user's sole and exclusive remedy is to stop using the software.
5. NIMA requests that products developed using the software credit the
source of the software with the following statement, "The product was
developed using GEOTRANS, a product of the National Imagery and Mapping
Agency and U.S. Army Engineering Research and Development Center."
6. For any products developed using the software, NIMA requires a disclaimer
that use of the software does not indicate endorsement or approval of the
product by the Secretary of Defense or the National Imagery and Mapping
Agency. Pursuant to the United States Code, 10 U.S.C. Sec. 2797, the name of
the National Imagery and Mapping Agency, the initials "NIMA", the seal of
the National Imagery and Mapping Agency, or any colorable imitation thereof
shall not be used to imply approval, endorsement, or authorization of a
product without prior written permission from United States Secretary of
Defense.
*/
#include "ellipsoid.h"
#include "rd.h"
#include "albersequal.h"
#ifndef M_PI_2
#define M_PI_2 1.57079632679489661923
#endif // M_PI_2
#define ONE_MINUS_SQR(x) (1.0 - (x) * (x))
#define ALBERS_Q(slat, one_minus_sqr_es_sin, es_sin) \
(_one_minus_es2 * ((slat) / (one_minus_sqr_es_sin) - \
(1 / (_two_es)) * log((1 - (es_sin)) / (1 + (es_sin)))))
#define ALBERS_M(clat, one_minus_sqr_es_sin) \
((clat) / sqrt(one_minus_sqr_es_sin))
AlbersEqual::AlbersEqual(const Ellipsoid &ellipsoid, double standardParallel1,
double standardParallel2, double latitudeOrigin, double longitudeOrigin,
double falseEasting, double falseNorthing)
{
double sin_lat, sin_lat1, sin_lat2, cos_lat1, cos_lat2;
double m1, m2, sqr_m1, sqr_m2;
double q0, q1, q2;
double es_sin, es_sin1, es_sin2;
double one_minus_sqr_es_sin1, one_minus_sqr_es_sin2;
double nq0;
double sp1, sp2;
_e = ellipsoid;
_latitudeOrigin = deg2rad(latitudeOrigin);
_longitudeOrigin = deg2rad(longitudeOrigin);
_falseEasting = falseEasting;
_falseNorthing = falseNorthing;
sp1 = deg2rad(standardParallel1);
sp2 = deg2rad(standardParallel2);
_es2 = 2 * _e.flattening() - _e.flattening() * _e.flattening();
_es = sqrt(_es2);
_one_minus_es2 = 1 - _es2;
_two_es = 2 * _es;
sin_lat = sin(_latitudeOrigin);
es_sin = _es * sin_lat;
q0 = ALBERS_Q(sin_lat, ONE_MINUS_SQR(es_sin), es_sin);
sin_lat1 = sin(sp1);
cos_lat1 = cos(sp1);
es_sin1 = _es * sin_lat1;
one_minus_sqr_es_sin1 = ONE_MINUS_SQR(es_sin1);
m1 = ALBERS_M(cos_lat1, one_minus_sqr_es_sin1);
q1 = ALBERS_Q(sin_lat1, one_minus_sqr_es_sin1, es_sin1);
sqr_m1 = m1 * m1;
if (fabs(sp1 - sp2) > 1.0e-10) {
sin_lat2 = sin(sp2);
cos_lat2 = cos(sp2);
es_sin2 = _es * sin_lat2;
one_minus_sqr_es_sin2 = ONE_MINUS_SQR(es_sin2);
m2 = ALBERS_M(cos_lat2, one_minus_sqr_es_sin2);
q2 = ALBERS_Q(sin_lat2, one_minus_sqr_es_sin2, es_sin2);
sqr_m2 = m2 * m2;
_n = (sqr_m1 - sqr_m2) / (q2 - q1);
} else
_n = sin_lat1;
_C = sqr_m1 + _n * q1;
_a_over_n = _e.radius() / _n;
nq0 = _n * q0;
_rho0 = (_C < nq0) ? 0 : _a_over_n * sqrt(_C - nq0);
}
QPointF AlbersEqual::ll2xy(const Coordinates &c) const
{
double dlam;
double sin_lat;
double es_sin;
double q;
double rho;
double theta;
double nq;
dlam = deg2rad(c.lon()) - _longitudeOrigin;
if (dlam > M_PI)
dlam -= 2.0 * M_PI;
if (dlam < -M_PI)
dlam += 2.0 * M_PI;
sin_lat = sin(deg2rad(c.lat()));
es_sin = _es * sin_lat;
q = ALBERS_Q(sin_lat, ONE_MINUS_SQR(es_sin), es_sin);
nq = _n * q;
rho = (_C < nq) ? 0 : _a_over_n * sqrt(_C - nq);
theta = _n * dlam;
return QPointF(rho * sin(theta) + _falseEasting,
_rho0 - rho * cos(theta) + _falseNorthing);
}
Coordinates AlbersEqual::xy2ll(const QPointF &p) const
{
double dy, dx;
double rho0_minus_dy;
double q, qc, q_over_2;
double rho, rho_n;
double phi, delta_phi = 1.0;
double sin_phi;
double es_sin, one_minus_sqr_es_sin;
double theta = 0.0;
int count = 30;
double tolerance = 4.85e-10;
double lat, lon;
dy = p.y() - _falseNorthing;
dx = p.x() - _falseEasting;
rho0_minus_dy = _rho0 - dy;
rho = sqrt(dx * dx + rho0_minus_dy * rho0_minus_dy);
if (_n < 0) {
rho *= -1.0;
dy *= -1.0;
dx *= -1.0;
rho0_minus_dy *= -1.0;
}
if (rho != 0.0)
theta = atan2(dx, rho0_minus_dy);
rho_n = rho * _n;
q = (_C - (rho_n * rho_n) / (_e.radius() * _e.radius())) / _n;
qc = 1 - ((_one_minus_es2) / (_two_es)) * log((1.0 - _es) / (1.0 + _es));
if (fabs(fabs(qc) - fabs(q)) > 1.0e-6) {
q_over_2 = q / 2.0;
if (q_over_2 > 1.0)
lat = M_PI_2;
else if (q_over_2 < -1.0)
lat = -M_PI_2;
else {
phi = asin(q_over_2);
if (_es < 1.0e-10)
lat = phi;
else {
while ((fabs(delta_phi) > tolerance) && count) {
sin_phi = sin(phi);
es_sin = _es * sin_phi;
one_minus_sqr_es_sin = ONE_MINUS_SQR(es_sin);
delta_phi = (one_minus_sqr_es_sin * one_minus_sqr_es_sin)
/ (2.0 * cos(phi)) * (q / (_one_minus_es2) - sin_phi
/ one_minus_sqr_es_sin + (log((1.0 - es_sin)
/ (1.0 + es_sin)) / (_two_es)));
phi += delta_phi;
count --;
}
lat = phi;
}
if (lat > M_PI_2)
lat = M_PI_2;
else if (lat < -M_PI_2)
lat = -M_PI_2;
}
} else {
if (q >= 0.0)
lat = M_PI_2;
else
lat = -M_PI_2;
}
lon = _longitudeOrigin + theta / _n;
if (lon > M_PI)
lon -= M_PI * 2;
if (lon < -M_PI)
lon += M_PI * 2;
if (lon > M_PI)
lon = M_PI;
else if (lon < -M_PI)
lon = -M_PI;
return Coordinates(rad2deg(lon), rad2deg(lat));
}

36
src/albersequal.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef ALBERSEQUAL_H
#define ALBERSEQUAL_H
#include "projection.h"
class Ellipsoid;
class AlbersEqual : public Projection
{
public:
AlbersEqual(const Ellipsoid &ellipsoid, double standardParallel1,
double standardParallel2, double latitudeOrigin, double longitudeOrigin,
double falseEasting, double falseNorthing);
virtual QPointF ll2xy(const Coordinates &c) const;
virtual Coordinates xy2ll(const QPointF &p) const;
private:
Ellipsoid _e;
double _latitudeOrigin;
double _longitudeOrigin;
double _falseEasting;
double _falseNorthing;
double _rho0;
double _C;
double _n;
double _es;
double _es2;
double _a_over_n;
double _one_minus_es2;
double _two_es;
};
#endif // ALBERSEQUAL_H

View File

@ -3,7 +3,6 @@
#include <QLocale> #include <QLocale>
#include <QFileOpenEvent> #include <QFileOpenEvent>
#include <QNetworkProxyFactory> #include <QNetworkProxyFactory>
#include <QPixmapCache>
#include "opengl.h" #include "opengl.h"
#include "gui.h" #include "gui.h"
#include "onlinemap.h" #include "onlinemap.h"
@ -24,7 +23,6 @@ App::App(int &argc, char **argv) : QApplication(argc, argv),
#endif // Q_OS_MAC #endif // Q_OS_MAC
QNetworkProxyFactory::setUseSystemConfiguration(true); QNetworkProxyFactory::setUseSystemConfiguration(true);
QPixmapCache::setCacheLimit(65536);
OnlineMap::setDownloader(new Downloader(this)); OnlineMap::setDownloader(new Downloader(this));
OPENGL_SET_SAMPLES(4); OPENGL_SET_SAMPLES(4);

View File

@ -30,25 +30,35 @@ static bool yCmp(const OfflineMap *m1, const OfflineMap *m2)
return TL(m1).y() > TL(m2).y(); return TL(m1).y() > TL(m2).y();
} }
bool Atlas::isAtlas(Tar &tar, const QFileInfoList &files) bool Atlas::isAtlas(Tar &tar, const QString &path)
{ {
for (int i = 0; i < files.count(); i++) { QFileInfo fi(path);
const QString &fileName = files.at(i).fileName(); QByteArray ba;
if (fileName.endsWith(".tar")) { QString suffix = fi.suffix().toLower();
if (!tar.load(files.at(i).absoluteFilePath())) {
qWarning("%s: %s: error loading tar file", qPrintable(_name), if (suffix == "tar") {
qPrintable(fileName)); if (!tar.load(path)) {
_errorString = "Error reading tar file";
return false; return false;
} }
QStringList tarFiles = tar.files(); QString tbaFileName = fi.completeBaseName() + ".tba";
for (int j = 0; j < tarFiles.size(); j++) ba = tar.file(tbaFileName);
if (tarFiles.at(j).endsWith(".tba")) } else if (suffix == "tba") {
return true; QFile tbaFile(path);
} else if (fileName.endsWith(".tba")) if (!tbaFile.open(QIODevice::ReadOnly)) {
return true; _errorString = QString("Error opening tba file: %1")
.arg(tbaFile.errorString());
return false;
}
ba = tbaFile.readAll();
} }
if (ba.startsWith("Atlas 1.0"))
return true;
else {
_errorString = "Missing or invalid tba file";
return false; return false;
}
} }
void Atlas::computeZooms() void Atlas::computeZooms()
@ -100,38 +110,46 @@ void Atlas::computeBounds()
BR(_maps.at(i))), QRectF(offsets.at(i), _maps.at(i)->bounds().size()))); BR(_maps.at(i))), QRectF(offsets.at(i), _maps.at(i)->bounds().size())));
} }
Atlas::Atlas(const QString &path, QObject *parent) : Map(parent) Atlas::Atlas(const QString &fileName, QObject *parent) : Map(parent)
{ {
Tar tar; Tar tar;
QFileInfo fi(fileName);
_valid = false; _valid = false;
_zoom = 0; _zoom = 0;
_name = fi.dir().dirName();
_ci = -1; _cz = -1;
QFileInfo fi(path); if (!isAtlas(tar, fileName))
_name = fi.fileName();
QDir dir(path);
QFileInfoList files = dir.entryInfoList(QDir::Files);
if (!isAtlas(tar, files))
return; return;
QDir dir(fi.absolutePath());
QFileInfoList layers = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); QFileInfoList layers = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for (int n = 0; n < layers.count(); n++) { for (int n = 0; n < layers.count(); n++) {
QDir zdir(layers.at(n).absoluteFilePath()); QDir zdir(layers.at(n).absoluteFilePath());
QFileInfoList maps = zdir.entryInfoList(QDir::Dirs QFileInfoList maps = zdir.entryInfoList(QDir::Dirs
| QDir::NoDotAndDotDot); | QDir::NoDotAndDotDot);
for (int i = 0; i < maps.count(); i++) { for (int i = 0; i < maps.count(); i++) {
QString mapFile = maps.at(i).absoluteFilePath() + "/"
+ maps.at(i).fileName() + ".map";
OfflineMap *map; OfflineMap *map;
if (tar.isOpen()) if (tar.isOpen())
map = new OfflineMap(tar, maps.at(i).absoluteFilePath(), this); map = new OfflineMap(mapFile, tar, this);
else else
map = new OfflineMap(maps.at(i).absoluteFilePath(), this); map = new OfflineMap(mapFile, this);
if (map->isValid()) if (map->isValid())
_maps.append(map); _maps.append(map);
else {
_errorString = QString("Error loading map: %1: %2")
.arg(mapFile, map->errorString());
return;
}
} }
} }
if (_maps.isEmpty()) { if (_maps.isEmpty()) {
qWarning("%s: No usable maps available", qPrintable(_name)); _errorString = "No maps found in atlas";
return; return;
} }
@ -184,9 +202,14 @@ qreal Atlas::zoomFit(const QSize &size, const QRectF &br)
{ {
_zoom = 0; _zoom = 0;
if (br.isNull()) {
_zoom = _zooms.size() - 1;
return _zoom;
}
for (int z = 0; z < _zooms.count(); z++) { for (int z = 0; z < _zooms.count(); z++) {
for (int i = _zooms.at(z).first; i <= _zooms.at(z).second; i++) { for (int i = _zooms.at(z).first; i <= _zooms.at(z).second; i++) {
if (_bounds.at(i).first.contains(_maps.at(i)->ll2pp(br.center()))) if (!_bounds.at(i).first.contains(_maps.at(i)->ll2pp(br.center())))
continue; continue;
QRect sbr = QRectF(_maps.at(i)->ll2xy(br.topLeft()), QRect sbr = QRectF(_maps.at(i)->ll2xy(br.topLeft()),
@ -216,22 +239,33 @@ qreal Atlas::zoomOut()
return _zoom; return _zoom;
} }
QPointF Atlas::ll2xy(const Coordinates &c) const QPointF Atlas::ll2xy(const Coordinates &c)
{ {
int idx = _zooms.at(_zoom).first; QPointF pp;
if (_cz != _zoom) {
_ci = -1;
_cz = _zoom;
}
if (_ci >= 0)
pp = _maps.at(_ci)->ll2pp(c);
if (_ci < 0 || !_bounds.at(_ci).first.contains(pp)) {
_ci = _zooms.at(_zoom).first;
for (int i = _zooms.at(_zoom).first; i <= _zooms.at(_zoom).second; i++) { for (int i = _zooms.at(_zoom).first; i <= _zooms.at(_zoom).second; i++) {
if (_bounds.at(i).first.contains(_maps.at(i)->ll2pp(c))) { pp = _maps.at(i)->ll2pp(c);
idx = i; if (_bounds.at(i).first.contains(pp)) {
_ci = i;
break; break;
} }
} }
}
QPointF p = _maps.at(idx)->ll2xy(c); QPointF p = _maps.at(_ci)->pp2xy(pp);
return p + _bounds.at(idx).second.topLeft(); return p + _bounds.at(_ci).second.topLeft();
} }
Coordinates Atlas::xy2ll(const QPointF &p) const Coordinates Atlas::xy2ll(const QPointF &p)
{ {
int idx = _zooms.at(_zoom).first; int idx = _zooms.at(_zoom).first;
@ -278,3 +312,9 @@ void Atlas::draw(QPainter *painter, const QRectF &rect, int mapIndex)
map->draw(painter, pr); map->draw(painter, pr);
painter->translate(-offset); painter->translate(-offset);
} }
void Atlas::unload()
{
for (int i = 0; i < _maps.count(); i++)
_maps.at(i)->unload();
}

View File

@ -11,7 +11,7 @@ class Atlas : public Map
Q_OBJECT Q_OBJECT
public: public:
Atlas(const QString &path, QObject *parent = 0); Atlas(const QString &fileName, QObject *parent = 0);
~Atlas(); ~Atlas();
const QString &name() const {return _name;} const QString &name() const {return _name;}
@ -24,26 +24,32 @@ public:
qreal zoomIn(); qreal zoomIn();
qreal zoomOut(); qreal zoomOut();
QPointF ll2xy(const Coordinates &c) const; QPointF ll2xy(const Coordinates &c);
Coordinates xy2ll(const QPointF &p) const; Coordinates xy2ll(const QPointF &p);
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);
bool isValid() {return _valid;} void unload();
bool isValid() const {return _valid;}
const QString &errorString() const {return _errorString;}
private: private:
void draw(QPainter *painter, const QRectF &rect, int mapIndex); void draw(QPainter *painter, const QRectF &rect, int mapIndex);
bool isAtlas(Tar &tar, const QFileInfoList &files); bool isAtlas(Tar &tar, const QString &path);
void computeZooms(); void computeZooms();
void computeBounds(); void computeBounds();
QString _name; QString _name;
bool _valid; bool _valid;
QString _errorString;
QList<OfflineMap*> _maps; QList<OfflineMap*> _maps;
QVector<QPair<int, int> > _zooms; QVector<QPair<int, int> > _zooms;
QVector<QPair<QRectF, QRectF> > _bounds; QVector<QPair<QRectF, QRectF> > _bounds;
int _zoom; int _zoom;
int _ci, _cz;
}; };
#endif // ATLAS_H #endif // ATLAS_H

View File

@ -64,13 +64,13 @@ void EmptyMap::draw(QPainter *painter, const QRectF &rect)
painter->fillRect(rect, Qt::white); painter->fillRect(rect, Qt::white);
} }
QPointF EmptyMap::ll2xy(const Coordinates &c) const QPointF EmptyMap::ll2xy(const Coordinates &c)
{ {
QPointF m = Mercator().ll2xy(c); QPointF m = Mercator().ll2xy(c);
return QPointF(m.x() / _scale, m.y() / -_scale); return QPointF(m.x() / _scale, m.y() / -_scale);
} }
Coordinates EmptyMap::xy2ll(const QPointF &p) const Coordinates EmptyMap::xy2ll(const QPointF &p)
{ {
QPointF m(p.x() * _scale, -p.y() * _scale); QPointF m(p.x() * _scale, -p.y() * _scale);
return Mercator().xy2ll(m); return Mercator().xy2ll(m);

View File

@ -20,8 +20,8 @@ public:
qreal zoomIn(); qreal zoomIn();
qreal zoomOut(); qreal zoomOut();
QPointF ll2xy(const Coordinates &c) const; QPointF ll2xy(const Coordinates &c);
Coordinates xy2ll(const QPointF &p) const; Coordinates xy2ll(const QPointF &p);
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);

View File

@ -21,6 +21,7 @@
#include <QLocale> #include <QLocale>
#include <QMimeData> #include <QMimeData>
#include <QUrl> #include <QUrl>
#include <QPixmapCache>
#include "config.h" #include "config.h"
#include "icons.h" #include "icons.h"
#include "keys.h" #include "keys.h"
@ -30,7 +31,6 @@
#include "datum.h" #include "datum.h"
#include "map.h" #include "map.h"
#include "maplist.h" #include "maplist.h"
#include "mapdir.h"
#include "emptymap.h" #include "emptymap.h"
#include "elevationgraph.h" #include "elevationgraph.h"
#include "speedgraph.h" #include "speedgraph.h"
@ -166,21 +166,48 @@ void GUI::loadDatums()
void GUI::loadMaps() void GUI::loadMaps()
{ {
QList<Map*> online, offline; _ml = new MapList(this);
QString offline, online;
if (QFile::exists(USER_MAP_FILE)) if (QFile::exists(USER_MAP_FILE))
online = MapList::load(USER_MAP_FILE, this); online = USER_MAP_FILE;
else else if (QFile::exists(GLOBAL_MAP_FILE))
online = MapList::load(GLOBAL_MAP_FILE, this); online = GLOBAL_MAP_FILE;
if (!online.isNull() && !_ml->loadList(online))
qWarning("%s: %s", qPrintable(online), qPrintable(_ml->errorString()));
if (QFile::exists(USER_MAP_DIR)) if (QFile::exists(USER_MAP_DIR))
offline = MapDir::load(USER_MAP_DIR, this); offline = USER_MAP_DIR;
else if (QFile::exists(GLOBAL_MAP_DIR))
offline = GLOBAL_MAP_DIR;
if (!offline.isNull()) {
QDir md(offline);
QFileInfoList ml = md.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
QStringList filters;
filters << "*.map" << "*.tba" << "*.tar";
for (int i = 0; i < ml.size(); i++) {
QDir dir(ml.at(i).absoluteFilePath());
QFileInfoList fl = dir.entryInfoList(filters, QDir::Files);
if (fl.isEmpty())
qWarning("%s: no map/atlas file found",
qPrintable(ml.at(i).absoluteFilePath()));
else if (fl.size() > 1)
qWarning("%s: ambiguous directory content",
qPrintable(ml.at(i).absoluteFilePath()));
else else
offline = MapDir::load(GLOBAL_MAP_DIR, this); if (!_ml->loadMap(fl.first().absoluteFilePath()))
qWarning("%s: %s", qPrintable(fl.first().absoluteFilePath()),
qPrintable(_ml->errorString()));
}
}
_maps = online + offline; _map = _ml->maps().isEmpty() ? new EmptyMap(this) : _ml->maps().first();
_map = _maps.isEmpty() ? new EmptyMap(this) : _maps.first();
} }
void GUI::loadPOIs() void GUI::loadPOIs()
@ -209,33 +236,33 @@ void GUI::loadPOIs()
void GUI::createMapActions() void GUI::createMapActions()
{ {
QActionGroup *ag = new QActionGroup(this); _mapsSignalMapper = new QSignalMapper(this);
ag->setExclusive(true); _mapsActionGroup = new QActionGroup(this);
_mapsActionGroup->setExclusive(true);
QSignalMapper *sm = new QSignalMapper(this); for (int i = 0; i < _ml->maps().count(); i++) {
QAction *a = new QAction(_ml->maps().at(i)->name(), this);
for (int i = 0; i < _maps.count(); i++) {
QAction *a = new QAction(_maps.at(i)->name(), this);
a->setCheckable(true); a->setCheckable(true);
a->setActionGroup(ag); a->setActionGroup(_mapsActionGroup);
sm->setMapping(a, i); _mapsSignalMapper->setMapping(a, i);
connect(a, SIGNAL(triggered()), sm, SLOT(map())); connect(a, SIGNAL(triggered()), _mapsSignalMapper, SLOT(map()));
_mapActions.append(a); _mapActions.append(a);
} }
connect(sm, SIGNAL(mapped(int)), this, SLOT(mapChanged(int))); connect(_mapsSignalMapper, SIGNAL(mapped(int)), this,
SLOT(mapChanged(int)));
} }
void GUI::createPOIFilesActions() void GUI::createPOIFilesActions()
{ {
_poiFilesSM = new QSignalMapper(this); _poiFilesSignalMapper = new QSignalMapper(this);
for (int i = 0; i < _poi->files().count(); i++) for (int i = 0; i < _poi->files().count(); i++)
createPOIFileAction(i); createPOIFileAction(i);
connect(_poiFilesSM, SIGNAL(mapped(int)), this, SLOT(poiFileChecked(int))); connect(_poiFilesSignalMapper, SIGNAL(mapped(int)), this, SLOT(poiFileChecked(int)));
} }
QAction *GUI::createPOIFileAction(int index) QAction *GUI::createPOIFileAction(int index)
@ -244,8 +271,8 @@ QAction *GUI::createPOIFileAction(int index)
this); this);
a->setCheckable(true); a->setCheckable(true);
_poiFilesSM->setMapping(a, index); _poiFilesSignalMapper->setMapping(a, index);
connect(a, SIGNAL(triggered()), _poiFilesSM, SLOT(map())); connect(a, SIGNAL(triggered()), _poiFilesSignalMapper, SLOT(map()));
_poiFilesActions.append(a); _poiFilesActions.append(a);
@ -341,15 +368,13 @@ void GUI::createActions()
connect(_showMapAction, SIGNAL(triggered(bool)), _pathView, connect(_showMapAction, SIGNAL(triggered(bool)), _pathView,
SLOT(showMap(bool))); SLOT(showMap(bool)));
addAction(_showMapAction); addAction(_showMapAction);
_loadMapAction = new QAction(QIcon(QPixmap(OPEN_FILE_ICON)), tr("Load map"),
this);
connect(_loadMapAction, SIGNAL(triggered()), this, SLOT(loadMap()));
_clearMapCacheAction = new QAction(tr("Clear tile cache"), this); _clearMapCacheAction = new QAction(tr("Clear tile cache"), this);
connect(_clearMapCacheAction, SIGNAL(triggered()), this, connect(_clearMapCacheAction, SIGNAL(triggered()), this,
SLOT(clearMapCache())); SLOT(clearMapCache()));
if (_maps.empty()) {
_showMapAction->setEnabled(false);
_clearMapCacheAction->setEnabled(false);
} else {
createMapActions(); createMapActions();
_nextMapAction = new QAction(tr("Next map"), this); _nextMapAction = new QAction(tr("Next map"), this);
_nextMapAction->setShortcut(NEXT_MAP_SHORTCUT); _nextMapAction->setShortcut(NEXT_MAP_SHORTCUT);
connect(_nextMapAction, SIGNAL(triggered()), this, SLOT(nextMap())); connect(_nextMapAction, SIGNAL(triggered()), this, SLOT(nextMap()));
@ -358,6 +383,9 @@ void GUI::createActions()
_prevMapAction->setShortcut(PREV_MAP_SHORTCUT); _prevMapAction->setShortcut(PREV_MAP_SHORTCUT);
connect(_prevMapAction, SIGNAL(triggered()), this, SLOT(prevMap())); connect(_prevMapAction, SIGNAL(triggered()), this, SLOT(prevMap()));
addAction(_prevMapAction); addAction(_prevMapAction);
if (_ml->maps().isEmpty()) {
_showMapAction->setEnabled(false);
_clearMapCacheAction->setEnabled(false);
} }
// Data actions // Data actions
@ -484,12 +512,13 @@ void GUI::createMenus()
fileMenu->addAction(_exitAction); fileMenu->addAction(_exitAction);
#endif // Q_OS_MAC #endif // Q_OS_MAC
QMenu *mapMenu = menuBar()->addMenu(tr("Map")); _mapMenu = menuBar()->addMenu(tr("Map"));
mapMenu->addActions(_mapActions); _mapMenu->addActions(_mapActions);
mapMenu->addSeparator(); _mapsEnd = _mapMenu->addSeparator();
mapMenu->addAction(_clearMapCacheAction); _mapMenu->addAction(_loadMapAction);
mapMenu->addSeparator(); _mapMenu->addAction(_clearMapCacheAction);
mapMenu->addAction(_showMapAction); _mapMenu->addSeparator();
_mapMenu->addAction(_showMapAction);
QMenu *graphMenu = menuBar()->addMenu(tr("Graph")); QMenu *graphMenu = menuBar()->addMenu(tr("Graph"));
graphMenu->addAction(_distanceGraphAction); graphMenu->addAction(_distanceGraphAction);
@ -686,8 +715,8 @@ void GUI::dataSources()
"directory:") "directory:")
+ "</p><p><code>" + USER_MAP_DIR + "</code></p><p>" + "</p><p><code>" + USER_MAP_DIR + "</code></p><p>"
+ tr("The expected structure is one map/atlas in a separate subdirectory." + tr("The expected structure is one map/atlas in a separate subdirectory."
" Supported map formats are OziExplorer image-based maps and tiled" " Supported map formats are OziExplorer maps and TrekBuddy maps/atlases"
" TrekBuddy maps/atlases (tared and non-tared).") + "</p>" " (tared and non-tared).") + "</p>"
+ "<h4>" + tr("POIs") + "</h4><p>" + "<h4>" + tr("POIs") + "</h4><p>"
+ tr("To make GPXSee load a POI file automatically on startup, add " + tr("To make GPXSee load a POI file automatically on startup, add "
@ -882,6 +911,8 @@ void GUI::openOptions()
for (int i = 0; i < _tabs.count(); i++) for (int i = 0; i < _tabs.count(); i++)
_tabs.at(i)->useOpenGL(options.useOpenGL); _tabs.at(i)->useOpenGL(options.useOpenGL);
} }
if (options.pixmapCache != _options.pixmapCache)
QPixmapCache::setCacheLimit(options.pixmapCache * 1024);
_options = options; _options = options;
} }
@ -1132,6 +1163,32 @@ void GUI::showGraphGrids(bool show)
_tabs.at(i)->showGrid(show); _tabs.at(i)->showGrid(show);
} }
void GUI::loadMap()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Load map"),
QString(), tr("Map files (*.map *.tba *.tar)"));
if (fileName.isEmpty())
return;
if (_ml->loadMap(fileName)) {
QAction *a = new QAction(_ml->maps().last()->name(), this);
a->setCheckable(true);
a->setActionGroup(_mapsActionGroup);
_mapsSignalMapper->setMapping(a, _ml->maps().size() - 1);
connect(a, SIGNAL(triggered()), _mapsSignalMapper, SLOT(map()));
_mapActions.append(a);
_mapMenu->insertAction(_mapsEnd, a);
_showMapAction->setEnabled(true);
_clearMapCacheAction->setEnabled(true);
a->activate(QAction::Trigger);
} else {
QString error = tr("Error loading map:") + "\n\n"
+ fileName + "\n\n" + _ml->errorString();
QMessageBox::critical(this, APP_NAME, error);
}
}
void GUI::clearMapCache() void GUI::clearMapCache()
{ {
_map->clearCache(); _map->clearCache();
@ -1178,26 +1235,27 @@ void GUI::updateWindowTitle()
void GUI::mapChanged(int index) void GUI::mapChanged(int index)
{ {
_map = _maps.at(index); _map = _ml->maps().at(index);
_pathView->setMap(_map); _pathView->setMap(_map);
} }
void GUI::nextMap() void GUI::nextMap()
{ {
if (_maps.count() < 2) if (_ml->maps().count() < 2)
return; return;
int next = (_maps.indexOf(_map) + 1) % _maps.count(); int next = (_ml->maps().indexOf(_map) + 1) % _ml->maps().count();
_mapActions.at(next)->setChecked(true); _mapActions.at(next)->setChecked(true);
mapChanged(next); mapChanged(next);
} }
void GUI::prevMap() void GUI::prevMap()
{ {
if (_maps.count() < 2) if (_ml->maps().count() < 2)
return; return;
int prev = (_maps.indexOf(_map) + _maps.count() - 1) % _maps.count(); int prev = (_ml->maps().indexOf(_map) + _ml->maps().count() - 1)
% _ml->maps().count();
_mapActions.at(prev)->setChecked(true); _mapActions.at(prev)->setChecked(true);
mapChanged(prev); mapChanged(prev);
} }
@ -1526,6 +1584,8 @@ void GUI::writeSettings()
settings.setValue(POI_RADIUS_SETTING, _options.poiRadius); settings.setValue(POI_RADIUS_SETTING, _options.poiRadius);
if (_options.useOpenGL != USE_OPENGL_DEFAULT) if (_options.useOpenGL != USE_OPENGL_DEFAULT)
settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL); settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL);
if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT)
settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache);
if (_options.printName != PRINT_NAME_DEFAULT) if (_options.printName != PRINT_NAME_DEFAULT)
settings.setValue(PRINT_NAME_SETTING, _options.printName); settings.setValue(PRINT_NAME_SETTING, _options.printName);
if (_options.printDate != PRINT_DATE_DEFAULT) if (_options.printDate != PRINT_DATE_DEFAULT)
@ -1578,10 +1638,10 @@ void GUI::readSettings()
settings.beginGroup(MAP_SETTINGS_GROUP); settings.beginGroup(MAP_SETTINGS_GROUP);
if (settings.value(SHOW_MAP_SETTING, SHOW_MAP_DEFAULT).toBool()) if (settings.value(SHOW_MAP_SETTING, SHOW_MAP_DEFAULT).toBool())
_showMapAction->setChecked(true); _showMapAction->setChecked(true);
if (_maps.count()) { if (_ml->maps().count()) {
int index = mapIndex(settings.value(CURRENT_MAP_SETTING).toString()); int index = mapIndex(settings.value(CURRENT_MAP_SETTING).toString());
_mapActions.at(index)->setChecked(true); _mapActions.at(index)->setChecked(true);
_map = _maps.at(index); _map = _ml->maps().at(index);
_pathView->setMap(_map); _pathView->setMap(_map);
} }
settings.endGroup(); settings.endGroup();
@ -1703,6 +1763,8 @@ void GUI::readSettings()
.toInt(); .toInt();
_options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT) _options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT)
.toBool(); .toBool();
_options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING,
PIXMAP_CACHE_DEFAULT).toInt();
_options.printName = settings.value(PRINT_NAME_SETTING, PRINT_NAME_DEFAULT) _options.printName = settings.value(PRINT_NAME_SETTING, PRINT_NAME_DEFAULT)
.toBool(); .toBool();
_options.printDate = settings.value(PRINT_DATE_SETTING, PRINT_DATE_DEFAULT) _options.printDate = settings.value(PRINT_DATE_SETTING, PRINT_DATE_DEFAULT)
@ -1738,13 +1800,15 @@ void GUI::readSettings()
_poi->setRadius(_options.poiRadius); _poi->setRadius(_options.poiRadius);
QPixmapCache::setCacheLimit(_options.pixmapCache * 1024);
settings.endGroup(); settings.endGroup();
} }
int GUI::mapIndex(const QString &name) int GUI::mapIndex(const QString &name)
{ {
for (int i = 0; i < _maps.count(); i++) for (int i = 0; i < _ml->maps().count(); i++)
if (_maps.at(i)->name() == name) if (_ml->maps().at(i)->name() == name)
return i; return i;
return 0; return 0;

View File

@ -13,6 +13,7 @@
#include "exportdialog.h" #include "exportdialog.h"
#include "optionsdialog.h" #include "optionsdialog.h"
class QMenu; class QMenu;
class QToolBar; class QToolBar;
class QTabWidget; class QTabWidget;
@ -25,6 +26,7 @@ class FileBrowser;
class GraphTab; class GraphTab;
class PathView; class PathView;
class Map; class Map;
class MapList;
class GUI : public QMainWindow class GUI : public QMainWindow
{ {
@ -53,6 +55,7 @@ private slots:
void showFullscreen(bool show); void showFullscreen(bool show);
void showTracks(bool show); void showTracks(bool show);
void showRoutes(bool show); void showRoutes(bool show);
void loadMap();
void clearMapCache(); void clearMapCache();
void nextMap(); void nextMap();
void prevMap(); void prevMap();
@ -129,9 +132,11 @@ private:
QToolBar *_showToolBar; QToolBar *_showToolBar;
QToolBar *_navigationToolBar; QToolBar *_navigationToolBar;
QMenu *_poiFilesMenu; QMenu *_poiFilesMenu;
QMenu *_mapMenu;
QActionGroup *_fileActionGroup; QActionGroup *_fileActionGroup;
QActionGroup *_navigationActionGroup; QActionGroup *_navigationActionGroup;
QActionGroup *_mapsActionGroup;
QAction *_exitAction; QAction *_exitAction;
QAction *_keysAction; QAction *_keysAction;
QAction *_dataSourcesAction; QAction *_dataSourcesAction;
@ -149,6 +154,7 @@ private:
QAction *_showPOILabelsAction; QAction *_showPOILabelsAction;
QAction *_showMapAction; QAction *_showMapAction;
QAction *_fullscreenAction; QAction *_fullscreenAction;
QAction *_loadMapAction;
QAction *_clearMapCacheAction; QAction *_clearMapCacheAction;
QAction *_showGraphsAction; QAction *_showGraphsAction;
QAction *_showGraphGridAction; QAction *_showGraphGridAction;
@ -171,10 +177,12 @@ private:
QAction *_showWaypointLabelsAction; QAction *_showWaypointLabelsAction;
QAction *_showRouteWaypointsAction; QAction *_showRouteWaypointsAction;
QAction *_openOptionsAction; QAction *_openOptionsAction;
QAction *_mapsEnd;
QList<QAction*> _mapActions; QList<QAction*> _mapActions;
QList<QAction*> _poiFilesActions; QList<QAction*> _poiFilesActions;
QSignalMapper *_poiFilesSM; QSignalMapper *_poiFilesSignalMapper;
QSignalMapper *_mapsSignalMapper;
QLabel *_fileNameLabel; QLabel *_fileNameLabel;
QLabel *_distanceLabel; QLabel *_distanceLabel;
@ -185,7 +193,7 @@ private:
QList<GraphTab*> _tabs; QList<GraphTab*> _tabs;
POI *_poi; POI *_poi;
QList<Map*> _maps; MapList *_ml;
FileBrowser *_browser; FileBrowser *_browser;
QList<QString> _files; QList<QString> _files;

View File

@ -25,8 +25,8 @@ public:
virtual qreal zoomIn() = 0; virtual qreal zoomIn() = 0;
virtual qreal zoomOut() = 0; virtual qreal zoomOut() = 0;
virtual QPointF ll2xy(const Coordinates &c) const = 0; virtual QPointF ll2xy(const Coordinates &c) = 0;
virtual Coordinates xy2ll(const QPointF &p) const = 0; virtual Coordinates xy2ll(const QPointF &p) = 0;
virtual void draw(QPainter *painter, const QRectF &rect) = 0; virtual void draw(QPainter *painter, const QRectF &rect) = 0;

View File

@ -1,40 +0,0 @@
#include <QDir>
#include "atlas.h"
#include "offlinemap.h"
#include "mapdir.h"
QList<Map*> MapDir::load(const QString &path, QObject *parent)
{
QList<Map*> maps;
QDir dir(path);
if (!dir.exists())
return maps;
if (!dir.isReadable()) {
qWarning("Map directory not readable: %s\n", qPrintable(path));
return maps;
}
QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for (int i = 0; i < list.size(); i++) {
QFileInfo fileInfo = list.at(i);
Atlas *atlas = new Atlas(fileInfo.absoluteFilePath(), parent);
if (atlas->isValid())
maps.append(atlas);
else {
delete atlas;
OfflineMap *map = new OfflineMap(fileInfo.absoluteFilePath(),
parent);
if (map->isValid())
maps.append(map);
else
delete map;
}
}
return maps;
}

View File

@ -1,16 +0,0 @@
#ifndef MAPDIR_H
#define MAPDIR_H
#include <QList>
#include <QString>
class QObject;
class Map;
class MapDir
{
public:
static QList<Map*> load(const QString &path, QObject *parent = 0);
};
#endif // MAPDIR_H

View File

@ -1,41 +1,100 @@
#include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QDir>
#include "atlas.h"
#include "offlinemap.h"
#include "onlinemap.h" #include "onlinemap.h"
#include "maplist.h" #include "maplist.h"
QList<Map*> MapList::load(const QString &fileName, QObject *parent) bool MapList::loadListEntry(const QByteArray &line)
{ {
QList<Map*> maps; QList<QByteArray> list = line.split('\t');
QFileInfo fi(fileName); if (list.size() != 2)
return false;
if (!fi.exists()) QByteArray ba1 = list[0].trimmed();
return maps; QByteArray ba2 = list[1].trimmed();
if (ba1.isEmpty() || ba2.isEmpty())
return false;
QFile file(fileName); _maps.append(new OnlineMap(QString::fromUtf8(ba1.data(), ba1.size()),
QString::fromLatin1(ba2.data(), ba2.size()), this));
return true;
}
bool MapList::loadList(const QString &path)
{
QFile file(path);
if (!file.open(QFile::ReadOnly | QFile::Text)) { if (!file.open(QFile::ReadOnly | QFile::Text)) {
qWarning("Error opening map list file: %s: %s\n", _errorString = file.errorString();
qPrintable(fileName), qPrintable(file.errorString())); return false;
return maps;
} }
int ln = 0; int ln = 0;
while (!file.atEnd()) { while (!file.atEnd()) {
ln++; ln++;
QByteArray line = file.readLine(); QByteArray line = file.readLine();
QList<QByteArray> list = line.split('\t');
if (list.size() != 2) { if (!loadListEntry(line)) {
qWarning("Invalid map list entry on line %d\n", ln); _errorString = QString("Invalid map list entry on line %1.")
continue; .arg(QString::number(ln));
return false;
}
} }
QByteArray ba1 = list[0].trimmed(); return true;
QByteArray ba2 = list[1].trimmed(); }
maps.append(new OnlineMap(QString::fromUtf8(ba1.data(), ba1.size()), bool MapList::loadMap(const QString &path)
QString::fromLatin1(ba2.data(), ba2.size()), parent)); {
} QFileInfo fi(path);
QString suffix = fi.suffix().toLower();
return maps;
if (suffix == "map") {
OfflineMap *om = new OfflineMap(path, this);
if (om->isValid()) {
_maps.append(om);
return true;
} else {
_errorString = om->errorString();
delete om;
return false;
}
} else if (suffix == "tba") {
Atlas *atlas = new Atlas(path, this);
if (atlas->isValid()) {
_maps.append(atlas);
return true;
} else {
_errorString = atlas->errorString();
delete atlas;
return false;
}
} else if (suffix == "tar") {
Atlas *atlas = new Atlas(path, this);
if (atlas->isValid()) {
_maps.append(atlas);
return true;
} else {
_errorString = atlas->errorString();
delete atlas;
OfflineMap *om = new OfflineMap(path, this);
if (om->isValid()) {
_maps.append(om);
return true;
} else {
qWarning("%s: %s", qPrintable(path), qPrintable(_errorString));
qWarning("%s: %s", qPrintable(path),
qPrintable(om->errorString()));
_errorString = "Not a map/atlas file";
delete om;
return false;
}
}
} else {
_errorString = "Not a map/atlas file";
return false;
}
} }

View File

@ -1,16 +1,28 @@
#ifndef MAPLIST_H #ifndef MAPLIST_H
#define MAPLIST_H #define MAPLIST_H
#include <QList> #include <QObject>
#include <QString> #include <QString>
#include "map.h"
class QObject; class MapList : public QObject
class Map;
class MapList
{ {
Q_OBJECT
public: public:
static QList<Map*> load(const QString &fileName, QObject *parent = 0); MapList(QObject *parent = 0) : QObject(parent) {}
bool loadMap(const QString &path);
bool loadList(const QString &path);
QList<Map*> &maps() {return _maps;}
const QString &errorString() const {return _errorString;}
private:
bool loadListEntry(const QByteArray &line);
QList<Map*> _maps;
QString _errorString;
}; };
#endif // MAPLIST_H #endif // MAPLIST_H

View File

@ -18,6 +18,7 @@
#include "transversemercator.h" #include "transversemercator.h"
#include "utm.h" #include "utm.h"
#include "lambertconic.h" #include "lambertconic.h"
#include "albersequal.h"
#include "ozf.h" #include "ozf.h"
#include "offlinemap.h" #include "offlinemap.h"
@ -25,8 +26,6 @@
// Abridged Molodensky transformation // Abridged Molodensky transformation
static Coordinates toWGS84(Coordinates c, const Datum &datum) static Coordinates toWGS84(Coordinates c, const Datum &datum)
{ {
Ellipsoid WGS84(WGS84_RADIUS, WGS84_FLATTENING);
double dX = datum.dx(); double dX = datum.dx();
double dY = datum.dy(); double dY = datum.dy();
double dZ = datum.dz(); double dZ = datum.dz();
@ -38,15 +37,15 @@ static Coordinates toWGS84(Coordinates c, const Datum &datum)
double ssqlat = slat * slat; double ssqlat = slat * slat;
double from_f = datum.ellipsoid().flattening(); double from_f = datum.ellipsoid().flattening();
double df = WGS84.flattening() - from_f; double df = WGS84_FLATTENING - from_f;
double from_a = datum.ellipsoid().radius(); double from_a = datum.ellipsoid().radius();
double da = WGS84.radius() - from_a; double da = WGS84_RADIUS - from_a;
double from_esq = datum.ellipsoid().flattening() double from_esq = datum.ellipsoid().flattening()
* (2.0 - datum.ellipsoid().flattening()); * (2.0 - datum.ellipsoid().flattening());
double adb = 1.0 / (1.0 - from_f); double adb = 1.0 / (1.0 - from_f);
double rn = from_a / sqrt(1 - from_esq * ssqlat); double rn = from_a / sqrt(1 - from_esq * ssqlat);
double rm = from_a * (1 - from_esq) / pow((1 - from_esq * ssqlat), 1.5); double rm = from_a * (1 - from_esq) / pow((1 - from_esq * ssqlat), 1.5);
double from_h = 0.0; // we're flat! double from_h = 0.0;
double dlat = (-dX * slat * clon - dY * slat * slon + dZ * clat + da * rn double dlat = (-dX * slat * clon - dY * slat * slon + dZ * clat + da * rn
* from_esq * slat * clat / from_a + +df * (rm * adb + rn / adb) * slat * from_esq * slat * clat / from_a + +df * (rm * adb + rn / adb) * slat
@ -56,23 +55,22 @@ static Coordinates toWGS84(Coordinates c, const Datum &datum)
return Coordinates(c.lon() + rad2deg(dlon), c.lat() + rad2deg(dlat)); return Coordinates(c.lon() + rad2deg(dlon), c.lat() + rad2deg(dlat));
} }
int OfflineMap::parseMapFile(QIODevice &device, QList<ReferencePoint> &points,
int OfflineMap::parse(QIODevice &device, QList<ReferencePoint> &points,
QString &projection, ProjectionSetup &setup, QString &datum) QString &projection, ProjectionSetup &setup, QString &datum)
{ {
bool res; bool res;
int ln = 1; int ln = 1;
if (!device.open(QIODevice::ReadOnly))
return -1;
while (!device.atEnd()) { while (!device.atEnd()) {
QByteArray line = device.readLine(); QByteArray line = device.readLine();
if (ln == 1) { if (ln == 1) {
if (!line.trimmed().startsWith("OziExplorer Map Data File")) if (!line.trimmed().startsWith("OziExplorer Map Data File"))
return ln; return ln;
} else if (ln == 3) } else if (ln == 2)
_name = line.trimmed();
else if (ln == 3)
_imgPath = line.trimmed(); _imgPath = line.trimmed();
else if (ln == 5) else if (ln == 5)
datum = line.split(',').at(0).trimmed(); datum = line.split(',').at(0).trimmed();
@ -102,14 +100,18 @@ int OfflineMap::parseMapFile(QIODevice &device, QList<ReferencePoint> &points,
qreal lonm = list.at(10).trimmed().toFloat(&res); qreal lonm = list.at(10).trimmed().toFloat(&res);
if (!res) if (!res)
ll = false; ll = false;
if (ll && list.at(8).trimmed() == "S") if (ll && list.at(8).trimmed() == "S") {
latd = -latd; latd = -latd;
if (ll && list.at(11).trimmed() == "W") latm = -latm;
}
if (ll && list.at(11).trimmed() == "W") {
lond = -lond; lond = -lond;
lonm = -lonm;
}
int zone = list.at(13).trimmed().toInt(&res); setup.zone = list.at(13).trimmed().toInt(&res);
if (!res) if (!res)
zone = 0; setup.zone = 0;
qreal ppx = list.at(14).trimmed().toFloat(&res); qreal ppx = list.at(14).trimmed().toFloat(&res);
if (!res) if (!res)
pp = false; pp = false;
@ -117,16 +119,18 @@ int OfflineMap::parseMapFile(QIODevice &device, QList<ReferencePoint> &points,
if (!res) if (!res)
pp = false; pp = false;
if (list.at(16).trimmed() == "S") if (list.at(16).trimmed() == "S")
zone = -zone; setup.zone = -setup.zone;
ReferencePoint p; ReferencePoint p;
p.xy = QPoint(x, y); p.xy = QPoint(x, y);
if (ll) { if (ll) {
p.ll = Coordinates(lond + lonm/60.0, latd + latm/60.0); p.ll = Coordinates(lond + lonm/60.0, latd + latm/60.0);
if (p.ll.isValid())
points.append(p); points.append(p);
else
return ln;
} else if (pp) { } else if (pp) {
p.pp = QPointF(ppx, ppy); p.pp = QPointF(ppx, ppy);
setup.zone = zone;
points.append(p); points.append(p);
} else } else
return ln; return ln;
@ -173,19 +177,45 @@ int OfflineMap::parseMapFile(QIODevice &device, QList<ReferencePoint> &points,
return 0; return 0;
} }
bool OfflineMap::parseMapFile(QIODevice &device, QList<ReferencePoint> &points,
QString &projection, ProjectionSetup &setup, QString &datum)
{
int el;
if (!device.open(QIODevice::ReadOnly)) {
_errorString = QString("Error opening map file: %1")
.arg(device.errorString());
return false;
}
if ((el = parse(device, points, projection, setup, datum))) {
_errorString = QString("Map file parse error on line %1").arg(el);
return false;
}
return true;
}
bool OfflineMap::createProjection(const QString &datum, bool OfflineMap::createProjection(const QString &datum,
const QString &projection, const ProjectionSetup &setup, const QString &projection, const ProjectionSetup &setup,
QList<ReferencePoint> &points) QList<ReferencePoint> &points)
{ {
if (points.count() < 2) { if (points.count() < 2) {
qWarning("%s: insufficient number of reference points", _errorString = "Insufficient number of reference points";
qPrintable(_name));
return false; return false;
} }
Datum d = Datum::datum(datum); Datum d = Datum::datum(datum);
if (d.isNull()) { if (d.isNull()) {
qWarning("%s: %s: unknown datum", qPrintable(_name), qPrintable(datum)); _errorString = QString("%1: Unknown datum").arg(datum);
return false;
}
if (setup.latitudeOrigin < -90.0 || setup.latitudeOrigin > 90.0
|| setup.longitudeOrigin < -180.0 || setup.longitudeOrigin > 180.0
|| setup.standardParallel1 < -90 || setup.standardParallel1 > 90
|| setup.standardParallel2 < -90 || setup.standardParallel2 > 90) {
_errorString = "Invalid projection setup";
return false; return false;
} }
@ -193,8 +223,8 @@ bool OfflineMap::createProjection(const QString &datum,
_projection = new Mercator(); _projection = new Mercator();
else if (projection == "Transverse Mercator") else if (projection == "Transverse Mercator")
_projection = new TransverseMercator(d.ellipsoid(), _projection = new TransverseMercator(d.ellipsoid(),
setup.longitudeOrigin, setup.scale, setup.falseEasting, setup.latitudeOrigin, setup.longitudeOrigin, setup.scale,
setup.falseNorthing); setup.falseEasting, setup.falseNorthing);
else if (projection == "Latitude/Longitude") else if (projection == "Latitude/Longitude")
_projection = new LatLon(); _projection = new LatLon();
else if (projection == "Lambert Conformal Conic") else if (projection == "Lambert Conformal Conic")
@ -202,18 +232,33 @@ bool OfflineMap::createProjection(const QString &datum,
setup.standardParallel1, setup.standardParallel2, setup.standardParallel1, setup.standardParallel2,
setup.latitudeOrigin, setup.longitudeOrigin, setup.scale, setup.latitudeOrigin, setup.longitudeOrigin, setup.scale,
setup.falseEasting, setup.falseNorthing); setup.falseEasting, setup.falseNorthing);
else if (projection == "Albers Equal Area")
_projection = new AlbersEqual(d.ellipsoid(), setup.standardParallel1,
setup.standardParallel2, setup.latitudeOrigin, setup.longitudeOrigin,
setup.falseEasting, setup.falseNorthing);
else if (projection == "(UTM) Universal Transverse Mercator") { else if (projection == "(UTM) Universal Transverse Mercator") {
if (setup.zone) if (setup.zone)
_projection = new UTM(d.ellipsoid(), setup.zone); _projection = new UTM(d.ellipsoid(), setup.zone);
else if (!points.first().ll.isNull()) else if (!points.first().ll.isNull())
_projection = new UTM(d.ellipsoid(), points.first().ll); _projection = new UTM(d.ellipsoid(), points.first().ll);
else { else {
qWarning("%s: Can not determine UTM zone", qPrintable(_name)); _errorString = "Can not determine UTM zone";
return false; return false;
} }
} else { } else if (projection == "(NZTM2) New Zealand TM 2000")
qWarning("%s: %s: unsupported map projection", qPrintable(_name), _projection = new TransverseMercator(d.ellipsoid(), 0, 173.0, 0.9996,
qPrintable(projection)); 1600000, 10000000);
else if (projection == "(BNG) British National Grid")
_projection = new TransverseMercator(d.ellipsoid(), 49, -2, 0.999601,
400000, -100000);
else if (projection == "(IG) Irish Grid")
_projection = new TransverseMercator(d.ellipsoid(), 53.5, -8, 1.000035,
200000, 250000);
else if (projection == "(SG) Swedish Grid")
_projection = new TransverseMercator(d.ellipsoid(), 0, 15.808278, 1,
1500000, 0);
else {
_errorString = QString("%1: Unknown map projection").arg(projection);
return false; return false;
} }
@ -270,7 +315,7 @@ bool OfflineMap::computeTransformation(const QList<ReferencePoint> &points)
Matrix M = Q.augemented(c); Matrix M = Q.augemented(c);
if (!M.eliminate()) { if (!M.eliminate()) {
qWarning("%s: singular transformation matrix", qPrintable(_name)); _errorString = "Singular transformation matrix";
return false; return false;
} }
@ -327,17 +372,17 @@ bool OfflineMap::getImageInfo(const QString &path)
if (ii.exists()) if (ii.exists())
_imgPath = ii.absoluteFilePath(); _imgPath = ii.absoluteFilePath();
else { else {
qWarning("%s: %s: No such image file", qPrintable(_name), _errorString = QString("%1: No such image file").arg(_imgPath);
qPrintable(_imgPath));
return false; return false;
} }
if (_imgPath.endsWith("ozf3", Qt::CaseInsensitive) QString suffix = ii.suffix().toLower();
|| _imgPath.endsWith("ozf4", Qt::CaseInsensitive)) { if (suffix == "ozf4" || suffix == "ozfx4") {
qWarning("%s: %s: obfuscated image files are not supported", _errorString = QString("%1: OZF4 image files not supported")
qPrintable(_name), qPrintable(_imgPath)); .arg(QFileInfo(_imgPath).fileName());
return false; return false;
} else if (_imgPath.endsWith("ozf2", Qt::CaseInsensitive)) { } else if (suffix == "ozf2" || suffix == "ozfx2" || suffix == "ozf3"
|| suffix == "ozfx3") {
_ozf.load(_imgPath); _ozf.load(_imgPath);
_size = _ozf.size(); _size = _ozf.size();
} else { } else {
@ -345,8 +390,8 @@ bool OfflineMap::getImageInfo(const QString &path)
_size = img.size(); _size = img.size();
} }
if (!_size.isValid()) { if (!_size.isValid()) {
qWarning("%s: %s: error reading map image", qPrintable(_name), _errorString = QString("%1: Error reading map image")
qPrintable(_imgPath)); .arg(QFileInfo(_imgPath).fileName());
return false; return false;
} }
@ -355,11 +400,6 @@ bool OfflineMap::getImageInfo(const QString &path)
bool OfflineMap::getTileInfo(const QStringList &tiles, const QString &path) bool OfflineMap::getTileInfo(const QStringList &tiles, const QString &path)
{ {
if (tiles.isEmpty()) {
qWarning("%s: empty tile set", qPrintable(_name));
return false;
}
QRegExp rx("_[0-9]+_[0-9]+\\."); QRegExp rx("_[0-9]+_[0-9]+\\.");
for (int i = 0; i < tiles.size(); i++) { for (int i = 0; i < tiles.size(); i++) {
if (tiles.at(i).contains(rx)) { if (tiles.at(i).contains(rx)) {
@ -374,9 +414,8 @@ bool OfflineMap::getTileInfo(const QStringList &tiles, const QString &path)
_tileSize = QImageReader(path + "/" + tiles.at(i)).size(); _tileSize = QImageReader(path + "/" + tiles.at(i)).size();
} }
if (!_tileSize.isValid()) { if (!_tileSize.isValid()) {
qWarning("%s: error retrieving tile size: %s: invalid image", _errorString = QString("Error retrieving tile size: "
qPrintable(_name), qPrintable(QFileInfo(tiles.at(i)) "%1: Invalid image").arg(QFileInfo(tiles.at(i)).fileName());
.fileName()));
return false; return false;
} }
@ -384,42 +423,27 @@ bool OfflineMap::getTileInfo(const QStringList &tiles, const QString &path)
} }
} }
qWarning("%s: invalid tile names", qPrintable(_name)); _errorString = "Invalid/missing tile set";
return false; return false;
} }
bool OfflineMap::mapLoaded(int res)
{
if (res) {
if (res == -2)
qWarning("%s: no map file found", qPrintable(_name));
else if (res == -1)
qWarning("%s: error opening map file", qPrintable(_name));
else
qWarning("%s: map file parse error on line: %d", qPrintable(_name),
res);
return false;
}
return true;
}
bool OfflineMap::totalSizeSet() bool OfflineMap::totalSizeSet()
{ {
if (!_size.isValid()) { if (!_size.isValid()) {
qWarning("%s: missing total image size (IWH)", qPrintable(_name)); _errorString = "Missing total image size (IWH)";
return false; return false;
} else } else
return true; return true;
} }
OfflineMap::OfflineMap(const QString &path, QObject *parent) : Map(parent) OfflineMap::OfflineMap(const QString &fileName, QObject *parent)
: Map(parent)
{ {
int errorLine = -2;
QList<ReferencePoint> points; QList<ReferencePoint> points;
QString proj, datum; QString proj, datum;
ProjectionSetup setup; ProjectionSetup setup;
QFileInfo fi(fileName);
QString suffix = fi.suffix().toLower();
_valid = false; _valid = false;
@ -427,38 +451,29 @@ OfflineMap::OfflineMap(const QString &path, QObject *parent) : Map(parent)
_projection = 0; _projection = 0;
_resolution = 0; _resolution = 0;
QFileInfo fi(path); if (suffix == "tar") {
_name = fi.fileName(); if (!_tar.load(fileName)) {
_errorString = "Error reading tar file";
return;
}
QDir dir(path); QString mapFileName = fi.completeBaseName() + ".map";
QFileInfoList mapFiles = dir.entryInfoList(QDir::Files); QByteArray ba = _tar.file(mapFileName);
for (int i = 0; i < mapFiles.count(); i++) { if (ba.isNull()) {
const QString &fileName = mapFiles.at(i).fileName(); _errorString = "Map file not found";
if (fileName.endsWith(".tar")) {
if (!_tar.load(mapFiles.at(i).absoluteFilePath())) {
qWarning("%s: %s: error loading tar file", qPrintable(_name),
qPrintable(fileName));
return; return;
} }
QStringList tarFiles = _tar.files(); QBuffer mapFile(&ba);
for (int j = 0; j < tarFiles.size(); j++) { if (!parseMapFile(mapFile, points, proj, setup, datum))
if (tarFiles.at(j).endsWith(".map")) {
QByteArray ba = _tar.file(tarFiles.at(j));
QBuffer buffer(&ba);
errorLine = parseMapFile(buffer, points, proj, setup, datum);
_imgPath = QString();
break;
}
}
break;
} else if (fileName.endsWith(".map")) {
QFile mapFile(mapFiles.at(i).absoluteFilePath());
errorLine = parseMapFile(mapFile, points, proj, setup, datum);
break;
}
}
if (!mapLoaded(errorLine))
return; return;
} else if (suffix =="map") {
QFile mapFile(fileName);
if (!parseMapFile(mapFile, points, proj, setup, datum))
return;
} else {
_errorString = "Not a map file";
return;
}
if (!createProjection(datum, proj, setup, points)) if (!createProjection(datum, proj, setup, points))
return; return;
@ -471,16 +486,17 @@ OfflineMap::OfflineMap(const QString &path, QObject *parent) : Map(parent)
return; return;
if (!getTileInfo(_tar.files())) if (!getTileInfo(_tar.files()))
return; return;
_imgPath = QString();
} else { } else {
QDir set(fi.absoluteFilePath() + "/" + "set"); QDir set(fi.absolutePath() + "/" + "set");
if (set.exists()) { if (set.exists()) {
if (!totalSizeSet()) if (!totalSizeSet())
return; return;
if (!getTileInfo(set.entryList(), set.canonicalPath())) if (!getTileInfo(set.entryList(), set.absolutePath()))
return; return;
_imgPath = QString(); _imgPath = QString();
} else { } else {
if (!getImageInfo(fi.absoluteFilePath())) if (!getImageInfo(fi.absolutePath()))
return; return;
} }
} }
@ -488,36 +504,31 @@ OfflineMap::OfflineMap(const QString &path, QObject *parent) : Map(parent)
_valid = true; _valid = true;
} }
OfflineMap::OfflineMap(Tar &tar, const QString &path, QObject *parent) OfflineMap::OfflineMap(const QString &fileName, Tar &tar, QObject *parent)
: Map(parent) : Map(parent)
{ {
int errorLine = -2;
QList<ReferencePoint> points; QList<ReferencePoint> points;
QString proj, datum; QString proj, datum;
ProjectionSetup setup; ProjectionSetup setup;
QFileInfo fi(fileName);
_valid = false; _valid = false;
_img = 0; _img = 0;
_projection = 0; _projection = 0;
QFileInfo fi(path); QFileInfo map(fi.absolutePath());
_name = fi.fileName(); QFileInfo layer(map.absolutePath());
QString mapFile = layer.fileName() + "/" + map.fileName() + "/"
QFileInfo li(fi.absoluteDir().dirName()); + fi.fileName();
QString prefix = li.fileName() + "/" + fi.fileName() + "/"; QByteArray ba = tar.file(mapFile);
QStringList tarFiles = tar.files(); if (ba.isNull()) {
for (int j = 0; j < tarFiles.size(); j++) { _errorString = "Map file not found";
if (tarFiles.at(j).startsWith(prefix)) {
QByteArray ba = tar.file(tarFiles.at(j));
QBuffer buffer(&ba);
errorLine = parseMapFile(buffer, points, proj, setup, datum);
break;
}
}
if (!mapLoaded(errorLine))
return; return;
}
QBuffer buffer(&ba);
if (!parseMapFile(buffer, points, proj, setup, datum))
return;
if (!createProjection(datum, proj, setup, points)) if (!createProjection(datum, proj, setup, points))
return; return;
if (!totalSizeSet()) if (!totalSizeSet())
@ -526,14 +537,8 @@ OfflineMap::OfflineMap(Tar &tar, const QString &path, QObject *parent)
return; return;
computeResolution(points); computeResolution(points);
QDir dir(path);
QFileInfoList mapFiles = dir.entryInfoList(QDir::Files);
for (int i = 0; i < mapFiles.count(); i++) {
const QString &fileName = mapFiles.at(i).absoluteFilePath();
if (fileName.endsWith(".tar"))
_tarPath = fileName;
}
_tarPath = fi.absolutePath() + "/" + fi.completeBaseName() + ".tar";
_imgPath = QString(); _imgPath = QString();
_valid = true; _valid = true;
} }
@ -550,11 +555,11 @@ void OfflineMap::load()
{ {
if (!_tarPath.isNull() && !_tileSize.isValid()) { if (!_tarPath.isNull() && !_tileSize.isValid()) {
if (!_tar.load(_tarPath)) { if (!_tar.load(_tarPath)) {
qWarning("%s: %s: error loading tar file", qPrintable(_name), qWarning("%s: error loading tar file", qPrintable(_tarPath));
qPrintable(_tarPath));
return; return;
} }
getTileInfo(_tar.files()); if (!getTileInfo(_tar.files()))
qWarning("%s: %s", qPrintable(_tarPath), qPrintable(_errorString));
return; return;
} }

View File

@ -17,8 +17,8 @@ class OfflineMap : public Map
Q_OBJECT Q_OBJECT
public: public:
OfflineMap(const QString &path, QObject *parent = 0); OfflineMap(const QString &fileName, QObject *parent = 0);
OfflineMap(Tar &tar, const QString &path, QObject *parent = 0); OfflineMap(const QString &fileName, Tar &tar, QObject *parent = 0);
~OfflineMap(); ~OfflineMap();
const QString &name() const {return _name;} const QString &name() const {return _name;}
@ -31,9 +31,9 @@ public:
qreal zoomIn() {return 1.0;} qreal zoomIn() {return 1.0;}
qreal zoomOut() {return 1.0;} qreal zoomOut() {return 1.0;}
QPointF ll2xy(const Coordinates &c) const QPointF ll2xy(const Coordinates &c)
{return _transform.map(_projection->ll2xy(c));} {return _transform.map(_projection->ll2xy(c));}
Coordinates xy2ll(const QPointF &p) const Coordinates xy2ll(const QPointF &p)
{return _projection->xy2ll(_inverted.map(p));} {return _projection->xy2ll(_inverted.map(p));}
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);
@ -41,7 +41,8 @@ public:
void load(); void load();
void unload(); void unload();
bool isValid() {return _valid;} bool isValid() const {return _valid;}
const QString &errorString() const {return _errorString;}
QPointF ll2pp(const Coordinates &c) const QPointF ll2pp(const Coordinates &c) const
{return _projection->ll2xy(c);} {return _projection->ll2xy(c);}
@ -68,9 +69,10 @@ private:
int zone; int zone;
} ProjectionSetup; } ProjectionSetup;
int parseMapFile(QIODevice &device, QList<ReferencePoint> &points, int parse(QIODevice &device, QList<ReferencePoint> &points,
QString &projection, ProjectionSetup &setup, QString &datum);
bool parseMapFile(QIODevice &device, QList<ReferencePoint> &points,
QString &projection, ProjectionSetup &setup, QString &datum); QString &projection, ProjectionSetup &setup, QString &datum);
bool mapLoaded(int res);
bool totalSizeSet(); bool totalSizeSet();
bool createProjection(const QString &datum, const QString &projection, bool createProjection(const QString &datum, const QString &projection,
const ProjectionSetup &setup, QList<ReferencePoint> &points); const ProjectionSetup &setup, QList<ReferencePoint> &points);
@ -84,6 +86,9 @@ private:
void drawImage(QPainter *painter, const QRectF &rect); void drawImage(QPainter *painter, const QRectF &rect);
QString _name; QString _name;
bool _valid;
QString _errorString;
QSize _size; QSize _size;
Projection *_projection; Projection *_projection;
QTransform _transform, _inverted; QTransform _transform, _inverted;
@ -96,8 +101,6 @@ private:
QString _imgPath; QString _imgPath;
QSize _tileSize; QSize _tileSize;
QString _tileName; QString _tileName;
bool _valid;
}; };
#endif // OFFLINEMAP_H #endif // OFFLINEMAP_H

View File

@ -232,13 +232,13 @@ void OnlineMap::draw(QPainter *painter, const QRectF &rect)
} }
} }
QPointF OnlineMap::ll2xy(const Coordinates &c) const QPointF OnlineMap::ll2xy(const Coordinates &c)
{ {
QPointF m = Mercator().ll2xy(c); QPointF m = Mercator().ll2xy(c);
return QPointF(m.x() / _scale, m.y() / -_scale); return QPointF(m.x() / _scale, m.y() / -_scale);
} }
Coordinates OnlineMap::xy2ll(const QPointF &p) const Coordinates OnlineMap::xy2ll(const QPointF &p)
{ {
QPointF m(p.x() * _scale, -p.y() * _scale); QPointF m(p.x() * _scale, -p.y() * _scale);
return Mercator().xy2ll(m); return Mercator().xy2ll(m);

View File

@ -23,8 +23,8 @@ public:
qreal zoomIn(); qreal zoomIn();
qreal zoomOut(); qreal zoomOut();
QPointF ll2xy(const Coordinates &c) const; QPointF ll2xy(const Coordinates &c);
Coordinates xy2ll(const QPointF &p) const; Coordinates xy2ll(const QPointF &p);
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);

View File

@ -196,11 +196,24 @@ QWidget *OptionsDialog::createSystemPage()
#endif // Q_OS_WIN32 #endif // Q_OS_WIN32
_useOpenGL->setChecked(_options->useOpenGL); _useOpenGL->setChecked(_options->useOpenGL);
QFormLayout *systemLayout = new QFormLayout(); _pixmapCache = new QSpinBox();
systemLayout->addWidget(_useOpenGL); _pixmapCache->setMinimum(16);
_pixmapCache->setMaximum(1024);
_pixmapCache->setSuffix(UNIT_SPACE + tr("MB"));
_pixmapCache->setValue(_options->pixmapCache);
QFormLayout *cacheLayout = new QFormLayout();
cacheLayout->addRow(tr("Image cache size:"), _pixmapCache);
QFormLayout *openGLLayout = new QFormLayout();
openGLLayout->addWidget(_useOpenGL);
QWidget *systemTab = new QWidget(); QWidget *systemTab = new QWidget();
systemTab->setLayout(systemLayout); QVBoxLayout *systemTabLayout = new QVBoxLayout();
systemTabLayout->addLayout(cacheLayout);
systemTabLayout->addLayout(openGLLayout);
systemTabLayout->addStretch();
systemTab->setLayout(systemTabLayout);
QTabWidget *systemPage = new QTabWidget(); QTabWidget *systemPage = new QTabWidget();
systemPage->addTab(systemTab, tr("System")); systemPage->addTab(systemTab, tr("System"));
@ -275,6 +288,7 @@ void OptionsDialog::accept()
_options->poiRadius = _poiRadius->value() * KMINM; _options->poiRadius = _poiRadius->value() * KMINM;
_options->useOpenGL = _useOpenGL->isChecked(); _options->useOpenGL = _useOpenGL->isChecked();
_options->pixmapCache = _pixmapCache->value();
_options->printName = _name->isChecked(); _options->printName = _name->isChecked();
_options->printDate = _date->isChecked(); _options->printDate = _date->isChecked();

View File

@ -26,6 +26,7 @@ struct Options {
int poiRadius; int poiRadius;
// System // System
bool useOpenGL; bool useOpenGL;
int pixmapCache;
// Print/Export // Print/Export
bool printName; bool printName;
bool printDate; bool printDate;
@ -66,6 +67,7 @@ private:
QSpinBox *_graphWidth; QSpinBox *_graphWidth;
QCheckBox *_graphAA; QCheckBox *_graphAA;
QDoubleSpinBox *_poiRadius; QDoubleSpinBox *_poiRadius;
QSpinBox *_pixmapCache;
QCheckBox *_useOpenGL; QCheckBox *_useOpenGL;
QCheckBox *_name; QCheckBox *_name;
QCheckBox *_date; QCheckBox *_date;

View File

@ -4,7 +4,22 @@
#define OZF2_MAGIC 0x7778 #define OZF2_MAGIC 0x7778
#define OZF2_SEPARATOR 0x77777777 #define OZF3_MAGIC 0x7780
#define SEPARATOR 0x77777777
static const quint8 XKEY[] =
{
0x2D, 0x4A, 0x43, 0xF1, 0x27, 0x9B, 0x69, 0x4F,
0x36, 0x52, 0x87, 0xEC, 0x5F, 0x42, 0x53, 0x22,
0x9E, 0x8B, 0x2D, 0x83, 0x3D, 0xD2, 0x84, 0xBA,
0xD8, 0x5B
};
static void decrypt(void *data, size_t size, quint8 init)
{
for (size_t i = 0; i < size; i++)
reinterpret_cast<quint8*>(data)[i] ^= XKEY[i % sizeof(XKEY)] + init;
}
template<class T> bool OZF::readValue(T &val) template<class T> bool OZF::readValue(T &val)
{ {
@ -13,6 +28,9 @@ template<class T> bool OZF::readValue(T &val)
if (_file.read((char*)&data, sizeof(T)) < (qint64)sizeof(T)) if (_file.read((char*)&data, sizeof(T)) < (qint64)sizeof(T))
return false; return false;
if (_decrypt)
decrypt(&data, sizeof(T), _key);
if (sizeof(T) > 1) if (sizeof(T) > 1)
val = qFromLittleEndian(data); val = qFromLittleEndian(data);
else else
@ -21,17 +39,88 @@ template<class T> bool OZF::readValue(T &val)
return true; return true;
} }
bool OZF::read(void *data, size_t size)
{
if (_file.read((char*)data, size) < (qint64)size)
return false;
if (_decrypt)
decrypt(data, size, _key);
return true;
}
bool OZF::readKey()
{
quint8 randomNumber, initial;
quint32 keyblock;
if (!_file.seek(14))
return false;
if (!readValue(randomNumber))
return false;
if (!_file.seek(162))
return false;
if (!readValue(initial))
return false;
_decrypt = true; _key = initial;
if (!_file.seek(15 + randomNumber))
return false;
if (!readValue(keyblock))
return false;
switch (keyblock & 0xFF) {
case 0xf1:
initial += 0x8a;
break;
case 0x18:
case 0x54:
initial += 0xa0;
break;
case 0x56:
initial += 0xb9;
break;
case 0x43:
initial += 0x6a;
break;
case 0x83:
initial += 0xa4;
break;
case 0xc5:
initial += 0x7e;
break;
case 0x38:
initial += 0xc1;
break;
default:
break;
}
_key = initial;
return true;
}
bool OZF::readHeaders() bool OZF::readHeaders()
{ {
quint16 magic; quint16 magic;
quint32 separator; quint32 separator;
if (!readValue(magic) || magic != OZF2_MAGIC) if (!readValue(magic))
return false; return false;
if (magic == OZF2_MAGIC) {
if (!_file.seek(_file.pos() + 52)) if (!_file.seek(_file.pos() + 52))
return false; return false;
if (!readValue(separator) || separator != OZF2_SEPARATOR) if (!readValue(separator) || separator != SEPARATOR)
return false;
} else if (magic == OZF3_MAGIC) {
if (!readKey())
return false;
} else
return false; return false;
return true; return true;
@ -69,9 +158,10 @@ bool OZF::readTileTable()
_dim = QSize(x, y); _dim = QSize(x, y);
_palette = QVector<quint32>(256); _palette = QVector<quint32>(256);
for (int i = 0; i < _palette.size(); i++) { if (!read(&(_palette[0]), sizeof(quint32) * 256))
if (!readValue(bgr0))
return false; return false;
for (int i = 0; i < _palette.size(); i++) {
bgr0 = qFromLittleEndian(_palette.at(i));
quint32 b = (bgr0 & 0x000000FF); quint32 b = (bgr0 & 0x000000FF);
quint32 g = (bgr0 & 0x0000FF00) >> 8; quint32 g = (bgr0 & 0x0000FF00) >> 8;
@ -98,7 +188,7 @@ bool OZF::load(const QString &path)
return false; return false;
if (!readHeaders()) { if (!readHeaders()) {
qWarning("%s: not a OZF2 file", qPrintable(_file.fileName())); qWarning("%s: not a OZF2/OZF3 file", qPrintable(_file.fileName()));
_file.close(); _file.close();
return false; return false;
} }
@ -128,6 +218,8 @@ QPixmap OZF::tile(int x, int y)
QByteArray ba = _file.read(size); QByteArray ba = _file.read(size);
if (ba.size() != size) if (ba.size() != size)
return QPixmap(); return QPixmap();
if (_decrypt)
decrypt(ba.data(), qMin(16, ba.size()), _key);
quint32 bes = qToBigEndian(tileSize().width() * tileSize().height()); quint32 bes = qToBigEndian(tileSize().width() * tileSize().height());
ba.prepend(QByteArray((char*)&bes, sizeof(bes))); ba.prepend(QByteArray((char*)&bes, sizeof(bes)));
QByteArray uba = qUncompress(ba); QByteArray uba = qUncompress(ba);

View File

@ -11,6 +11,8 @@
class OZF class OZF
{ {
public: public:
OZF() : _decrypt(false), _key(0) {}
bool load(const QString &path); bool load(const QString &path);
QString fileName() const {return _file.fileName();} QString fileName() const {return _file.fileName();}
@ -22,9 +24,14 @@ public:
private: private:
template<class T> bool readValue(T &val); template<class T> bool readValue(T &val);
bool read(void *data, size_t size);
bool readKey();
bool readHeaders(); bool readHeaders();
bool readTileTable(); bool readTileTable();
bool _decrypt;
quint8 _key;
QSize _size; QSize _size;
QSize _dim; QSize _dim;
QVector<QRgb> _palette; QVector<QRgb> _palette;

View File

@ -12,20 +12,21 @@ PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
: QGraphicsObject(parent) : QGraphicsObject(parent)
{ {
Q_ASSERT(path.count() >= 2); Q_ASSERT(path.count() >= 2);
_path = path; _path = path;
_map = map; _map = map;
_digitalZoom = 0;
updatePainterPath(map);
updateShape();
_width = 3; _width = 3;
QBrush brush(Qt::SolidPattern); QBrush brush(Qt::SolidPattern);
_pen = QPen(brush, _width); _pen = QPen(brush, _width);
updatePainterPath(map);
updateShape();
_marker = new MarkerItem(this); _marker = new MarkerItem(this);
_marker->setPos(position(_path.at(0).distance())); _marker->setPos(position(_path.at(0).distance()));
_marker->setFlag(QGraphicsItem::ItemIgnoresTransformations); _markerDistance = _path.at(0).distance();
_md = _path.at(0).distance();
setCursor(Qt::ArrowCursor); setCursor(Qt::ArrowCursor);
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
@ -34,7 +35,7 @@ PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
void PathItem::updateShape() void PathItem::updateShape()
{ {
QPainterPathStroker s; QPainterPathStroker s;
s.setWidth((_width + 1) * 1.0/scale()); s.setWidth((_width + 1) * pow(2, -_digitalZoom));
_shape = s.createStroke(_painterPath); _shape = s.createStroke(_painterPath);
} }
@ -71,7 +72,7 @@ void PathItem::setMap(Map *map)
updatePainterPath(map); updatePainterPath(map);
updateShape(); updateShape();
_marker->setPos(position(_md)); _marker->setPos(position(_markerDistance));
} }
void PathItem::setColor(const QColor &color) void PathItem::setColor(const QColor &color)
@ -85,7 +86,7 @@ void PathItem::setWidth(qreal width)
prepareGeometryChange(); prepareGeometryChange();
_width = width; _width = width;
_pen.setWidthF(_width * 1.0/scale()); _pen.setWidthF(_width * pow(2, -_digitalZoom));
updateShape(); updateShape();
} }
@ -96,6 +97,17 @@ void PathItem::setStyle(Qt::PenStyle style)
update(); update();
} }
void PathItem::setDigitalZoom(int zoom)
{
prepareGeometryChange();
_digitalZoom = zoom;
_pen.setWidthF(_width * pow(2, -_digitalZoom));
_marker->setScale(pow(2, -_digitalZoom));
updateShape();
}
QPointF PathItem::position(qreal x) const QPointF PathItem::position(qreal x) const
{ {
int low = 0; int low = 0;
@ -137,7 +149,7 @@ void PathItem::moveMarker(qreal distance)
&& distance <= _path.last().distance()) { && distance <= _path.last().distance()) {
_marker->setVisible(true); _marker->setVisible(true);
_marker->setPos(position(distance)); _marker->setPos(position(distance));
_md = distance; _markerDistance = distance;
} else } else
_marker->setVisible(false); _marker->setVisible(false);
} }
@ -146,7 +158,7 @@ void PathItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);
_pen.setWidthF((_width + 1) * 1.0/scale()); _pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
setZValue(zValue() + 1.0); setZValue(zValue() + 1.0);
update(); update();
@ -157,7 +169,7 @@ void PathItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);
_pen.setWidthF(_width * 1.0/scale()); _pen.setWidthF(_width * pow(2, -_digitalZoom));
setZValue(zValue() - 1.0); setZValue(zValue() - 1.0);
update(); update();

View File

@ -28,8 +28,7 @@ public:
void setColor(const QColor &color); void setColor(const QColor &color);
void setWidth(qreal width); void setWidth(qreal width);
void setStyle(Qt::PenStyle style); void setStyle(Qt::PenStyle style);
void setDigitalZoom(int zoom);
void showMarker(bool show) {_marker->setVisible(show);}
public slots: public slots:
void moveMarker(qreal distance); void moveMarker(qreal distance);
@ -50,7 +49,8 @@ private:
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
Map *_map; Map *_map;
qreal _md; qreal _markerDistance;
int _digitalZoom;
qreal _width; qreal _width;
QPen _pen; QPen _pen;

View File

@ -50,7 +50,6 @@ PathView::PathView(Map *map, POI *poi, QWidget *parent)
_mapScale = new ScaleItem(); _mapScale = new ScaleItem();
_mapScale->setZValue(2.0); _mapScale->setZValue(2.0);
_mapScale->setFlag(QGraphicsItem::ItemIgnoresTransformations);
_map = map; _map = map;
_poi = poi; _poi = poi;
@ -97,9 +96,10 @@ PathItem *PathView::addTrack(const Track &track)
_tracks.append(ti); _tracks.append(ti);
_tr |= ti->path().boundingRect(); _tr |= ti->path().boundingRect();
ti->setColor(_palette.nextColor()); ti->setColor(_palette.nextColor());
ti->setWidth(_trackWidth * pow(2, -_digitalZoom)); ti->setWidth(_trackWidth);
ti->setStyle(_trackStyle); ti->setStyle(_trackStyle);
ti->setVisible(_showTracks); ti->setVisible(_showTracks);
ti->setDigitalZoom(_digitalZoom);
_scene->addItem(ti); _scene->addItem(ti);
addPOI(_poi->points(ti->path())); addPOI(_poi->points(ti->path()));
@ -118,11 +118,12 @@ PathItem *PathView::addRoute(const Route &route)
_routes.append(ri); _routes.append(ri);
_rr |= ri->path().boundingRect(); _rr |= ri->path().boundingRect();
ri->setColor(_palette.nextColor()); ri->setColor(_palette.nextColor());
ri->setWidth(_routeWidth * pow(2, -_digitalZoom)); ri->setWidth(_routeWidth);
ri->setStyle(_routeStyle); ri->setStyle(_routeStyle);
ri->setVisible(_showRoutes); ri->setVisible(_showRoutes);
ri->showWaypoints(_showRouteWaypoints); ri->showWaypoints(_showRouteWaypoints);
ri->showWaypointLabels(_showWaypointLabels); ri->showWaypointLabels(_showWaypointLabels);
ri->setDigitalZoom(_digitalZoom);
_scene->addItem(ri); _scene->addItem(ri);
addPOI(_poi->points(ri->path())); addPOI(_poi->points(ri->path()));
@ -142,7 +143,7 @@ void PathView::addWaypoints(const QList<Waypoint> &waypoints)
wi->setZValue(1); wi->setZValue(1);
wi->showLabel(_showWaypointLabels); wi->showLabel(_showWaypointLabels);
wi->setVisible(_showWaypoints); wi->setVisible(_showWaypoints);
wi->setFlag(QGraphicsItem::ItemIgnoresTransformations); wi->setDigitalZoom(_digitalZoom);
_scene->addItem(wi); _scene->addItem(wi);
} }
@ -340,7 +341,7 @@ void PathView::addPOI(const QVector<Waypoint> &waypoints)
pi->setZValue(1); pi->setZValue(1);
pi->showLabel(_showPOILabels); pi->showLabel(_showPOILabels);
pi->setVisible(_showPOI); pi->setVisible(_showPOI);
pi->setFlag(QGraphicsItem::ItemIgnoresTransformations); pi->setDigitalZoom(_digitalZoom);
_scene->addItem(pi); _scene->addItem(pi);
_pois.insert(w, pi); _pois.insert(w, pi);
@ -372,23 +373,40 @@ void PathView::redraw()
void PathView::resetDigitalZoom() void PathView::resetDigitalZoom()
{ {
_digitalZoom = 0; QHash<Waypoint, WaypointItem*>::const_iterator it;
_digitalZoom = 0;
resetTransform(); resetTransform();
setTrackWidth(_trackWidth); for (int i = 0; i < _tracks.size(); i++)
setRouteWidth(_routeWidth); _tracks.at(i)->setDigitalZoom(0);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setDigitalZoom(0);
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setDigitalZoom(0);
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setDigitalZoom(0);
_mapScale->setDigitalZoom(0);
} }
void PathView::digitalZoom(int zoom) void PathView::digitalZoom(int zoom)
{ {
QHash<Waypoint, WaypointItem*>::const_iterator it;
_digitalZoom += zoom; _digitalZoom += zoom;
scale(pow(2, zoom), pow(2, zoom)); scale(pow(2, zoom), pow(2, zoom));
setTrackWidth(_trackWidth); for (int i = 0; i < _tracks.size(); i++)
setRouteWidth(_routeWidth); _tracks.at(i)->setDigitalZoom(_digitalZoom);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setDigitalZoom(_digitalZoom);
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setDigitalZoom(_digitalZoom);
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setDigitalZoom(_digitalZoom);
_mapScale->setResolution(_res * pow(2, -_digitalZoom)); _mapScale->setDigitalZoom(_digitalZoom);
} }
void PathView::zoom(int zoom, const QPoint &pos, const Coordinates &c) void PathView::zoom(int zoom, const QPoint &pos, const Coordinates &c)
@ -519,9 +537,7 @@ void PathView::clear()
_tr = QRectF(); _rr = QRectF(); _wr = QRectF(); _tr = QRectF(); _rr = QRectF(); _wr = QRectF();
_wp = QPointF(); _wp = QPointF();
_digitalZoom = 0; resetDigitalZoom();
resetTransform();
resetCachedContent(); resetCachedContent();
} }
@ -608,7 +624,7 @@ void PathView::setTrackWidth(int width)
_trackWidth = width; _trackWidth = width;
for (int i = 0; i < _tracks.count(); i++) for (int i = 0; i < _tracks.count(); i++)
_tracks.at(i)->setWidth(width * pow(2, -_digitalZoom)); _tracks.at(i)->setWidth(width);
} }
void PathView::setRouteWidth(int width) void PathView::setRouteWidth(int width)
@ -616,7 +632,7 @@ void PathView::setRouteWidth(int width)
_routeWidth = width; _routeWidth = width;
for (int i = 0; i < _routes.count(); i++) for (int i = 0; i < _routes.count(); i++)
_routes.at(i)->setWidth(width * pow(2, -_digitalZoom)); _routes.at(i)->setWidth(width);
} }
void PathView::setTrackStyle(Qt::PenStyle style) void PathView::setTrackStyle(Qt::PenStyle style)

View File

@ -1,3 +1,4 @@
#include <cmath>
#include <QPainter> #include <QPainter>
#include "config.h" #include "config.h"
#include "misc.h" #include "misc.h"
@ -15,6 +16,7 @@ ScaleItem::ScaleItem(QGraphicsItem *parent) : QGraphicsItem(parent)
{ {
_units = Metric; _units = Metric;
_res = 1.0; _res = 1.0;
_digitalZoom = 0;
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
setCacheMode(QGraphicsItem::DeviceCoordinateCache); setCacheMode(QGraphicsItem::DeviceCoordinateCache);
@ -87,24 +89,26 @@ QString ScaleItem::units() const
void ScaleItem::computeScale() void ScaleItem::computeScale()
{ {
qreal res = _res * pow(2, -_digitalZoom);
if (_units == Imperial) { if (_units == Imperial) {
_length = niceNum((_res * M2FT * SCALE_WIDTH) / SEGMENTS, 1); _length = niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, 1);
if (_length >= MIINFT) { if (_length >= MIINFT) {
_length = niceNum((_res * M2FT * FT2MI * SCALE_WIDTH) / SEGMENTS, 1); _length = niceNum((res * M2FT * FT2MI * SCALE_WIDTH) / SEGMENTS, 1);
_width = (_length / (_res * M2FT * FT2MI)); _width = (_length / (res * M2FT * FT2MI));
_scale = true; _scale = true;
} else { } else {
_width = (_length / (_res * M2FT)); _width = (_length / (res * M2FT));
_scale = false; _scale = false;
} }
} else { } else {
_length = niceNum((_res * SCALE_WIDTH) / SEGMENTS, 1); _length = niceNum((res * SCALE_WIDTH) / SEGMENTS, 1);
if (_length >= KMINM) { if (_length >= KMINM) {
_length *= M2KM; _length *= M2KM;
_width = (_length / (_res * M2KM)); _width = (_length / (res * M2KM));
_scale = true; _scale = true;
} else { } else {
_width = (_length / _res); _width = (_length / res);
_scale = false; _scale = false;
} }
} }
@ -127,3 +131,14 @@ void ScaleItem::setUnits(enum Units units)
updateBoundingRect(); updateBoundingRect();
update(); update();
} }
void ScaleItem::setDigitalZoom(int zoom)
{
prepareGeometryChange();
_digitalZoom = zoom;
computeScale();
updateBoundingRect();
update();
setScale(pow(2, -_digitalZoom));
}

View File

@ -15,6 +15,7 @@ public:
void setResolution(qreal res); void setResolution(qreal res);
void setUnits(enum Units units); void setUnits(enum Units units);
void setDigitalZoom(int zoom);
private: private:
void updateBoundingRect(); void updateBoundingRect();
@ -27,6 +28,8 @@ private:
Units _units; Units _units;
bool _scale; bool _scale;
int _digitalZoom;
QRectF _boundingRect; QRectF _boundingRect;
}; };

View File

@ -94,6 +94,8 @@
#define POI_RADIUS_DEFAULT (IMPERIAL_UNITS() ? MIINM : KMINM) #define POI_RADIUS_DEFAULT (IMPERIAL_UNITS() ? MIINM : KMINM)
#define USE_OPENGL_SETTING "useOpenGL" #define USE_OPENGL_SETTING "useOpenGL"
#define USE_OPENGL_DEFAULT false #define USE_OPENGL_DEFAULT false
#define PIXMAP_CACHE_SETTING "pixmapCache"
#define PIXMAP_CACHE_DEFAULT 64
#define PRINT_NAME_SETTING "printName" #define PRINT_NAME_SETTING "printName"
#define PRINT_NAME_DEFAULT true #define PRINT_NAME_DEFAULT true
#define PRINT_DATE_SETTING "printDate" #define PRINT_DATE_SETTING "printDate"

View File

@ -1,93 +1,256 @@
/*
* Based on libgeotrans with the following Source Code Disclaimer:
1. The GEOTRANS source code ("the software") is provided free of charge by
the National Imagery and Mapping Agency (NIMA) of the United States
Department of Defense. Although NIMA makes no copyright claim under Title 17
U.S.C., NIMA claims copyrights in the source code under other legal regimes.
NIMA hereby grants to each user of the software a license to use and
distribute the software, and develop derivative works.
2. Warranty Disclaimer: The software was developed to meet only the internal
requirements of the U.S. National Imagery and Mapping Agency. The software
is provided "as is," and no warranty, express or implied, including but not
limited to the implied warranties of merchantability and fitness for
particular purpose or arising by statute or otherwise in law or from a
course of dealing or usage in trade, is made by NIMA as to the accuracy and
functioning of the software.
3. NIMA and its personnel are not required to provide technical support or
general assistance with respect to the software.
4. Neither NIMA nor its personnel will be liable for any claims, losses, or
damages arising from or connected with the use of the software. The user
agrees to hold harmless the United States National Imagery and Mapping
Agency. The user's sole and exclusive remedy is to stop using the software.
5. NIMA requests that products developed using the software credit the
source of the software with the following statement, "The product was
developed using GEOTRANS, a product of the National Imagery and Mapping
Agency and U.S. Army Engineering Research and Development Center."
6. For any products developed using the software, NIMA requires a disclaimer
that use of the software does not indicate endorsement or approval of the
product by the Secretary of Defense or the National Imagery and Mapping
Agency. Pursuant to the United States Code, 10 U.S.C. Sec. 2797, the name of
the National Imagery and Mapping Agency, the initials "NIMA", the seal of
the National Imagery and Mapping Agency, or any colorable imitation thereof
shall not be used to imply approval, endorsement, or authorization of a
product without prior written permission from United States Secretary of
Defense.
*/
#include <cmath> #include <cmath>
#include "rd.h" #include "rd.h"
#include "ellipsoid.h" #include "ellipsoid.h"
#include "transversemercator.h" #include "transversemercator.h"
#define SPHSN(lat) \
((double)(_e.radius() / sqrt(1.e0 - _es * pow(sin(lat), 2))))
#define SPHTMD(lat) \
((double)(_ap * lat - _bp * sin(2.e0 * lat) + _cp * sin(4.e0 * lat) \
- _dp * sin(6.e0 * lat) + _ep * sin(8.e0 * lat)))
#define DENOM(lat) \
((double)(sqrt(1.e0 - _es * pow(sin(lat),2))))
#define SPHSR(lat) \
((double)(_e.radius() * (1.e0 - _es) / pow(DENOM(lat), 3)))
TransverseMercator::TransverseMercator(const Ellipsoid &ellipsoid, TransverseMercator::TransverseMercator(const Ellipsoid &ellipsoid,
double centralMeridian, double scale, double falseEasting, double latitudeOrigin, double longitudeOrigin, double scale,
double falseNorthing) double falseEasting, double falseNorthing)
{ {
_centralMeridian = centralMeridian; double tn, tn2, tn3, tn4, tn5;
double b;
_e = ellipsoid;
_longitudeOrigin = deg2rad(longitudeOrigin);
_latitudeOrigin = deg2rad(latitudeOrigin);
_scale = scale; _scale = scale;
_falseEasting = falseEasting; _falseEasting = falseEasting;
_falseNorthing = falseNorthing; _falseNorthing = falseNorthing;
_es = 2 * _e.flattening() - _e.flattening() * _e.flattening();
_ebs = (1 / (1 - _es)) - 1;
const double e2 = ellipsoid.flattening() * (2 - ellipsoid.flattening()); b = _e.radius() * (1 - _e.flattening());
const double n = ellipsoid.flattening() / (2 - ellipsoid.flattening());
_rectifyingRadius = ellipsoid.radius() / (1 + n)
* (1 + 0.25*pow(n, 2) + 0.015625*pow(n, 4));
_A = e2; tn = (_e.radius() - b) / (_e.radius() + b);
_B = (5 * pow(e2, 2) - pow(e2, 3)) / 6.0; tn2 = tn * tn;
_C = (104 * pow(e2, 3) - 45 * pow(e2, 4)) / 120.0; tn3 = tn2 * tn;
_D = (1237 * pow(e2, 4)) / 1260.0; tn4 = tn3 * tn;
tn5 = tn4 * tn;
_beta1 = 1/2.0 * n - 2/3.0 * pow(n, 2) + 5/16.0 * pow(n, 3) + 41/180.0 _ap = _e.radius() * (1.e0 - tn + 5.e0 * (tn2 - tn3) / 4.e0 + 81.e0
* pow(n, 4); * (tn4 - tn5) / 64.e0);
_beta2 = 13/48.0 * pow(n, 2) - 3/5.0 * pow(n, 3) + 557/1440.0 * pow(n, 4); _bp = 3.e0 * _e.radius() * (tn - tn2 + 7.e0 * (tn3 - tn4) / 8.e0 + 55.e0
_beta3 = 61/240.0 * pow(n, 3) - 103/140.0 * pow(n, 4); * tn5 / 64.e0 ) / 2.e0;
_beta4 = 49561/161280.0 * pow(n, 4); _cp = 15.e0 * _e.radius() * (tn2 - tn3 + 3.e0 * (tn4 - tn5 ) / 4.e0) / 16.0;
_dp = 35.e0 * _e.radius() * (tn3 - tn4 + 11.e0 * tn5 / 16.e0) / 48.e0;
_delta1 = 1/2.0 * n - 2/3.0 * pow(n, 2) + 37/96.0 * pow(n, 3) - 1/360.0 _ep = 315.e0 * _e.radius() * (tn4 - tn5) / 512.e0;
* pow(n, 4);
_delta2 = 1/48.0 * pow(n, 2) + 1/15.0 * pow(n, 3) - 437/1440.0 * pow(n, 4);
_delta3 = 17/480.0 * pow(n, 3) - 37/840.0 * pow(n, 4);
_delta4 = 4397/161280.0 * pow(n, 4);
_AStar = e2 + pow(e2, 2) + pow(e2, 3) + pow(e2, 4);
_BStar = (7 * pow(e2, 2) + 17 * pow(e2, 3) + 30 * pow(e2, 4)) / -6;
_CStar = (224 * pow(e2, 3) + 889 * pow(e2, 4)) / 120;
_DStar = (4279 * pow(e2, 4)) / -1260;
} }
QPointF TransverseMercator::ll2xy(const Coordinates &c) const QPointF TransverseMercator::ll2xy(const Coordinates &c) const
{ {
QPointF p; double rl;
double cl, c2, c3, c5, c7;
double dlam;
double eta, eta2, eta3, eta4;
double sl, sn;
double t, tan2, tan3, tan4, tan5, tan6;
double t1, t2, t3, t4, t5, t6, t7, t8, t9;
double tmd, tmdo;
double x, y;
double phi = deg2rad(c.lat());
double lambda = deg2rad(c.lon());
double lambda0 = deg2rad(_centralMeridian);
double deltaLambda = lambda - lambda0; dlam = deg2rad(c.lon()) - _longitudeOrigin;
double phiStar = phi - sin(phi) * cos(phi) * (_A + _B*pow(sin(phi), 2) if (dlam > M_PI)
+ _C*pow(sin(phi), 4) + _D*pow(sin(phi), 6)); dlam -= (2 * M_PI);
if (dlam < -M_PI)
dlam += (2 * M_PI);
if (fabs(dlam) < 2.e-10)
dlam = 0.0;
double xiPrim = atan(tan(phiStar) / cos(deltaLambda)); rl = deg2rad(c.lat());
double etaPrim = atanh(cos(phiStar) * sin(deltaLambda)); sl = sin(rl);
cl = cos(rl);
c2 = cl * cl;
c3 = c2 * cl;
c5 = c3 * c2;
c7 = c5 * c2;
t = sl / cl;
tan2 = t * t;
tan3 = tan2 * t;
tan4 = tan3 * t;
tan5 = tan4 * t;
tan6 = tan5 * t;
eta = _ebs * c2;
eta2 = eta * eta;
eta3 = eta2 * eta;
eta4 = eta3 * eta;
p.ry() = _falseNorthing + _scale * _rectifyingRadius * (xiPrim + _beta1 sn = SPHSN(rl);
* sin(2*xiPrim) * cosh(2*etaPrim) + _beta2 * sin(4*xiPrim) tmd = SPHTMD(rl);
* cosh(4*etaPrim) + _beta3 * sin(6*xiPrim) * cosh(6*etaPrim) + _beta4 tmdo = SPHTMD (_latitudeOrigin);
* sin(8*xiPrim) * cosh(8*etaPrim));
p.rx() = _falseEasting + _scale * _rectifyingRadius * (etaPrim + _beta1
* cos(2*xiPrim) * sinh(2*etaPrim) + _beta2 * cos(4*xiPrim)
* sinh(4*etaPrim) + _beta3 * cos(6*xiPrim) * sinh(6*etaPrim) + _beta4
* cos(8*xiPrim) * sinh(8*etaPrim));
return p;
t1 = (tmd - tmdo) * _scale;
t2 = sn * sl * cl * _scale / 2.e0;
t3 = sn * sl * c3 * _scale * (5.e0 - tan2 + 9.e0 * eta + 4.e0 * eta2)
/ 24.e0;
t4 = sn * sl * c5 * _scale * (61.e0 - 58.e0 * tan2 + tan4 + 270.e0 * eta
- 330.e0 * tan2 * eta + 445.e0 * eta2 + 324.e0 * eta3 - 680.e0 * tan2
* eta2 + 88.e0 * eta4 - 600.e0 * tan2 * eta3 - 192.e0 * tan2 * eta4)
/ 720.e0;
t5 = sn * sl * c7 * _scale * (1385.e0 - 3111.e0 * tan2 + 543.e0 * tan4
- tan6) / 40320.e0;
y = _falseNorthing + t1 + pow(dlam, 2.e0) * t2 + pow(dlam, 4.e0) * t3
+ pow(dlam, 6.e0) * t4 + pow(dlam, 8.e0) * t5;
t6 = sn * cl * _scale;
t7 = sn * c3 * _scale * (1.e0 - tan2 + eta) /6.e0;
t8 = sn * c5 * _scale * (5.e0 - 18.e0 * tan2 + tan4 + 14.e0 * eta - 58.e0
* tan2 * eta + 13.e0 * eta2 + 4.e0 * eta3 - 64.e0 * tan2 * eta2 - 24.e0
* tan2 * eta3) / 120.e0;
t9 = sn * c7 * _scale * (61.e0 - 479.e0 * tan2 + 179.e0 * tan4 - tan6)
/ 5040.e0;
x = _falseEasting + dlam * t6 + pow(dlam, 3.e0) * t7 + pow(dlam, 5.e0)
* t8 + pow(dlam, 7.e0) * t9;
return QPointF(x, y);
} }
Coordinates TransverseMercator::xy2ll(const QPointF &p) const Coordinates TransverseMercator::xy2ll(const QPointF &p) const
{ {
double xi = (p.y() - _falseNorthing) / (_scale * _rectifyingRadius); double cl;
double eta = (p.x() - _falseEasting) / (_scale * _rectifyingRadius); double de;
double dlam;
double eta, eta2, eta3, eta4;
double ftphi;
double sn;
double sr;
double t, tan2, tan4;
double t10, t11, t12, t13, t14, t15, t16, t17;
double tmd, tmdo;
double lat, lon;
double xiPrim = xi - _delta1 * sin(2*xi) * cosh(2*eta) - _delta2 * sin(4*xi)
* cosh(4*eta) - _delta3 * sin(6*xi) * cosh(6*eta) - _delta4 * sin(8*xi)
* cosh(8*eta);
double etaPrim = eta - _delta1 * cos(2*xi) * sinh(2*eta) - _delta2
* cos(4*xi) * sinh(4*eta) - _delta3 * cos(6*xi) * sinh(6*eta) - _delta4
* cos(8*xi) * sinh(8*eta);
double phiStar = asin(sin(xiPrim) / cosh(etaPrim)); tmdo = SPHTMD(_latitudeOrigin);
double deltaLambda = atan(sinh(etaPrim) / cos(xiPrim)); tmd = tmdo + (p.y() - _falseNorthing) / _scale;
double phi = phiStar + sin(phiStar) * cos(phiStar) * (_AStar + _BStar sr = SPHSR(0.e0);
* pow(sin(phiStar), 2) + _CStar * pow(sin(phiStar), 4) + _DStar ftphi = tmd / sr;
* pow(sin(phiStar), 6));
return Coordinates(_centralMeridian + rad2deg(deltaLambda), rad2deg(phi)); for (int i = 0; i < 5 ; i++) {
t10 = SPHTMD(ftphi);
sr = SPHSR(ftphi);
ftphi = ftphi + (tmd - t10) / sr;
}
sr = SPHSR(ftphi);
sn = SPHSN(ftphi);
cl = cos(ftphi);
t = tan(ftphi);
tan2 = t * t;
tan4 = tan2 * tan2;
eta = _ebs * pow(cl, 2);
eta2 = eta * eta;
eta3 = eta2 * eta;
eta4 = eta3 * eta;
de = p.x() - _falseEasting;
if (fabs(de) < 0.0001)
de = 0.0;
t10 = t / (2.e0 * sr * sn * pow(_scale, 2));
t11 = t * (5.e0 + 3.e0 * tan2 + eta - 4.e0 * pow(eta, 2) - 9.e0 * tan2
* eta) / (24.e0 * sr * pow(sn, 3) * pow(_scale, 4));
t12 = t * (61.e0 + 90.e0 * tan2 + 46.e0 * eta + 45.E0 * tan4 - 252.e0 * tan2
* eta - 3.e0 * eta2 + 100.e0 * eta3 - 66.e0 * tan2 * eta2 - 90.e0 * tan4
* eta + 88.e0 * eta4 + 225.e0 * tan4 * eta2 + 84.e0 * tan2 * eta3 - 192.e0
* tan2 * eta4) / (720.e0 * sr * pow(sn, 5) * pow(_scale, 6));
t13 = t * (1385.e0 + 3633.e0 * tan2 + 4095.e0 * tan4 + 1575.e0 * pow(t,6))
/ (40320.e0 * sr * pow(sn, 7) * pow(_scale, 8));
lat = ftphi - pow(de, 2) * t10 + pow(de, 4) * t11 - pow(de, 6) * t12
+ pow(de, 8) * t13;
t14 = 1.e0 / (sn * cl * _scale);
t15 = (1.e0 + 2.e0 * tan2 + eta) / (6.e0 * pow(sn, 3) * cl * pow(_scale, 3));
t16 = (5.e0 + 6.e0 * eta + 28.e0 * tan2 - 3.e0 * eta2 + 8.e0 * tan2 * eta
+ 24.e0 * tan4 - 4.e0 * eta3 + 4.e0 * tan2 * eta2 + 24.e0 * tan2 * eta3)
/ (120.e0 * pow(sn, 5) * cl * pow(_scale, 5));
t17 = (61.e0 + 662.e0 * tan2 + 1320.e0 * tan4 + 720.e0 * pow(t,6))
/ (5040.e0 * pow(sn, 7) * cl * pow(_scale, 7));
dlam = de * t14 - pow(de, 3) * t15 + pow(de, 5) * t16 - pow(de, 7) * t17;
lon = _longitudeOrigin + dlam;
while (lat > deg2rad(90.0)) {
lat = M_PI - lat;
lon += M_PI;
if (lon > M_PI)
lon -= (2 * M_PI);
}
while (lat < deg2rad(-90.0)) {
lat = - (lat + M_PI);
lon += M_PI;
if (lon > M_PI)
lon -= (2 * M_PI);
}
if (lon > (2 * M_PI))
lon -= (2 * M_PI);
if (lon < -M_PI)
lon += (2 * M_PI);
return Coordinates(rad2deg(lon), rad2deg(lat));
} }

View File

@ -2,29 +2,29 @@
#define TRANSVERSEMERCATOR_H #define TRANSVERSEMERCATOR_H
#include "projection.h" #include "projection.h"
#include "ellipsoid.h"
class Ellipsoid;
class TransverseMercator : public Projection class TransverseMercator : public Projection
{ {
public: public:
TransverseMercator(const Ellipsoid &ellipsoid, double centralMeridian, TransverseMercator(const Ellipsoid &ellipsoid, double latitudeOrigin,
double scale, double falseEasting, double falseNorthing); double longitudeOrigin, double scale, double falseEasting,
double falseNorthing);
virtual QPointF ll2xy(const Coordinates &c) const; virtual QPointF ll2xy(const Coordinates &c) const;
virtual Coordinates xy2ll(const QPointF &p) const; virtual Coordinates xy2ll(const QPointF &p) const;
private: private:
double _centralMeridian; Ellipsoid _e;
double _longitudeOrigin;
double _latitudeOrigin;
double _scale; double _scale;
double _falseEasting; double _falseEasting;
double _falseNorthing; double _falseNorthing;
double _rectifyingRadius; double _es;
double _A, _B, _C, _D; double _ebs;
double _beta1, _beta2, _beta3, _beta4; double _ap, _bp, _cp, _dp, _ep;
double _delta1, _delta2, _delta3, _delta4;
double _AStar, _BStar, _CStar, _DStar;
}; };
#endif // TRANSVERSEMERCATOR_H #endif // TRANSVERSEMERCATOR_H

View File

@ -2,13 +2,13 @@
#include "utm.h" #include "utm.h"
UTM::UTM(const Ellipsoid &ellipsoid, int zone) UTM::UTM(const Ellipsoid &ellipsoid, int zone)
: _tm(ellipsoid, (qAbs(zone) - 1)*6 - 180 + 3, 0.9996, 500000, : _tm(ellipsoid, 0, (qAbs(zone) - 1)*6 - 180 + 3, 0.9996, 500000,
zone < 0 ? 10000000 : 0) zone < 0 ? 10000000 : 0)
{ {
} }
UTM::UTM(const Ellipsoid &ellipsoid, const Coordinates &c) UTM::UTM(const Ellipsoid &ellipsoid, const Coordinates &c)
: _tm(ellipsoid, 0, 0, 0, 0) : _tm(ellipsoid, 0, 0, 0, 0, 0)
{ {
int zone = int((c.lon() + 180)/6) + 1; int zone = int((c.lon() + 180)/6) + 1;
@ -26,6 +26,6 @@ UTM::UTM(const Ellipsoid &ellipsoid, const Coordinates &c)
} }
double cm = (zone - 1)*6 - 180 + 3; double cm = (zone - 1)*6 - 180 + 3;
_tm = TransverseMercator(ellipsoid, cm, 0.9996, 500000, _tm = TransverseMercator(ellipsoid, 0, cm, 0.9996, 500000,
(c.lat() < 0) ? 10000000 : 0); (c.lat() < 0) ? 10000000 : 0);
} }

View File

@ -3,7 +3,6 @@
#include "config.h" #include "config.h"
#include "format.h" #include "format.h"
#include "tooltip.h" #include "tooltip.h"
#include "map.h"
#include "waypointitem.h" #include "waypointitem.h"
@ -46,11 +45,6 @@ WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
} }
void WaypointItem::setMap(Map *map)
{
setPos(map->ll2xy(_waypoint.coordinates()));
}
void WaypointItem::updateShape() void WaypointItem::updateShape()
{ {
QPainterPath p; QPainterPath p;
@ -106,14 +100,6 @@ void WaypointItem::paint(QPainter *painter,
*/ */
} }
/*
void WaypointItem::setScale(qreal scale)
{
QPointF p = _map->ll2xy(_waypoint.coordinates());
setPos(QPointF(p.x(), -p.y()) * scale);
}
*/
void WaypointItem::setUnits(enum Units units) void WaypointItem::setUnits(enum Units units)
{ {
setToolTip(toolTip(units)); setToolTip(toolTip(units));

View File

@ -1,11 +1,11 @@
#ifndef WAYPOINTITEM_H #ifndef WAYPOINTITEM_H
#define WAYPOINTITEM_H #define WAYPOINTITEM_H
#include <cmath>
#include <QGraphicsItem> #include <QGraphicsItem>
#include "waypoint.h" #include "waypoint.h"
#include "units.h" #include "units.h"
#include "map.h"
class Map;
class WaypointItem : public QGraphicsItem class WaypointItem : public QGraphicsItem
{ {
@ -14,9 +14,10 @@ public:
const Waypoint &waypoint() const {return _waypoint;} const Waypoint &waypoint() const {return _waypoint;}
void setMap(Map *map); void setMap(Map *map) {setPos(map->ll2xy(_waypoint.coordinates()));}
void setUnits(Units units); void setUnits(Units units);
void showLabel(bool show); void showLabel(bool show);
void setDigitalZoom(int zoom) {setScale(pow(2, -zoom));}
QPainterPath shape() const {return _shape;} QPainterPath shape() const {return _shape;}
QRectF boundingRect() const {return _shape.boundingRect();} QRectF boundingRect() const {return _shape.boundingRect();}