1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-03 22:39:15 +02:00

Compare commits

...

27 Commits
11.8 ... 11.10

Author SHA1 Message Date
07954b7d1a Prohibited areas 2022-11-26 19:22:09 +01:00
08dbb315cb Turning basins 2022-11-26 16:51:12 +01:00
82b8314b74 Some more ENC stuff 2022-11-26 15:14:41 +01:00
12b17487ac Some more ENC render style enhancements 2022-11-26 13:05:08 +01:00
a05098f502 Fixed render order 2022-11-25 23:23:08 +01:00
4cfb967e39 Some more ENC render style improvements 2022-11-25 23:20:35 +01:00
04f45013eb Some more inland wates ECDIS style fixes/improvements 2022-11-25 02:16:17 +01:00
0c8a77a4ca Fixed broken inland ECDIS styles 2022-11-24 09:34:03 +01:00
03c9dbd2a7 Back to Qt 6.4.0 2022-11-23 20:54:55 +01:00
2a2cd5ff59 Use Qt 6.4.1 for Android CI builds 2022-11-23 20:40:09 +01:00
3b134d52aa Distinguish some more OSs 2022-11-23 20:20:35 +01:00
5fbc95f206 Version++ 2022-11-20 08:43:12 +01:00
f47a5e50ad MORFAC & CRANES rendering 2022-11-19 23:55:17 +01:00
0c5076eaaf Added missing fences rendering 2022-11-19 16:15:50 +01:00
2438150679 Updated github action components 2022-11-19 13:20:46 +01:00
d04c070fe1 Fixed typo 2022-11-17 22:03:30 +01:00
ac5f4cafeb Code cleanup 2022-11-17 13:26:45 +01:00
ccb0364e76 Some more missing ENC objects 2022-11-17 13:05:38 +01:00
414bdead17 Docks render style 2022-11-17 10:37:05 +01:00
8cf09a68d1 Some more missing ENC render style 2022-11-17 08:25:53 +01:00
e4c79d7275 Added missing dams and pylons rendering 2022-11-16 22:51:16 +01:00
a718f1e122 Properly handle non-ASCII characters
(Support for UCS-2 encoded files is still missing as there is no such sample
file available.)
2022-11-16 22:47:30 +01:00
6507764545 Version++ 2022-11-16 00:39:23 +01:00
bd2d66ecd3 Added traffic lines arrows 2022-11-14 22:29:27 +01:00
c09525f306 Fixed map order 2022-11-14 07:09:46 +01:00
5bc7487c3a Still wrong... Fixed the broken mask. 2022-11-11 11:26:15 +01:00
9b73b0f70e Fixed broken points ordering 2022-11-11 10:40:59 +01:00
33 changed files with 465 additions and 131 deletions

View File

@ -1,4 +1,4 @@
version: 11.8.{build}
version: 11.10.{build}
configuration:
- Release

View File

@ -26,12 +26,12 @@ jobs:
- name: Setup NDK path
run: echo "ANDROID_NDK_ROOT=${ANDROID_HOME}/ndk/23.1.7779620/" >> $GITHUB_ENV
- name: Install Qt (Desktop)
uses: jurplel/install-qt-action@v2
uses: jurplel/install-qt-action@v3
with:
aqtversion: '==2.1.0'
version: '6.4.0'
- name: Install Qt (Android)
uses: jurplel/install-qt-action@v2
uses: jurplel/install-qt-action@v3
with:
aqtversion: '==2.1.0'
version: '6.4.0'
@ -47,7 +47,7 @@ jobs:
- name: Build project
run: make -j2 apk
- name: Upload artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: GPXSee-armv7.apk
path: android-build/build/outputs/apk/debug/android-build-debug.apk

View File

@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update

View File

@ -13,7 +13,7 @@ jobs:
- name: Set environment variables
run: echo "PATH=/usr/local/opt/qt@5/bin:$PATH" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install dependencies
run: brew install qt5
- name: Create localization
@ -25,7 +25,7 @@ jobs:
- name: Create DMG
run: macdeployqt GPXSee.app -dmg
- name: Upload artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: GPXSee-qt5.dmg
path: GPXSee.dmg
@ -37,7 +37,7 @@ jobs:
- name: Set environment variables
run: echo "PATH=/usr/local/opt/qt@6/bin:$PATH" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install dependencies
run: brew install qt6
- name: Create localization
@ -49,7 +49,7 @@ jobs:
- name: Create DMG
run: macdeployqt GPXSee.app -dmg
- name: Upload artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: GPXSee-qt6.dmg
path: GPXSee.dmg

View File

@ -10,7 +10,7 @@ GPS log file formats.
QuadTiles).
* Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases,
Garmin IMG/GMAP & JNX maps, TwoNav RMaps, GeoTIFF images, BSB charts,
ENC charts KMZ maps, AlpineQuest maps, Locus/OsmAnd/RMaps SQLite maps,
ENC charts, KMZ maps, AlpineQuest maps, Locus/OsmAnd/RMaps SQLite maps,
Mapsforge vector maps, QCT maps, GEMF maps, Osmdroid SQLite maps, Orux maps,
ESRI World-File georeferenced images).
* Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else {
TARGET = GPXSee
}
VERSION = 11.8
VERSION = 11.10
QT += core \
gui \
@ -29,6 +29,7 @@ HEADERS += src/common/config.h \
src/GUI/pluginparameters.h \
src/common/garmin.h \
src/common/coordinates.h \
src/common/linec.h \
src/common/range.h \
src/common/rectc.h \
src/common/textcodec.h \

View File

@ -172,6 +172,20 @@
<file alias="chimney.png">icons/map/marine/chimney.png</file>
<file alias="platform.png">icons/map/marine/platform.png</file>
<file alias="ferry-line.png">icons/map/marine/ferry-line.png</file>
<file alias="dw-route-line.png">icons/map/marine/dw-route-line.png</file>
<file alias="fence-line.png">icons/map/marine/fence-line.png</file>
<file alias="crane.png">icons/map/marine/crane.png</file>
<file alias="distance-mark.png">icons/map/marine/distance-mark.png</file>
<file alias="conveyor-line.png">icons/map/marine/conveyor-line.png</file>
<file alias="pipeline-overhead.png">icons/map/marine/pipeline-overhead.png</file>
<file alias="coast-guard.png">icons/map/marine/coast-guard.png</file>
<file alias="monument.png">icons/map/marine/monument.png</file>
<file alias="radio.png">icons/map/marine/radio.png</file>
<file alias="radar.png">icons/map/marine/radar.png</file>
<file alias="radar-transponder.png">icons/map/marine/radar-transponder.png</file>
<file alias="silo.png">icons/map/marine/silo.png</file>
<file alias="turning-basin.png">icons/map/marine/turning-basin.png</file>
<file alias="entry-prohibited-line.png">icons/map/marine/entry-prohibited-line.png</file>
</qresource>
<!-- Mapsforge rendertheme -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

