1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-16 11:54:23 +02:00

Compare commits

..

79 Commits

Author SHA1 Message Date
67b91f62a0 Radar reflectors (RADRFL) 2024-12-18 13:58:49 +01:00
0ab6e02e6c RCTLPT areas and TSSLPT/RCTLPT points 2024-12-18 12:41:05 +01:00
7f20e2e307 Cosmetics 2024-12-17 11:28:23 +01:00
68f1f1fc3f Code cleanup 2024-12-17 10:55:01 +01:00
a4449897a7 Version++ 2024-12-16 15:03:02 +01:00
80a8ac260d const correctness 2024-12-10 19:13:00 +01:00
6673281e1c Removed obsolete comment 2024-12-10 09:23:25 +01:00
30157f8e4a Use Qt 6.8 in the Windows CI builds 2024-12-10 07:55:49 +01:00
12e3bbc988 Never use (semi)transparent areas 2024-12-05 18:13:37 +01:00
9d5ac81f2f Slipways 2024-12-04 00:24:17 +01:00
c0f97ddbd4 Distinguish parking types 2024-12-04 00:12:49 +01:00
d7d193871a Fixed broken placeholder 2024-12-03 23:35:21 +01:00
4b9bb04cec Translated using Weblate (Finnish)
Currently translated at 96.9% (473 of 488 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2024-12-03 23:25:37 +01:00
d3889b6dfe Use the same locking algorithm like in IMG/Mapsforge maps 2024-12-03 20:25:38 +01:00
240ddaf39c Use the same locking algorithm like in IMG/Mapsforge maps 2024-12-03 20:20:40 +01:00
53685253d7 Quarry names 2024-12-03 09:21:52 +01:00
38486e594b Fountains + minor fixes 2024-12-03 07:14:28 +01:00
47dd212f47 Wayside crosses 2024-12-03 06:46:35 +01:00
a11ba0487c Improved tile loading parallelism 2024-12-01 12:34:26 +01:00
c014526bd9 Improved tile loading parallelism 2024-12-01 10:25:10 +01:00
f620bbc383 Reduce the number of file opens for IMG files 2024-11-30 00:13:35 +01:00
9ac10e2909 Cricket 2024-11-29 08:51:00 +01:00
5f623975f9 Volleyball 2024-11-29 08:42:18 +01:00
bd266ea73c Some more sports 2024-11-29 08:34:38 +01:00
6774e29d3f SVG code cleanup 2024-11-28 18:47:57 +01:00
a02f157bd8 Emergency stuff 2024-11-28 09:33:16 +01:00
4bad7c9b46 Power plants 2024-11-28 05:37:52 +01:00
93402dd4cd Neighbourhoods 2024-11-28 04:59:25 +01:00
f6dcf43c1a Track lines 2024-11-27 23:08:16 +01:00
7452650999 Missing railway areas 2024-11-27 07:37:13 +01:00
863f6ac58f Improved tracks rendering 2024-11-26 19:58:22 +01:00
a57b50e07c Distinguish peaks 2024-11-26 07:42:00 +01:00
450b8aad59 Version++ 2024-11-26 07:40:45 +01:00
2fcee5aae0 Translated using Weblate (Danish)
Currently translated at 100.0% (488 of 488 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/da/
2024-11-24 14:33:57 +01:00
2fefd3ec55 Water bodies labels adjustments 2024-11-24 12:52:02 +01:00
8a3808248a Code cleanup 2024-11-24 09:09:45 +01:00
7d2bbfe12a Added missing rails 2024-11-24 02:54:19 +01:00
929035eee9 Fixed city labels fetching 2024-11-23 23:09:00 +01:00
cccda7395e Allow more labels for same symbol-id 2024-11-23 18:31:56 +01:00
93775a5adf Do not show the glaciers later than the other terain 2024-11-23 15:22:16 +01:00
f5b0c3f041 Quarters 2024-11-23 10:37:20 +01:00
c1eca4eacf Show the suburbs on lower zooms 2024-11-23 09:43:53 +01:00
6b0a08ae91 Bunkers 2024-11-23 07:15:17 +01:00
81751a2564 SVG code cleanup 2024-11-23 07:14:13 +01:00
4281e809be Redesigned City/town/village label sizes + suburbs 2024-11-22 22:37:07 +01:00
67820d7c4d Do not try to draw labels outside the tile rect 2024-11-22 21:52:32 +01:00
2a16a1f34c Fixed typo 2024-11-22 21:52:22 +01:00
a086c13648 Increase the vector tile caches size 2024-11-22 21:18:34 +01:00
85fd574b38 Do not try to draw labels outside the tile rect 2024-11-22 20:45:43 +01:00
62ae50ecda Always show the rails when the railway stations are shown 2024-11-22 19:11:27 +01:00
b969eef432 Version++ 2024-11-22 19:10:54 +01:00
cd44f350e1 Split light rails from trams 2024-11-22 08:12:05 +01:00
90534c991c Added missing rails 2024-11-22 07:52:52 +01:00
071b16f76d Use the boundingbox center instead of the centroid like Mapsforge does 2024-11-21 19:05:08 +01:00
6d450023b0 Centroid computation cleanup 2024-11-21 17:52:54 +01:00
890985bacd Fixed debug builds 2024-11-21 10:59:32 +01:00
496065b549 Version++ 2024-11-21 10:58:00 +01:00
33b9354212 Some more POIs 2024-11-20 20:27:05 +01:00
cee20e2e9f Increased objects chache size 2024-11-20 19:10:44 +01:00
e10c6547ac Some more POI enhancements 2024-11-20 19:05:09 +01:00
2c1d340a44 Millitary areas zoom levels 2024-11-20 09:24:40 +01:00
848bde0f80 Properly mix the way and node POIs 2024-11-20 09:13:59 +01:00
5d3d2d7571 Embassies 2024-11-19 23:49:23 +01:00
72ae27f724 Distinguish schools and universities 2024-11-19 21:33:41 +01:00
a433ca3e1d Lock gates 2024-11-19 21:06:53 +01:00
26c99af3dc Observation towers 2024-11-19 20:46:13 +01:00
47b936dede Adjusted POI appearance levels 2024-11-19 19:12:25 +01:00
e8c8b86b81 Removed accidentally left debug output 2024-11-19 19:08:41 +01:00
62651666e1 Unified point and areal labels processing 2024-11-19 09:40:26 +01:00
7c59998f96 Do not duplicate the label rules 2024-11-19 01:45:34 +01:00
d577eab66e Improved natural POIs priorities 2024-11-19 00:32:32 +01:00
c4de36c7e4 Saddles + natural POIs cleanup 2024-11-19 00:25:12 +01:00
bf68ac8145 Give the artefact a better name 2024-11-18 22:27:26 +01:00
6169bcc67a Remove Qt version from the name as we only build for Qt6 now 2024-11-18 18:30:56 +01:00
94d62ab2b8 Dropped MacOS Qt5 build 2024-11-18 18:22:02 +01:00
3658c09403 Less agressive water labels 2024-11-18 16:55:16 +01:00
07085983ee Make the style more compatible with the original Mapsforge rendering engine 2024-11-18 15:01:00 +01:00
0e1244da6d Version++ 2024-11-18 14:37:30 +01:00
4a6deeaa16 Fixed graveyard rendering 2024-11-18 14:31:47 +01:00
70 changed files with 1228 additions and 818 deletions

View File

@ -1,4 +1,4 @@
version: 13.29.{build}
version: 13.34.{build}
configuration:
- Release
@ -12,7 +12,7 @@ environment:
- QTDIR: C:\Qt\5.15\msvc2019_64
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
NSISDEF: /DOPENSSL /DANGLE
- QTDIR: C:\Qt\6.7\msvc2019_64
- QTDIR: C:\Qt\6.8\msvc2019_64
OPENSSLDIR: C:\OpenSSL-v33-Win64\bin
NSISDEF: /DQT6 /DOPENSSL

View File

@ -6,32 +6,8 @@ on:
- master
jobs:
qt5:
name: GPXSee Qt5 build
runs-on: macos-12
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '5.15.2'
- name: Create localization
run: lrelease gpxsee.pro
- name: Configure build
run: qmake gpxsee.pro
- name: Build project
run: make -j3
- name: Create DMG
run: macdeployqt GPXSee.app -dmg -appstore-compliant
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: GPXSee-qt5.dmg
path: GPXSee.dmg
qt6:
name: GPXSee Qt6 build
build:
name: GPXSee
runs-on: macos-latest
steps:
- name: Checkout
@ -39,7 +15,7 @@ jobs:
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.7.2'
version: '6.8.0'
modules: qtpositioning qtserialport qtimageformats
- name: Create localization
run: lrelease gpxsee.pro
@ -52,5 +28,5 @@ jobs:
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: GPXSee-qt6.dmg
path: GPXSee.dmg
name: GPXSee.dmg

View File

@ -21,9 +21,9 @@
</rule>
<rule e="way" closed="yes" k="natural" v="rock|stone|bare_rock|bedrock" zoom-min="14">
<area fill="#60000000"/>
<area fill="#96968f"/>
</rule>
<rule e="way" closed="yes" k="natural" v="glacier" zoom-min="12">
<rule e="way" closed="yes" k="natural" v="glacier" zoom-min="10">
<area fill="#ddf1fd"/>
</rule>
@ -32,7 +32,7 @@
<area fill="#e4efcf"/>
</rule>
<rule e="way" closed="yes" k="landuse" v="construction|quarry|landfill|industrial|farm|farmyard" zoom-min="10">
<rule e="way" closed="yes" k="landuse" v="construction|quarry|landfill|industrial|farm|farmyard|railway" zoom-min="10">
<area fill="#d6d4ce"/>
</rule>
<rule e="way" closed="yes" k="landuse" v="allotments" zoom-min="10">
@ -82,34 +82,39 @@
<!-- Water -->
<rule e="way" closed="yes" k="natural" v="water">
<area fill="#9fc4e1"/>
<rule e="way" k="*" v="*" zoom-min="11" zoom-max="13">
<caption fill="#9fc4e1" font-size="12" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<rule e="way" k="bBoxWeight" v="~|mid|large|xlarge|xxlarge|xxxlarge" zoom-min="14" zoom-max="15">
<caption fill="#ffffff" font-size="12" font-family="serif" font-style="italic" k="name" stroke="#9fc4e1" stroke-width="2"/>
</rule>
<rule e="way" k="*" v="*" zoom-min="14" zoom-max="19">
<caption fill="#9fc4e1" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<rule e="way" k="bBoxWeight" v="~|xsmall|small|mid|large|xlarge|xxlarge|xxxlarge" zoom-min="16" zoom-max="16">
<caption fill="#ffffff" font-size="12" font-family="serif" font-style="italic" k="name" stroke="#9fc4e1" stroke-width="2"/>
</rule>
<rule e="way" k="*" v="*" zoom-min="17">
<caption fill="#ffffff" font-size="12" font-family="serif" font-style="italic" k="name" stroke="#9fc4e1" stroke-width="2"/>
</rule>
</rule>
<rule e="way" closed="yes" k="natural" v="marsh|wetland|mud" zoom-min="13">
<rule e="way" closed="yes" k="natural" v="marsh|wetland|mud" zoom-min="12">
<area src=":/patterns/wetland.svg" symbol-height="4"/>
</rule>
<rule e="way" k="waterway" v="river" zoom-min="8">
<line stroke="#9fc4e1" stroke-width="1.2"/>
<pathText fill="#9fc4e1" font-size="12" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<rule e="way" k="*" v="*" zoom-min="12">
<rule e="way" k="*" v="*" zoom-min="10" zoom-max="13">
<pathText fill="#ffffff" font-size="12" font-family="serif" font-style="italic" k="name" stroke="#9fc4e1" stroke-width="2"/>
</rule>
<rule e="way" k="*" v="*" zoom-min="14">
<lineSymbol src=":/symbols/flow.svg" symbol-width="16" symbol-height="8"/>
<pathText fill="#ffffff" font-size="14" font-family="serif" font-style="italic" k="name" stroke="#9fc4e1" stroke-width="2"/>
</rule>
</rule>
<rule e="way" k="waterway" v="stream|drain|ditch">
<rule e="way" k="waterway" v="stream|drain|ditch" zoom-min="10">
<rule e="way" k="intermittent" v="~|no">
<rule e="way" k="*" v="*" zoom-min="10" zoom-max="13">
<rule e="way" k="*" v="*" zoom-max="13">
<line stroke="#9fc4e1" stroke-width="1"/>
<pathText fill="#9fc4e1" font-size="11" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
</rule>
<rule e="way" k="*" v="*" zoom-min="14">
<line stroke="#9fc4e1" stroke-width="0.6"/>
<pathText fill="#9fc4e1" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<rule e="way" k="name" v="*">
<pathText fill="#ffffff" font-size="12" font-family="serif" font-style="italic" k="name" stroke="#9fc4e1" stroke-width="2"/>
<rule e="way" k="name" v="*" zoom-min="16">
<lineSymbol src=":/symbols/flow.svg" symbol-width="16" symbol-height="8"/>
</rule>
</rule>
@ -127,9 +132,12 @@
<rule e="way" closed="yes" k="waterway" v="dam" zoom-min="10">
<area fill="#bbbbbb"/>
</rule>
<rule e="way" k="waterway" v="lock_gate" zoom-min="10">
<line stroke="#000000" stroke-width="0.1"/>
</rule>
<rule e="way" k="waterway" v="weir" zoom-min="10">
<lineSymbol src=":/symbols/cliff.svg" repeat="true" display="always" repeat-gap="0" repeat-start="0" symbol-width="4" symbol-height="5"/>
<pathText fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<pathText fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="way" k="man_made" v="pier" zoom-min="10">
<line stroke="#ededed" stroke-width="0.5" stroke-linecap="butt"/>
@ -154,44 +162,53 @@
<rule e="way" closed="yes" k="landuse" v="cemetery">
<area src=":/patterns/cemetery.svg" symbol-width="6" symbol-height="7"/>
<rule e="way" k="*" v="*" zoom-min="15">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2"/>
</rule>
</rule>
<rule e="way" closed="yes" k="amenity" v="grave_yard">
<area src=":/patterns/cemetery.svg" symbol-width="30" symbol-height="28"/>
<area src=":/patterns/cemetery.svg" symbol-width="6" symbol-height="7"/>
</rule>
<rule e="way" closed="yes" k="bridge" v="yes|true|viaduct|aqueduct|suspension|culvert|swing" zoom-min="10">
<area fill="#ffffff"/>
</rule>
<rule e="way" closed="yes" k="amenity" v="parking" zoom-min="10">
<area fill="#ffffff" stroke="#d5cdc0" stroke-width="0.1"/>
<rule e="way" k="*" v="*" zoom-min="16">
<rule e="way" k="parking" v="~|surface|street_side|lane" zoom-min="17">
<symbol id="parking" src=":/POI/parking-11.svg" symbol-width="11"/>
</rule>
<rule e="way" k="parking" v="underground|multi-storey" zoom-min="17">
<symbol id="garage" src=":/POI/parking-garage-11.svg" symbol-width="11"/>
</rule>
</rule>
<rule e="way" closed="yes" k="highway" v="pedestrian" zoom-min="10">
<area fill="#ffffff"/>
</rule>
<rule e="way" closed="yes" k="leisure" v="pitch|playground|track" zoom-min="10">
<rule e="way" closed="yes" k="leisure" v="pitch|playground|track|ls_track" zoom-min="10">
<area fill="#e3edc6" stroke="#c9d3a5" stroke-width="1" scale="none"/>
</rule>
<rule e="way" closed="yes" k="leisure" v="swimming_pool" zoom-min="10">
<rule e="way" closed="no" k="leisure" v="track|ls_track" zoom-min="10">
<line stroke="#c9d3a5" stroke-width="0.3"/>
<line stroke="#e3edc6" stroke-width="0.2"/>
</rule>
<rule e="way" closed="yes" k="leisure" v="swimming_pool" zoom-min="12">
<area fill="#9fc4e1" stroke="#4398d9" stroke-width="1" scale="none"/>
</rule>
<rule e="way" k="leisure" v="track" zoom-min="10">
<line stroke="#e3edc6" stroke-width="1"/>
<rule e="way" closed="yes" k="amenity" v="fountain" zoom-min="12">
<area fill="#9fc4e1"/>
</rule>
<!-- Area overlays -->
<rule e="way" k="landuse" v="military" zoom-min="10">
<area src=":/patterns/military-area.svg" symbol-height="4"/>
<caption fill="#ff4040" font-size="10" font-style="italic" text-transform="uppercase" k="name" stroke="#ffffff" stroke-width="1"/>
<rule e="way" k="*" v="*" zoom-min="16">
<caption fill="#ff4040" font-size="10" font-style="italic" text-transform="uppercase" k="name" stroke="#ffffff" stroke-width="2"/>
</rule>
</rule>
<rule e="way" k="boundary" v="protected_area|national_park" zoom-min="10" zoom-max="14">
<rule e="way" k="protect_class" v="pr_2">
<area src=":/patterns/nature-reserve.svg" symbol-height="4"/>
<rule e="way" k="*" v="*" zoom-max="12">
<caption fill="#9ac269" font-size="10" font-style="italic" text-transform="uppercase" k="name" stroke="#ffffff" stroke-width="1"/>
<rule e="way" k="*" v="*" zoom-max="11">
<caption fill="#9ac269" font-size="10" font-style="italic" text-transform="uppercase" k="name" stroke="#ffffff" stroke-width="2"/>
</rule>
</rule>
</rule>
@ -203,13 +220,13 @@
<rule e="way" k="building" v="civic">
<area fill="#cfc4b3" stroke="#cdccc4" stroke-width="0.1"/>
<rule e="way" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" priority="-10"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" priority="-10"/>
</rule>
</rule>
<rule e="way" k="building" v="cathedral|church|basilica">
<area fill="#a19d96" stroke="#cdccc4" stroke-width="0.1"/>
<rule e="way" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2"/>
</rule>
</rule>
@ -346,7 +363,7 @@
<line stroke="#ffffff" stroke-width="0.4"/>
</rule>
</rule>
<rule e="way" k="highway" v="tertiary|tertiary_link|residential|living_street">
<rule e="way" k="highway" v="tertiary|tertiary_link|residential|living_street|raceway">
<rule e="way" k="*" v="*" zoom-min="13" zoom-max="13">
<line stroke="#d5cdc0" stroke-width="1.5"/>
<line stroke="#ffffff" stroke-width="0.75"/>
@ -356,7 +373,7 @@
<line stroke="#ffffff" stroke-width="0.75"/>
</rule>
<rule e="way" k="*" v="*" zoom-min="15">
<pathText fill="#000000" font-size="10" k="name" priority="-7" stroke="#FFFFFF" stroke-width="1"/>
<pathText fill="#000000" font-size="10" k="name" priority="-7" stroke="#FFFFFF" stroke-width="2"/>
<rule e="way" k="oneway" v="yes|true|1" zoom-min="16">
<lineSymbol priority="-50" src=":/symbols/oneway.svg" symbol-width="16" symbol-height="8"/>
</rule>
@ -384,7 +401,7 @@
</rule>
</rule>
<rule e="way" k="*" v="*" zoom-min="14">
<pathText fill="#000000" font-size="10" k="name" priority="-5" stroke="#FFFFFF" stroke-width="1"/>
<pathText fill="#000000" font-size="10" k="name" priority="-5" stroke="#FFFFFF" stroke-width="2"/>
<rule e="way" k="oneway" v="yes|true|1" zoom-min="16">
<lineSymbol priority="-50" src=":/symbols/arrow.svg" symbol-width="16" symbol-height="8"/>
</rule>
@ -436,16 +453,16 @@
</rule>
<rule e="way" k="highway" v="motorway" zoom-min="14">
<pathText fill="#FFFFFF" font-size="10" k="ref" stroke="#dd3e3e" stroke-width="1" text-orientation="auto_down"/>
<pathText fill="#FFFFFF" font-size="10" k="ref" stroke="#dd3e3e" stroke-width="2" text-orientation="auto_down"/>
</rule>
<rule e="node" k="highway" v="motorway_junction" zoom-min="16">
<symbol id="exit" src=":/symbols/exit.svg" symbol-width="15" symbol-height="11" priority="100"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="exit"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="exit"/>
</rule>
<!-- Railways -->
<rule e="way" k="tunnel" v="~|false|no">
<rule e="way" k="railway" v="rail">
<rule e="way" k="railway" v="rail|preserved|disused">
<rule e="way" k="*" v="*" zoom-min="10" zoom-max="12">
<line stroke="#717171" stroke-width="1" stroke-linecap="butt"/>
</rule>
@ -462,12 +479,15 @@
<line stroke="#ffffff" stroke-width="0.4608" stroke-dasharray="2,2" stroke-linecap="butt" scale="all"/>
</rule>
</rule>
<rule e="way" k="railway" v="narrow_gauge|light_rail|funicular" zoom-min="14">
<line stroke="#414141" stroke-width="0.2" stroke-linecap="butt"/>
</rule>
<rule e="way" k="railway" v="tram" zoom-min="15">
<line stroke="#717171" stroke-width="0.2" stroke-linecap="butt"/>
</rule>
</rule>
<rule e="way" k="tunnel" v="yes|true">
<rule e="way" k="railway" v="rail">
<rule e="way" k="railway" v="rail|preserved|disused">
<rule e="way" k="*" v="*" zoom-min="10" zoom-max="12">
<line stroke="#717171" stroke-width="1" stroke-linecap="butt" stroke-dasharray="10,8"/>
</rule>
@ -481,6 +501,9 @@
<line stroke="#878787" stroke-width="0.4144" stroke-linecap="butt" stroke-dasharray="2,1" scale="all"/>
</rule>
</rule>
<rule e="way" k="railway" v="narrow_gauge|light_rail|funicular" zoom-min="14">
<line stroke="#414141" stroke-width="0.2" stroke-linecap="butt" stroke-dasharray="12,4"/>
</rule>
<rule e="way" k="railway" v="tram" zoom-min="15">
<line stroke="#717171" stroke-width="0.2" stroke-linecap="butt" stroke-dasharray="12,4"/>
</rule>
@ -507,7 +530,7 @@
<rule e="way" closed="no" k="aerialway" v="*">
<line stroke="#202020" stroke-linecap="butt" stroke-width="0.3"/>
<rule e="any" k="*" v="*" zoom-min="15">
<pathText fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1"/>
<pathText fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2"/>
</rule>
</rule>
@ -523,63 +546,123 @@
</rule>
</rule>
<!-- Town & vilage names -->
<rule e="node" k="place" v="locality" zoom-min="14">
<caption fill="#000000" font-size="10" k="name" priority="10" stroke="#FFFFFF" stroke-width="1"/>
<!-- Town & village names -->
<rule e="node" k="place" v="locality|isolated_dwelling|farm" zoom-min="14">
<caption fill="#000000" font-size="10" k="name" priority="10" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="node" k="place" v="hamlet" zoom-min="12">
<caption fill="#000000" font-size="12" k="name" priority="20" stroke="#FFFFFF" stroke-width="1"/>
<caption fill="#000000" font-size="14" k="name" priority="20" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="node" k="place" v="village" zoom-min="11">
<caption fill="#000000" font-size="12" k="name" priority="20" stroke="#FFFFFF" stroke-width="1"/>
<caption fill="#000000" font-size="14" k="name" priority="20" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="node" k="place" v="town" zoom-min="9">
<caption fill="#000000" font-size="14" k="name" priority="30" stroke="#FFFFFF" stroke-width="1"/>
<rule e="node" k="place" v="town" zoom-min="9" zoom-max="14">
<rule e="node" k="*" v="*" zoom-max="10">
<caption fill="#000000" font-size="14" k="name" priority="30" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="node" k="*" v="*" zoom-min="11">
<caption fill="#000000" font-size="16" k="name" font-style="bold" priority="30" stroke="#FFFFFF" stroke-width="2"/>
</rule>
</rule>
<rule e="node" k="place" v="city">
<rule e="node" k="capital" v="yes|1|2">
<caption fill="#000000" font-size="16" font-style="bold" k="name" priority="40" stroke="#FFFFFF" stroke-width="1" text-transform="uppercase"/>
<rule e="node" k="*" v="*" zoom-max="10">
<rule e="node" k="capital" v="2">
<caption fill="#000000" font-size="18" font-style="bold" k="name" priority="40" stroke="#FFFFFF" stroke-width="2" text-transform="uppercase"/>
</rule>
<rule e="node" k="capital" v="4|~">
<caption fill="#000000" font-size="18" font-style="bold" k="name" priority="35" stroke="#FFFFFF" stroke-width="2"/>
</rule>
</rule>
<rule e="node" k="capital" v="no|~">
<caption fill="#000000" font-size="16" font-style="bold" k="name" priority="35" stroke="#FFFFFF" stroke-width="1"/>
<rule e="node" k="*" v="*" zoom-min="11" zoom-max="14">
<rule e="node" k="capital" v="2">
<caption fill="#000000" font-size="22" font-style="bold" k="name" priority="40" stroke="#FFFFFF" stroke-width="2" text-transform="uppercase"/>
</rule>
<rule e="node" k="capital" v="4|~">
<caption fill="#000000" font-size="22" font-style="bold" k="name" priority="35" stroke="#FFFFFF" stroke-width="2"/>
</rule>
</rule>
</rule>
<rule e="node" k="place" v="suburb">
<rule e="node" k="*" v="*" zoom-min="12" zoom-max="13">
<caption fill="#000000" font-size="14" k="name" priority="25" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="node" k="*" v="*" zoom-min="14" zoom-max="17">
<caption fill="#000000" font-size="16" k="name" priority="25" stroke="#FFFFFF" stroke-width="2"/>
</rule>
</rule>
<rule e="node" k="place" v="quarter" zoom-min="14" zoom-max="17">
<caption fill="#000000" font-size="14" k="name" priority="20" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="node" k="place" v="neighbourhood" zoom-min="15" zoom-max="17">
<caption fill="#000000" font-size="12" k="name" priority="15" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<!-- Nature POIs -->
<rule e="node" k="natural" v="peak" zoom-min="13">
<rule e="node" k="ele" v="*">
<rule e="node" k="name" v="*">
<symbol id="peak" src=":/POI/triangle-11.svg" symbol-width="11" priority="10"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="peak"/>
<rule e="node" k="*" v="*" zoom-min="14">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="ele" stroke="#FFFFFF" stroke-width="2" symbol-id="peak" priority="-1"/>
</rule>
</rule>
</rule>
<rule e="node" k="ele" v="~" zoom-min="15">
<rule e="node" k="name" v="*">
<symbol id="peak-minor" src=":/POI/triangle-stroked-11.svg" symbol-width="11" priority="5"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="peak-minor"/>
</rule>
</rule>
</rule>
<rule e="node" k="natural" v="saddle" zoom-min="13">
<rule e="node" k="name" v="*">
<symbol id="peak" src=":/POI/mountain-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" priority="10" stroke="#FFFFFF" stroke-width="1" symbol-id="peak"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="ele" priority="9" stroke="#FFFFFF" stroke-width="1" symbol-id="peak"/>
<symbol id="saddle" src=":/symbols/saddle.svg" symbol-width="9" symbol-height="11" priority="9"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="saddle"/>
<rule e="node" k="*" v="*" zoom-min="14">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="ele" stroke="#FFFFFF" stroke-width="2" symbol-id="saddle" priority="-1"/>
</rule>
</rule>
</rule>
<rule e="node" k="natural" v="volcano" zoom-min="13">
<symbol id="volcano" src=":/POI/volcano-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" priority="10" stroke="#FFFFFF" stroke-width="1" symbol-id="volcano"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="ele" priority="9" stroke="#FFFFFF" stroke-width="1" symbol-id="volcano"/>
<rule e="node" k="name" v="*">
<symbol id="volcano" src=":/POI/volcano-11.svg" symbol-width="11" priority="10"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="volcano"/>
<rule e="node" k="*" v="*" zoom-min="14">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="ele" stroke="#FFFFFF" stroke-width="2" symbol-id="volcano" priority="-1"/>
</rule>
</rule>
</rule>
<rule e="node" k="waterway" v="waterfall" zoom-min="15">
<symbol id="waterfall" src=":/POI/waterfall-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" priority="10" stroke="#FFFFFF" stroke-width="1" symbol-id="waterfall"/>
<rule e="any" k="name" v="*">
<symbol id="waterfall" src=":/POI/waterfall-11.svg" symbol-width="11" priority="8"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="waterfall"/>
</rule>
</rule>
</rule>
<rule e="node" k="natural" v="spring" zoom-min="15">
<rule e="any" k="name" v="*">
<symbol id="spring" src=":/POI/water-11.svg" symbol-width="11"/>
<symbol id="spring" src=":/POI/water-11.svg" symbol-width="11" priority="7"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" priority="10" stroke="#FFFFFF" stroke-width="1" symbol-id="spring"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="spring"/>
</rule>
</rule>
</rule>
<rule e="node" k="natural" v="hot_spring|geyser" zoom-min="15">
<rule e="any" k="name" v="*">
<symbol id="hot-spring" src=":/POI/hot-spring.svg" symbol-width="11" priority="7"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="hot-spring"/>
</rule>
</rule>
</rule>
<rule e="node" k="tourism" v="viewpoint" zoom-min="15">
<rule e="node" k="name" v="*">
<symbol id="viewpoint" src=":/POI/viewpoint-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="viewpoint"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-family="serif" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="viewpoint"/>
</rule>
</rule>
</rule>
@ -588,156 +671,192 @@
<rule e="any" k="name" v="*">
<symbol id="hospital" src=":/POI/hospital-11.svg" symbol-width="11" priority="20"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="hospital"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="hospital"/>
</rule>
</rule>
</rule>
<rule e="any" k="amenity" v="doctors" zoom-min="16">
<symbol id="doctor" src=":/POI/doctor-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="doctor"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="doctor"/>
</rule>
<rule e="any" k="amenity|building" v="police" zoom-min="15">
<symbol id="police" src=":/POI/police-11.svg" symbol-width="11" priority="19"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="police"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="police"/>
</rule>
</rule>
<rule e="any" k="amenity|building" v="fire_station" zoom-min="15">
<symbol id="fire-station" src=":/POI/fire-station-11.svg" symbol-width="11" priority="18"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="fire-station"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="fire-station"/>
</rule>
</rule>
<rule e="any" k="barrier" v="border_control|checkpoint" zoom-min="15">
<symbol id="checkpoint" src=":/POI/entrance-alt1-11.svg" symbol-width="11" priority="20"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="checkpoint"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="checkpoint"/>
</rule>
<rule e="any" k="aeroway" v="helipad" zoom-min="14">
<symbol id="heliport" src=":/POI/heliport-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="heliport"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="heliport"/>
</rule>
</rule>
<rule e="any" k="aeroway" v="aerodrome" zoom-min="12">
<symbol id="airport" src=":/POI/airport-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="airport"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="airport"/>
</rule>
<rule e="any" k="railway" v="station|halt">
<rule e="any" k="station" v="~" zoom-min="14">
<symbol id="train-station" src=":/POI/rail-11.svg" symbol-width="13" priority="20"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="train-station"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="train-station"/>
</rule>
<rule e="any" k="station" v="subway" zoom-min="15">
<symbol id="metro-station" src=":/POI/rail-metro-11.svg" symbol-width="11" priority="20"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="metro-station"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="metro-station"/>
</rule>
<rule e="any" k="station" v="light_rail" zoom-min="15">
<symbol id="light-rail-station" src=":/POI/rail-light-11.svg" symbol-width="11" priority="20"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="light-rail-station"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="light-rail-station"/>
</rule>
</rule>
<rule e="node" k="railway" v="tram_stop" zoom-min="16">
<symbol id="tram-stop" src=":/POI/rail-light-11.svg" symbol-width="11" priority="10"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="tram-stop"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="tram-stop"/>
</rule>
</rule>
<rule e="any" k="amenity" v="bus_station" zoom-min="16">
<symbol id="bus-station" src=":/POI/bus-11.svg" symbol-width="11" priority="10"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="bus-station"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="bus-station"/>
</rule>
<rule e="any" k="highway" v="bus_stop" zoom-min="16">
<symbol id="bus-stop" src=":/POI/bus-11.svg" symbol-width="11" priority="5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="bus-stop"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="bus-stop"/>
</rule>
</rule>
<rule e="any" k="amenity" v="ferry_terminal" zoom-min="16">
<symbol id="ferry" src=":/POI/ferry-11.svg" symbol-width="11" priority="10"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="ferry"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="ferry"/>
</rule>
</rule>
<rule e="any" k="amenity" v="fuel" zoom-min="15">
<symbol id="fuel" src=":/POI/fuel-11.svg" symbol-width="11" priority="15"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="fuel"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="fuel"/>
</rule>
</rule>
<rule e="any" k="amenity" v="shelter" zoom-min="16">
<symbol id="shelter" src=":/POI/shelter-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="shelter"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="shelter"/>
</rule>
</rule>
<rule e="any" k="tourism|building" v="alpine_hut|hotel|hostel|guest_house|chalet|motel" zoom-min="16">
<rule e="any" k="tourism|building" v="alpine_hut" zoom-min="15">
<symbol id="alpine_hut" src=":/POI/home-11.svg" symbol-width="11" priority="5"/>
<rule e="any" k="*" v="*" zoom-min="16">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="alpine_hut"/>
</rule>
</rule>
<rule e="any" k="tourism|building" v="hotel|hostel|guest_house|chalet|motel" zoom-min="17">
<symbol id="lodging" src=":/POI/lodging-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="lodging"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="lodging"/>
</rule>
</rule>
<rule e="any" k="tourism|accommodation" v="camp_site|caravan_site" zoom-min="16">
<symbol id="camp" src=":/POI/campsite-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="camp"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="camp"/>
</rule>
</rule>
<rule e="any" k="man_made" v="lighthouse" zoom-min="16">
<rule e="any" k="man_made" v="lighthouse" zoom-min="15">
<symbol id="lighthouse" src=":/POI/lighthouse-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="lighthouse"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="lighthouse"/>
</rule>
</rule>
<rule e="any" k="tower" v="communication" zoom-min="16">
<symbol id="com-tower" src=":/POI/communications-tower-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="com-tower"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="com-tower"/>
</rule>
</rule>
<rule e="any" k="tower" v="observation" zoom-min="16">
<symbol id="obs-tower" src=":/POI/observation-tower.svg" symbol-width="11" priority="5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="obs-tower"/>
</rule>
</rule>
<rule e="any" k="power" v="generator" zoom-min="16">
<rule e="any" k="generator:source" v="wind">
<symbol id="wind-turbine" src=":/POI/cross-11.svg" symbol-width="11" priority="5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="wind-turbine"/>
</rule>
</rule>
</rule>
<rule e="any" k="man_made" v="watermill" zoom-min="16">
<symbol id="watermill" src=":/POI/watermill-11.svg" symbol-width="11" priority="5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="watermill"/>
</rule>
</rule>
<rule e="any" k="man_made|tower" v="windmill" zoom-min="16">
<symbol id="windmill" src=":/POI/windmill-11.svg" symbol-width="11" priority="5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="windmill"/>
</rule>
</rule>
<rule e="any" k="amenity" v="theatre" zoom-min="16">
<symbol id="theatre" src=":/POI/theatre-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="theatre"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="theatre"/>
</rule>
</rule>
<rule e="any" k="amenity" v="cinema" zoom-min="16">
<symbol id="cinema" src=":/POI/cinema-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="cinema"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="cinema"/>
</rule>
</rule>
<rule e="any" k="tourism" v="museum" zoom-min="16">
<symbol id="museum" src=":/POI/museum-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="museum"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="museum"/>
</rule>
</rule>
<rule e="any" k="amenity|building" v="library" zoom-min="16">
<symbol id="library" src=":/POI/library-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="library"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="library"/>
</rule>
</rule>
<rule e="any" k="amenity" v="post_office" zoom-min="16">
<symbol id="post" src=":/POI/post-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="post"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="post"/>
</rule>
</rule>
<rule e="any" k="historic" v="memorial" zoom-min="17">
<rule e="any" k="historic" v="memorial|monument" zoom-min="17">
<symbol id="memorial" src=":/POI/monument-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="memorial"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="memorial"/>
</rule>
</rule>
<rule e="any" k="amenity" v="bank" zoom-min="16">
<rule e="any" k="amenity" v="bank" zoom-min="17">
<symbol id="bank" src=":/POI/bank-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="bank"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="bank"/>
</rule>
</rule>
<rule e="any" k="amenity" v="toilets" zoom-min="16">
@ -746,139 +865,266 @@
<rule e="any" k="information" v="visitor_centre|office" zoom-min="16">
<symbol id="information" src=":/POI/information-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="information"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="information"/>
</rule>
</rule>
<rule e="any" k="historic" v="castle" zoom-min="16">
<symbol id="castle" src=":/POI/castle-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="castle"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="castle"/>
</rule>
</rule>
<rule e="any" k="amenity" v="townhall" zoom-min="16">
<symbol id="townhall" src=":/POI/town-hall-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="townhall"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="townhall"/>
</rule>
</rule>
<rule e="any" k="amenity" v="school|university" zoom-min="16">
<rule e="any" k="amenity" v="university|college" zoom-min="16">
<symbol id="university" src=":/POI/college-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="university"/>
</rule>
</rule>
<rule e="any" k="amenity" v="school" zoom-min="16">
<symbol id="school" src=":/POI/school-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="school"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="school"/>
</rule>
</rule>
<rule e="any" k="amenity|building" v="embassy" zoom-min="16">
<symbol id="embassy" src=":/POI/embassy-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="embassy"/>
</rule>
</rule>
<rule e="any" k="leisure" v="stadium" zoom-min="16">
<symbol id="stadium" src=":/POI/stadium-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="stadium"/>
</rule>
</rule>
<rule e="any" k="tourism" v="zoo" zoom-min="16">
<symbol id="zoo" src=":/POI/zoo-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="zoo"/>
</rule>
</rule>
<rule e="any" k="leisure" v="park" zoom-min="16">
<rule e="any" k="name" v="*">
<symbol id="park" src=":/POI/park-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="park"/>
</rule>
</rule>
</rule>
<rule e="any" k="leisure" v="garden" zoom-min="16">
<rule e="any" k="name" v="*">
<symbol id="garden" src=":/POI/garden-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="garden"/>
</rule>
</rule>
</rule>
<rule e="any" k="sport" v="swimming" zoom-min="16">
<symbol id="swimming" src=":/POI/swimming-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="swimming"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="swimming"/>
</rule>
</rule>
<rule e="any" k="sport" v="golf" zoom-min="16">
<rule e="any" k="sport|leisure" v="golf|golf_course" zoom-min="17">
<symbol id="golf" src=":/POI/golf-11.svg" symbol-width="11"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="golf"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="golf"/>
</rule>
<rule e="any" k="sport" v="soccer" zoom-min="16">
<rule e="any" k="sport" v="soccer" zoom-min="17">
<symbol id="soccer" src=":/POI/soccer-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="soccer"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="soccer"/>
</rule>
</rule>
<rule e="any" k="sport" v="tennis" zoom-min="16">
<rule e="any" k="sport" v="tennis" zoom-min="17">
<symbol id="tennis" src=":/POI/tennis-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="tennis"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="tennis"/>
</rule>
</rule>
<rule e="any" k="sport" v="skateboard" zoom-min="16">
<rule e="any" k="sport" v="skateboard" zoom-min="17">
<symbol id="skateboard" src=":/POI/skateboard-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="skateboard"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="skateboard"/>
</rule>
</rule>
<rule e="any" k="sport" v="baseball" zoom-min="17">
<symbol id="baseball" src=":/POI/baseball-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="baseball"/>
</rule>
</rule>
<rule e="any" k="sport" v="basketball" zoom-min="17">
<symbol id="basketball" src=":/POI/basketball-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="basketball"/>
</rule>
</rule>
<rule e="any" k="sport" v="volleyball" zoom-min="17">
<symbol id="volleyball" src=":/POI/volleyball-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="volleyball"/>
</rule>
</rule>
<rule e="any" k="sport" v="equestrian" zoom-min="17">
<symbol id="equestrian" src=":/POI/horse-riding-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="equestrian"/>
</rule>
</rule>
<rule e="any" k="sport" v="cricket" zoom-min="17">
<symbol id="cricket" src=":/POI/cricket-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="cricket"/>
</rule>
</rule>
<rule e="any" k="amenity" v="restaurant" zoom-min="16">
<rule e="any" k="amenity" v="restaurant" zoom-min="17">
<symbol id="restaurant" src=":/POI/restaurant-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="restaurant"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="restaurant"/>
</rule>
</rule>
<rule e="any" k="amenity" v="fast_food" zoom-min="16">
<rule e="any" k="amenity" v="fast_food" zoom-min="17">
<symbol id="fast-food" src=":/POI/fast-food-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="fast-food"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="fast-food"/>
</rule>
</rule>
<rule e="any" k="amenity" v="cafe" zoom-min="16">
<rule e="any" k="amenity" v="cafe" zoom-min="17">
<symbol id="cafe" src=":/POI/cafe-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="cafe"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="cafe"/>
</rule>
</rule>
<rule e="any" k="amenity" v="bar" zoom-min="17">
<symbol id="bar" src=":/POI/bar-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="bar"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="bar"/>
</rule>
</rule>
<rule e="any" k="amenity" v="pub" zoom-min="16">
<rule e="any" k="amenity" v="pub|biergarten" zoom-min="17">
<symbol id="pub" src=":/POI/beer-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="pub"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="pub"/>
</rule>
</rule>
<rule e="any" k="amenity" v="ice_cream" zoom-min="17">
<symbol id="ice-cream" src=":/POI/ice-cream-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="ice-cream"/>
</rule>
</rule>
<rule e="any" k="shop" v="car|car_repair|car_parts" zoom-min="16">
<symbol id="car-repair" src=":/POI/car-repair-11.svg" symbol-width="11" priority="-5"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="car-repair"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="car-repair"/>
</rule>
<rule e="any" k="shop" v="supermarket" zoom-min="16">
<symbol id="supermarket" src=":/POI/grocery-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="supermarket"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="supermarket"/>
</rule>
</rule>
<rule e="any" k="shop" v="convenience" zoom-min="16">
<rule e="any" k="shop" v="convenience" zoom-min="17">
<symbol id="convenience" src=":/POI/shop-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="convenience"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="convenience"/>
</rule>
</rule>
<rule e="any" k="shop" v="doityourself|hardware" zoom-min="16">
<rule e="any" k="shop" v="doityourself|hardware" zoom-min="17">
<symbol id="hardware" src=":/POI/hardware-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="hardware"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="hardware"/>
</rule>
</rule>
<rule e="any" k="shop" v="bakery" zoom-min="16">
<rule e="any" k="shop" v="bakery" zoom-min="17">
<symbol id="bakery" src=":/POI/bakery-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="bakery"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="bakery"/>
</rule>
</rule>
<rule e="any" k="amenity" v="pharmacy" zoom-min="16">
<symbol id="pharmacy" src=":/POI/pharmacy-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="pharmacy"/>
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="pharmacy"/>
</rule>
</rule>
<rule e="any" k="shop" v="bicycle" zoom-min="16">
<rule e="any" k="shop" v="bicycle" zoom-min="17">
<symbol id="bikeshop" src=":/POI/bicycle-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="bikeshop"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="bikeshop"/>
</rule>
</rule>
<rule e="any" k="shop" v="hairdresser" zoom-min="16">
<rule e="any" k="shop" v="hairdresser" zoom-min="17">
<symbol id="hairdresser" src=":/POI/hairdresser-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="hairdresser"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="hairdresser"/>
</rule>
</rule>
<rule e="any" k="shop" v="beverages|alcohol" zoom-min="16">
<rule e="any" k="shop" v="beverages|alcohol" zoom-min="17">
<symbol id="alcohol" src=":/POI/alcohol-shop-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="1" symbol-id="alcohol"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="alcohol"/>
</rule>
</rule>
<rule e="any" k="shop" v="travel_agency" zoom-min="17">
<symbol id="travel-agency" src=":/POI/beach-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="travel-agency"/>
</rule>
</rule>
<rule e="any" k="shop" v="laundry" zoom-min="17">
<symbol id="laundry" src=":/POI/laundry-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="laundry"/>
</rule>
</rule>
<rule e="any" k="shop" v="butcher" zoom-min="17">
<symbol id="butcher" src=":/POI/slaughterhouse-11.svg" symbol-width="11" priority="-5"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="butcher"/>
</rule>
</rule>
<rule e="any" k="military" v="bunker|bunker_disused" zoom-min="17">
<symbol id="bunker" src=":/symbols/bunker.svg" symbol-width="11" symbol-height="9"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="bunker"/>
</rule>
</rule>
<rule e="any" k="historic" v="wayside_cross|wayside_shrine" zoom-min="17">
<symbol id="wayside-cross" src=":/symbols/cross.svg" symbol-width="6" symbol-height="8"/>
<rule e="any" k="*" v="*" zoom-min="18">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="wayside-cross"/>
</rule>
</rule>
<rule e="any" k="leisure" v="slipway" zoom-min="16">
<symbol id="slipway" src=":/POI/slipway-11.svg" symbol-width="11"/>
<rule e="any" k="*" v="*" zoom-min="17">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" symbol-id="slipway"/>
</rule>
</rule>
<rule e="any" k="power" v="plant" zoom-min="15">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2" priority="1"/>
</rule>
<rule e="any" k="landuse" v="quarry" zoom-min="14">
<caption fill="#000000" font-size="10" font-style="italic" k="name" stroke="#FFFFFF" stroke-width="2"/>
</rule>
<rule e="any" k="emergency" v="phone" zoom-min="16">
<symbol id="phone" src=":/POI/telephone-11.svg" symbol-width="11"/>
</rule>
<rule e="any" k="emergency" v="defibrillator" zoom-min="16">
<symbol id="defibrillator" src=":/POI/defibrillator-11.svg" symbol-width="11"/>
</rule>
</rendertheme>

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else {
TARGET = GPXSee
}
VERSION = 13.29
VERSION = 13.34
QT += core \

View File

@ -6,10 +6,13 @@
<!-- Common map stuff -->
<qresource prefix="/symbols">
<file alias="bunker.svg">icons/map/symbols/bunker.svg</file>
<file alias="cliff.svg">icons/map/symbols/cliff.svg</file>
<file alias="cross.svg">icons/map/symbols/cross.svg</file>
<file alias="exit.svg">icons/map/symbols/exit.svg</file>
<file alias="flow.svg">icons/map/symbols/flow.svg</file>
<file alias="oneway.svg">icons/map/symbols/oneway.svg</file>
<file alias="saddle.svg">icons/map/symbols/saddle.svg</file>
</qresource>
<!-- POIs (IMG, Mapsforge & ENC style) -->
@ -22,6 +25,8 @@
<file alias="bank-11.svg">icons/map/POI/bank-11.svg</file>
<file alias="bar-11.svg">icons/map/POI/bar-11.svg</file>
<file alias="barrier-11.svg">icons/map/POI/barrier-11.svg</file>
<file alias="baseball-11.svg">icons/map/POI/baseball-11.svg</file>
<file alias="basketball-11.svg">icons/map/POI/basketball-11.svg</file>
<file alias="bbq-11.svg">icons/map/POI/bbq-11.svg</file>
<file alias="beach-11.svg">icons/map/POI/beach-11.svg</file>
<file alias="beer-11.svg">icons/map/POI/beer-11.svg</file>
@ -40,13 +45,18 @@
<file alias="cemetery-11.svg">icons/map/POI/cemetery-11.svg</file>
<file alias="cinema-11.svg">icons/map/POI/cinema-11.svg</file>
<file alias="clothing-store-11.svg">icons/map/POI/clothing-store-11.svg</file>
<file alias="college-11.svg">icons/map/POI/college-11.svg</file>
<file alias="communications-tower-11.svg">icons/map/POI/communications-tower-11.svg</file>
<file alias="convenience-11.svg">icons/map/POI/convenience-11.svg</file>
<file alias="cricket-11.svg">icons/map/POI/cricket-11.svg</file>
<file alias="cross-11.svg">icons/map/POI/cross-11.svg</file>
<file alias="dam-11.svg">icons/map/POI/dam-11.svg</file>
<file alias="danger-11.svg">icons/map/POI/danger-11.svg</file>
<file alias="defibrillator-11.svg">icons/map/POI/defibrillator-11.svg</file>
<file alias="doctor-11.svg">icons/map/POI/doctor-11.svg</file>
<file alias="drinking-water-11.svg">icons/map/POI/drinking-water-11.svg</file>
<file alias="fast-food-11.svg">icons/map/POI/fast-food-11.svg</file>
<file alias="embassy-11.svg">icons/map/POI/embassy-11.svg</file>
<file alias="entrance-alt1-11.svg">icons/map/POI/entrance-alt1-11.svg</file>
<file alias="ferry-11.svg">icons/map/POI/ferry-11.svg</file>
<file alias="fire-station-11.svg">icons/map/POI/fire-station-11.svg</file>
@ -61,17 +71,24 @@
<file alias="harbor-11.svg">icons/map/POI/harbor-11.svg</file>
<file alias="hardware-11.svg">icons/map/POI/hardware-11.svg</file>
<file alias="heliport-11.svg">icons/map/POI/heliport-11.svg</file>
<file alias="home-11.svg">icons/map/POI/home-11.svg</file>
<file alias="horse-riding-11.svg">icons/map/POI/horse-riding-11.svg</file>
<file alias="hospital-11.svg">icons/map/POI/hospital-11.svg</file>
<file alias="hot-spring.svg">icons/map/POI/hot-spring.svg</file>
<file alias="ice-cream-11.svg">icons/map/POI/ice-cream-11.svg</file>
<file alias="information-11.svg">icons/map/POI/information-11.svg</file>
<file alias="landmark-11.svg">icons/map/POI/landmark-11.svg</file>
<file alias="laundry-11.svg">icons/map/POI/laundry-11.svg</file>
<file alias="library-11.svg">icons/map/POI/library-11.svg</file>
<file alias="lighthouse-11.svg">icons/map/POI/lighthouse-11.svg</file>
<file alias="lodging-11.svg">icons/map/POI/lodging-11.svg</file>
<file alias="monument-11.svg">icons/map/POI/monument-11.svg</file>
<file alias="mountain-11.svg">icons/map/POI/mountain-11.svg</file>
<file alias="museum-11.svg">icons/map/POI/museum-11.svg</file>
<file alias="observation-tower.svg">icons/map/POI/observation-tower.svg</file>
<file alias="park-11.svg">icons/map/POI/park-11.svg</file>
<file alias="parking-11.svg">icons/map/POI/parking-11.svg</file>
<file alias="parking-garage-11.svg">icons/map/POI/parking-garage-11.svg</file>
<file alias="pharmacy-11.svg">icons/map/POI/pharmacy-11.svg</file>
<file alias="picnic-site-11.svg">icons/map/POI/picnic-site-11.svg</file>
<file alias="place-of-worship-11.svg">icons/map/POI/place-of-worship-11.svg</file>
@ -93,19 +110,27 @@
<file alias="shop-11.svg">icons/map/POI/shop-11.svg</file>
<file alias="skateboard-11.svg">icons/map/POI/skateboard-11.svg</file>
<file alias="skiing-11.svg">icons/map/POI/skiing-11.svg</file>
<file alias="slaughterhouse-11.svg">icons/map/POI/slaughterhouse-11.svg</file>
<file alias="slipway-11.svg">icons/map/POI/slipway-11.svg</file>
<file alias="soccer-11.svg">icons/map/POI/soccer-11.svg</file>
<file alias="stadium-11.svg">icons/map/POI/stadium-11.svg</file>
<file alias="swimming-11.svg">icons/map/POI/swimming-11.svg</file>
<file alias="telephone-11.svg">icons/map/POI/telephone-11.svg</file>
<file alias="tennis-11.svg">icons/map/POI/tennis-11.svg</file>
<file alias="theatre-11.svg">icons/map/POI/theatre-11.svg</file>
<file alias="toilet-11.svg">icons/map/POI/toilet-11.svg</file>
<file alias="town-hall-11.svg">icons/map/POI/town-hall-11.svg</file>
<file alias="triangle-11.svg">icons/map/POI/triangle-11.svg</file>
<file alias="triangle-stroked-11.svg">icons/map/POI/triangle-stroked-11.svg</file>
<file alias="viewpoint-11.svg">icons/map/POI/viewpoint-11.svg</file>
<file alias="village-11.svg">icons/map/POI/village-11.svg</file>
<file alias="volcano-11.svg">icons/map/POI/volcano-11.svg</file>
<file alias="volleyball-11.svg">icons/map/POI/volleyball-11.svg</file>
<file alias="water-11.svg">icons/map/POI/water-11.svg</file>
<file alias="waterfall-11.svg">icons/map/POI/waterfall-11.svg</file>
<file alias="watermill-11.svg">icons/map/POI/watermill-11.svg</file>
<file alias="wetland-11.svg">icons/map/POI/wetland-11.svg</file>
<file alias="windmill-11.svg">icons/map/POI/windmill-11.svg</file>
<file alias="zoo-11.svg">icons/map/POI/zoo-11.svg</file>
</qresource>
@ -181,6 +206,7 @@
<file alias="kelp.png">icons/map/marine/kelp.png</file>
<file alias="eddies.png">icons/map/marine/eddies.png</file>
<file alias="dome.png">icons/map/marine/dome.png</file>
<file alias="radar-reflector.png">icons/map/marine/radar-reflector.png</file>
</qresource>
<!-- Patterns (Mapsforge) -->

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="baseball-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M7,3c0,0.5523-0.4477,1-1,1S5,3.5523,5,3s0.4477-1,1-1S7,2.4477,7,3z M9.85,10.24L9.85,10.24l-3-4.85&#xA;&#x9;C6.7391,5.2011,6.5603,5.0616,6.35,5H2.5C2.2239,5,2,5.2239,2,5.5S2.2239,6,2.5,6H5l0.92,1.09l-2.73,3l0,0&#xA;&#x9;C3.0637,10.1876,2.9928,10.3405,3,10.5C3,10.7761,3.2239,11,3.5,11c0.1224-0.0006,0.2401-0.047,0.33-0.13l0,0l3-2.71L9,10.81l0,0&#xA;&#x9;c0.0912,0.1178,0.231,0.1877,0.38,0.19c0.2761,0,0.5-0.2239,0.5-0.5C9.8938,10.4122,9.8834,10.3223,9.85,10.24z M4,0.28&#xA;&#x9;C4,0.1254,3.8746,0,3.72,0C3.6221,0.0262,3.5348,0.0821,3.47,0.16L2,4.59C1.9941,4.6331,1.9941,4.6769,2,4.72&#xA;&#x9;C2,4.8746,2.1254,5,2.28,5c0.1015-0.0243,0.1926-0.0803,0.26-0.16L4,0.41C4.006,0.3669,4.006,0.3231,4,0.28z"/>
</svg>

After

Width:  |  Height:  |  Size: 876 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="basketball-11" xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11">
<path id="icon_concepts:_sports_leisure" d="M2.63,3.51a5.1555,5.1555,0,0,1,.34,1.48H2.04A3.2586,3.2586,0,0,1,2.63,3.51Zm.55-.63a6.2022,6.2022,0,0,1,.55,2.11H5.12V2.01A3.4256,3.4256,0,0,0,3.18,2.88Zm2.7-.87V4.99H7.27a6.2022,6.2022,0,0,1,.55-2.11A3.4256,3.4256,0,0,0,5.88,2.01Zm2.49,1.5a5.1555,5.1555,0,0,0-.34,1.48h.93A3.2586,3.2586,0,0,0,8.37,3.51ZM9.9,6.5a.4952.4952,0,0,1-.49.5H8.44L7.91,8.05v1.7a.2176.2176,0,0,1-.14.2.236.236,0,0,1-.08.02.1987.1987,0,0,1-.16-.07l-.75-.74-1.16.77a.2107.2107,0,0,1-.24,0L4.22,9.16l-.75.74a.2222.2222,0,0,1-.38-.15V8.05L2.57,7H1.6a.5.5,0,1,1,0-1H9.4a.4951.4951,0,0,1,.5.49ZM3.53,8V9.22l.5-.5c.01,0,.01-.01.02-.01L5.1,7H3.06l.45.9A.3561.3561,0,0,1,3.53,8Zm2.97.82-1-1.63-1,1.63,1,.67ZM7.94,7H5.9L6.95,8.71c.01,0,.01.01.02.01l.5.5V8a.3561.3561,0,0,1,.02-.1Z"/>
</svg>

After

Width:  |  Height:  |  Size: 944 B

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="college-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<g>
<path d="M2,7.3c0.3-0.2,0.5-0.5,0.5-0.8c0-0.4-0.2-0.7-0.6-0.9V4.4L5.5,6L11,3.5L5.5,1L0,3.5L1.2,4v1.6&#xA; C0.8,5.8,0.6,6.1,0.6,6.5c0,0.3,0.2,0.6,0.5,0.8L0.6,9c-0.3,1,0.5,1,0.5,1h1c0,0,0.8,0,0.5-1L2,7.3z"/>
<path d="M3.5,6.2c0,0.1,0,0.2,0,0.3c0,0.4-0.2,0.8-0.4,1.1C3.3,8,3.5,8.4,3.5,9v0.6C4,9.8,4.7,10,5.5,10&#xA; C8,10,9,8.5,9,8.5v-3L5.5,7.1L3.5,6.2z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 526 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="cricket-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M6,1c0,0.5523-0.4477,1-1,1S4,1.5523,4,1s0.4477-1,1-1S6,0.4477,6,1z M8.88,5.18l-1-2l0,0l0,0&#xA;&#x9;C7.7859,3.0671,7.647,3.0012,7.5,3H2.77C2.3827,2.9815,2.0467,3.2651,2,3.65l0,0l-1,6.71l0,0c-0.0068,0.0464-0.0068,0.0936,0,0.14&#xA;&#x9;C1,10.7761,1.2239,11,1.5,11c0.2307,0.0129,0.4391-0.1371,0.5-0.36l0,0l1.22-3.89l0,0l0.21-0.83l0.4,0.44l0,0L5,7.6v2.9&#xA;&#x9;C5,10.7761,5.2239,11,5.5,11S6,10.7761,6,10.5v-3l0,0l0,0C5.9971,7.3984,5.9621,7.3004,5.9,7.22l0,0L4.45,5.5L5.5,4h1.71l0.92,1.84&#xA;&#x9;l0,0C8.2247,5.9439,8.3594,6.0022,8.5,6C8.7723,6.0001,8.9946,5.7822,9,5.51C8.9826,5.3931,8.9418,5.2808,8.88,5.18z M10.5,8&#xA;&#x9;C10.2239,8,10,8.2239,10,8.5S10.2239,9,10.5,9S11,8.7761,11,8.5S10.7761,8,10.5,8z M8.69,8V7.25C8.69,7.1119,8.5781,7,8.44,7&#xA;&#x9;S8.19,7.1119,8.19,7.25V8C8.0378,8.0855,7.9426,8.2455,7.94,8.42v2.08c0,0.2761,0.2239,0.5,0.5,0.5s0.5-0.2239,0.5-0.5V8.41&#xA;&#x9;C8.9339,8.2391,8.8392,8.0837,8.69,8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="cross-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M2.2,1.19l3.3,3.3L8.8,1.2C8.9314,1.0663,9.1127,0.9938,9.3,1C9.6761,1.0243,9.9757,1.3239,10,1.7&#xA;&#x9;c0.0018,0.1806-0.0705,0.3541-0.2,0.48L6.49,5.5L9.8,8.82C9.9295,8.9459,10.0018,9.1194,10,9.3C9.9757,9.6761,9.6761,9.9757,9.3,10&#xA;&#x9;c-0.1873,0.0062-0.3686-0.0663-0.5-0.2L5.5,6.51L2.21,9.8c-0.1314,0.1337-0.3127,0.2062-0.5,0.2C1.3265,9.98,1.02,9.6735,1,9.29&#xA;&#x9;C0.9982,9.1094,1.0705,8.9359,1.2,8.81L4.51,5.5L1.19,2.18C1.0641,2.0524,0.9955,1.8792,1,1.7C1.0243,1.3239,1.3239,1.0243,1.7,1&#xA;&#x9;C1.8858,0.9912,2.0669,1.06,2.2,1.19z"/>
</svg>

After

Width:  |  Height:  |  Size: 719 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11" id="defibrillator-11">
<path d="M1.42,4.7955C-0.2131,1.5291,3.9327-.6514,5.512,2.6149,7.0914-.6514,11.2371,1.5291,9.6039,4.7955c-0.0225.0377-.0483,0.0732-0.071,0.1108H8.3867L7.5586,3.252a0.65,0.65,0,0,0-1.1172,0L5,6.1338,4.5586,5.252A0.6243,0.6243,0,0,0,4,4.9063H1.4913C1.4685,4.8687,1.4427,4.8332,1.42,4.7955ZM8,6.1563a0.6243,0.6243,0,0,1-.5586-0.3457L7,4.9287,5.5586,7.8105a0.6241,0.6241,0,0,1-1.1172,0L3.6133,6.1563H2.3006a24.2269,24.2269,0,0,0,2.8973,3.449L5.2134,9.6208A0.44,0.44,0,0,0,5.835,9.6053a24.2289,24.2289,0,0,0,2.8905-3.449H8Z"/>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="embassy-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M5.5,2C4.6014,2.0766,3.7537,2.4494,3.09,3.06C3.0316,3.1262,2.9995,3.2117,3,3.3v3.32&#xA;&#x9;C2.9889,6.8074,3.1318,6.9684,3.3193,6.9796C3.4115,6.985,3.5021,6.9527,3.57,6.89C4.1239,6.4637,4.8011,6.2286,5.5,6.22&#xA;&#x9;C6.61,6.22,6.85,7,8,7c0.6869-0.0671,1.3313-0.3629,1.83-0.84C9.9401,6.0917,10.0051,5.9695,10,5.84V2.37&#xA;&#x9;c0.0309-0.1908-0.0987-0.3705-0.2896-0.4014C9.6387,1.9569,9.5652,1.9679,9.5,2C9.0686,2.3529,8.5507,2.5842,8,2.67&#xA;&#x9;C6.85,2.67,6.65,2,5.5,2z M1.5,1.5c0.5523,0,1,0.4477,1,1s-0.4477,1-1,1s-1-0.4477-1-1S0.9477,1.5,1.5,1.5z M2,4.5v6&#xA;&#x9;C2,10.7761,1.7761,11,1.5,11S1,10.7761,1,10.5v-6C1,4.2239,1.2239,4,1.5,4S2,4.2239,2,4.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 838 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11" id="home-11">
<path d="M10.0015,4.7507c0,0.13807-0.11193,0.25-0.25,0.25H1.25c-0.13807,0-0.25-0.11193-0.25-0.25&#xA;&#x9;c-0.00054-0.07163,0.02839-0.14033,0.08-0.19l4.2378-3.4545l0.016-0.016c0.10112-0.09209,0.2577-0.08493,0.35,0.016l2.3174,1.8892&#xA;&#x9;V1.5c0-0.27614,0.22386-0.5,0.5-0.5s0.5,0.22386,0.5,0.5v2.31l0.92,0.75C9.9731,4.60979,10.00215,4.67878,10.0015,4.7507z M2,9.7514&#xA;&#x9;c-0.00111,0.13696,0.10902,0.24889,0.24598,0.25c0.00001,0,0.00001,0,0.00002,0h2.7547v-2h1v2h2.7526&#xA;&#x9;c0.13697,0,0.248-0.11103,0.248-0.248l0,0l0,0V6.0009H2V9.7514z"/>
</svg>

After

Width:  |  Height:  |  Size: 712 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="horse-riding-11" xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11">
<path d="M4,1A1,1,0,1,1,5,2,1,1,0,0,1,4,1Zm6.88,3.5L9,3V2.5L7,5H6L7,6V7.014a.5.5,0,1,1-1,0V6.5L4,5H3a1,1,0,0,0-.8.446A1.189,1.189,0,0,0,1.247,5,1.076,1.076,0,0,0,0,5.988C0,7.3.635,7.471.635,7.471a.33.33,0,0,0,.115.023A.253.253,0,0,0,1,7.25V6a.49.49,0,0,1,.48-.5H1.5A.5.5,0,0,1,2,6V8.014l-.3.6a1.609,1.609,0,0,0-.2.6v1.542A.244.244,0,0,0,1.744,11,.255.255,0,0,0,2,10.756V9.514a.367.367,0,0,1,.1-.3l.9-1.2V9l.467,1.816A.256.256,0,0,0,3.709,11a.25.25,0,0,0,.25-.25v-.016l-.242-1.61a.6.6,0,0,1,.025-.236L3.8,8.714,4,8H6V9l.466,1.816A.256.256,0,0,0,6.709,11a.25.25,0,0,0,.25-.25L6.718,9.124a.6.6,0,0,1,.025-.236L7,8a.877.877,0,0,0,.934-.661L8.5,4.5a.6.6,0,0,0,.71.454.562.562,0,0,0,.143-.07l.9.116a.721.721,0,0,0,.392.1A.331.331,0,0,0,11,4.784.406.406,0,0,0,10.88,4.5ZM6,3.5A.51.51,0,0,0,5.5,3h-1a.482.482,0,0,0-.5.5V5H6Z"/>
</svg>

After

Width:  |  Height:  |  Size: 972 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="hot-spring" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
<path d="M6.682,5.759c-.505-.725-.781-1.121-.63-2.376,.139-1.156,.678-1.616,1.198-2.059,.404-.345,.797-.68,.981-1.324,.301,.722-.036,1.47-.349,2.164-.311,.691-.599,1.329-.211,1.836,.971,1.271,1.963,2.88,.971,4.586-.214,.393-.539,.681-.861,.968-.422,.375-.841,.747-1.004,1.348-.269-.677,.008-1.366,.285-2.052,.306-.759,.61-1.516,.172-2.251-.203-.34-.389-.607-.551-.84Zm3.371-1.174c-.098-.632,.034-1.281,.368-1.809,.367-.45,.701-.642,.991-.81,.345-.199,.627-.362,.83-.877,.289,.684,0,1.188-.304,1.718-.119,.207-.24,.418-.329,.645-.191,.61,.101,.893,.467,1.247,.358,.346,.786,.76,.899,1.617,.083,.635-.036,1.156-.372,1.684-.356,.436-.681,.655-.965,.846-.356,.24-.648,.437-.856,.965-.292-.688,.031-1.259,.353-1.828,.123-.217,.246-.434,.334-.658,.073-.558-.234-.867-.581-1.217-.357-.36-.757-.763-.834-1.523Zm-8.018,0c-.098-.632,.005-1.3,.368-1.809,.376-.528,.729-.717,1.035-.881,.323-.173,.594-.318,.786-.806,.289,.683-.014,1.208-.325,1.749-.122,.212-.246,.427-.336,.655-.152,.385,.131,1.014,.501,1.242,1.002,.801,1.227,2.286,.547,3.353-.366,.448-.704,.648-.999,.823-.353,.209-.645,.382-.849,.898-.278-.656,.008-1.18,.3-1.714,.131-.24,.263-.481,.345-.737,.179-.557-.134-.884-.51-1.277-.349-.365-.752-.785-.863-1.498Zm10.965,4.414c.7,2.616-3.474,3-5.5,3s-6.2-.484-5.5-3c-.633,.316-1,.961-1,1.5,0,1.519,2.91,2.9,6.5,2.9s6.5-1.381,6.5-2.9c0-.539-.367-1.184-1-1.5Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="ice-cream-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M4,6c0.541,0.0007,1.0676-0.1748,1.5-0.5C5.9324,5.8252,6.459,6.0007,7,6l-1,4.69c-0.1082,0.2541-0.4019,0.3723-0.656,0.264&#xA;&#x9;c-0.1188-0.0506-0.2134-0.1452-0.264-0.264L4,6z M7,2H6.91c0.2826-0.7787-0.1195-1.6391-0.8982-1.9218S4.3726,0.1978,4.09,0.9765&#xA;&#x9;C3.97,1.3071,3.97,1.6694,4.09,2H4C3.1716,2,2.5,2.6716,2.5,3.5S3.1716,5,4,5s1.5-0.6716,1.5-1.5l0,0l0,0l0,0&#xA;&#x9;C5.5,4.3284,6.1716,5,7,5s1.5-0.6716,1.5-1.5S7.8284,2,7,2z"/>
</svg>

After

Width:  |  Height:  |  Size: 615 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="laundry-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path id="path3291" d="M5,0L4,2H2c0,0-1,0-1,1v7c0,0,0,1,1,1h7c1,0,1-1,1-1V1c0-1-1-1-1-1H5z M6,1h3v1H6V1z M5.5,4&#xA;&#x9;C6.8807,4,8,5.1193,8,6.5S6.8807,9,5.5,9S3,7.8807,3,6.5S4.1193,4,5.5,4z"/>
</svg>

After

Width:  |  Height:  |  Size: 360 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15" id="observation-tower">
<path d="M12 12.5H11.5L10 9V7C10.9951 7 10.9951 6.25 10.9951 6.25L11.5 3C11.5 3 11.5 2.5 11 2.5H10C10 2.5 10 2 9.5 2H8.5V1.5C8.5 1.5 8.5 0.5 7.5 0.5C6.5 0.5 6.5 1.5 6.5 1.5V2H5.5C5 2 5 2.5 5 2.5H4C3.5 2.5 3.5 3 3.5 3L4.0049 6.25C4.0049 6.25 4.0049 7 5 7V9L3.5 12.5H3C3 12.5 2 12.5 2 13.25C2 14 3 14 3 14H12C12 14 13 14 13 13.25C13 12.5 12 12.5 12 12.5ZM10.25 3.5L10 5H5L4.75 3.4971L10.25 3.5ZM8.5 7V8H6.5V7H8.5ZM6.5006 9.4971H8.4994L9.5 12.5H5.5L6.5006 9.4971Z"/>
</svg>

After

Width:  |  Height:  |  Size: 618 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="parking-garage-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M7.25,7.44C6.8067,7.7602,6.2657,7.9158,5.72,7.88H4.45V10H3.19V4H5.8c0.5201-0.0279,1.0324,0.1358,1.44,0.46&#xA;&#x9;c0.3847,0.372,0.5828,0.8966,0.54,1.43C7.8557,6.4611,7.6596,7.0348,7.25,7.44z M6.25,5.28c-0.1946-0.1475-0.4365-0.2186-0.68-0.2&#xA;&#x9;H4.45v1.76H5.6c0.246,0.0129,0.4882-0.0654,0.68-0.22c0.1746-0.1813,0.2621-0.4293,0.24-0.68c0.023-0.2449-0.0651-0.4871-0.24-0.66&#xA;&#x9;L6.25,5.28z M10.41,3.28c0.1349-0.2403,0.0499-0.5444-0.19-0.68l-4.5-2.5c-0.1521-0.0855-0.3379-0.0855-0.49,0l-4.5,2.5&#xA;&#x9;C0.4972,2.7485,0.4288,3.0576,0.5773,3.2904C0.7144,3.5054,0.9913,3.5828,1.22,3.47l4.28-2.4l4.26,2.37&#xA;&#x9;c0.2421,0.1328,0.546,0.0442,0.6789-0.1979C10.4392,3.2414,10.4396,3.2407,10.44,3.24L10.41,3.28z"/>
</svg>

After

Width:  |  Height:  |  Size: 899 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="slaughterhouse-11" xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11">
<path d="M11,5.75v.241C11,7,10,6.5,10,6.5H8A3.081,3.081,0,0,1,7,8a2.848,2.848,0,0,1-.416.9.26.26,0,0,0-.05.242l.458,1.55A.227.227,0,0,1,7,10.75a.25.25,0,0,1-.25.25.259.259,0,0,1-.244-.173L6,9V8.5H2.75l-.21.42a.25.25,0,0,0-.02.168L3,10.75a.25.25,0,0,1-.25.25.26.26,0,0,1-.237-.172L2,9V8.5a4.013,4.013,0,0,1-.843-.139,1.383,1.383,0,0,1-.5,1.045.242.242,0,0,0-.094.282l.414.99a.213.213,0,0,1,.011.072.25.25,0,0,1-.25.25.253.253,0,0,1-.228-.148L0,9.5a6.031,6.031,0,0,0,0-2v-2A1.486,1.486,0,0,1,2,4.1s.768.132,1.1.154A2.457,2.457,0,0,0,4,4.087,1.666,1.666,0,0,1,4.5,4a1.648,1.648,0,0,1,.844.257,3.166,3.166,0,0,0,.9.23L7,4.5s.966-.484,1-.5V3.5l.5.5A1.474,1.474,0,0,1,10,3.5.914.914,0,0,0,9,4l1,1,.68.529a.425.425,0,0,1,.07-.029A.238.238,0,0,1,11,5.75Z"/>
</svg>

After

Width:  |  Height:  |  Size: 904 B

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="slipway-11" xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11">
<g id="slipway-final">
<path d="M1.0417,8l8,1.3794V10h-8Zm8-4-1,1v.625L3.7345,4.01l.0777-.2852.86-.8447H5.5a.35.35,0,0,0,0-.6992H4.529a.3478.3478,0,0,0-.2451.1L3.2546,3.291a.3566.3566,0,0,0-.0928.1582l-.0856.3137L1.0417,3C1.0948,4,1,5.5094,3,5.8844,3.9829,6.0687,8.0948,7,8.0948,7l1.9469-2Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 452 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="stadium-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path id="path4177" d="M5,0v3v0.0117&#xA;&#x9;C2.7922,3.1089,1.0876,3.8182,1,4.6816c0,0,0,2.4594,0,3.6816C0.9995,9.2672,3.0143,10,5.5,10s4.5005-0.7328,4.5-1.6367V4.6816&#xA;&#x9;C9.9122,3.8177,8.2093,3.1082,6,3.0117V2.5723L8.5,1.5L5,0z M1.8184,5.752C2.1366,5.9302,2.5373,6.0838,3,6.2051v2.459&#xA;&#x9;C2.2493,8.4283,1.8213,8.0972,1.8184,7.75V5.752z M9.1816,5.7559V7.75C9.1803,8.0979,8.7521,8.4298,8,8.666V6.2031&#xA;&#x9;C8.4614,6.0836,8.862,5.932,9.1816,5.7559z M4,6.3984C4.4815,6.4652,4.9888,6.4995,5.5,6.5C6.0112,6.4995,6.5185,6.4652,7,6.3984&#xA;&#x9;v2.4922C6.5282,8.9624,6.0171,8.9997,5.5,9C4.9829,8.9997,4.4718,8.9624,4,8.8906V6.3984z"/>
</svg>

After

Width:  |  Height:  |  Size: 811 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="triangle-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path id="rect3338" d="M5.5174,1.2315&#xA;&#x9;C5.3163,1.2253,5.1276,1.328,5.024,1.5l-4,6.6598C0.8013,8.5293,1.0679,8.9999,1.5,9h8c0.4321-0.0001,0.6987-0.4707,0.476-0.8402&#xA;&#x9;l-4-6.6598C5.8787,1.3386,5.706,1.2375,5.5174,1.2315z"/>
</svg>

After

Width:  |  Height:  |  Size: 403 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="triangle-stroked-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path id="rect3338" d="M5.5174,1.2315&#xA;&#x9;C5.3163,1.2253,5.1276,1.328,5.024,1.5l-4,6.6598C0.8013,8.5293,1.0679,8.9999,1.5,9h8c0.4321-0.0001,0.6987-0.4707,0.476-0.8402&#xA;&#x9;l-4-6.6598C5.8787,1.3386,5.706,1.2375,5.5174,1.2315z M5.5,2.8627l3.0191,5.0286H2.4809L5.5,2.8627z"/>
</svg>

After

Width:  |  Height:  |  Size: 456 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="volleyball-11" xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11">
<path d="M9.99,5.73a3.6572,3.6572,0,0,1-.1.74A6.3224,6.3224,0,0,0,7.44,5.05a5.9537,5.9537,0,0,0-1.32-.27c-.03,0-.07-.01-.11-.01A4.6052,4.6052,0,0,1,5.5,3.64a1.0563,1.0563,0,0,1-.06-.24h.12a4.8784,4.8784,0,0,1,1.01.11,5.0388,5.0388,0,0,1,1.14.36,4.8341,4.8341,0,0,1,.94.53A5.1356,5.1356,0,0,1,9.99,5.73ZM9.33,7.31a5.1964,5.1964,0,0,0-1.36-.97c-.05.1-.11.19-.17.29a5.8645,5.8645,0,0,1-.59.82,7.1807,7.1807,0,0,1-.78.78,6.72,6.72,0,0,1-.93.65,6.3643,6.3643,0,0,1-1.86.72,4.524,4.524,0,0,0,3.72,0,4.1584,4.1584,0,0,0,1.25-.86,3.1983,3.1983,0,0,0,.43-.47,3.7473,3.7473,0,0,0,.48-.76A1.1915,1.1915,0,0,0,9.33,7.31ZM8.68,2.32a4.5077,4.5077,0,0,0-1.24-.88,3.979,3.979,0,0,0-.75-.28,4.3423,4.3423,0,0,0-1.03-.15,1.2787,1.2787,0,0,0-.32,0A5.3628,5.3628,0,0,0,5.25,2c0,.14.01.28.02.41a1.6165,1.6165,0,0,1,.22-.01,1.9237,1.9237,0,0,1,.24.01,6.6508,6.6508,0,0,1,1,.11,5.6947,5.6947,0,0,1,1,.28,6.7814,6.7814,0,0,1,1.02.47,6.6645,6.6645,0,0,1,.98.69A4.5655,4.5655,0,0,0,8.68,2.32ZM3.03,6.34a5.808,5.808,0,0,1-.4-.92,5.7849,5.7849,0,0,1-.28-1.03,6.86,6.86,0,0,1-.1-1.12V3.25a5.656,5.656,0,0,1,.07-.93A4.3939,4.3939,0,0,0,1.27,3.97,4.3206,4.3206,0,0,0,1,5.5a1.7671,1.7671,0,0,0,.01.23,4.4161,4.4161,0,0,0,.09.73,4.0749,4.0749,0,0,0,.31.91,1.0685,1.0685,0,0,0,.27-.07A5.0679,5.0679,0,0,0,3.2,6.63C3.14,6.53,3.08,6.44,3.03,6.34Zm3.88-.4a5.4992,5.4992,0,0,0-1.35-.19c-.02.03-.04.05-.06.08a6.2466,6.2466,0,0,1-.91,1.01,5.8334,5.8334,0,0,1-.8.61,6.5727,6.5727,0,0,1-1.83.82,3.1983,3.1983,0,0,0,.43.47,5.1724,5.1724,0,0,0,2.18-.51,5.4146,5.4146,0,0,0,.93-.55,5.5958,5.5958,0,0,0,.91-.84A4.8049,4.8049,0,0,0,7,6.01a.0517.0517,0,0,0,.02-.04A.2283.2283,0,0,0,6.91,5.94ZM4.88,4.78a5.6391,5.6391,0,0,1-.45-1.27,6.3861,6.3861,0,0,1-.16-.99c-.01-.17-.02-.35-.02-.52a5.83,5.83,0,0,1,.06-.84,3.9815,3.9815,0,0,0-.75.28A5.5806,5.5806,0,0,0,3.27,2.8c-.01.15-.02.3-.02.45a4.2153,4.2153,0,0,0,.04.62,4.7107,4.7107,0,0,0,.27,1.18,5.0984,5.0984,0,0,0,.42.92A.0517.0517,0,0,0,4,6.01a.1778.1778,0,0,0,.08-.07h.01a5.6817,5.6817,0,0,0,.84-1.06A.3131.3131,0,0,1,4.88,4.78Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="watermill-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M9.9874,4.375C9.9216,2.5436,8.4563,1.0784,6.625,1.0126V1h-0.25v0.0126C5.274,1.0521,4.3123,1.6034,3.7004,2.4301L2.5059,1&#xA;&#x9;L0,4h1v4l1.8-1l1.8,1l1.1202-0.6218C5.2513,7.2512,4.825,7.021,4.4765,6.7003L6.252,4.9247c0.0385,0.0226,0.0788,0.0383,0.123,0.05&#xA;&#x9;v2.0399L6.4014,7L6.625,7.1243V4.9747c0.0442-0.0117,0.0845-0.0274,0.123-0.05l1.7755,1.7755&#xA;&#x9;C8.1429,7.0505,7.6736,7.3016,7.1526,7.4177l0.5937,0.3301C9.0195,7.2596,9.9359,6.0602,9.9874,4.625H10v-0.25H9.9874z&#xA;&#x9; M4.2997,6.5235C3.8347,6.0182,3.5435,5.3568,3.5126,4.625h2.5126c0.0117,0.0442,0.0274,0.0845,0.05,0.123L4.2997,6.5235z&#xA;&#x9; M6.0253,4.375H3.5126c0.0308-0.7318,0.3221-1.3932,0.7871-1.8985L6.0753,4.252C6.0527,4.2905,6.037,4.3308,6.0253,4.375z&#xA;&#x9; M6.375,4.0253c-0.0442,0.0117-0.0845,0.0274-0.123,0.05L4.4765,2.2997c0.5053-0.465,1.1667-0.7563,1.8985-0.7871V4.0253z&#xA;&#x9; M6.625,4.0253V1.5126c0.7318,0.0308,1.3932,0.3221,1.8985,0.7871L6.748,4.0753C6.7095,4.0527,6.6692,4.037,6.625,4.0253z&#xA;&#x9; M8.7003,6.5235L6.9247,4.748c0.0226-0.0385,0.0383-0.0788,0.05-0.123h2.5126C9.4565,5.3568,9.1653,6.0182,8.7003,6.5235z&#xA;&#x9; M6.9747,4.375c-0.0117-0.0442-0.0274-0.0845-0.05-0.123l1.7755-1.7755c0.465,0.5053,0.7563,1.1667,0.7871,1.8985H6.9747z M6.4014,8&#xA;&#x9;L4.6,9L3.808,8.56l0,0L2.8,8L1.792,8.56l0,0L1,9v1l1.8-1l1.8,1l1.8014-1L8.2,10L10,9V8L8.2,9L6.4014,8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="windmill-11" xmlns="http://www.w3.org/2000/svg" width="11px" height="11px" viewBox="0 0 11 11">
<path d="M6.375,3.9375L5.9375,3.5L6.375,3.0625h0.4375L9,0.875L8.125,0L5.9375,2.1875V2.625L5.5,3.0625L5.0625,2.625V2.1875L2.875,0&#xA;&#x9;L2,0.875l2.1875,2.1875H4.625L5.0625,3.5L4.625,3.9375H4.1875L2,6.125L2.875,7l2.1875-2.1875V4.375L5.5,3.9375L5.9375,4.375v0.4375&#xA;&#x9;L8.125,7L9,6.125L6.8125,3.9375H6.375z M8.5,10H8L7,7.5L5.5,6L4,7.5L3,10H2.5C2.2239,10,2,10.2238,2,10.5&#xA;&#x9;C2,10.7761,2.2239,11,2.5,11h6C8.7761,11,9,10.7761,9,10.5C9,10.2238,8.7761,10,8.5,10z M6,9.9717C6,9.9873,5.9874,10,5.9717,10&#xA;&#x9;H5.0283C5.0126,10,5,9.9873,5,9.9717v-0.972C5,8.7238,5.2238,8.5,5.4998,8.5C5.7761,8.5,6,8.7239,6,9.0002V9.9717z"/>
</svg>

After

Width:  |  Height:  |  Size: 798 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="7" height="7" version="1.1" viewBox="0 0 7 7">
<rect x="0" y="0" width="100%" height="100%" fill="#dee9bc"/>
<rect x="0" y="0" width="7" height="7" fill="#dee9bc"/>
<circle cx="3" cy="3" r="1.5" stroke="#c9d69c" stroke-width="1" fill="none"/>
</svg>

Before

Width:  |  Height:  |  Size: 247 B

After

Width:  |  Height:  |  Size: 241 B

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="7" height="8" version="1.1" viewBox="0 0 7 8">
<rect x="0" y="0" width="100%" height="100%" fill="#dee9bc"/>
<rect x="0" y="0" width="7" height="8" fill="#dee9bc"/>
<path d="M 3,2 L 3,6" stroke="#c9d69c" stroke-width="1"/>
</svg>

Before

Width:  |  Height:  |  Size: 227 B

After

Width:  |  Height:  |  Size: 221 B

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 11 9" height="9" width="11" version="1.1">
<g stroke-width="1.5" stroke="#000000" fill="none">
<rect x="2" y="2" width="7" height="5"/>
<line x1="0" y1="0" x2="2" y2="2"/>
<line x1="11" y1="0" x2="9" y2="2"/>
<line x1="0" y1="9" x2="2" y2="7"/>
<line x1="11" y1="9" x2="9" y2="7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 363 B

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 4 5" height="5" width="4" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<g>
<path d="M 0.5,0 V 5" stroke-width="1.0" stroke="#666666"/>
<path d="M 0,0.5 H 4" stroke-width="1.0" stroke="#666666"/>
</g>
<svg viewBox="0 0 4 5" height="5" width="4" version="1.1">
<g stroke-width="1.0" stroke="#666666">
<path d="M 0.5,0 V 5"/>
<path d="M 0,0.5 H 4"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 320 B

After

Width:  |  Height:  |  Size: 204 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="6" height="8" version="1.1" viewBox="0 0 6 8">
<path d="M 0.5,3 L 5.5,3 M 3,0.5 L 3,7.5" stroke="#000000" stroke-width="1"/>
</svg>

After

Width:  |  Height:  |  Size: 184 B

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="15" height="11" viewBox="0 0 15 11" version="1.1">
<g>
<path style="stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 15.007812 0.132812 C 15.007812 0.230469 15.007812 0.324219 15.007812 0.421875 C 14.570312 1.402344 14.0625 2.710938 13.589844 3.875 C 13.480469 4.140625 13.316406 4.886719 12.96875 4.859375 C 12.683594 4.835938 12.535156 4.089844 12.445312 3.8125 C 12.292969 3.339844 12.210938 3.003906 12.074219 2.605469 C 10.507812 3.261719 9.367188 4.308594 9.421875 6.476562 C 9.460938 8.195312 10.074219 9.632812 10.441406 11.007812 C 8.917969 11.007812 7.394531 11.007812 5.871094 11.007812 C 5.730469 7.347656 5.59375 3.683594 5.46875 0.0078125 C 5.996094 0.0078125 6.519531 0.0078125 7.042969 0.0078125 C 7.40625 1.230469 7.800781 2.421875 8.15625 3.652344 C 8.941406 2.871094 10.023438 2.042969 11.335938 1.65625 C 11.128906 1.378906 10.828125 1.179688 10.5625 0.957031 C 10.320312 0.757812 9.9375 0.570312 9.945312 0.132812 C 10.007812 0.113281 10.015625 0.0390625 10.070312 0.0078125 C 11.675781 0.0078125 13.28125 0.0078125 14.882812 0.0078125 C 14.898438 0.046875 14.921875 0.0742188 14.976562 0.0703125 C 14.972656 0.109375 14.984375 0.128906 15.007812 0.132812 Z M 15.007812 0.132812 "/>
<path style="stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 3.433594 0.0078125 C 3.957031 0.0078125 4.484375 0.0078125 5.007812 0.0078125 C 4.867188 3.667969 4.730469 7.332031 4.605469 11.007812 C 3.074219 11.007812 1.539062 11.007812 0.0078125 11.007812 C 0.0078125 10.976562 0.0078125 10.945312 0.0078125 10.914062 C 1.171875 7.300781 2.277344 3.628906 3.433594 0.0078125 Z M 3.433594 0.0078125 "/>
</g>
<svg width="15" height="11" viewBox="0 0 15 11" version="1.1">
<g stroke="none" fill="#000000">
<path d="M 15.007812 0.132812 C 15.007812 0.230469 15.007812 0.324219 15.007812 0.421875 C 14.570312 1.402344 14.0625 2.710938 13.589844 3.875 C 13.480469 4.140625 13.316406 4.886719 12.96875 4.859375 C 12.683594 4.835938 12.535156 4.089844 12.445312 3.8125 C 12.292969 3.339844 12.210938 3.003906 12.074219 2.605469 C 10.507812 3.261719 9.367188 4.308594 9.421875 6.476562 C 9.460938 8.195312 10.074219 9.632812 10.441406 11.007812 C 8.917969 11.007812 7.394531 11.007812 5.871094 11.007812 C 5.730469 7.347656 5.59375 3.683594 5.46875 0.0078125 C 5.996094 0.0078125 6.519531 0.0078125 7.042969 0.0078125 C 7.40625 1.230469 7.800781 2.421875 8.15625 3.652344 C 8.941406 2.871094 10.023438 2.042969 11.335938 1.65625 C 11.128906 1.378906 10.828125 1.179688 10.5625 0.957031 C 10.320312 0.757812 9.9375 0.570312 9.945312 0.132812 C 10.007812 0.113281 10.015625 0.0390625 10.070312 0.0078125 C 11.675781 0.0078125 13.28125 0.0078125 14.882812 0.0078125 C 14.898438 0.046875 14.921875 0.0742188 14.976562 0.0703125 C 14.972656 0.109375 14.984375 0.128906 15.007812 0.132812 Z M 15.007812 0.132812"/>
<path d="M 3.433594 0.0078125 C 3.957031 0.0078125 4.484375 0.0078125 5.007812 0.0078125 C 4.867188 3.667969 4.730469 7.332031 4.605469 11.007812 C 3.074219 11.007812 1.539062 11.007812 0.0078125 11.007812 C 0.0078125 10.976562 0.0078125 10.945312 0.0078125 10.914062 C 1.171875 7.300781 2.277344 3.628906 3.433594 0.0078125 Z M 3.433594 0.0078125"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 9 11" height="11" width="9" version="1.1">
<g stroke-width="1" stroke="#000000" fill="none">
<path d="M 1.5,1.5 L3,3 L 3,8 L 1.5,9.5"/>
<path d="M 7.5,1.5 L6,3 L 6,8 L 7.5,9.5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 254 B

View File

@ -172,7 +172,7 @@
<message>
<location filename="../src/data/data.cpp" line="180"/>
<source>GPSDump files</source>
<translation type="unfinished"></translation>
<translation>GPSDump-filer</translation>
</message>
<message>
<location filename="../src/data/data.cpp" line="181"/>
@ -414,7 +414,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="276"/>
<source>Clear list</source>
<translation type="unfinished"></translation>
<translation>Ryd liste</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="288"/>
@ -486,17 +486,17 @@
<message>
<location filename="../src/GUI/gui.cpp" line="370"/>
<source>All</source>
<translation type="unfinished"></translation>
<translation>Alle</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="374"/>
<source>Raster only</source>
<translation type="unfinished"></translation>
<translation>Kun raster</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="378"/>
<source>Vector only</source>
<translation type="unfinished"></translation>
<translation>Kun vektor</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="385"/>
@ -591,7 +591,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="490"/>
<source>Show hillshading</source>
<translation type="unfinished"></translation>
<translation>Vis terrænskygge</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="498"/>
@ -713,7 +713,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="664"/>
<source>Open recent</source>
<translation type="unfinished"></translation>
<translation>Åbn seneste</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="689"/>
@ -723,7 +723,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="695"/>
<source>Layers</source>
<translation type="unfinished"></translation>
<translation>Lag</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="704"/>
@ -772,9 +772,9 @@
<message numerus="yes">
<location filename="../src/GUI/gui.cpp" line="2001"/>
<source>Download %n DEM tiles?</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<translation>
<numerusform>Download %n DEM-flise?</numerusform>
<numerusform>Download %n DEM-fliser?</numerusform>
</translation>
</message>
<message>
@ -785,12 +785,12 @@
<message>
<location filename="../src/GUI/gui.cpp" line="476"/>
<source>Download data DEM</source>
<translation type="unfinished"></translation>
<translation>Download data-DEM</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="482"/>
<source>Download map DEM</source>
<translation type="unfinished"></translation>
<translation>Download kort-DEM</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="721"/>
@ -1053,7 +1053,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="1998"/>
<source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source>
<translation type="unfinished"></translation>
<translation>Downloadgrænsen for DEM-fliser er overskredet. Hvis du virkelig har brug for data for stort et område, skal du downloade filerne manuelt.</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="2014"/>
@ -1790,7 +1790,7 @@
<location filename="../src/GUI/optionsdialog.cpp" line="273"/>
<location filename="../src/GUI/optionsdialog.cpp" line="639"/>
<source>px</source>
<translation type="unfinished">px</translation>
<translation>px</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="309"/>
@ -1810,7 +1810,7 @@
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="388"/>
<source>Detect pauses</source>
<translation type="unfinished"></translation>
<translation>Registrer pauser</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="392"/>
@ -1821,7 +1821,7 @@
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="537"/>
<source>Detection:</source>
<translation type="unfinished"></translation>
<translation>Registrering:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="564"/>
@ -1865,27 +1865,27 @@
<location filename="../src/GUI/optionsdialog.cpp" line="314"/>
<location filename="../src/GUI/optionsdialog.cpp" line="655"/>
<source>Opacity:</source>
<translation type="unfinished"></translation>
<translation>Gennemsigtighed:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="657"/>
<source>Blur radius:</source>
<translation type="unfinished"></translation>
<translation>Sløringsradius:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="659"/>
<source>Azimuth:</source>
<translation type="unfinished"></translation>
<translation>Azimut:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="660"/>
<source>Altitude:</source>
<translation type="unfinished"></translation>
<translation>Højde:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="661"/>
<source>Z Factor:</source>
<translation type="unfinished"></translation>
<translation>Z-faktor:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="666"/>
@ -1896,7 +1896,7 @@
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="667"/>
<source>Hillshading</source>
<translation type="unfinished"></translation>
<translation>Terrænskygge</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="687"/>
@ -1917,7 +1917,7 @@
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="656"/>
<source>Lightening:</source>
<translation type="unfinished"></translation>
<translation>Belysning:</translation>
</message>
<message>
<location filename="../src/GUI/optionsdialog.cpp" line="713"/>
@ -2325,7 +2325,7 @@
<message>
<location filename="../src/GUI/routeitem.cpp" line="38"/>
<source>File</source>
<translation type="unfinished">Fil</translation>
<translation>Fil</translation>
</message>
</context>
<context>
@ -2591,7 +2591,7 @@
<message>
<location filename="../src/GUI/trackitem.cpp" line="46"/>
<source>File</source>
<translation type="unfinished">Fil</translation>
<translation>Fil</translation>
</message>
</context>
<context>

View File

@ -587,7 +587,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="487"/>
<source>Show local DEM tiles</source>
<translation type="unfinished"></translation>
<translation>Näytä paikalliset DEM-laatat</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="490"/>
@ -699,7 +699,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="695"/>
<source>Layers</source>
<translation type="unfinished"></translation>
<translation>Kerrokset</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="721"/>
@ -850,12 +850,12 @@
<message>
<location filename="../src/GUI/gui.cpp" line="1998"/>
<source>DEM tiles download limit exceeded. If you really need data for such a huge area, download the files manually.</source>
<translation type="unfinished"></translation>
<translation>DEM-laattojen latausraja ylitetty. Jos todella tarvitset tietoja niin suurelta alueelta, lataa tiedostot manuaalisesti.</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="2014"/>
<source>Could not download all required DEM files.</source>
<translation type="unfinished"></translation>
<translation>Kaikkia vaadittuja DEM-tiedostoja ei voitu ladata.</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="2048"/>
@ -898,12 +898,12 @@
<message>
<location filename="../src/GUI/gui.cpp" line="476"/>
<source>Download data DEM</source>
<translation type="unfinished"></translation>
<translation>Lataa data-DEM</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="482"/>
<source>Download map DEM</source>
<translation type="unfinished"></translation>
<translation>Lataa kartta-DEM</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="762"/>
@ -961,7 +961,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="1978"/>
<source>Clear &quot;%1&quot; tile cache?</source>
<translation type="unfinished"></translation>
<translation>Tyhjennetäänkö &quot;%1&quot; ruutuvälimuisti?</translation>
</message>
<message numerus="yes">
<location filename="../src/GUI/gui.cpp" line="2001"/>

View File

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

View File

@ -6,31 +6,23 @@ bool AtlasData::pointCb(MapEntry *map, void *context)
{
PointCTX *ctx = (PointCTX*)context;
start:
map->lock.lock();
ctx->cacheLock.lock();
MapData *cached = ctx->cache.object(map->path);
if (!cached) {
ctx->cacheLock.unlock();
if (map->lock.tryLock()) {
MapData *data = new MapData(map->path);
data->points(ctx->rect, ctx->points);
MapData *data = new MapData(map->path);
data->points(ctx->rect, ctx->points);
ctx->cacheLock.lock();
ctx->cache.insert(map->path, data);
map->lock.unlock();
} else {
map->lock.lock();
map->lock.unlock();
goto start;
}
ctx->cacheLock.lock();
ctx->cache.insert(map->path, data);
} else
cached->points(ctx->rect, ctx->points);
ctx->cacheLock.unlock();
map->lock.unlock();
return true;
}
@ -39,34 +31,26 @@ bool AtlasData::polyCb(MapEntry *map, void *context)
{
PolyCTX *ctx = (PolyCTX*)context;
start:
map->lock.lock();
ctx->cacheLock.lock();
MapData *cached = ctx->cache.object(map->path);
if (!cached) {
ctx->cacheLock.unlock();
if (map->lock.tryLock()) {
MapData *data = new MapData(map->path);
data->polygons(ctx->rect, ctx->polygons);
data->lines(ctx->rect, ctx->lines);
MapData *data = new MapData(map->path);
data->polygons(ctx->rect, ctx->polygons);
data->lines(ctx->rect, ctx->lines);
ctx->cacheLock.lock();
ctx->cache.insert(map->path, data);
map->lock.unlock();
} else {
map->lock.lock();
map->lock.unlock();
goto start;
}
ctx->cacheLock.lock();
ctx->cache.insert(map->path, data);
} else {
cached->polygons(ctx->rect, ctx->polygons);
cached->lines(ctx->rect, ctx->lines);
}
ctx->cacheLock.unlock();
map->lock.unlock();
return true;
}

View File

@ -63,16 +63,17 @@ static QMap<uint,uint> orderMapInit()
map.insert(TYPE(PILPNT), 34);
map.insert(TYPE(ACHBRT), 35);
map.insert(TYPE(I_ACHBRT), 35);
map.insert(TYPE(CRANES), 36);
map.insert(TYPE(I_CRANES), 36);
map.insert(TYPE(I_WTWGAG), 37);
map.insert(TYPE(PYLONS), 38);
map.insert(TYPE(SLCONS), 39);
map.insert(TYPE(LNDMRK), 40);
map.insert(TYPE(SILTNK), 41);
map.insert(TYPE(LNDELV), 42);
map.insert(TYPE(SMCFAC), 43);
map.insert(TYPE(BUISGL), 44);
map.insert(TYPE(RADRFL), 36);
map.insert(TYPE(CRANES), 37);
map.insert(TYPE(I_CRANES), 37);
map.insert(TYPE(I_WTWGAG), 38);
map.insert(TYPE(PYLONS), 39);
map.insert(TYPE(SLCONS), 40);
map.insert(TYPE(LNDMRK), 41);
map.insert(TYPE(SILTNK), 42);
map.insert(TYPE(LNDELV), 43);
map.insert(TYPE(SMCFAC), 44);
map.insert(TYPE(BUISGL), 45);
map.insert(TYPE(I_DISMAR), 0xFFFFFFFE);
map.insert(TYPE(SOUNDG), 0xFFFFFFFF);
@ -285,7 +286,8 @@ MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
else
_label += "\n(" + QString::fromLatin1(params.at(0))
+ "\xE2\x80\x89m)";
}
} else if ((type == TYPE(TSSLPT) || type == TYPE(RCTLPT)) && params.size())
_param = QVariant(params.at(0).toDouble());
}
MapData::Poly::Poly(uint type, const Polygon &path, const QString &label,
@ -293,7 +295,7 @@ MapData::Poly::Poly(uint type, const Polygon &path, const QString &label,
{
if (type == TYPE(DEPARE) && params.size())
_type = SUBTYPE(DEPARE, depthLevel(params.at(0)));
else if (type == TYPE(TSSLPT) && params.size())
else if ((type == TYPE(TSSLPT) || type == TYPE(RCTLPT)) && params.size())
_param = QVariant(params.at(0).toDouble());
else if ((type == TYPE(BRIDGE) || type == TYPE(I_BRIDGE))
&& params.size()) {
@ -595,7 +597,9 @@ MapData::Attr MapData::pointAttr(const ISO8211::Record &r, uint OBJL)
|| (OBJL == RDOCAL && key == ORIENT)
|| (OBJL == I_RDOCAL && key == ORIENT)
|| (OBJL == CURENT && key == ORIENT)
|| (OBJL == LNDELV && key == ELEVAT))
|| (OBJL == LNDELV && key == ELEVAT)
|| (OBJL == TSSLPT && key == ORIENT)
|| (OBJL == RCTLPT && key == ORIENT))
params[0] = av.at(1).toByteArray();
if ((OBJL == I_RDOCAL && key == COMCHA)
|| (OBJL == RDOCAL && key == COMCHA)
@ -668,6 +672,7 @@ MapData::Attr MapData::polyAttr(const ISO8211::Record &r, uint OBJL)
}
if ((OBJL == TSSLPT && key == ORIENT)
|| (OBJL == RCTLPT && key == ORIENT)
|| (OBJL == DEPARE && key == DRVAL1))
params[0] = av.at(1).toByteArray();
if ((OBJL == BRIDGE && key == VERCLR)

View File

@ -67,6 +67,7 @@
#define PONTON 95
#define PRCARE 96
#define PYLONS 98
#define RADRFL 101
#define RADSTA 102
#define RTPBCN 103
#define RDOCAL 104
@ -74,6 +75,7 @@
#define RAILWY 106
#define RCRTCL 108
#define RECTRC 109
#define RCTLPT 110
#define RSCSTA 111
#define RESARE 112
#define RIVERS 114

View File

@ -150,19 +150,42 @@ QPolygonF RasterTile::tsslptArrow(const QPointF &p, qreal angle) const
return polygon;
}
static void drawArrow(QPainter *painter, const QPolygonF &polygon, uint type)
{
if (type>>16 == RCTLPT) {
painter->setPen(QPen(tsslptPen, 1, Qt::DashLine));
painter->setBrush(Qt::NoBrush);
} else {
painter->setPen(QPen(tsslptPen, 1));
painter->setBrush(QBrush(tsslptBrush));
}
painter->drawPolygon(polygon);
}
void RasterTile::drawArrows(QPainter *painter,
const QList<MapData::Poly> &polygons)
{
for (int i = 0; i < polygons.size(); i++) {
const MapData::Poly &poly = polygons.at(i);
if (poly.type()>>16 == TSSLPT) {
if (poly.type()>>16 == TSSLPT || poly.type()>>16 == RCTLPT) {
QPolygonF polygon(tsslptArrow(centroid(poly.path().first()),
deg2rad(poly.param().toDouble())));
drawArrow(painter, polygon, poly.type());
}
}
}
painter->setPen(QPen(tsslptPen, 1));
painter->setBrush(QBrush(tsslptBrush));
painter->drawPolygon(polygon);
void RasterTile::drawArrows(QPainter *painter,
const QList<MapData::Point> &points)
{
for (int i = 0; i < points.size(); i++) {
const MapData::Point &point = points.at(i);
if (point.type()>>16 == TSSLPT || point.type()>>16 == RCTLPT) {
QPolygonF polygon(tsslptArrow(ll2xy(point.pos()),
deg2rad(point.param().toDouble())));
drawArrow(painter, polygon, point.type());
}
}
}
@ -220,8 +243,13 @@ void RasterTile::drawLines(QPainter *painter, const QList<MapData::Line> &lines)
void RasterTile::drawTextItems(QPainter *painter,
const QList<TextItem*> &textItems)
{
for (int i = 0; i < textItems.size(); i++)
textItems.at(i)->paint(painter);
QRectF rect(_rect);
for (int i = 0; i < textItems.size(); i++) {
const TextItem *ti = textItems.at(i);
if (rect.intersects(ti->boundingRect()))
ti->paint(painter);
}
}
void RasterTile::processPolygons(const QList<MapData::Poly> &polygons,
@ -395,6 +423,7 @@ void RasterTile::render()
drawPolygons(&painter, polygons);
drawLines(&painter, lines);
drawArrows(&painter, polygons);
drawArrows(&painter, points);
drawTextItems(&painter, lights);
drawTextItems(&painter, textItems);

View File

@ -52,6 +52,7 @@ private:
void drawBitmapPath(QPainter *painter, const QImage &img,
const Polygon &polygon);
void drawArrows(QPainter *painter, const QList<MapData::Poly> &polygons);
void drawArrows(QPainter *painter, const QList<MapData::Point> &points);
void drawPolygons(QPainter *painter, const QList<MapData::Poly> &polygons);
void drawLines(QPainter *painter, const QList<MapData::Line> &lines);
void drawTextItems(QPainter *painter, const QList<TextItem*> &textItems);

View File

@ -335,6 +335,7 @@ void Style::pointStyle(qreal ratio)
_points[SUBTYPE(WEDKLP, 0)] = Point(QImage(":/marine/kelp.png"));
_points[SUBTYPE(WEDKLP, 1)] = Point(QImage(":/marine/kelp.png"));
_points[TYPE(SEAARE)].setHaloColor(QColor());
_points[TYPE(RADRFL)] = Point(QImage(":/marine/radar-reflector.png"));
_points[SUBTYPE(SMCFAC, 7)] = Point(svg2img(":/POI/restaurant-11.svg",
ratio), Small);

View File

@ -146,7 +146,7 @@ int DEMFile::level(const Zoom &zoom) const
}
MapData::Elevation *DEMFile::elevations(Handle &hdl, int level,
const DEMTile *tile)
const DEMTile *tile) const
{
const Level &l = _levels.at(level);
MapData::Elevation *ele = new MapData::Elevation();

View File

@ -16,7 +16,8 @@ public:
bool load(Handle &hdl);
void clear();
MapData::Elevation *elevations(Handle &hdl, int level, const DEMTile *tile);
MapData::Elevation *elevations(Handle &hdl, int level,
const DEMTile *tile) const;
int level(const Zoom &zoom) const;
QList<const DEMTile *> tiles(const RectC &rect, int level) const;
@ -44,7 +45,7 @@ private:
QList<DEMTile> tiles;
};
qint16 meters(qint16 val)
qint16 meters(qint16 val) const
{
return (_flags & 1) ? (qint16)qRound(val * 0.3048) : val;
}

View File

@ -92,7 +92,7 @@ bool GMAPData::loadTile(const QDir &dir)
}
}
if (!tile->init()) {
if (!tile->init(0)) {
qWarning("%s: Invalid map tile", qPrintable(dir.path()));
delete tile;
return false;

View File

@ -29,11 +29,11 @@ static SubFile::Type tileType(const char str[3])
return SubFile::Unknown;
}
bool IMGData::readSubFileBlocks(QFile &file, quint64 offset, SubFile *subFile)
bool IMGData::readSubFileBlocks(QFile *file, quint64 offset, SubFile *subFile)
{
quint16 block;
if (!file.seek(offset + 0x20))
if (!file->seek(offset + 0x20))
return false;
for (int i = 0; i < 240; i++) {
if (!readValue(file, block))
@ -46,11 +46,11 @@ bool IMGData::readSubFileBlocks(QFile &file, quint64 offset, SubFile *subFile)
return true;
}
bool IMGData::readIMGHeader(QFile &file)
bool IMGData::readIMGHeader(QFile *file)
{
char signature[7], identifier[7];
if (!(file.read((char*)&_key, 1) && file.seek(0x10)
&& read(file, signature, sizeof(signature)) && file.seek(0x41)
if (!(file->read((char*)&_key, 1) && file->seek(0x10)
&& read(file, signature, sizeof(signature)) && file->seek(0x41)
&& read(file, identifier, sizeof(identifier)))
|| memcmp(signature, "DSKIMG", sizeof(signature))
|| memcmp(identifier, "GARMIN", sizeof(identifier))) {
@ -60,8 +60,8 @@ bool IMGData::readIMGHeader(QFile &file)
char d1[20], d2[31];
quint8 e1, e2;
if (!(file.seek(0x49) && read(file, d1, sizeof(d1)) && file.seek(0x61)
&& readValue(file, e1) && readValue(file, e2) && file.seek(0x65)
if (!(file->seek(0x49) && read(file, d1, sizeof(d1)) && file->seek(0x61)
&& readValue(file, e1) && readValue(file, e2) && file->seek(0x65)
&& read(file, d2, sizeof(d2)))) {
_errorString = "Error reading IMG header";
return false;
@ -74,7 +74,7 @@ bool IMGData::readIMGHeader(QFile &file)
return true;
}
bool IMGData::readFAT(QFile &file, TileMap &tileMap)
bool IMGData::readFAT(QFile *file, TileMap &tileMap)
{
QByteArray typFile;
quint8 flag;
@ -82,7 +82,7 @@ bool IMGData::readFAT(QFile &file, TileMap &tileMap)
// Skip unused FAT blocks if any
while (true) {
if (!(file.seek(offset) && readValue(file, flag)))
if (!(file->seek(offset) && readValue(file, flag)))
return false;
if (flag)
break;
@ -93,14 +93,14 @@ bool IMGData::readFAT(QFile &file, TileMap &tileMap)
char name[8], type[3];
quint32 size;
quint16 part;
if (!(file.seek(offset + 12) && readValue(file, size)))
if (!(file->seek(offset + 12) && readValue(file, size)))
return false;
offset += 512;
int cnt = (size - offset) / 512;
// Read FAT blocks describing the IMG sub-files
for (int i = 0; i < cnt; i++) {
if (!(file.seek(offset) && readValue(file, flag)
if (!(file->seek(offset) && readValue(file, flag)
&& read(file, name, sizeof(name))
&& read(file, type, sizeof(type)) && readValue(file, size)
&& readValue(file, part)))
@ -140,13 +140,13 @@ bool IMGData::readFAT(QFile &file, TileMap &tileMap)
return true;
}
bool IMGData::createTileTree(const TileMap &tileMap)
bool IMGData::createTileTree(QFile *file, const TileMap &tileMap)
{
for (TileMap::const_iterator it = tileMap.constBegin();
it != tileMap.constEnd(); ++it) {
VectorTile *tile = it.value();
if (!tile->init()) {
if (!tile->init(file)) {
qWarning("%s: %s: Invalid map tile", qPrintable(_fileName),
qPrintable(it.key()));
delete tile;
@ -177,14 +177,14 @@ IMGData::IMGData(const QString &fileName) : MapData(fileName)
return;
}
if (!readIMGHeader(file))
if (!readIMGHeader(&file))
return;
if (!readFAT(file, tileMap)) {
if (!readFAT(&file, tileMap)) {
_errorString = "Error reading FAT data";
qDeleteAll(tileMap);
return;
}
if (!createTileTree(tileMap)) {
if (!createTileTree(&file, tileMap)) {
_errorString = "No usable map tile found";
return;
}
@ -194,16 +194,16 @@ IMGData::IMGData(const QString &fileName) : MapData(fileName)
_valid = true;
}
qint64 IMGData::read(QFile &file, char *data, qint64 maxSize) const
qint64 IMGData::read(QFile *file, char *data, qint64 maxSize) const
{
qint64 ret = file.read(data, maxSize);
qint64 ret = file->read(data, maxSize);
if (_key)
for (int i = 0; i < ret; i++)
data[i] ^= _key;
return ret;
}
template<class T> bool IMGData::readValue(QFile &file, T &val) const
template<class T> bool IMGData::readValue(QFile *file, T &val) const
{
T data;
@ -215,9 +215,9 @@ template<class T> bool IMGData::readValue(QFile &file, T &val) const
return true;
}
bool IMGData::readBlock(QFile &file, int blockNum, char *data) const
bool IMGData::readBlock(QFile *file, int blockNum, char *data) const
{
if (!file.seek((quint64)blockNum << _blockBits))
if (!file->seek((quint64)blockNum << _blockBits))
return false;
if (read(file, data, 1ULL<<_blockBits) < (qint64)(1ULL<<_blockBits))
return false;

View File

@ -13,17 +13,17 @@ public:
IMGData(const QString &fileName);
unsigned blockBits() const {return _blockBits;}
bool readBlock(QFile &file, int blockNum, char *data) const;
bool readBlock(QFile *file, int blockNum, char *data) const;
private:
typedef QMap<QByteArray, VectorTile*> TileMap;
qint64 read(QFile &file, char *data, qint64 maxSize) const;
template<class T> bool readValue(QFile &file, T &val) const;
bool readSubFileBlocks(QFile &file, quint64 offset, SubFile *subFile);
bool readFAT(QFile &file, TileMap &tileMap);
bool readIMGHeader(QFile &file);
bool createTileTree(const TileMap &tileMap);
qint64 read(QFile *file, char *data, qint64 maxSize) const;
template<class T> bool readValue(QFile *file, T &val) const;
bool readSubFileBlocks(QFile *file, quint64 offset, SubFile *subFile);
bool readFAT(QFile *file, TileMap &tileMap);
bool readIMGHeader(QFile *file);
bool createTileTree(QFile *file, const TileMap &tileMap);
quint8 _key;
unsigned _blockBits;

View File

@ -32,7 +32,8 @@ JLS::JLS(quint16 maxval, quint16 near)
_limit = LIMIT - _qbpp - 1;
}
bool JLS::processRunMode(BitStream &bs, quint16 col, quint16 &samples)
bool JLS::processRunMode(BitStream &bs, Context &ctx, quint16 col,
quint16 &samples) const
{
quint8 z;
quint16 cnt = 0;
@ -42,12 +43,12 @@ bool JLS::processRunMode(BitStream &bs, quint16 col, quint16 &samples)
z = Z[(bs.value() >> 0x18) ^ 0xff];
for (quint8 i = 0; i < z; i++) {
cnt = cnt + _rg;
cnt = cnt + ctx.rg;
if (cnt <= col && _runIndex < 31) {
_runIndex++;
_rk = J[_runIndex];
_rg = 1U << _rk;
if (cnt <= col && ctx.runIndex < 31) {
ctx.runIndex++;
ctx.rk = J[ctx.runIndex];
ctx.rg = 1U << ctx.rk;
}
if (cnt >= col) {
@ -65,18 +66,18 @@ bool JLS::processRunMode(BitStream &bs, quint16 col, quint16 &samples)
if (!bs.read(z + 1))
return false;
if (_rk) {
samples = (bs.value() >> (32 - _rk)) + cnt;
if (!bs.read(_rk))
if (ctx.rk) {
samples = (bs.value() >> (32 - ctx.rk)) + cnt;
if (!bs.read(ctx.rk))
return false;
} else
samples = cnt;
_lrk = _rk + 1;
if (_runIndex != 0) {
_runIndex--;
_rk = J[_runIndex];
_rg = 1U << _rk;
ctx.lrk = ctx.rk + 1;
if (ctx.runIndex != 0) {
ctx.runIndex--;
ctx.rk = J[ctx.runIndex];
ctx.rg = 1U << ctx.rk;
}
return true;
@ -87,7 +88,8 @@ bool JLS::processRunMode(BitStream &bs, quint16 col, quint16 &samples)
}
}
bool JLS::decodeError(BitStream &bs, quint8 limit, quint8 k, uint &MErrval)
bool JLS::decodeError(BitStream &bs, quint8 limit, quint8 k,
uint &MErrval) const
{
quint8 cnt = 0;
MErrval = 0;
@ -122,19 +124,19 @@ bool JLS::decodeError(BitStream &bs, quint8 limit, quint8 k, uint &MErrval)
return true;
}
bool JLS::readLine(BitStream &bs)
bool JLS::readLine(BitStream &bs, Context &ctx) const
{
quint8 ictx, rctx;
quint8 k;
uint MErrval;
int Errval;
int Rx;
int Ra = _last[1];
int Rb = _last[1];
int Rc = _last[0];
int Ra = ctx.last[1];
int Rb = ctx.last[1];
int Rc = ctx.last[0];
uint col = 1;
*_current = _last[1];
*ctx.current = ctx.last[1];
do {
if (abs(Rb - Ra) > _near) {
@ -144,7 +146,7 @@ bool JLS::readLine(BitStream &bs)
else if (Px > _maxval)
Px = _maxval;
for (k = 0; _n[1] << k < _a[1]; k++)
for (k = 0; ctx.n[1] << k < ctx.a[1]; k++)
;
if (!decodeError(bs, _limit, k, MErrval))
@ -158,7 +160,7 @@ bool JLS::readLine(BitStream &bs)
meh = MErrval >> 1;
mes = meh;
}
if ((_near == 0) && (k == 0) && (_b[1] * 2 <= -_n[1])) {
if ((_near == 0) && (k == 0) && (ctx.b[1] * 2 <= -ctx.n[1])) {
meh = mes + 1;
mes = -mes - 1;
if (MErrval & 1)
@ -179,67 +181,67 @@ bool JLS::readLine(BitStream &bs)
if (Rx > _maxval)
Rx = _maxval;
_a[1] = _a[1] + meh;
_b[1] = _b[1] + mes;
if (_n[1] == 0x40) {
_a[1] = _a[1] >> 1;
if (_b[1] >= 0)
_b[1] = _b[1] >> 1;
ctx.a[1] = ctx.a[1] + meh;
ctx.b[1] = ctx.b[1] + mes;
if (ctx.n[1] == 0x40) {
ctx.a[1] = ctx.a[1] >> 1;
if (ctx.b[1] >= 0)
ctx.b[1] = ctx.b[1] >> 1;
else
_b[1] = -((1 - _b[1]) >> 1);
_n[1] = 0x21;
ctx.b[1] = -((1 - ctx.b[1]) >> 1);
ctx.n[1] = 0x21;
} else
_n[1] = _n[1] + 1;
ctx.n[1] = ctx.n[1] + 1;
if (_b[1] <= -_n[1]) {
_b[1] = _b[1] + _n[1];
if (_b[1] <= -_n[1])
_b[1] = 1 - _n[1];
} else if (_b[1] > 0) {
_b[1] = _b[1] - _n[1];
if (_b[1] > 0)
_b[1] = 0;
if (ctx.b[1] <= -ctx.n[1]) {
ctx.b[1] = ctx.b[1] + ctx.n[1];
if (ctx.b[1] <= -ctx.n[1])
ctx.b[1] = 1 - ctx.n[1];
} else if (ctx.b[1] > 0) {
ctx.b[1] = ctx.b[1] - ctx.n[1];
if (ctx.b[1] > 0)
ctx.b[1] = 0;
}
Rc = Rb;
Rb = _last[col + 1];
Rb = ctx.last[col + 1];
} else {
quint16 samples;
if (!processRunMode(bs, _w - col + 1, samples))
if (!processRunMode(bs, ctx, ctx.w - col + 1, samples))
return false;
if (samples != 0) {
for (int i = 0; i < samples; i++) {
if (col > _w)
if (col > ctx.w)
return false;
_current[col] = Ra;
ctx.current[col] = Ra;
col++;
}
if (col > _w)
if (col > ctx.w)
break;
Rc = _last[col];
Rb = _last[col + 1];
Rc = ctx.last[col];
Rb = ctx.last[col + 1];
} else {
Rc = Rb;
Rb = _last[col + 1];
Rb = ctx.last[col + 1];
}
rctx = (abs(Rc - Ra) <= _near);
quint16 TEMP = _a[rctx + 2];
quint16 TEMP = ctx.a[rctx + 2];
if (rctx)
TEMP += _n[rctx + 2] >> 1;
TEMP += ctx.n[rctx + 2] >> 1;
ictx = rctx | 2;
for (k = 0; _n[rctx + 2] << k < TEMP; k++)
for (k = 0; ctx.n[rctx + 2] << k < TEMP; k++)
;
if (!decodeError(bs, _limit - _lrk, k, MErrval))
if (!decodeError(bs, _limit - ctx.lrk, k, MErrval))
return false;
quint16 s = ((k == 0) && (rctx || MErrval)) ?
(_b[ictx] * 2 < _n[ictx]) : 0;
(ctx.b[ictx] * 2 < ctx.n[ictx]) : 0;
Errval = MErrval + rctx + s;
int evh;
@ -249,7 +251,7 @@ bool JLS::readLine(BitStream &bs)
} else {
Errval = s - ((Errval + 1) >> 1);
evh = -Errval;
_b[ictx] = _b[ictx] + 1;
ctx.b[ictx] = ctx.b[ictx] + 1;
}
Errval *= (_near * 2 + 1);
@ -274,59 +276,45 @@ bool JLS::readLine(BitStream &bs)
if (Rx > _maxval)
Rx = _maxval;
_a[ictx] = _a[ictx] + (evh - rctx);
if (_n[ictx] == 0x40) {
_a[ictx] = _a[ictx] >> 1;
if (_b[ictx] >= 0)
_b[ictx] = _b[ictx] >> 1;
ctx.a[ictx] = ctx.a[ictx] + (evh - rctx);
if (ctx.n[ictx] == 0x40) {
ctx.a[ictx] = ctx.a[ictx] >> 1;
if (ctx.b[ictx] >= 0)
ctx.b[ictx] = ctx.b[ictx] >> 1;
else
_b[ictx] = -((1 - _b[ictx]) >> 1);
_n[ictx] = 0x21;
ctx.b[ictx] = -((1 - ctx.b[ictx]) >> 1);
ctx.n[ictx] = 0x21;
} else
_n[ictx] = _n[ictx] + 1;
ctx.n[ictx] = ctx.n[ictx] + 1;
}
_current[col] = Rx;
ctx.current[col] = Rx;
Ra = Rx;
col = col + 1;
} while (col <= _w);
} while (col <= ctx.w);
return true;
}
bool JLS::decode(const SubFile *file, SubFile::Handle &hdl, Matrix<qint16> &img)
bool JLS::decode(const SubFile *file, SubFile::Handle &hdl,
Matrix<qint16> &img) const
{
Context ctx(img.w(), _range);
BitStream bs(file, hdl);
if (!bs.init())
return false;
_w = img.w();
_data = QVector<quint16>((_w + 3) * 2);
_last = _data.data();
_current = _data.data() + (_w + 3);
_runIndex = 0;
_rk = 0;
_rg = 1;
_lrk = 0;
quint16 A = qMax(2, (_range + 32) / 64);
for (int i = 0; i < 4; i++) {
_a[i] = A;
_b[i] = 0;
_n[i] = 1;
}
for (int i = 0; i < img.h(); i++) {
if (!readLine(bs))
if (!readLine(bs, ctx))
return false;
memcpy(img.row(i), _current + 1, _w * sizeof(quint16));
memcpy(img.row(i), ctx.current + 1, img.w() * sizeof(quint16));
quint16 *tmp = _last;
_last = _current;
_current = tmp;
quint16 *tmp = ctx.last;
ctx.last = ctx.current;
ctx.current = tmp;
}
return true;

View File

@ -12,7 +12,8 @@ class JLS
public:
JLS(quint16 maxval, quint16 near);
bool decode(const SubFile *file, SubFile::Handle &hdl, Matrix<qint16> &img);
bool decode(const SubFile *file, SubFile::Handle &hdl,
Matrix<qint16> &img) const;
private:
class BitStream
@ -56,28 +57,48 @@ private:
qint8 _shift;
};
bool readLine(BitStream &bs);
bool processRunMode(BitStream &bs, quint16 col, quint16 &samples);
bool decodeError(BitStream &bs, quint8 limit, quint8 k, uint &MErrval);
struct Context
{
Context(quint16 width, quint16 range)
: data(QVector<quint16>((width + 3) * 2)), w(width), rg(1),
runIndex(0), rk(0), lrk(0)
{
quint16 A = qMax(2, (range + 32) / 64);
last = data.data();
current = data.data() + (w + 3);
for (int i = 0; i < 4; i++) {
a[i] = A;
b[i] = 0;
n[i] = 1;
}
}
QVector<quint16> data;
quint16 *current;
quint16 *last;
quint16 w;
quint16 rg;
quint16 n[4];
quint16 a[4];
qint16 b[4];
quint8 runIndex;
quint8 rk;
quint8 lrk;
};
bool readLine(BitStream &bs, Context &ctx) const;
bool processRunMode(BitStream &bs, Context &ctx, quint16 col,
quint16 &samples) const;
bool decodeError(BitStream &bs, quint8 limit, quint8 k,
uint &MErrval) const;
quint16 _maxval;
quint16 _near;
quint16 _range;
quint8 _qbpp;
quint8 _limit;
quint8 _runIndex;
quint8 _rk;
quint16 _rg;
quint16 _n[4];
quint16 _a[4];
qint16 _b[4];
quint8 _lrk;
quint16 _w;
QVector<quint16> _data;
quint16 *_current;
quint16 *_last;
};
}

View File

@ -13,7 +13,7 @@ using namespace IMG;
bool MapData::polyCb(VectorTile *tile, void *context)
{
PolyCTX *ctx = (PolyCTX*)context;
tile->polys(ctx->rect, ctx->zoom, ctx->polygons, ctx->lines,
tile->polys(ctx->file, ctx->rect, ctx->zoom, ctx->polygons, ctx->lines,
ctx->cache, ctx->lock);
return true;
}
@ -21,14 +21,16 @@ bool MapData::polyCb(VectorTile *tile, void *context)
bool MapData::pointCb(VectorTile *tile, void *context)
{
PointCTX *ctx = (PointCTX*)context;
tile->points(ctx->rect, ctx->zoom, ctx->points, ctx->cache, ctx->lock);
tile->points(ctx->file, ctx->rect, ctx->zoom, ctx->points, ctx->cache,
ctx->lock);
return true;
}
bool MapData::elevationCb(VectorTile *tile, void *context)
{
ElevationCTX *ctx = (ElevationCTX*)context;
tile->elevations(ctx->rect, ctx->zoom, ctx->elevations, ctx->cache, ctx->lock);
tile->elevations(ctx->file, ctx->rect, ctx->zoom, ctx->elevations,
ctx->cache, ctx->lock);
return true;
}
@ -50,10 +52,10 @@ MapData::~MapData()
delete _style;
}
void MapData::polys(const RectC &rect, int bits, QList<Poly> *polygons,
QList<Poly> *lines)
void MapData::polys(QFile *file, const RectC &rect, int bits,
QList<Poly> *polygons, QList<Poly> *lines)
{
PolyCTX ctx(rect, zoom(bits), polygons, lines, &_polyCache, &_lock);
PolyCTX ctx(file, rect, zoom(bits), polygons, lines, &_polyCache, &_lock);
double min[2], max[2];
min[0] = rect.left();
@ -64,9 +66,10 @@ void MapData::polys(const RectC &rect, int bits, QList<Poly> *polygons,
_tileTree.Search(min, max, polyCb, &ctx);
}
void MapData::points(const RectC &rect, int bits, QList<Point> *points)
void MapData::points(QFile *file, const RectC &rect, int bits,
QList<Point> *points)
{
PointCTX ctx(rect, zoom(bits), points, &_pointCache, &_lock);
PointCTX ctx(file, rect, zoom(bits), points, &_pointCache, &_lock);
double min[2], max[2];
min[0] = rect.left();
@ -77,9 +80,10 @@ void MapData::points(const RectC &rect, int bits, QList<Point> *points)
_tileTree.Search(min, max, pointCb, &ctx);
}
void MapData::elevations(const RectC &rect, int bits, QList<Elevation> *elevations)
void MapData::elevations(QFile *file, const RectC &rect, int bits,
QList<Elevation> *elevations)
{
ElevationCTX ctx(rect, zoom(bits), elevations, &_demCache, &_demLock);
ElevationCTX ctx(file, rect, zoom(bits), elevations, &_demCache, &_demLock);
double min[2], max[2];
min[0] = rect.left();
@ -95,14 +99,14 @@ void MapData::load(qreal ratio)
Q_ASSERT(!_style);
if (_typ)
_style = new Style(ratio, _typ);
_style = new Style(0, ratio, _typ);
else {
QString typFile(ProgramPaths::typFile());
if (QFileInfo::exists(typFile)) {
SubFile typ(&typFile);
_style = new Style(ratio, &typ);
_style = new Style(0, ratio, &typ);
} else
_style = new Style(ratio);
_style = new Style(0, ratio);
}
}

View File

@ -5,6 +5,7 @@
#include <QPointF>
#include <QCache>
#include <QMutex>
#include <QFile>
#include <QDebug>
#include "common/rectc.h"
#include "common/rtree.h"
@ -77,10 +78,11 @@ public:
const RectC &bounds() const {return _bounds;}
const Range &zooms() const {return _zoomLevels;}
const Style *style() const {return _style;}
void polys(const RectC &rect, int bits, QList<Poly> *polygons,
void polys(QFile *file, const RectC &rect, int bits, QList<Poly> *polygons,
QList<Poly> *lines);
void points(const RectC &rect, int bits, QList<Point> *points);
void elevations(const RectC &rect, int bits, QList<Elevation> *elevations);
void points(QFile *file, const RectC &rect, int bits, QList<Point> *points);
void elevations(QFile *file, const RectC &rect, int bits,
QList<Elevation> *elevations);
void load(qreal ratio);
void clear();
@ -122,12 +124,13 @@ private:
struct PolyCTX
{
PolyCTX(const RectC &rect, const Zoom &zoom,
PolyCTX(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
PolyCache *cache, QMutex *lock)
: rect(rect), zoom(zoom), polygons(polygons), lines(lines),
cache(cache), lock(lock) {}
: file(file), rect(rect), zoom(zoom), polygons(polygons),
lines(lines), cache(cache), lock(lock) {}
QFile *file;
const RectC &rect;
const Zoom &zoom;
QList<MapData::Poly> *polygons;
@ -138,10 +141,12 @@ private:
struct PointCTX
{
PointCTX(const RectC &rect, const Zoom &zoom,
PointCTX(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Point> *points, PointCache *cache, QMutex *lock)
: rect(rect), zoom(zoom), points(points), cache(cache), lock(lock) {}
: file(file), rect(rect), zoom(zoom), points(points), cache(cache),
lock(lock) {}
QFile *file;
const RectC &rect;
const Zoom &zoom;
QList<MapData::Point> *points;
@ -151,11 +156,12 @@ private:
struct ElevationCTX
{
ElevationCTX(const RectC &rect, const Zoom &zoom,
ElevationCTX(QFile *file, const RectC &rect, const Zoom &zoom,
QList<Elevation> *elevations, ElevationCache *cache, QMutex *lock)
: rect(rect), zoom(zoom), elevations(elevations), cache(cache),
lock(lock) {}
: file(file), rect(rect), zoom(zoom), elevations(elevations),
cache(cache), lock(lock) {}
QFile *file;
const RectC &rect;
const Zoom &zoom;
QList<Elevation> *elevations;

View File

@ -152,7 +152,7 @@ void RasterTile::drawPolygons(QPainter *painter,
bool insert = false;
SubFile::Handle *hdl = hc.object(poly.raster.lbl());
if (!hdl) {
hdl = new SubFile::Handle(poly.raster.lbl());
hdl = new SubFile::Handle(_file, poly.raster.lbl());
insert = true;
}
QPixmap pm(poly.raster.lbl()->image(*hdl, poly.raster.id()));
@ -217,8 +217,13 @@ void RasterTile::drawLines(QPainter *painter,
void RasterTile::drawTextItems(QPainter *painter,
const QList<TextItem*> &textItems) const
{
for (int i = 0; i < textItems.size(); i++)
textItems.at(i)->paint(painter);
QRectF rect(_rect);
for (int i = 0; i < textItems.size(); i++) {
const TextItem *ti = textItems.at(i);
if (rect.intersects(ti->boundingRect()))
ti->paint(painter);
}
}
static void removeDuplicitLabel(QList<TextItem *> &labels, const QString &text,
@ -438,11 +443,16 @@ void RasterTile::fetchData(QList<MapData::Poly> &polygons,
{
QPoint ttl(_rect.topLeft());
if (dynamic_cast<IMGData*>(_data)) {
_file = new QFile(_data->fileName());
_file->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
}
QRectF polyRect(ttl, QPointF(ttl.x() + _rect.width(), ttl.y()
+ _rect.height()));
RectD polyRectD(_transform.img2proj(polyRect.topLeft()),
_transform.img2proj(polyRect.bottomRight()));
_data->polys(polyRectD.toRectC(_proj, 20), _zoom,
_data->polys(_file, polyRectD.toRectC(_proj, 20), _zoom,
&polygons, _vectors ? &lines : 0);
if (_vectors) {
@ -451,7 +461,7 @@ void RasterTile::fetchData(QList<MapData::Poly> &polygons,
+ TEXT_EXTENT));
RectD pointRectD(_transform.img2proj(pointRect.topLeft()),
_transform.img2proj(pointRect.bottomRight()));
_data->points(pointRectD.toRectC(_proj, 20), _zoom, &points);
_data->points(_file, pointRectD.toRectC(_proj, 20), _zoom, &points);
}
}
@ -476,7 +486,7 @@ MatrixD RasterTile::elevation(int extend) const
// Extra margin for always including the next DEM tile on the map tile
// edges (the DEM tile resolution is usally 0.5-15% of the map tile)
double factor = 6 - (_zoom - 24) * 1.7;
_data->elevations(rect.adjusted(0, 0, rect.width() / factor,
_data->elevations(_file, rect.adjusted(0, 0, rect.width() / factor,
-rect.height() / factor), _zoom, &tiles);
DEMTree tree(tiles);

View File

@ -22,7 +22,8 @@ public:
bool hillShading, bool rasters, bool vectors)
: _proj(proj), _transform(transform), _data(data), _zoom(zoom),
_rect(rect), _ratio(ratio), _key(key), _hillShading(hillShading),
_rasters(rasters), _vectors(vectors) {}
_rasters(rasters), _vectors(vectors), _file(0) {}
~RasterTile() {delete _file;}
const QString &key() const {return _key;}
QPoint xy() const {return _rect.topLeft();}
@ -88,6 +89,7 @@ private:
QPixmap _pixmap;
bool _hillShading;
bool _rasters, _vectors;
QFile *_file;
};
}

View File

@ -1268,50 +1268,50 @@ bool Style::parseDrawOrder(SubFile *file, SubFile::Handle &hdl,
return true;
}
bool Style::parseTYPFile(SubFile *file)
bool Style::parseTYPFile(QFile *file, SubFile *typ)
{
SubFile::Handle hdl(file);
SubFile::Handle hdl(file, typ);
Section points, lines, polygons, order;
quint16 tmp16, codepage;
if (!(file->seek(hdl, 0x15) && file->readUInt16(hdl, codepage)
&& file->readUInt32(hdl, points.offset)
&& file->readUInt32(hdl, points.size)
&& file->readUInt32(hdl, lines.offset)
&& file->readUInt32(hdl, lines.size)
&& file->readUInt32(hdl, polygons.offset)
&& file->readUInt32(hdl, polygons.size)))
if (!(typ->seek(hdl, 0x15) && typ->readUInt16(hdl, codepage)
&& typ->readUInt32(hdl, points.offset)
&& typ->readUInt32(hdl, points.size)
&& typ->readUInt32(hdl, lines.offset)
&& typ->readUInt32(hdl, lines.size)
&& typ->readUInt32(hdl, polygons.offset)
&& typ->readUInt32(hdl, polygons.size)))
return false;
if (!(file->readUInt16(hdl, tmp16) && file->readUInt16(hdl, tmp16)))
if (!(typ->readUInt16(hdl, tmp16) && typ->readUInt16(hdl, tmp16)))
return false;
if (!(file->readUInt32(hdl, points.arrayOffset)
&& file->readUInt16(hdl, points.arrayItemSize)
&& file->readUInt32(hdl, points.arraySize)
&& file->readUInt32(hdl, lines.arrayOffset)
&& file->readUInt16(hdl, lines.arrayItemSize)
&& file->readUInt32(hdl, lines.arraySize)
&& file->readUInt32(hdl, polygons.arrayOffset)
&& file->readUInt16(hdl, polygons.arrayItemSize)
&& file->readUInt32(hdl, polygons.arraySize)
&& file->readUInt32(hdl, order.arrayOffset)
&& file->readUInt16(hdl, order.arrayItemSize)
&& file->readUInt32(hdl, order.arraySize)))
if (!(typ->readUInt32(hdl, points.arrayOffset)
&& typ->readUInt16(hdl, points.arrayItemSize)
&& typ->readUInt32(hdl, points.arraySize)
&& typ->readUInt32(hdl, lines.arrayOffset)
&& typ->readUInt16(hdl, lines.arrayItemSize)
&& typ->readUInt32(hdl, lines.arraySize)
&& typ->readUInt32(hdl, polygons.arrayOffset)
&& typ->readUInt16(hdl, polygons.arrayItemSize)
&& typ->readUInt32(hdl, polygons.arraySize)
&& typ->readUInt32(hdl, order.arrayOffset)
&& typ->readUInt16(hdl, order.arrayItemSize)
&& typ->readUInt32(hdl, order.arraySize)))
return false;
if (!(parsePoints(file, hdl, points) && parseLines(file, hdl, lines)
&& parsePolygons(file, hdl, polygons)
&& parseDrawOrder(file, hdl, order))) {
if (!(parsePoints(typ, hdl, points) && parseLines(typ, hdl, lines)
&& parsePolygons(typ, hdl, polygons)
&& parseDrawOrder(typ, hdl, order))) {
qWarning("%s: Invalid TYP file, using default style",
qPrintable(file->fileName()));
qPrintable(typ->fileName()));
return false;
}
return true;
}
Style::Style(qreal ratio, SubFile *typ)
Style::Style(QFile *file, qreal ratio, SubFile *typ)
{
_large = pixelSizeFont(16);
_normal = pixelSizeFont(14);
@ -1326,7 +1326,7 @@ Style::Style(qreal ratio, SubFile *typ)
defaultPointStyle(ratio);
if (typ)
parseTYPFile(typ);
parseTYPFile(file, typ);
}
const Style::Line &Style::line(quint32 type) const

View File

@ -104,7 +104,7 @@ public:
};
Style(qreal ratio, SubFile *typ = 0);
Style(QFile *file, qreal ratio, SubFile *typ = 0);
const Line &line(quint32 type) const;
const Polygon &polygon(quint32 type) const;
@ -171,7 +171,7 @@ private:
bool extended;
};
bool parseTYPFile(SubFile *file);
bool parseTYPFile(QFile *file, SubFile *typ);
bool parsePoints(SubFile *file, SubFile::Handle &hdl,
const Section &section);
bool parsePoint(SubFile *file, SubFile::Handle &hdl,

View File

@ -27,9 +27,9 @@ bool SubFile::seek(Handle &handle, quint32 pos) const
int blockNum = pos >> BLOCK_BITS;
if (handle._blockNum != blockNum) {
if (!handle._file.seek((quint64)blockNum << BLOCK_BITS))
if (!handle._file->seek((quint64)blockNum << BLOCK_BITS))
return false;
if (handle._file.read(handle._data.data(), (1<<BLOCK_BITS)) < 0)
if (handle._file->read(handle._data.data(), (1<<BLOCK_BITS)) < 0)
return false;
handle._blockNum = blockNum;
}

View File

@ -18,25 +18,34 @@ public:
class Handle
{
public:
Handle(const SubFile *subFile)
: _blockNum(-1), _blockPos(-1), _pos(-1)
Handle(QFile *file, const SubFile *subFile)
: _file(file), _blockNum(-1), _blockPos(-1), _pos(-1), _delete(false)
{
if (!subFile)
return;
if (!_file) {
_file = new QFile(subFile->fileName());
_file->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
_delete = true;
}
_data.resize(subFile->blockSize());
_file.setFileName(subFile->fileName());
_file.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
}
~Handle()
{
if (_delete)
delete _file;
}
private:
friend class SubFile;
QFile _file;
QFile *_file;
QByteArray _data;
int _blockNum;
int _blockPos;
int _pos;
bool _delete;
};
SubFile(const IMGData *img)

View File

@ -49,9 +49,9 @@ TREFile::~TREFile()
clear();
}
bool TREFile::init()
bool TREFile::init(QFile *file)
{
Handle hdl(this);
Handle hdl(file, this);
quint8 locked, levels[64];
quint16 hdrLen;
qint32 north, east, south, west;
@ -154,9 +154,9 @@ int TREFile::readExtEntry(Handle &hdl, quint32 &polygons, quint32 &lines,
return rb;
}
bool TREFile::load(int idx)
bool TREFile::load(QFile *file, int idx)
{
Handle hdl(this);
Handle hdl(file, this);
QList<SubDiv*> sl;
SubDiv *s = 0;
SubDivTree *tree = new SubDivTree();
@ -282,7 +282,7 @@ void TREFile::clear()
_subdivs.clear();
}
const TREFile::SubDivTree *TREFile::subdivs(const Zoom &zoom)
const TREFile::SubDivTree *TREFile::subdivs(QFile *file, const Zoom &zoom)
{
int idx = -1;
@ -296,7 +296,7 @@ const TREFile::SubDivTree *TREFile::subdivs(const Zoom &zoom)
if (idx < 0)
return 0;
if (!_subdivs.contains(_levels.at(idx).level) && !load(idx))
if (!_subdivs.contains(_levels.at(idx).level) && !load(file, idx))
return 0;
return _subdivs.value(_levels.at(idx).level);
@ -309,10 +309,10 @@ static bool cb(SubDiv *subdiv, void *context)
return true;
}
QList<SubDiv*> TREFile::subdivs(const RectC &rect, const Zoom &zoom)
QList<SubDiv*> TREFile::subdivs(QFile *file, const RectC &rect, const Zoom &zoom)
{
QList<SubDiv*> list;
const SubDivTree *tree = subdivs(zoom);
const SubDivTree *tree = subdivs(file, zoom);
double min[2], max[2];
min[0] = rect.left();

View File

@ -24,11 +24,11 @@ public:
: SubFile(gmp, offset), _flags(0), _extItemSize(0) {}
~TREFile();
bool init();
bool init(QFile *file);
void clear();
const RectC &bounds() const {return _bounds;}
QList<SubDiv*> subdivs(const RectC &rect, const Zoom &zoom);
QList<SubDiv*> subdivs(QFile *file, const RectC &rect, const Zoom &zoom);
quint32 shift(quint8 bits) const
{return (bits == _levels.last().bits) ? (_flags >> 0xb) & 7 : 0;}
QVector<Zoom> zooms() const;
@ -41,8 +41,8 @@ private:
};
typedef RTree<SubDiv*, double, 2> SubDivTree;
bool load(int idx);
const SubDivTree *subdivs(const Zoom &zoom);
bool load(QFile *file, int idx);
const SubDivTree *subdivs(QFile *file, const Zoom &zoom);
int readExtEntry(Handle &hdl, quint32 &polygons, quint32 &lines,
quint32 &points);

View File

@ -40,20 +40,20 @@ SubFile *VectorTile::file(SubFile::Type type)
}
}
bool VectorTile::init()
bool VectorTile::init(QFile *file)
{
if (_gmp && !initGMP())
if (_gmp && !initGMP(file))
return false;
if (!(_tre && _tre->init() && _rgn))
if (!(_tre && _tre->init(file) && _rgn))
return false;
return true;
}
bool VectorTile::initGMP()
bool VectorTile::initGMP(QFile *file)
{
SubFile::Handle hdl(_gmp);
SubFile::Handle hdl(file, _gmp);
quint32 tre, rgn, lbl, net, nod, dem;
if (!(_gmp->seek(hdl, 0x19) && _gmp->readUInt32(hdl, tre)
@ -118,49 +118,56 @@ void VectorTile::clear()
_demLoaded = 0;
}
void VectorTile::polys(const RectC &rect, const Zoom &zoom,
void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
MapData::PolyCache *cache, QMutex *lock)
MapData::PolyCache *cache, QMutex *cacheLock)
{
SubFile::Handle *rgnHdl = 0, *lblHdl = 0, *netHdl = 0, *nodHdl = 0,
*nodHdl2 = 0;
lock->lock();
_lock.lock();
if (_loaded < 0) {
lock->unlock();
_lock.unlock();
return;
}
if (!_loaded) {
rgnHdl = new SubFile::Handle(_rgn);
lblHdl = new SubFile::Handle(_lbl);
netHdl = new SubFile::Handle(_net);
nodHdl = new SubFile::Handle(_nod);
rgnHdl = new SubFile::Handle(file, _rgn);
lblHdl = new SubFile::Handle(file, _lbl);
netHdl = new SubFile::Handle(file, _net);
nodHdl = new SubFile::Handle(file, _nod);
if (!load(*rgnHdl, *lblHdl, *netHdl, *nodHdl)) {
lock->unlock();
_lock.unlock();
delete rgnHdl; delete lblHdl; delete netHdl; delete nodHdl;
return;
}
}
QList<SubDiv*> subdivs = _tre->subdivs(rect, zoom);
QList<SubDiv*> subdivs = _tre->subdivs(file, rect, zoom);
cacheLock->lock();
for (int i = 0; i < subdivs.size(); i++) {
SubDiv *subdiv = subdivs.at(i);
MapData::Polys *polys = cache->object(subdiv);
if (!polys) {
cacheLock->unlock();
quint32 shift = _tre->shift(subdiv->bits());
if (!rgnHdl) {
rgnHdl = new SubFile::Handle(_rgn);
lblHdl = new SubFile::Handle(_lbl);
netHdl = new SubFile::Handle(_net);
rgnHdl = new SubFile::Handle(file, _rgn);
lblHdl = new SubFile::Handle(file, _lbl);
netHdl = new SubFile::Handle(file, _net);
}
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv))
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) {
cacheLock->lock();
continue;
}
polys = new MapData::Polys();
@ -175,9 +182,9 @@ void VectorTile::polys(const RectC &rect, const Zoom &zoom,
if (_net && _net->hasLinks()) {
if (!nodHdl)
nodHdl = new SubFile::Handle(_nod);
nodHdl = new SubFile::Handle(file, _nod);
if (!nodHdl2)
nodHdl2 = new SubFile::Handle(_nod);
nodHdl2 = new SubFile::Handle(file, _nod);
_rgn->links(*rgnHdl, subdiv, shift, _net, *netHdl, _nod, *nodHdl,
*nodHdl2, _lbl, *lblHdl, &polys->lines);
}
@ -186,6 +193,7 @@ void VectorTile::polys(const RectC &rect, const Zoom &zoom,
if (lines)
copyPolys(rect, &polys->lines, lines);
cacheLock->lock();
cache->insert(subdiv, polys);
} else {
copyPolys(rect, &polys->polygons, polygons);
@ -194,49 +202,57 @@ void VectorTile::polys(const RectC &rect, const Zoom &zoom,
}
}
lock->unlock();
cacheLock->unlock();
_lock.unlock();
delete rgnHdl; delete lblHdl; delete netHdl; delete nodHdl; delete nodHdl2;
}
void VectorTile::points(const RectC &rect, const Zoom &zoom,
QList<MapData::Point> *points, MapData::PointCache *cache, QMutex *lock)
void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Point> *points, MapData::PointCache *cache, QMutex *cacheLock)
{
SubFile::Handle *rgnHdl = 0, *lblHdl = 0;
lock->lock();
_lock.lock();
if (_loaded < 0) {
lock->unlock();
_lock.unlock();
return;
}
if (!_loaded) {
rgnHdl = new SubFile::Handle(_rgn);
lblHdl = new SubFile::Handle(_lbl);
SubFile::Handle nodHdl(_nod);
SubFile::Handle netHdl(_net);
rgnHdl = new SubFile::Handle(file, _rgn);
lblHdl = new SubFile::Handle(file, _lbl);
SubFile::Handle nodHdl(file, _nod);
SubFile::Handle netHdl(file, _net);
if (!load(*rgnHdl, *lblHdl, netHdl, nodHdl)) {
lock->unlock();
_lock.unlock();
delete rgnHdl; delete lblHdl;
return;
}
}
QList<SubDiv*> subdivs = _tre->subdivs(rect, zoom);
QList<SubDiv*> subdivs = _tre->subdivs(file, rect, zoom);
cacheLock->lock();
for (int i = 0; i < subdivs.size(); i++) {
SubDiv *subdiv = subdivs.at(i);
QList<MapData::Point> *pl = cache->object(subdiv);
if (!pl) {
cacheLock->unlock();
if (!rgnHdl) {
rgnHdl = new SubFile::Handle(_rgn);
lblHdl = new SubFile::Handle(_lbl);
rgnHdl = new SubFile::Handle(file, _rgn);
lblHdl = new SubFile::Handle(file, _lbl);
}
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv))
if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) {
cacheLock->lock();
continue;
}
pl = new QList<MapData::Point>;
@ -248,34 +264,36 @@ void VectorTile::points(const RectC &rect, const Zoom &zoom,
copyPoints(rect, pl, points);
cacheLock->lock();
cache->insert(subdiv, pl);
} else
copyPoints(rect, pl, points);
}
lock->unlock();
cacheLock->unlock();
_lock.unlock();
delete rgnHdl; delete lblHdl;
}
void VectorTile::elevations(const RectC &rect, const Zoom &zoom,
void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Elevation> *elevations, MapData::ElevationCache *cache,
QMutex *lock)
QMutex *cacheLock)
{
SubFile::Handle *hdl = 0;
lock->lock();
_demLock.lock();
if (_demLoaded < 0) {
lock->unlock();
_demLock.unlock();
return;
}
if (!_demLoaded) {
hdl = new SubFile::Handle(_dem);
hdl = new SubFile::Handle(file, _dem);
if (!loadDem(*hdl)) {
lock->unlock();
_demLock.unlock();
delete hdl;
return;
}
@ -285,19 +303,25 @@ void VectorTile::elevations(const RectC &rect, const Zoom &zoom,
// the given zoom (we prefer rendering quality rather than speed). For
// maps with a single level this has no effect.
int level = qMax(0, _dem->level(zoom) - 1);
QList<const DEMTile*> tiles(_dem->tiles(rect, level));
cacheLock->lock();
for (int i = 0; i < tiles.size(); i++) {
const DEMTile *tile = tiles.at(i);
MapData::Elevation *el = cache->object(tile);
MapData::Elevation *el = cache->object(tile);
if (!el) {
cacheLock->unlock();
if (!hdl)
hdl = new SubFile::Handle(_dem);
hdl = new SubFile::Handle(file, _dem);
el = _dem->elevations(*hdl, level, tile);
if (!el->m.isNull())
elevations->append(*el);
cacheLock->lock();
cache->insert(tile, el);
} else {
if (!el->m.isNull())
@ -305,7 +329,8 @@ void VectorTile::elevations(const RectC &rect, const Zoom &zoom,
}
}
lock->unlock();
cacheLock->unlock();
_demLock.unlock();
delete hdl;
}

View File

@ -21,7 +21,7 @@ public:
delete _dem; delete _gmp;
}
bool init();
bool init(QFile *file);
void clear();
const RectC &bounds() const {return _tre->bounds();}
@ -30,14 +30,15 @@ public:
SubFile *file(SubFile::Type type);
void polys(const RectC &rect, const Zoom &zoom,
void polys(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Poly> *polygons, QList<MapData::Poly> *lines,
MapData::PolyCache *cache, QMutex *lock);
void points(const RectC &rect, const Zoom &zoom,
QList<MapData::Point> *points, MapData::PointCache *cache, QMutex *lock);
void elevations(const RectC &rect, const Zoom &zoom,
MapData::PolyCache *cache, QMutex *cacheLock);
void points(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Point> *points, MapData::PointCache *cache,
QMutex *cacheLock);
void elevations(QFile *file, const RectC &rect, const Zoom &zoom,
QList<MapData::Elevation> *elevations, MapData::ElevationCache *cache,
QMutex *lock);
QMutex *cacheLock);
static bool isTileFile(SubFile::Type type)
{
@ -78,7 +79,7 @@ public:
}
private:
bool initGMP();
bool initGMP(QFile *file);
bool load(SubFile::Handle &rgnHdl, SubFile::Handle &lblHdl,
SubFile::Handle &netHdl, SubFile::Handle &nodHdl);
bool loadDem(SubFile::Handle &demHdl);
@ -92,6 +93,7 @@ private:
SubFile *_gmp;
int _loaded, _demLoaded;
QMutex _lock, _demLock;
};
}

View File

@ -276,7 +276,7 @@ double IMGMap::elevation(const Coordinates &c)
if (d->hasDEM()) {
QList<MapData::Elevation> tiles;
d->elevations(RectC(c, Coordinates(c.lon() + DELTA, c.lat() - DELTA)),
d->elevations(0, RectC(c, Coordinates(c.lon() + DELTA, c.lat() - DELTA)),
d->zooms().max(), &tiles);
DEMTree tree(tiles);

View File

@ -39,6 +39,16 @@ static void copyPoints(const RectC &rect, const QList<MapData::Point> *src,
}
}
static void copyPoints(const RectC &rect, const QList<MapData::Path> *src,
QList<MapData::Point> *dst)
{
for (int i = 0; i < src->size(); i++) {
const MapData::Path &path = src->at(i);
if (path.closed && rect.contains(path.point.coordinates))
dst->append(path.point);
}
}
static double distance(const Coordinates &c1, const Coordinates &c2)
{
return hypot(c1.lon() - c2.lon(), c1.lat() - c2.lat());
@ -209,10 +219,9 @@ bool MapData::readTags(SubFile &subfile, int count,
return true;
}
bool MapData::readSubFiles()
bool MapData::readSubFiles(QFile &file)
{
/* both _pointFile and _pathFile can be used here */
QDataStream stream(&_pointFile);
QDataStream stream(&file);
for (int i = 0; i < _subFiles.size(); i++) {
const SubFileInfo &f = _subFiles.at(i);
@ -412,8 +421,7 @@ bool MapData::readHeader(QFile &file)
return true;
}
MapData::MapData(const QString &fileName)
: _pointFile(fileName), _pathFile(fileName), _valid(false)
MapData::MapData(const QString &fileName) : _fileName(fileName), _valid(false)
{
QFile file(fileName);
@ -425,8 +433,8 @@ MapData::MapData(const QString &fileName)
if (!readHeader(file))
return;
_pathCache.setMaxCost(256);
_pointCache.setMaxCost(256);
_pathCache.setMaxCost(2048);
_pointCache.setMaxCost(2048);
_valid = true;
}
@ -450,17 +458,13 @@ RectC MapData::bounds() const
void MapData::load()
{
_pointFile.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
_pathFile.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
readSubFiles();
QFile file(_fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Unbuffered))
readSubFiles(file);
}
void MapData::clear()
{
_pointFile.close();
_pathFile.close();
_pathCache.clear();
_pointCache.clear();
@ -484,14 +488,14 @@ void MapData::clearTiles()
bool MapData::pathCb(VectorTile *tile, void *context)
{
PathCTX *ctx = (PathCTX*)context;
ctx->data->paths(tile, ctx->rect, ctx->zoom, ctx->list);
ctx->data->paths(ctx->file, tile, ctx->rect, ctx->zoom, ctx->list);
return true;
}
bool MapData::pointCb(VectorTile *tile, void *context)
{
PointCTX *ctx = (PointCTX*)context;
ctx->data->points(tile, ctx->rect, ctx->zoom, ctx->list);
ctx->data->points(ctx->file, tile, ctx->rect, ctx->zoom, ctx->list);
return true;
}
@ -504,13 +508,14 @@ int MapData::level(int zoom) const
return _subFiles.size() - 1;
}
void MapData::points(const RectC &rect, int zoom, QList<Point> *list)
void MapData::points(QFile &file, const RectC &rect, int zoom,
QList<Point> *list)
{
if (!rect.isValid())
return;
int l(level(zoom));
PointCTX ctx(this, rect, zoom, list);
PointCTX ctx(file, this, rect, zoom, list);
double min[2], max[2];
min[0] = rect.left();
@ -521,36 +526,58 @@ void MapData::points(const RectC &rect, int zoom, QList<Point> *list)
_tiles.at(l)->Search(min, max, pointCb, &ctx);
}
void MapData::points(const VectorTile *tile, const RectC &rect, int zoom,
QList<Point> *list)
void MapData::points(QFile &file, VectorTile *tile, const RectC &rect,
int zoom, QList<Point> *list)
{
Key key(tile, zoom);
_pointLock.lock();
tile->lock.lock();
QList<Point> *cached = _pointCache.object(key);
if (!cached) {
_pointCacheLock.lock();
QList<Point> *tilePoints = _pointCache.object(key);
if (!tilePoints) {
_pointCacheLock.unlock();
QList<Point> *p = new QList<Point>();
if (readPoints(tile, zoom, p)) {
if (readPoints(file, tile, zoom, p)) {
copyPoints(rect, p, list);
_pointCacheLock.lock();
_pointCache.insert(key, p);
_pointCacheLock.unlock();
} else
delete p;
} else
copyPoints(rect, cached, list);
} else {
copyPoints(rect, tilePoints, list);
_pointCacheLock.unlock();
}
_pointLock.unlock();
_pathCacheLock.lock();
QList<Path> *tilePaths = _pathCache.object(key);
if (!tilePaths) {
_pathCacheLock.unlock();
QList<Path> *p = new QList<Path>();
if (readPaths(file, tile, zoom, p)) {
copyPoints(rect, p, list);
_pathCacheLock.lock();
_pathCache.insert(key, p);
_pathCacheLock.unlock();
} else
delete p;
} else {
copyPoints(rect, tilePaths, list);
_pathCacheLock.unlock();
}
tile->lock.unlock();
}
void MapData::paths(const RectC &searchRect, const RectC &boundsRect, int zoom,
QList<Path> *list)
void MapData::paths(QFile &file, const RectC &searchRect,
const RectC &boundsRect, int zoom, QList<Path> *list)
{
if (!searchRect.isValid())
return;
int l(level(zoom));
PathCTX ctx(this, boundsRect, zoom, list);
PathCTX ctx(file, this, boundsRect, zoom, list);
double min[2], max[2];
min[0] = searchRect.left();
@ -561,32 +588,38 @@ void MapData::paths(const RectC &searchRect, const RectC &boundsRect, int zoom,
_tiles.at(l)->Search(min, max, pathCb, &ctx);
}
void MapData::paths(const VectorTile *tile, const RectC &rect, int zoom,
void MapData::paths(QFile &file, VectorTile *tile, const RectC &rect, int zoom,
QList<Path> *list)
{
Key key(tile, zoom);
_pathLock.lock();
tile->lock.lock();
_pathCacheLock.lock();
QList<Path> *cached = _pathCache.object(key);
if (!cached) {
_pathCacheLock.unlock();
QList<Path> *p = new QList<Path>();
if (readPaths(tile, zoom, p)) {
if (readPaths(file, tile, zoom, p)) {
copyPaths(rect, p, list);
_pathCacheLock.lock();
_pathCache.insert(key, p);
_pathCacheLock.unlock();
} else
delete p;
} else
} else {
copyPaths(rect, cached, list);
_pathCacheLock.unlock();
}
_pathLock.unlock();
tile->lock.unlock();
}
bool MapData::readPaths(const VectorTile *tile, int zoom, QList<Path> *list)
bool MapData::readPaths(QFile &file, const VectorTile *tile, int zoom,
QList<Path> *list)
{
const SubFileInfo &info = _subFiles.at(level(zoom));
SubFile subfile(_pathFile, info.offset, info.size);
SubFile subfile(file, info.offset, info.size);
int rows = info.max - info.min + 1;
QVector<unsigned> paths(rows);
quint32 blocks, unused, val, cnt = 0;
@ -613,16 +646,16 @@ bool MapData::readPaths(const VectorTile *tile, int zoom, QList<Path> *list)
paths.reserve(paths[zoom - info.min]);
for (unsigned i = 0; i < paths[zoom - info.min]; i++) {
Path p;
qint32 lon = 0, lat = 0;
Path p(subfile.pos());
if (!(subfile.readVUInt32(unused) && subfile.readUInt16(bitmap)
&& subfile.readByte(sb)))
return false;
p.layer = sb >> 4;
p.point.layer = sb >> 4;
int tags = sb & 0x0F;
if (!readTags(subfile, tags, _pathTags, p.tags))
if (!readTags(subfile, tags, _pathTags, p.point.tags))
return false;
if (!subfile.readByte(flags))
@ -631,17 +664,17 @@ bool MapData::readPaths(const VectorTile *tile, int zoom, QList<Path> *list)
if (!subfile.readString(name))
return false;
name = name.split('\r').first();
p.tags.append(Tag(ID_NAME, name));
p.point.tags.append(Tag(ID_NAME, name));
}
if (flags & 0x40) {
if (!subfile.readString(houseNumber))
return false;
p.tags.append(Tag(ID_HOUSE, houseNumber));
p.point.tags.append(Tag(ID_HOUSE, houseNumber));
}
if (flags & 0x20) {
if (!subfile.readString(reference))
return false;
p.tags.append(Tag(ID_REF, reference));
p.point.tags.append(Tag(ID_REF, reference));
}
if (flags & 0x10) {
if (!(subfile.readVInt32(lat) && subfile.readVInt32(lon)))
@ -660,8 +693,10 @@ bool MapData::readPaths(const VectorTile *tile, int zoom, QList<Path> *list)
const QVector<Coordinates> &outline = p.poly.first();
p.closed = isClosed(outline);
if (flags & 0x10)
p.labelPos = Coordinates(outline.first().lon() + MD(lon),
p.point.coordinates = Coordinates(outline.first().lon() + MD(lon),
outline.first().lat() + MD(lat));
else if (p.closed)
p.point.coordinates = p.poly.boundingRect().center();
list->append(p);
}
@ -669,10 +704,11 @@ bool MapData::readPaths(const VectorTile *tile, int zoom, QList<Path> *list)
return true;
}
bool MapData::readPoints(const VectorTile *tile, int zoom, QList<Point> *list)
bool MapData::readPoints(QFile &file, const VectorTile *tile, int zoom,
QList<Point> *list)
{
const SubFileInfo &info = _subFiles.at(level(zoom));
SubFile subfile(_pointFile, info.offset, info.size);
SubFile subfile(file, info.offset, info.size);
int rows = info.max - info.min + 1;
QVector<unsigned> points(rows);
quint32 val, unused, cnt = 0;
@ -747,7 +783,7 @@ QDebug operator<<(QDebug dbg, const Mapsforge::MapData::Tag &tag)
QDebug operator<<(QDebug dbg, const MapData::Path &path)
{
dbg.nospace() << "Path(" << path.poly.boundingRect() << ", "
<< path.tags << ")";
<< path.point.tags << ")";
return dbg.space();
}

View File

@ -39,6 +39,8 @@ public:
struct Point {
Point(quint64 id) : id(id) {}
bool center() const {return (id & 1ULL<<63) != 0;}
quint64 id;
Coordinates coordinates;
QVector<Tag> tags;
@ -46,24 +48,25 @@ public:
};
struct Path {
Path(quint64 id) : point(id | 1ULL<<63) {}
Point point;
Polygon poly;
QVector<Tag> tags;
Coordinates labelPos;
int layer;
bool closed;
bool operator<(const Path &other) const
{return layer < other.layer;}
{return point.layer < other.point.layer;}
};
const QString &fileName() const {return _fileName;}
RectC bounds() const;
Range zooms() const
{return Range(_subFiles.first().min, _subFiles.last().max);}
int tileSize() const {return _tileSize;}
void points(const RectC &rect, int zoom, QList<Point> *list);
void paths(const RectC &searchRect, const RectC &boundsRect, int zoom,
QList<Path> *set);
void points(QFile &file, const RectC &rect, int zoom, QList<Point> *list);
void paths(QFile &file, const RectC &searchRect, const RectC &boundsRect,
int zoom, QList<Path> *set);
unsigned tagId(const QByteArray &name) const {return _keys.value(name);}
void load();
@ -87,12 +90,15 @@ private:
size_t offset;
Coordinates pos;
QMutex lock;
};
struct PathCTX {
PathCTX(MapData *data, const RectC &rect, int zoom, QList<Path> *list)
: data(data), rect(rect), zoom(zoom), list(list) {}
PathCTX(QFile &file, MapData *data, const RectC &rect, int zoom,
QList<Path> *list)
: file(file), data(data), rect(rect), zoom(zoom), list(list) {}
QFile &file;
MapData *data;
const RectC &rect;
int zoom;
@ -100,9 +106,11 @@ private:
};
struct PointCTX {
PointCTX(MapData *data, const RectC &rect, int zoom, QList<Point> *list)
: data(data), rect(rect), zoom(zoom), list(list) {}
PointCTX(QFile &file, MapData *data, const RectC &rect, int zoom,
QList<Point> *list)
: file(file), data(data), rect(rect), zoom(zoom), list(list) {}
QFile &file;
MapData *data;
const RectC &rect;
int zoom;
@ -141,16 +149,18 @@ private:
bool readTagInfo(SubFile &hdr, QVector<TagSource> &tags);
bool readMapInfo(SubFile &hdr, QByteArray &projection, bool &debugMap);
bool readHeader(QFile &file);
bool readSubFiles();
bool readSubFiles(QFile &file);
void clearTiles();
int level(int zoom) const;
void paths(const VectorTile *tile, const RectC &rect, int zoom,
void paths(QFile &file, VectorTile *tile, const RectC &rect, int zoom,
QList<Path> *list);
void points(const VectorTile *tile, const RectC &rect, int zoom,
void points(QFile &file, VectorTile *tile, const RectC &rect, int zoom,
QList<Point> *list);
bool readPaths(QFile &file, const VectorTile *tile, int zoom,
QList<Path> *list);
bool readPoints(QFile &file, const VectorTile *tile, int zoom,
QList<Point> *list);
bool readPaths(const VectorTile *tile, int zoom, QList<Path> *list);
bool readPoints(const VectorTile *tile, int zoom, QList<Point> *list);
static bool readTags(SubFile &subfile, int count,
const QVector<TagSource> &tags, QVector<Tag> &list);
@ -159,7 +169,7 @@ private:
friend HASH_T qHash(const MapData::Key &key);
QFile _pointFile, _pathFile;
QString _fileName;
RectC _bounds;
quint16 _tileSize;
QVector<SubFileInfo> _subFiles;
@ -169,7 +179,7 @@ private:
QCache<Key, QList<Path> > _pathCache;
QCache<Key, QList<Point> > _pointCache;
QMutex _pathLock, _pointLock;
QMutex _pathCacheLock, _pointCacheLock;
bool _valid;
QString _errorString;

View File

@ -16,32 +16,6 @@ using namespace Mapsforge;
static double LIMIT = cos(deg2rad(170));
static bool rectNearPolygon(const QPainterPath &path, const QRectF &rect)
{
return (path.boundingRect().contains(rect)
&& (path.contains(rect.topLeft()) || path.contains(rect.topRight())
|| path.contains(rect.bottomLeft()) || path.contains(rect.bottomRight())));
}
static QPointF centroid(const QPainterPath &polygon)
{
qreal area = 0;
qreal cx = 0, cy = 0;
for (int i = 0; i < polygon.elementCount(); i++) {
int j = (i == polygon.elementCount() - 1) ? 0 : i + 1;
qreal f = (polygon.elementAt(i).x * polygon.elementAt(j).y
- polygon.elementAt(j).x * polygon.elementAt(i).y);
area += f;
cx += (polygon.elementAt(i).x + polygon.elementAt(j).x) * f;
cy += (polygon.elementAt(i).y + polygon.elementAt(j).y) * f;
}
qreal factor = 1.0 / (3.0 * area);
return QPointF(cx * factor, cy * factor);
}
static const QByteArray *label(unsigned key, const QVector<MapData::Tag> &tags)
{
for (int i = 0; i < tags.size(); i++) {
@ -100,22 +74,22 @@ static QPainterPath parallelPath(const QPainterPath &p, double dy)
return h;
}
void RasterTile::processPointLabels(const QList<MapData::Point> &points,
void RasterTile::processLabels(const QList<MapData::Point> &points,
QList<TextItem*> &textItems) const
{
QList<const Style::TextRender*> labels(_style->pointLabels(_zoom));
QList<const Style::Symbol*> symbols(_style->pointSymbols(_zoom));
QList<PointText> items;
QList<Label> items;
QList<const Style::TextRender*> labels(_style->labels(_zoom));
QList<const Style::Symbol*> symbols(_style->symbols(_zoom));
for (int i = 0; i < points.size(); i++) {
const MapData::Point &point = points.at(i);
const Style::TextRender *ti = 0;
const Style::Symbol *si = 0;
const QByteArray *lbl = 0;
QList<const QByteArray *> ll;
for (int j = 0; j < symbols.size(); j++) {
const Style::Symbol *ri = symbols.at(j);
if (ri->rule().match(point.tags)) {
if (ri->rule().match(point.center(), point.tags)) {
si = ri;
break;
}
@ -123,31 +97,37 @@ void RasterTile::processPointLabels(const QList<MapData::Point> &points,
for (int j = 0; j < labels.size(); j++) {
const Style::TextRender *ri = labels.at(j);
if (ri->rule().match(point.tags)) {
if ((lbl = label(ri->key(), point.tags))) {
if (!si || si->id() == ri->symbolId()) {
if (ri->rule().match(point.center(), point.tags)) {
const QByteArray *lbl = label(ri->key(), point.tags);
if (lbl) {
if (!si) {
ti = ri;
ll.append(lbl);
break;
} else if (si->id() == ri->symbolId()) {
if (!ti)
ti = ri;
ll.append(lbl);
}
}
}
}
if (ti || si)
items.append(PointText(&point, lbl, si, ti));
items.append(Label(&point, ll, si, ti));
}
std::sort(items.begin(), items.end());
for (int i = 0; i < items.size(); i++) {
const PointText &p = items.at(i);
const QImage *img = p.si ? &p.si->img() : 0;
const QFont *font = p.ti ? &p.ti->font() : 0;
const QColor *color = p.ti ? &p.ti->fillColor() : 0;
const QColor *hColor = p.ti ? haloColor(p.ti) : 0;
const Label &l = items.at(i);
const QImage *img = l.si ? &l.si->img() : 0;
const QFont *font = l.ti ? &l.ti->font() : 0;
const QColor *color = l.ti ? &l.ti->fillColor() : 0;
const QColor *hColor = l.ti ? haloColor(l.ti) : 0;
PointItem *item = new PointItem(ll2xy(p.p->coordinates).toPoint(),
p.lbl, font, img, color, hColor);
PointItem *item = new PointItem(ll2xy(l.point->coordinates).toPoint(),
l.lbl, font, img, color, hColor);
if (item->isValid() && !item->collides(textItems))
textItems.append(item);
else
@ -155,73 +135,12 @@ void RasterTile::processPointLabels(const QList<MapData::Point> &points,
}
}
void RasterTile::processAreaLabels(const QVector<PainterPath> &paths,
QList<TextItem*> &textItems) const
{
QList<const Style::TextRender*> labels(_style->areaLabels(_zoom));
QList<const Style::Symbol*> symbols(_style->areaSymbols(_zoom));
QList<PathText> items;
for (int i = 0; i < paths.size(); i++) {
const PainterPath &path = paths.at(i);
const Style::TextRender *ti = 0;
const Style::Symbol *si = 0;
const QByteArray *lbl = 0;
if (!path.path->closed)
continue;
for (int j = 0; j < symbols.size(); j++) {
const Style::Symbol *ri = symbols.at(j);
if (ri->rule().match(path.path->closed, path.path->tags)) {
si = ri;
break;
}
}
for (int j = 0; j < labels.size(); j++) {
const Style::TextRender *ri = labels.at(j);
if (ri->rule().match(path.path->closed, path.path->tags)) {
if ((lbl = label(ri->key(), path.path->tags))) {
if (!si || si->id() == ri->symbolId()) {
ti = ri;
break;
}
}
}
}
if (ti || si)
items.append(PathText(&path, lbl, si, ti));
}
std::sort(items.begin(), items.end());
for (int i = 0; i < items.size(); i++) {
const PathText &p = items.at(i);
const QImage *img = p.si ? &p.si->img() : 0;
const QFont *font = p.ti ? &p.ti->font() : 0;
const QColor *color = p.ti ? &p.ti->fillColor() : 0;
const QColor *hColor = p.ti ? haloColor(p.ti) : 0;
QPointF pos = p.p->path->labelPos.isNull()
? centroid(p.p->pp) : ll2xy(p.p->path->labelPos);
PointItem *item = new PointItem(pos.toPoint(), p.lbl, font, img, color,
hColor);
if (item->isValid() && rectNearPolygon(p.p->pp, item->boundingRect())
&& !item->collides(textItems))
textItems.append(item);
else
delete item;
}
}
void RasterTile::processLineLabels(const QVector<PainterPath> &paths,
QList<TextItem*> &textItems) const
{
QList<const Style::TextRender*> labels(_style->pathLabels(_zoom));
QList<const Style::Symbol*> symbols(_style->lineSymbols(_zoom));
QList<PathText> items;
QList<LineLabel> items;
QSet<QByteArray> set;
for (int i = 0; i < paths.size(); i++) {
@ -235,7 +154,7 @@ void RasterTile::processLineLabels(const QVector<PainterPath> &paths,
for (int j = 0; j < symbols.size(); j++) {
const Style::Symbol *ri = symbols.at(j);
if (ri->rule().match(path.path->closed, path.path->tags)) {
if (ri->rule().matchPath(path.path->closed, path.path->point.tags)) {
si = ri;
break;
}
@ -243,8 +162,8 @@ void RasterTile::processLineLabels(const QVector<PainterPath> &paths,
for (int j = 0; j < labels.size(); j++) {
const Style::TextRender *ri = labels.at(j);
if (ri->rule().match(path.path->closed, path.path->tags)) {
if ((lbl = label(ri->key(), path.path->tags))) {
if (ri->rule().matchPath(path.path->closed, path.path->point.tags)) {
if ((lbl = label(ri->key(), path.path->point.tags))) {
if (!si || si->id() == ri->symbolId()) {
ti = ri;
break;
@ -254,57 +173,57 @@ void RasterTile::processLineLabels(const QVector<PainterPath> &paths,
}
if (ti || si)
items.append(PathText(&path, lbl, si, ti));
items.append(LineLabel(&path, lbl, si, ti));
}
std::sort(items.begin(), items.end());
for (int i = 0; i < items.size(); i++) {
const PathText &p = items.at(i);
const QImage *img = p.si ? &p.si->img() : 0;
const QFont *font = p.ti ? &p.ti->font() : 0;
const QColor *color = p.ti ? &p.ti->fillColor() : 0;
const QColor *hColor = p.ti ? haloColor(p.ti) : 0;
bool rotate = p.si ? p.si->rotate() : false;
const LineLabel &l = items.at(i);
const QImage *img = l.si ? &l.si->img() : 0;
const QFont *font = l.ti ? &l.ti->font() : 0;
const QColor *color = l.ti ? &l.ti->fillColor() : 0;
const QColor *hColor = l.ti ? haloColor(l.ti) : 0;
bool rotate = l.si ? l.si->rotate() : false;
bool limit = false;
if (p.ti) {
limit = (p.ti->key() == ID_ELE || p.ti->key() == ID_REF
|| (!p.si && p.ti->shield()));
if (limit && set.contains(*p.lbl))
if (l.ti) {
limit = (l.ti->key() == ID_ELE || l.ti->key() == ID_REF
|| (!l.si && l.ti->shield()));
if (limit && set.contains(*l.lbl))
continue;
}
if (!p.si && p.ti && p.ti->shield()) {
if (p.ti && p.lbl && set.contains(*p.lbl))
if (!l.si && l.ti && l.ti->shield()) {
if (l.ti && l.lbl && set.contains(*l.lbl))
continue;
if (p.p->pp.length() < _rect.width() / 3.0)
if (l.path->pp.length() < _rect.width() / 3.0)
continue;
QPointF pos = p.p->pp.pointAtPercent(0.5);
QPointF pos = l.path->pp.pointAtPercent(0.5);
PointItem *item = new PointItem(pos.toPoint(), p.lbl, font, color,
PointItem *item = new PointItem(pos.toPoint(), l.lbl, font, color,
hColor);
if (item->isValid() && _rect.contains(item->boundingRect().toRect())
&& !item->collides(textItems)) {
textItems.append(item);
if (p.ti && p.lbl)
set.insert(*p.lbl);
if (l.ti && l.lbl)
set.insert(*l.lbl);
} else
delete item;
} else {
PathItem *item = new PathItem(p.p->pp, p.lbl, img, _rect, font,
PathItem *item = new PathItem(l.path->pp, l.lbl, img, _rect, font,
color, hColor, rotate);
if (item->isValid() && !item->collides(textItems)) {
textItems.append(item);
if (limit)
set.insert(*p.lbl);
set.insert(*l.lbl);
} else {
delete item;
if (img && p.lbl) {
PathItem *item = new PathItem(p.p->pp, 0, img, _rect, 0, 0,
0, rotate);
if (img && l.lbl) {
PathItem *item = new PathItem(l.path->pp, 0, img, _rect, 0,
0, 0, rotate);
if (item->isValid() && !item->collides(textItems))
textItems.append(item);
else
@ -318,8 +237,13 @@ void RasterTile::processLineLabels(const QVector<PainterPath> &paths,
void RasterTile::drawTextItems(QPainter *painter,
const QList<TextItem*> &textItems)
{
for (int i = 0; i < textItems.size(); i++)
textItems.at(i)->paint(painter);
QRectF rect(_rect);
for (int i = 0; i < textItems.size(); i++) {
const TextItem *ti = textItems.at(i);
if (rect.intersects(ti->boundingRect()))
ti->paint(painter);
}
}
QPainterPath RasterTile::painterPath(const Polygon &polygon, bool curve) const
@ -374,13 +298,13 @@ void RasterTile::pathInstructions(const QList<MapData::Path> &paths,
for (int i = 0; i < paths.size(); i++) {
const MapData::Path &path = paths.at(i);
PainterPath &rp = painterPaths[i];
PathKey key(_zoom, path.closed, path.tags);
PathKey key(_zoom, path.closed, path.point.tags);
rp.path = &path;
if (!(ri = cache.object(key))) {
ri = new QList<const Style::PathRender*>(_style->paths(_zoom,
path.closed, path.tags));
path.closed, path.point.tags));
for (int j = 0; j < ri->size(); j++)
instructions.append(RenderInstruction(ri->at(j), &rp));
cache.insert(key, ri);
@ -484,6 +408,10 @@ void RasterTile::fetchData(QList<MapData::Path> &paths,
QList<MapData::Point> &points) const
{
QPoint ttl(_rect.topLeft());
QFile file(_data->fileName());
if (!file.open(QIODevice::ReadOnly | QIODevice::Unbuffered))
return;
QRectF pathRect(QPointF(ttl.x() - PATHS_EXTENT, ttl.y() - PATHS_EXTENT),
QPointF(ttl.x() + _rect.width() + PATHS_EXTENT, ttl.y() + _rect.height()
@ -495,15 +423,15 @@ void RasterTile::fetchData(QList<MapData::Path> &paths,
_transform.img2proj(pathRect.bottomRight()));
RectD searchRectD(_transform.img2proj(searchRect.topLeft()),
_transform.img2proj(searchRect.bottomRight()));
_data->paths(searchRectD.toRectC(_proj, 20), pathRectD.toRectC(_proj, 20),
_zoom, &paths);
_data->paths(file, searchRectD.toRectC(_proj, 20),
pathRectD.toRectC(_proj, 20), _zoom, &paths);
QRectF pointRect(QPointF(ttl.x() - TEXT_EXTENT, ttl.y() - TEXT_EXTENT),
QPointF(ttl.x() + _rect.width() + TEXT_EXTENT, ttl.y() + _rect.height()
+ TEXT_EXTENT));
RectD pointRectD(_transform.img2proj(pointRect.topLeft()),
_transform.img2proj(pointRect.bottomRight()));
_data->points(pointRectD.toRectC(_proj, 20), _zoom, &points);
_data->points(file, pointRectD.toRectC(_proj, 20), _zoom, &points);
}
MatrixD RasterTile::elevation(int extend) const
@ -543,8 +471,7 @@ void RasterTile::render()
drawPaths(&painter, paths, points, renderPaths);
processPointLabels(points, textItems);
processAreaLabels(renderPaths, textItems);
processLabels(points, textItems);
processLineLabels(renderPaths, textItems);
drawTextItems(&painter, textItems);

View File

@ -43,44 +43,44 @@ private:
const MapData::Path *path;
};
struct PointText {
PointText(const MapData::Point *p, const QByteArray *lbl,
struct Label {
Label(const MapData::Point *p, const QList<const QByteArray *> lbl,
const Style::Symbol *si, const Style::TextRender *ti)
: p(p), lbl(lbl), ti(ti), si(si)
: point(p), ti(ti), si(si), lbl(lbl)
{
Q_ASSERT(si || ti);
}
bool operator<(const PointText &other) const
bool operator<(const Label &other) const
{
if (priority() == other.priority())
return p->id < other.p->id;
return point->id < other.point->id;
else
return (priority() > other.priority());
}
int priority() const {return si ? si->priority() : ti->priority();}
const MapData::Point *p;
const QByteArray *lbl;
const MapData::Point *point;
const Style::TextRender *ti;
const Style::Symbol *si;
QList<const QByteArray *> lbl;
};
struct PathText {
PathText(const PainterPath *p, const QByteArray *lbl,
struct LineLabel {
LineLabel(const PainterPath *p, const QByteArray *lbl,
const Style::Symbol *si, const Style::TextRender *ti)
: p(p), lbl(lbl), ti(ti), si(si)
: path(p), lbl(lbl), ti(ti), si(si)
{
Q_ASSERT(si || ti);
}
bool operator<(const PathText &other) const
bool operator<(const LineLabel &other) const
{
return (priority() > other.priority());
}
int priority() const {return si ? si->priority() : ti->priority();}
const PainterPath *p;
const PainterPath *path;
const QByteArray *lbl;
const Style::TextRender *ti;
const Style::Symbol *si;
@ -120,7 +120,7 @@ private:
int layer() const
{
if (_path)
return _path->path->layer;
return _path->path->point.layer;
else if (_point)
return _point->layer;
else
@ -170,15 +170,28 @@ private:
class PointItem : public TextPointItem
{
public:
PointItem(const QPoint &point, const QByteArray *label,
PointItem(const QPoint &point, const QList<const QByteArray *> &lbl,
const QFont *font, const QImage *img, const QColor *color,
const QColor *haloColor) : TextPointItem(point,
label ? new QString(*label) : 0, font, img, color, haloColor, 0) {}
const QColor *haloColor) : TextPointItem(point, label(lbl),
font, img, color, haloColor, 0) {}
PointItem(const QPoint &point, const QByteArray *label,
const QFont *font, const QColor *color, const QColor *bgColor)
: TextPointItem(point, label ? new QString(*label) : 0, font, 0,
color, 0, bgColor) {}
~PointItem() {delete _text;}
private:
static QString *label(const QList<const QByteArray*> &ll)
{
if (ll.isEmpty())
return 0;
QString *ret = new QString(*ll.first());
for (int i = 1; i < ll.size(); i++)
ret->append("\n" + *ll.at(i));
return ret;
}
};
class PathItem : public TextPathItem
@ -208,9 +221,7 @@ private:
{return _transform.proj2img(_proj.ll2xy(c));}
Coordinates xy2ll(const QPointF &p) const
{return _proj.xy2ll(_transform.img2proj(p));}
void processPointLabels(const QList<MapData::Point> &points,
QList<TextItem*> &textItems) const;
void processAreaLabels(const QVector<PainterPath> &paths,
void processLabels(const QList<MapData::Point> &points,
QList<TextItem*> &textItems) const;
void processLineLabels(const QVector<PainterPath> &paths,
QList<TextItem*> &textItems) const;

View File

@ -126,8 +126,13 @@ Style::Rule::Filter::Filter(const MapData &data, const QList<QByteArray> &keys,
_vals = valList(vc);
}
bool Style::Rule::match(const QVector<MapData::Tag> &tags) const
bool Style::Rule::match(bool path, const QVector<MapData::Tag> &tags) const
{
Type type = path ? WayType : NodeType;
if (!(_type == Rule::AnyType || _type == type))
return false;
for (int i = 0; i < _filters.size(); i++)
if (!_filters.at(i).match(tags))
return false;
@ -135,7 +140,7 @@ bool Style::Rule::match(const QVector<MapData::Tag> &tags) const
return true;
}
bool Style::Rule::match(bool closed, const QVector<MapData::Tag> &tags) const
bool Style::Rule::matchPath(bool closed, const QVector<MapData::Tag> &tags) const
{
Closed cl = closed ? YesClosed : NoClosed;
@ -471,12 +476,8 @@ void Style::text(QXmlStreamReader &reader, const MapData &data,
if (fontSize) {
if (line)
_pathLabels.append(ri);
else {
if (rule._type == Rule::WayType || rule._type == Rule::AnyType)
_areaLabels.append(ri);
if (rule._type == Rule::NodeType || rule._type == Rule::AnyType)
_pointLabels.append(ri);
}
else
_labels.append(ri);
}
reader.skipCurrentElement();
@ -806,8 +807,7 @@ void Style::load(const MapData &data, qreal ratio)
std::sort(_symbols.begin(), _symbols.end());
std::sort(_lineSymbols.begin(), _lineSymbols.end());
std::stable_sort(_pointLabels.begin(), _pointLabels.end());
std::stable_sort(_areaLabels.begin(), _areaLabels.end());
std::stable_sort(_labels.begin(), _labels.end());
std::stable_sort(_pathLabels.begin(), _pathLabels.end());
}
@ -816,8 +816,7 @@ void Style::clear()
_paths = QList<PathRender>();
_circles = QList<CircleRender>();
_pathLabels = QList<TextRender>();
_pointLabels = QList<TextRender>();
_areaLabels = QList<TextRender>();
_labels = QList<TextRender>();
_symbols = QList<Symbol>();
_lineSymbols = QList<Symbol>();
_hillShading = HillShadingRender();
@ -864,38 +863,14 @@ QList<const Style::TextRender*> Style::pathLabels(int zoom) const
return list;
}
QList<const Style::TextRender*> Style::pointLabels(int zoom) const
QList<const Style::TextRender*> Style::labels(int zoom) const
{
QList<const TextRender*> list;
for (int i = 0; i < _pointLabels.size(); i++)
if (_pointLabels.at(i).rule()._zooms.contains(zoom))
list.append(&_pointLabels.at(i));
return list;
}
QList<const Style::TextRender*> Style::areaLabels(int zoom) const
{
QList<const TextRender*> list;
for (int i = 0; i < _areaLabels.size(); i++)
if (_areaLabels.at(i).rule()._zooms.contains(zoom))
list.append(&_areaLabels.at(i));
return list;
}
QList<const Style::Symbol*> Style::pointSymbols(int zoom) const
{
QList<const Symbol*> list;
for (int i = 0; i < _symbols.size(); i++) {
const Symbol &symbol = _symbols.at(i);
const Rule &rule = symbol.rule();
if (rule._zooms.contains(zoom) && (rule._type == Rule::AnyType
|| rule._type == Rule::NodeType))
list.append(&symbol);
for (int i = 0; i < _labels.size(); i++) {
const TextRender &label= _labels.at(i);
if (label.rule()._zooms.contains(zoom))
list.append(&label);
}
return list;
@ -914,15 +889,13 @@ QList<const Style::Symbol*> Style::lineSymbols(int zoom) const
return list;
}
QList<const Style::Symbol*> Style::areaSymbols(int zoom) const
QList<const Style::Symbol*> Style::symbols(int zoom) const
{
QList<const Symbol*> list;
for (int i = 0; i < _symbols.size(); i++) {
const Symbol &symbol = _symbols.at(i);
const Rule &rule = symbol.rule();
if (rule._zooms.contains(zoom) && (rule._type == Rule::AnyType
|| rule._type == Rule::WayType))
if (symbol.rule()._zooms.contains(zoom))
list.append(&symbol);
}

View File

@ -18,11 +18,8 @@ public:
public:
Rule() : _type(AnyType), _closed(AnyClosed), _zooms(0, 127) {}
bool match(const QVector<MapData::Tag> &tags) const;
bool match(bool closed, const QVector<MapData::Tag> &tags) const;
bool match(int zoom, bool closed,
const QVector<MapData::Tag> &tags) const;
bool match(int zoom, const QVector<MapData::Tag> &tags) const;
bool match(bool path, const QVector<MapData::Tag> &tags) const;
bool matchPath(bool closed, const QVector<MapData::Tag> &tags) const;
private:
enum Type {
@ -109,8 +106,12 @@ public:
if (!filter.isTautology())
_filters.append(filter);
}
bool match(int zoom, Type type, Closed closed,
const QVector<MapData::Tag> &tags) const;
bool match(int zoom, bool closed,
const QVector<MapData::Tag> &tags) const;
bool match(int zoom, const QVector<MapData::Tag> &tags) const;
friend class Style;
@ -266,9 +267,9 @@ public:
QList<const CircleRender *> circles(int zoom,
const QVector<MapData::Tag> &tags) const;
QList<const TextRender*> pathLabels(int zoom) const;
QList<const TextRender*> pointLabels(int zoom) const;
QList<const TextRender*> labels(int zoom) const;
QList<const TextRender*> areaLabels(int zoom) const;
QList<const Symbol*> pointSymbols(int zoom) const;
QList<const Symbol*> symbols(int zoom) const;
QList<const Symbol*> areaSymbols(int zoom) const;
QList<const Symbol*> lineSymbols(int zoom) const;
const HillShadingRender *hillShading(int zoom) const;
@ -317,7 +318,7 @@ private:
HillShadingRender _hillShading;
QList<PathRender> _paths;
QList<CircleRender> _circles;
QList<TextRender> _pathLabels, _pointLabels, _areaLabels;
QList<TextRender> _labels, _pathLabels;
QList<Symbol> _symbols, _lineSymbols;
bool loadXml(const QString &path, const MapData &data, qreal ratio);