View File

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

View File

@ -7,12 +7,18 @@
#include "downloader.h"
#if defined(Q_OS_LINUX)
#if defined(Q_OS_ANDROID)
#define PLATFORM_STR "Android"
#elif defined(Q_OS_LINUX)
#define PLATFORM_STR "Linux"
#elif defined(Q_OS_WIN32)
#define PLATFORM_STR "Windows"
#elif defined(Q_OS_MAC)
#define PLATFORM_STR "OS X"
#elif defined(Q_OS_BSD4)
#define PLATFORM_STR "BSD"
#elif defined(Q_OS_HAIKU)
#define PLATFORM_STR "Haiku"
#else
#define PLATFORM_STR "Unknown"
#endif

25
src/common/linec.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef LINEC_H
#define LINEC_H
#include "coordinates.h"
class LineC
{
public:
LineC(const Coordinates &c1, const Coordinates &c2) : _c1(c1), _c2(c2) {}
const Coordinates &c1() const {return _c1;}
const Coordinates &c2() const {return _c2;}
Coordinates pointAt(double t) const
{
return Coordinates(
_c1.lon() + (_c2.lon() - _c1.lon()) * t,
_c1.lat() + (_c2.lat() - _c1.lat()) * t);
}
private:
Coordinates _c1, _c2;
};
#endif // LINEC_H

View File

@ -3,6 +3,7 @@
#define CATACH 8
#define CATBUA 10
#define CATDIS 21
#define CATHAF 30
#define CATLMK 35
#define CATMOR 40
@ -12,8 +13,14 @@
#define DRVAL1 87
#define ELEVAT 90
#define OBJNAM 116
#define ORIENT 117
#define RESTRN 131
#define VALDCO 174
#define WATLEV 187
#define I_CATACH 17000
#define I_RESTRN 17004
#define I_WTWDIS 17064
#define I_HUNITS 17103
#endif // ENC_ATTRIBUTES_H

View File

@ -194,7 +194,7 @@ bool ISO8211::readDDR(QFile &file)
int len = readDR(file, fields);
if (len < 0) {
_errorString = "Not a ENC file";
_errorString = "Not a ISO8211 file";
return false;
}

View File

@ -20,34 +20,45 @@ static QMap<uint,uint> orderMapInit()
{
QMap<uint,uint> map;
map.insert(TYPE(CGUSTA), 0);
map.insert(SUBTYPE(BUAARE, 1), 1);
map.insert(SUBTYPE(BUAARE, 5), 2);
map.insert(SUBTYPE(BUAARE, 4), 2);
map.insert(SUBTYPE(BUAARE, 3), 3);
map.insert(SUBTYPE(BUAARE, 2), 4);
map.insert(SUBTYPE(BUAARE, 6), 5);
map.insert(SUBTYPE(BUAARE, 0), 6);
map.insert(TYPE(BCNISD), 7);
map.insert(TYPE(BCNLAT), 8);
map.insert(TYPE(BCNSAW), 9);
map.insert(TYPE(BCNSPP), 10);
map.insert(TYPE(BOYCAR), 11);
map.insert(TYPE(BOYINB), 12);
map.insert(TYPE(BOYISD), 13);
map.insert(TYPE(BOYLAT), 14);
map.insert(TYPE(BOYSAW), 15);
map.insert(TYPE(BOYSPP), 16);
map.insert(TYPE(MORFAC), 17);
map.insert(TYPE(OFSPLF), 18);
map.insert(TYPE(LIGHTS), 19);
map.insert(TYPE(OBSTRN), 20);
map.insert(TYPE(WRECKS), 21);
map.insert(TYPE(UWTROC), 22);
map.insert(TYPE(HRBFAC), 23);
map.insert(TYPE(PILPNT), 24);
map.insert(TYPE(ACHBRT), 25);
map.insert(TYPE(LNDELV), 26);
map.insert(TYPE(LNDMRK), 27);
map.insert(SUBTYPE(BUAARE, 4), 3);
map.insert(SUBTYPE(BUAARE, 3), 4);
map.insert(SUBTYPE(BUAARE, 2), 5);
map.insert(SUBTYPE(BUAARE, 6), 6);
map.insert(SUBTYPE(BUAARE, 0), 7);
map.insert(TYPE(RDOSTA), 8);
map.insert(TYPE(RADSTA), 9);
map.insert(TYPE(RTPBCN), 10);
map.insert(TYPE(BCNISD), 11);
map.insert(TYPE(BCNLAT), 12);
map.insert(TYPE(I_BCNLAT), 12);
map.insert(TYPE(BCNSAW), 13);
map.insert(TYPE(BCNSPP), 14);
map.insert(TYPE(BOYCAR), 15);
map.insert(TYPE(BOYINB), 16);
map.insert(TYPE(BOYISD), 17);
map.insert(TYPE(BOYLAT), 18);
map.insert(TYPE(I_BOYLAT), 18);
map.insert(TYPE(BOYSAW), 19);
map.insert(TYPE(BOYSPP), 20);
map.insert(TYPE(MORFAC), 21);
map.insert(TYPE(OFSPLF), 22);
map.insert(TYPE(LIGHTS), 23);
map.insert(TYPE(OBSTRN), 24);
map.insert(TYPE(WRECKS), 25);
map.insert(TYPE(UWTROC), 26);
map.insert(TYPE(HRBFAC), 27);
map.insert(TYPE(PILPNT), 28);
map.insert(TYPE(ACHBRT), 29);
map.insert(TYPE(I_ACHBRT), 29);
map.insert(TYPE(CRANES), 30);
map.insert(TYPE(I_CRANES), 30);
map.insert(TYPE(LNDMRK), 31);
map.insert(TYPE(SILTNK), 32);
map.insert(TYPE(LNDELV), 33);
map.insert(TYPE(I_DISMAR), 0xFFFFFFFE);
map.insert(TYPE(SOUNDG), 0xFFFFFFFF);
return map;
@ -57,9 +68,9 @@ static QMap<uint,uint> orderMap = orderMapInit();
static uint order(uint type)
{
uint st = (type>>16 == BUAARE) ? type : type && 0xFFFF;
uint st = ((type>>16) == BUAARE) ? type : (type & 0xFFFF0000);
QMap<uint, uint>::const_iterator it = orderMap.find(st);
return (it == orderMap.constEnd()) ? type + 512 : it.value();
return (it == orderMap.constEnd()) ? (type>>16) + 512 : it.value();
}
static void warning(const ISO8211::Field &FRID, uint PRIM)
@ -142,26 +153,6 @@ static bool polygonCb(MapData::Poly *polygon, void *context)
return true;
}
static uint depthLevel(const QString &str)
{
double minDepth = str.isEmpty() ? -1 : str.toDouble();
if (minDepth < 0)
return 0;
else if (minDepth < 2)
return 1;
else if (minDepth < 5)
return 2;
else if (minDepth < 10)
return 3;
else if (minDepth < 20)
return 4;
else if (minDepth < 50)
return 5;
else
return 6;
}
static Coordinates coordinates(int x, int y, uint COMF)
{
return Coordinates(x / (double)COMF, y / (double)COMF);
@ -179,11 +170,85 @@ static Coordinates point(const ISO8211::Record &r, uint COMF)
return coordinates(x, y, COMF);
}
MapData::Point::Point(uint type, const Coordinates &c, const QString &label)
: _type(type), _pos(c), _label(label)
static uint depthLevel(const QByteArray &ba)
{
double minDepth = ba.isEmpty() ? -1 : ba.toDouble();
if (minDepth < 0)
return 0;
else if (minDepth < 2)
return 1;
else if (minDepth < 5)
return 2;
else if (minDepth < 10)
return 3;
else if (minDepth < 20)
return 4;
else if (minDepth < 50)
return 5;
else
return 6;
}
static QString hUnits(uint type)
{
switch (type) {
case 1:
return "m";
case 2:
return "ft";
case 3:
return "km";
case 4:
return "hm";
case 5:
return "mi";
case 6:
return "nm";
default:
return QString();
}
}
MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
const QByteArray &param) : _type(type), _pos(c), _label(label)
{
uint hash = (uint)qHash(QPair<double,double>(c.lon(), c.lat()));
_id = ((quint64)order(type))<<32 | hash;
if ((type & 0xFFFF0000) == TYPE(I_DISMAR)) {
_label = hUnits((type>>8)&0xFF) + " " + QString::fromLatin1(param);
_type = SUBTYPE(I_DISMAR, type & 0xFF);
}
}
MapData::Poly::Poly(uint type, const Polygon &path, const QByteArray &param)
: _type(type), _path(path)
{
if (type == TYPE(DEPARE))
_type = SUBTYPE(DEPARE, depthLevel(param));
else if (type == TYPE(TSSLPT)) {
double angle = param.toDouble();
_type = SUBTYPE(TSSLPT, (uint)(angle * 10));
}
}
MapData::Line::Line(uint type, const QVector<Coordinates> &path,
const QString &label, const QByteArray &param) : _type(type), _path(path),
_label(label)
{
if (type == TYPE(DEPCNT) || type == TYPE(LNDELV))
_label = QString::fromLatin1(param);
}
RectC MapData::Line::bounds() const
{
RectC b;
for (int i = 0; i < _path.size(); i++)
b = b.united(_path.at(i));
return b;
}
QVector<MapData::Sounding> MapData::soundings(const ISO8211::Record &r,
@ -409,6 +474,7 @@ Polygon MapData::polyGeometry(const ISO8211::Record &r, const RecordMap &vc,
MapData::Attr MapData::pointAttr(const ISO8211::Record &r, uint OBJL)
{
QString label;
QByteArray param;
uint subtype = 0;
const ISO8211::Field *ATTF = r.field("ATTF");
@ -420,22 +486,31 @@ MapData::Attr MapData::pointAttr(const ISO8211::Record &r, uint OBJL)
uint key = av.at(0).toUInt();
if (key == OBJNAM)
label = av.at(1).toString();
label = QString::fromLatin1(av.at(1).toByteArray());
if ((OBJL == HRBFAC && key == CATHAF)
|| (OBJL == LNDMRK && key == CATLMK)
|| (OBJL == WRECKS && key == CATWRK)
|| (OBJL == MORFAC && key == CATMOR)
|| (OBJL == UWTROC && key == WATLEV)
|| (OBJL == BUAARE && key == CATBUA))
subtype = av.at(1).toString().toUInt();
subtype = av.at(1).toByteArray().toUInt();
else if (OBJL == I_DISMAR && key == CATDIS)
subtype |= av.at(1).toByteArray().toUInt();
else if (OBJL == I_DISMAR && key == I_HUNITS)
subtype |= av.at(1).toByteArray().toUInt() << 8;
if (OBJL == I_DISMAR && key == I_WTWDIS)
param = av.at(1).toByteArray();
}
return Attr(subtype, label);
return Attr(subtype, label, param);
}
MapData::Attr MapData::lineAttr(const ISO8211::Record &r, uint OBJL)
{
QString label;
QByteArray param;
uint subtype = 0;
const ISO8211::Field *ATTF = r.field("ATTF");
@ -447,20 +522,23 @@ MapData::Attr MapData::lineAttr(const ISO8211::Record &r, uint OBJL)
uint key = av.at(0).toUInt();
if (key == OBJNAM)
label = av.at(1).toString();
label = QString::fromLatin1(av.at(1).toByteArray());
if ((OBJL == RECTRC || OBJL == RCRTCL) && key == CATTRK)
subtype = av.at(1).toByteArray().toUInt();
if ((OBJL == DEPCNT && key == VALDCO)
|| (OBJL == LNDELV && key == ELEVAT))
label = av.at(1).toString();
if (OBJL == RECTRC && key == CATTRK)
subtype = av.at(1).toString().toUInt();
param = av.at(1).toByteArray();
}
return Attr(subtype, label);
return Attr(subtype, label, param);
}
MapData::Attr MapData::polyAttr(const ISO8211::Record &r, uint OBJL)
{
QString label;
QByteArray param;
uint subtype = 0;
const ISO8211::Field *ATTF = r.field("ATTF");
@ -471,23 +549,30 @@ MapData::Attr MapData::polyAttr(const ISO8211::Record &r, uint OBJL)
const QVector<QVariant> &av = ATTF->data().at(i);
uint key = av.at(0).toUInt();
if (OBJL == DEPARE && key == DRVAL1)
subtype = depthLevel(av.at(1).toString());
else if ((OBJL == RESARE && key == CATREA)
|| (OBJL == ACHARE && key == CATACH))
subtype = av.at(1).toString().toUInt();
else if (OBJL == RESARE && key == RESTRN) {
if (av.at(1).toString().toUInt() == 1)
if ((OBJL == RESARE && key == CATREA)
|| (OBJL == I_RESARE && key == CATREA)
|| (OBJL == ACHARE && key == CATACH)
|| (OBJL == I_ACHARE && key == I_CATACH))
subtype = av.at(1).toByteArray().toUInt();
else if ((OBJL == RESARE && key == RESTRN)
|| (OBJL == I_RESARE && key == I_RESTRN)) {
if (av.at(1).toByteArray().toUInt() == 1)
subtype = 2;
if (av.at(1).toByteArray().toUInt() == 7)
subtype = 17;
}
if ((OBJL == TSSLPT && key == ORIENT)
|| (OBJL == DEPARE && key == DRVAL1))
param = av.at(1).toByteArray();
}
return Attr(subtype, label);
return Attr(subtype, label, param);
}
MapData::Point *MapData::pointObject(const Sounding &s)
{
return new Point(SOUNDG<<16, s.c, QString::number(s.depth));
return new Point(TYPE(SOUNDG), s.c, QString::number(s.depth), QByteArray());
}
MapData::Point *MapData::pointObject(const ISO8211::Record &r,
@ -496,8 +581,8 @@ MapData::Point *MapData::pointObject(const ISO8211::Record &r,
Coordinates c(pointGeometry(r, vi, vc, COMF));
Attr attr(pointAttr(r, OBJL));
return (c.isNull() ? 0 : new Point(OBJL<<16|attr.subtype(), c,
attr.label()));
return (c.isNull() ? 0 : new Point(SUBTYPE(OBJL,attr.subtype()), c,
attr.label(), attr.param()));
}
MapData::Line *MapData::lineObject(const ISO8211::Record &r,
@ -506,8 +591,8 @@ MapData::Line *MapData::lineObject(const ISO8211::Record &r,
QVector<Coordinates> path(lineGeometry(r, vc, ve, COMF));
Attr attr(lineAttr(r, OBJL));
return (path.isEmpty() ? 0 : new Line(OBJL<<16|attr.subtype(), path,
attr.label()));
return (path.isEmpty() ? 0 : new Line(SUBTYPE(OBJL, attr.subtype()), path,
attr.label(), attr.param()));
}
MapData::Poly *MapData::polyObject(const ISO8211::Record &r,
@ -516,7 +601,8 @@ MapData::Poly *MapData::polyObject(const ISO8211::Record &r,
Polygon path(polyGeometry(r, vc, ve, COMF));
Attr attr(polyAttr(r, OBJL));
return (path.isEmpty() ? 0 : new Poly(OBJL<<16|attr.subtype(), path));
return (path.isEmpty() ? 0 : new Poly(SUBTYPE(OBJL, attr.subtype()), path,
attr.param()));
}
bool MapData::processRecord(const ISO8211::Record &record,
@ -638,8 +724,10 @@ MapData::MapData(const QString &path): _fileName(path)
_errorString = ddf.errorString();
return;
}
if (!processRecord(record, gv, COMF, _name))
if (!processRecord(record, gv, COMF, _name)) {
_errorString = "Invalid S-57 record";
return;
}
}
Rect b;
@ -788,25 +876,25 @@ Range MapData::zooms() const
double size = qMin(_bounds.width(), _bounds.height());
if (size > 180)
return Range(0, 20);
return Range(0, 10);
else if (size > 90)
return Range(1, 20);
return Range(1, 11);
else if (size > 45)
return Range(2, 20);
return Range(2, 12);
else if (size > 22.5)
return Range(3, 20);
return Range(3, 13);
else if (size > 11.25)
return Range(4, 20);
return Range(4, 14);
else if (size > 5.625)
return Range(5, 20);
return Range(5, 15);
else if (size > 2.813)
return Range(6, 20);
return Range(6, 16);
else if (size > 1.406)
return Range(7, 20);
return Range(7, 17);
else if (size > 0.703)
return Range(8, 20);
return Range(8, 18);
else if (size > 0.352)
return Range(9, 20);
return Range(9, 19);
else if (size > 0.176)
return Range(10, 20);
else if (size > 0.088)

View File

@ -15,8 +15,7 @@ class MapData
public:
class Poly {
public:
Poly(uint type, const Polygon &path)
: _type(type), _path(path) {}
Poly(uint type, const Polygon &path, const QByteArray &param);
RectC bounds() const {return _path.boundingRect();}
const Polygon &path() const {return _path;}
@ -29,18 +28,10 @@ public:
class Line {
public:
Line(uint type, const QVector<Coordinates> &path, const QString &label)
: _type(type), _path(path), _label(label) {}
Line(uint type, const QVector<Coordinates> &path, const QString &label,
const QByteArray &param);
RectC bounds() const
{
RectC b;
for (int i = 0; i < _path.size(); i++)
b = b.united(_path.at(i));
return b;
}
RectC bounds() const;
const QVector<Coordinates> &path() const {return _path;}
uint type() const {return _type;}
const QString &label() const {return _label;}
@ -53,7 +44,8 @@ public:
class Point {
public:
Point(uint type, const Coordinates &c, const QString &label);
Point(uint type, const Coordinates &c, const QString &label,
const QByteArray &param);
const Coordinates &pos() const {return _pos;}
uint type() const {return _type;}
@ -124,15 +116,17 @@ private:
class Attr {
public:
Attr() : _subtype(0) {}
Attr(uint subtype, const QString &label = QString())
: _subtype(subtype), _label(label) {}
Attr(uint subtype, const QString &label, const QByteArray &param)
: _subtype(subtype), _label(label), _param(param) {}
unsigned subtype() const {return _subtype;}
const QString &label() const {return _label;}
const QByteArray &param() const {return _param;}
private:
unsigned _subtype;
QString _label;
QByteArray _param;
};
struct Sounding {

View File

@ -9,6 +9,7 @@
#define BCNLAT 7
#define BCNSAW 8
#define BCNSPP 9
#define BERTHS 10
#define BRIDGE 11
#define BUISGL 12
#define BUAARE 13
@ -21,42 +22,83 @@
#define CBLOHD 21
#define CBLSUB 22
#define CANALS 23
#define CGUSTA 29
#define COALNE 30
#define CONVYR 34
#define CRANES 35
#define DAMCON 38
#define DWRTPT 41
#define DEPARE 42
#define DEPCNT 43
#define DRGARE 46
#define DRYDOC 47
#define DMPGRD 48
#define DYKCON 49
#define FAIRWY 51
#define FNCLNE 52
#define FERYRT 53
#define FLODOC 57
#define GATCON 61
#define HRBFAC 64
#define HULKES 65
#define LAKARE 69
#define LNDARE 71
#define LNDELV 72
#define LNDMRK 74
#define LIGHTS 75
#define LOKBSN 79
#define MORFAC 84
#define NAVLNE 85
#define OBSTRN 86
#define OFSPLF 87
#define PILPNT 90
#define PIPOHD 93
#define PIPSOL 94
#define PONTON 95
#define PRCARE 96
#define PYLONS 98
#define RADSTA 102
#define RTPBCN 103
#define RDOSTA 105
#define RAILWY 106
#define RCRTCL 108
#define RECTRC 109
#define RESARE 112
#define RIVERS 114
#define ROADWY 116
#define SLCONS 122
#define SILTNK 125
#define SLOTOP 126
#define SOUNDG 129
#define TSELNE 145
#define TSSBND 146
#define TSSLPT 148
#define TSEZNE 150
#define UWTROC 153
#define UNSARE 154
#define WRECKS 159
#define M_COVR 302
#define I_ACHBRT 17000
#define I_ACHARE 17001
#define I_DISMAR 17004
#define I_RESARE 17005
#define I_BERTHS 17010
#define I_BRIDGE 17011
#define I_CBLOHD 17012
#define I_FERYRT 17013
#define I_LOKBSN 17016
#define I_HULKES 17020
#define I_PONTON 17021
#define I_PIPOHD 17024
#define I_FLODOC 17025
#define I_BCNLAT 17028
#define I_BOYLAT 17029
#define I_CRANES 17030
#define I_GATCON 17031
#define I_SLCONS 17032
#define I_WTWAXS 17051
#define I_TERMNL 17064
#define I_TRNBSN 17065
#endif // ENC_OBJECTS_H

View File

@ -1,4 +1,6 @@
#include <QtMath>
#include <QPainter>
#include "common/linec.h"
#include "map/bitmapline.h"
#include "map/textpointitem.h"
#include "map/textpathitem.h"
@ -8,8 +10,9 @@
using namespace ENC;
#define ICON_PADDING 2
#define ARROW_SIZE 0.005
#define ECDIS(x) (((x)>TYPE(17000))?((x)-TYPE(17000)):(x))
const float C1 = 0.866025f; /* sqrt(3)/2 */
static const QColor haloColor(Qt::white);
@ -51,6 +54,36 @@ static const Style& style()
return s;
}
static double area(const QVector<Coordinates> &polygon)
{
double area = 0;
for (int i = 0; i < polygon.size(); i++) {
int j = (i + 1) % polygon.size();
area += polygon.at(i).lon() * polygon.at(j).lat();
area -= polygon.at(i).lat() * polygon.at(j).lon();
}
area /= 2.0;
return area;
}
static Coordinates centroid(const QVector<Coordinates> &polygon)
{
double cx = 0, cy = 0;
double factor = 1.0 / (6.0 * area(polygon));
for (int i = 0; i < polygon.size(); i++) {
int j = (i + 1) % polygon.size();
qreal f = (polygon.at(i).lon() * polygon.at(j).lat()
- polygon.at(j).lon() * polygon.at(i).lat());
cx += (polygon.at(i).lon() + polygon.at(j).lon()) * f;
cy += (polygon.at(i).lat() + polygon.at(j).lat()) * f;
}
return Coordinates(cx * factor, cy * factor);
}
QPainterPath RasterTile::painterPath(const Polygon &polygon) const
{
QPainterPath path;
@ -77,6 +110,48 @@ QPolygonF RasterTile::polyline(const QVector<Coordinates> &path) const
return polygon;
}
QPolygonF RasterTile::arrow(const Coordinates &c, qreal angle) const
{
Coordinates t[3], r[4];
QPolygonF polygon;
t[0] = c;
t[1] = Coordinates(t[0].lon() - qCos(angle - M_PI/3) * ARROW_SIZE,
t[0].lat() - qSin(angle - M_PI/3) * ARROW_SIZE);
t[2] = Coordinates(t[0].lon() - qCos(angle - M_PI + M_PI/3) * ARROW_SIZE,
t[0].lat() - qSin(angle - M_PI + M_PI/3) * ARROW_SIZE);
LineC l(t[1], t[2]);
r[0] = l.pointAt(0.25);
r[1] = l.pointAt(0.75);
r[2] = Coordinates(r[0].lon() - C1 * ARROW_SIZE * qCos(angle - M_PI/2),
r[0].lat() - C1 * ARROW_SIZE * qSin(angle - M_PI/2));
r[3] = Coordinates(r[1].lon() - C1 * ARROW_SIZE * qCos(angle - M_PI/2),
r[1].lat() - C1 * ARROW_SIZE * qSin(angle - M_PI/2));
polygon << ll2xy(t[0]) << ll2xy(t[2]) << ll2xy(r[1]) << ll2xy(r[3])
<< ll2xy(r[2]) << ll2xy(r[0]) << ll2xy(t[1]);
return polygon;
}
void RasterTile::drawArrows(QPainter *painter)
{
painter->setPen(QPen(QColor("#eb49eb"), 1));
painter->setBrush(QBrush("#80eb49eb"));
for (int i = 0; i < _polygons.size(); i++) {
const MapData::Poly *poly = _polygons.at(i);
if (poly->type()>>16 == TSSLPT) {
qreal angle = (poly->type() & 0xFFFF) / 10.0;
QPolygonF polygon(arrow(centroid(poly->path().first()),
deg2rad(180 - angle)));
painter->drawPolygon(polygon);
}
}
}
void RasterTile::drawPolygons(QPainter *painter)
{
const Style &s = style();
@ -84,9 +159,9 @@ void RasterTile::drawPolygons(QPainter *painter)
for (int n = 0; n < s.drawOrder().size(); n++) {
for (int i = 0; i < _polygons.size(); i++) {
const MapData::Poly *poly = _polygons.at(i);
if (ECDIS(poly->type()) != s.drawOrder().at(n))
if (poly->type() != s.drawOrder().at(n))
continue;
const Style::Polygon &style = s.polygon(ECDIS(poly->type()));
const Style::Polygon &style = s.polygon(poly->type());
if (!style.img().isNull()) {
for (int i = 0; i < poly->path().size(); i++)
@ -109,7 +184,7 @@ void RasterTile::drawLines(QPainter *painter)
for (int i = 0; i < _lines.size(); i++) {
const MapData::Line *line = _lines.at(i);
const Style::Line &style = s.line(ECDIS(line->type()));
const Style::Line &style = s.line(line->type());
if (!style.img().isNull()) {
BitmapLine::draw(painter, polyline(line->path()), style.img());
@ -135,14 +210,14 @@ void RasterTile::processPoints(QList<TextItem*> &textItems)
for (int i = 0; i < _points.size(); i++) {
const MapData::Point *point = _points.at(i);
const Style::Point &style = s.point(ECDIS(point->type()));
const Style::Point &style = s.point(point->type());
const QString *label = point->label().isEmpty() ? 0 : &(point->label());
const QImage *img = style.img().isNull() ? 0 : &style.img();
const QFont *fnt = font(style.textFontSize());
const QColor *color = &style.textColor();
const QColor *hColor = Style::isSounding(ECDIS(point->type()))
? 0 : &haloColor;
const QColor *hColor = (Style::isSounding(point->type())
|| Style::isDistanceMark(point->type())) ? 0 : &haloColor;
if ((!label || !fnt) && !img)
continue;
@ -162,7 +237,7 @@ void RasterTile::processLines(QList<TextItem*> &textItems)
for (int i = 0; i < _lines.size(); i++) {
const MapData::Line *line = _lines.at(i);
const Style::Line &style = s.line(ECDIS(line->type()));
const Style::Line &style = s.line(line->type());
if (style.img().isNull() && style.pen() == Qt::NoPen)
continue;
@ -198,6 +273,7 @@ void RasterTile::render()
drawPolygons(&painter);
drawLines(&painter);
drawArrows(&painter);
drawTextItems(&painter, textItems);

View File

@ -32,10 +32,12 @@ private:
{return _transform.proj2img(_proj.ll2xy(c));}
QPainterPath painterPath(const Polygon &polygon) const;
QPolygonF polyline(const QVector<Coordinates> &path) const;
QPolygonF arrow(const Coordinates &c, qreal angle) const;
void processPoints(QList<TextItem*> &textItems);
void processLines(QList<TextItem*> &textItems);
void drawBitmapPath(QPainter *painter, const QImage &img,
const Polygon &polygon);
void drawArrows(QPainter *painter);
void drawPolygons(QPainter *painter);
void drawLines(QPainter *painter);
void drawTextItems(QPainter *painter, const QList<TextItem*> &textItems);

View File

@ -22,6 +22,7 @@ void Style::defaultPolygonStyle()
_polygons[TYPE(BUISGL)] = Polygon(QBrush("#d98b21"),
QPen(QColor("#966118"), 1.5));
_polygons[TYPE(BRIDGE)] = Polygon(QBrush("#a58140"));
_polygons[TYPE(I_BRIDGE)] = Polygon(QBrush("#a58140"));
_polygons[SUBTYPE(DEPARE, 0)] = Polygon(QBrush("#98c064"));
_polygons[SUBTYPE(DEPARE, 1)] = Polygon(QBrush("#a0a0ff"));
_polygons[SUBTYPE(DEPARE, 2)] = Polygon(QBrush("#b0b0ff"));
@ -35,9 +36,17 @@ void Style::defaultPolygonStyle()
Qt::DashDotDotLine));
_polygons[TYPE(OBSTRN)] = Polygon(Qt::NoBrush, QPen(QColor("#000000"), 1.5,
Qt::DotLine));
_polygons[TYPE(UWTROC)] = Polygon(Qt::NoBrush, QPen(QColor("#000000"), 1.5,
Qt::DotLine));
_polygons[TYPE(PONTON)] = Polygon(QBrush("#333333"));
_polygons[TYPE(I_PONTON)] = Polygon(QBrush("#333333"));
_polygons[TYPE(HULKES)] = Polygon(QBrush("#333333"));
_polygons[TYPE(I_HULKES)] = Polygon(QBrush("#333333"));
_polygons[TYPE(DRYDOC)] = Polygon(QBrush("#333333"));
_polygons[TYPE(SLCONS)] = Polygon(Qt::NoBrush, QPen(QColor("#333333"), 1.5,
Qt::DashLine));
_polygons[TYPE(I_SLCONS)] = Polygon(Qt::NoBrush, QPen(QColor("#333333"), 1.5,
Qt::DashLine));
_polygons[TYPE(LAKARE)] = Polygon(QBrush("#9fc4e1"),
QPen(QColor("#000000"), 1));
_polygons[TYPE(CANALS)] = Polygon(QBrush("#9fc4e1"),
@ -52,19 +61,56 @@ void Style::defaultPolygonStyle()
_polygons[TYPE(UNSARE)] = Polygon(QBrush("#999999"));
_polygons[SUBTYPE(RESARE, 9)] = Polygon(QBrush(QColor("#ff0000"),
Qt::BDiagPattern));
_polygons[SUBTYPE(RESARE, 2)] = Polygon(QImage(":/marine/noanchor-line.png"));
_polygons[SUBTYPE(I_RESARE, 2)] = Polygon(QImage(":/marine/noanchor-line.png"));
_polygons[SUBTYPE(RESARE, 17)] = Polygon(
QImage(":/marine/entry-prohibited-line.png"));
_polygons[SUBTYPE(I_RESARE, 17)] = Polygon(
QImage(":/marine/entry-prohibited-line.png"));
_polygons[SUBTYPE(ACHARE, 1)] = Polygon(QImage(":/marine/anchor-line.png"));
_polygons[SUBTYPE(I_ACHARE, 1)] = Polygon(QImage(":/marine/anchor-line.png"));
_polygons[TYPE(PRCARE)] = Polygon(QBrush(QColor("#eb49eb"),
Qt::BDiagPattern));
_polygons[TYPE(DAMCON)] = Polygon(QBrush("#d98b21"), QPen(QColor("#000000"),
1));
_polygons[TYPE(DRYDOC)] = Polygon(QBrush("#ebab54"), QPen(QColor("#000000"),
1));
_polygons[TYPE(PYLONS)] = Polygon(QBrush("#a58140"), QPen(QColor("#000000"),
1));
_polygons[TYPE(FLODOC)] = Polygon(QBrush("#333333"), QPen(QColor("#000000"),
1));
_polygons[TYPE(I_FLODOC)] = Polygon(QBrush("#333333"),
QPen(QColor("#000000"), 1));
_polygons[TYPE(DWRTPT)] = Polygon(QImage(":/marine/dw-route-line.png"));
_polygons[TYPE(MORFAC)] = Polygon(QBrush("#e8e064"), QPen(QColor("#000000"),
2));
_polygons[TYPE(GATCON)] = Polygon(QBrush("#000000"));
_polygons[TYPE(I_GATCON)] = Polygon(QBrush("#000000"));
_polygons[TYPE(I_TERMNL)] = Polygon(QBrush(QColor("#b8b04b")),
QPen(QColor("#966118")));
_polygons[TYPE(SILTNK)] = Polygon(QBrush("#d98b21"), QPen(QColor("#966118"),
2));
_polygons[TYPE(LOKBSN)] = Polygon(QBrush(QColor("#333333"),
Qt::Dense7Pattern));
_polygons[TYPE(I_LOKBSN)] = Polygon(QBrush(QColor("#333333"),
Qt::Dense7Pattern));
_drawOrder
<< TYPE(M_COVR) << TYPE(LNDARE) << SUBTYPE(DEPARE, 0)
<< SUBTYPE(DEPARE, 1) << SUBTYPE(DEPARE, 2) << SUBTYPE(DEPARE, 3)
<< TYPE(UNSARE) << SUBTYPE(DEPARE, 4) << SUBTYPE(DEPARE, 5)
<< SUBTYPE(DEPARE, 6) << TYPE(LAKARE) << TYPE(CANALS) << TYPE(DYKCON)
<< TYPE(RIVERS) << TYPE(DRGARE) << TYPE(FAIRWY) << TYPE(BUAARE)
<< TYPE(BUISGL) << TYPE(AIRARE) << TYPE(BRIDGE) << TYPE(SLCONS)
<< TYPE(PONTON) << TYPE(DMPGRD) << TYPE(TSEZNE) << TYPE(OBSTRN)
<< SUBTYPE(ACHARE, 1) << SUBTYPE(RESARE, 9) << SUBTYPE(RESARE, 2);
<< TYPE(RIVERS) << TYPE(DRGARE) << TYPE(FAIRWY) << TYPE(LOKBSN)
<< TYPE(I_LOKBSN) << TYPE(BUAARE) << TYPE(BUISGL) << TYPE(SILTNK)
<< TYPE(AIRARE) << TYPE(BRIDGE) << TYPE(I_BRIDGE) << TYPE(I_TERMNL)
<< TYPE(SLCONS) << TYPE(I_SLCONS) << TYPE(PONTON) << TYPE(I_PONTON)
<< TYPE(HULKES) << TYPE(I_HULKES) << TYPE(FLODOC) << TYPE(I_FLODOC)
<< TYPE(DRYDOC) << TYPE(DAMCON) << TYPE(PYLONS) << TYPE(MORFAC)
<< TYPE(GATCON) << TYPE(I_GATCON) << TYPE(DMPGRD) << TYPE(TSEZNE)
<< TYPE(OBSTRN) << TYPE(UWTROC) << TYPE(DWRTPT) << SUBTYPE(ACHARE, 1)
<< SUBTYPE(I_ACHARE, 1) << SUBTYPE(RESARE, 9) << SUBTYPE(RESARE, 2)
<< SUBTYPE(I_RESARE, 2) << SUBTYPE(RESARE, 17) << SUBTYPE(I_RESARE, 17)
<< TYPE(PRCARE);
}
void Style::defaultLineStyle()
@ -74,13 +120,16 @@ void Style::defaultLineStyle()
_lines[TYPE(DEPCNT)].setTextColor(QColor("#558adf"));
_lines[TYPE(DEPCNT)].setTextFontSize(Small);
_lines[TYPE(CBLOHD)] = Line(QImage(":/marine/cable-line.png"));
_lines[TYPE(I_CBLOHD)] = Line(QImage(":/marine/cable-line.png"));
_lines[TYPE(BRIDGE)] = Line(QPen(QColor("#a58140"), 3, Qt::SolidLine));
_lines[TYPE(I_BRIDGE)] = Line(QPen(QColor("#a58140"), 3, Qt::SolidLine));
_lines[TYPE(CBLSUB)] = Line(QImage(":/marine/cable.png"));
_lines[TYPE(CBLSUB)].setTextFontSize(Small);
_lines[TYPE(PIPSOL)] = Line(QImage(":/marine/pipeline.png"));
_lines[TYPE(NAVLNE)] = Line(QPen(QColor("#eb49eb"), 1, Qt::DashLine));
_lines[TYPE(COALNE)] = Line(QPen(QColor("#000000"), 1, Qt::SolidLine));
_lines[TYPE(SLCONS)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine));
_lines[TYPE(I_SLCONS)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine));
_lines[TYPE(PONTON)] = Line(QPen(QColor("#333333"), 1, Qt::SolidLine));
_lines[TYPE(DYKCON)] = Line(QPen(QColor("#333333"), 2, Qt::SolidLine));
_lines[TYPE(RIVERS)] = Line(QPen(QColor("#000000"), 1, Qt::SolidLine));
@ -91,12 +140,25 @@ void Style::defaultLineStyle()
_lines[TYPE(SLOTOP)] = Line(QPen(QColor("#797420"), 1, Qt::SolidLine));
_lines[TYPE(OBSTRN)] = Line(QPen(QColor("#000000"), 1.5, Qt::DotLine));
_lines[TYPE(FERYRT)] = Line(QImage(":/marine/ferry-line.png"));
_lines[TYPE(I_FERYRT)] = Line(QImage(":/marine/ferry-line.png"));
_lines[TYPE(RAILWY)] = Line(railroad());
_lines[TYPE(ROADWY)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine));
_lines[TYPE(GATCON)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine));
_lines[TYPE(I_GATCON)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine));
_lines[TYPE(TSELNE)] = Line(QPen(QColor("#80fcb4fc"), 4, Qt::SolidLine));
_lines[TYPE(I_WTWAXS)] = Line(QPen(QColor("#000000"), 0, Qt::DashLine));
_lines[SUBTYPE(RECTRC, 1)] = Line(QPen(QColor("#000000"), 0, Qt::SolidLine));
_lines[SUBTYPE(RECTRC, 2)] = Line(QPen(QColor("#000000"), 0, Qt::DashLine));
_lines[SUBTYPE(RCRTCL, 1)] = Line(QPen(QColor("#eb49eb"), 0, Qt::SolidLine));
_lines[SUBTYPE(RCRTCL, 2)] = Line(QPen(QColor("#eb49eb"), 0, Qt::DashLine));
_lines[TYPE(FAIRWY)] = Line(QPen(QColor("#888888"), 1, Qt::DashDotDotLine));
_lines[TYPE(BERTHS)] = Line(QPen(QColor("#333333"), 2));
_lines[TYPE(I_BERTHS)] = Line(QPen(QColor("#333333"), 2));
_lines[TYPE(FNCLNE)] = Line(QImage(":/marine/fence-line.png"));
_lines[TYPE(CONVYR)] = Line(QImage(":/marine/conveyor-line.png"));
_lines[TYPE(PIPOHD)] = Line(QImage(":/marine/pipeline-overhead.png"));
_lines[TYPE(I_PIPOHD)] = Line(QImage(":/marine/pipeline-overhead.png"));
_lines[TYPE(CANALS)] = Line(QPen(QColor("#9fc4e1"), 2));
}
void Style::defaultPointStyle()
@ -112,13 +174,16 @@ void Style::defaultPointStyle()
_points[TYPE(BOYINB)] = Point(QImage(":/marine/buoy.png"), Small);
_points[TYPE(BOYISD)] = Point(QImage(":/marine/buoy.png"), Small);
_points[TYPE(BOYLAT)] = Point(QImage(":/marine/buoy.png"), Small);
_points[TYPE(I_BOYLAT)] = Point(QImage(":/marine/buoy.png"), Small);
_points[TYPE(BOYSAW)] = Point(QImage(":/marine/buoy.png"), Small);
_points[TYPE(BOYSPP)] = Point(QImage(":/marine/buoy.png"), Small);
_points[TYPE(BCNISD)] = Point(QImage(":/marine/beacon.png"), Small);
_points[TYPE(BCNLAT)] = Point(QImage(":/marine/beacon.png"), Small);
_points[TYPE(I_BCNLAT)] = Point(QImage(":/marine/beacon.png"), Small);
_points[TYPE(BCNSAW)] = Point(QImage(":/marine/beacon.png"), Small);
_points[TYPE(BCNSPP)] = Point(QImage(":/marine/beacon.png"), Small);
_points[SUBTYPE(LNDMRK, 3)] = Point(QImage(":/marine/chimney.png"));
_points[SUBTYPE(LNDMRK, 9)] = Point(QImage(":/marine/monument.png"));
_points[SUBTYPE(LNDMRK, 20)] = Point(QImage(":/marine/church.png"));
_points[SUBTYPE(LNDMRK, 17)] = Point(QImage(":/marine/tower.png"));
_points[TYPE(LNDELV)] = Point(QImage(":/marine/triangulation-point.png"));
@ -141,6 +206,7 @@ void Style::defaultPointStyle()
Small);
_points[SUBTYPE(HRBFAC, 5)] = Point(QImage(":/marine/yacht-harbor.png"));
_points[TYPE(ACHBRT)] = Point(QImage(":/marine/anchorage.png"));
_points[TYPE(I_ACHBRT)] = Point(QImage(":/marine/anchorage.png"));
_points[TYPE(OFSPLF)] = Point(QImage(":/marine/platform.png"));
_points[TYPE(PILPNT)] = Point(QImage(":/marine/pile.png"), Small);
_points[SUBTYPE(MORFAC, 1)] = Point(QImage(":/marine/pile.png"), Small);
@ -148,6 +214,17 @@ void Style::defaultPointStyle()
_points[SUBTYPE(MORFAC, 5)] = Point(QImage(":/marine/pile.png"), Small);
_points[SUBTYPE(MORFAC, 7)] = Point(QImage(":/marine/mooring-buoy.png"),
Small);
_points[TYPE(CRANES)] = Point(QImage(":/marine/crane.png"));
_points[TYPE(I_CRANES)] = Point(QImage(":/marine/crane.png"));
_points[SUBTYPE(I_DISMAR, 1)] = Point(QImage(":/marine/distance-mark.png"));
_points[SUBTYPE(I_DISMAR, 1)].setTextColor(QColor("#ffffff"));
_points[SUBTYPE(I_DISMAR, 1)].setTextFontSize(Small);
_points[TYPE(CGUSTA)] = Point(QImage(":/marine/coast-guard.png"));
_points[TYPE(RDOSTA)] = Point(QImage(":/marine/radio.png"));
_points[TYPE(RADSTA)] = Point(QImage(":/marine/radar.png"));
_points[TYPE(RTPBCN)] = Point(QImage(":/marine/radar-transponder.png"));
_points[TYPE(SILTNK)] = Point(QImage(":/marine/silo.png"));
_points[TYPE(I_TRNBSN)] = Point(QImage(":/marine/turning-basin.png"));
}
Style::Style()
@ -157,7 +234,7 @@ Style::Style()
defaultPointStyle();
}
const Style::Line &Style::line(quint32 type) const
const Style::Line &Style::line(uint type) const
{
static Line null;
@ -165,7 +242,7 @@ const Style::Line &Style::line(quint32 type) const
return (it == _lines.constEnd()) ? null : *it;
}
const Style::Polygon &Style::polygon(quint32 type) const
const Style::Polygon &Style::polygon(uint type) const
{
static Polygon null;
@ -173,7 +250,7 @@ const Style::Polygon &Style::polygon(quint32 type) const
return (it == _polygons.constEnd()) ? null : *it;
}
const Style::Point &Style::point(quint32 type) const
const Style::Point &Style::point(uint type) const
{
static Point null;

View File

@ -89,11 +89,13 @@ public:
const Line &line(uint type) const;
const Polygon &polygon(uint type) const;
const Point &point(quint32 type) const;
const Point &point(uint type) const;
const QVector<uint> &drawOrder() const {return _drawOrder;}
static bool isSounding(quint32 type)
static bool isSounding(uint type)
{return type == TYPE(SOUNDG);}
static bool isDistanceMark(uint type)
{return (type & 0xFFFF0000) == TYPE(I_DISMAR);}
private:
void defaultPolygonStyle();