mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-07-24 15:34:24 +02:00
Added support for GMAP maps
This commit is contained in:
@ -13,6 +13,9 @@
|
||||
#include "IMG/textpathitem.h"
|
||||
#include "IMG/textpointitem.h"
|
||||
#include "IMG/bitmapline.h"
|
||||
#include "IMG/style.h"
|
||||
#include "IMG/img.h"
|
||||
#include "IMG/gmap.h"
|
||||
#include "pcs.h"
|
||||
#include "rectd.h"
|
||||
#include "imgmap.h"
|
||||
@ -35,9 +38,9 @@ public:
|
||||
const QString &key() const {return _key;}
|
||||
const QPoint &xy() const {return _xy;}
|
||||
QImage &img() {return _img;}
|
||||
QList<IMG::Poly> &polygons() {return _polygons;}
|
||||
QList<IMG::Poly> &lines() {return _lines;}
|
||||
QList<IMG::Point> &points() {return _points;}
|
||||
QList<MapData::Poly> &polygons() {return _polygons;}
|
||||
QList<MapData::Poly> &lines() {return _lines;}
|
||||
QList<MapData::Point> &points() {return _points;}
|
||||
|
||||
void render()
|
||||
{
|
||||
@ -70,9 +73,9 @@ private:
|
||||
QPoint _xy;
|
||||
QString _key;
|
||||
QImage _img;
|
||||
QList<IMG::Poly> _polygons;
|
||||
QList<IMG::Poly> _lines;
|
||||
QList<IMG::Point> _points;
|
||||
QList<MapData::Poly> _polygons;
|
||||
QList<MapData::Poly> _lines;
|
||||
QList<MapData::Point> _points;
|
||||
};
|
||||
|
||||
|
||||
@ -226,11 +229,17 @@ static bool rectNearPolygon(const QPolygonF &polygon, const QRectF &rect)
|
||||
|| polygon.containsPoint(rect.bottomRight(), Qt::OddEvenFill)));
|
||||
}
|
||||
|
||||
|
||||
IMGMap::IMGMap(const QString &fileName, QObject *parent)
|
||||
: Map(parent), _img(fileName), _projection(PCS::pcs(3857)), _valid(false)
|
||||
: Map(parent), _projection(PCS::pcs(3857)), _valid(false)
|
||||
{
|
||||
if (!_img.isValid()) {
|
||||
_errorString = _img.errorString();
|
||||
if (GMAP::isGMAP(fileName))
|
||||
_data = new GMAP(fileName);
|
||||
else
|
||||
_data = new IMG(fileName);
|
||||
|
||||
if (!_data->isValid()) {
|
||||
_errorString = _data->errorString();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -242,17 +251,17 @@ IMGMap::IMGMap(const QString &fileName, QObject *parent)
|
||||
|
||||
void IMGMap::load()
|
||||
{
|
||||
_img.load();
|
||||
_data->load();
|
||||
}
|
||||
|
||||
void IMGMap::unload()
|
||||
{
|
||||
_img.clear();
|
||||
_data->clear();
|
||||
}
|
||||
|
||||
QRectF IMGMap::bounds()
|
||||
{
|
||||
RectD prect(_img.bounds(), _projection);
|
||||
RectD prect(_data->bounds(), _projection);
|
||||
return QRectF(_transform.proj2img(prect.topLeft()),
|
||||
_transform.proj2img(prect.bottomRight()));
|
||||
}
|
||||
@ -302,7 +311,7 @@ Transform IMGMap::transform(int zoom) const
|
||||
{
|
||||
double scale = _projection.isGeographic()
|
||||
? 360.0 / (1<<zoom) : (2.0 * M_PI * WGS84_RADIUS) / (1<<zoom);
|
||||
PointD topLeft(_projection.ll2xy(_img.bounds().topLeft()));
|
||||
PointD topLeft(_projection.ll2xy(_data->bounds().topLeft()));
|
||||
return Transform(ReferencePoint(PointD(0, 0), topLeft),
|
||||
PointD(scale, scale));
|
||||
}
|
||||
@ -322,14 +331,14 @@ Coordinates IMGMap::xy2ll(const QPointF &p)
|
||||
return _projection.xy2ll(_transform.img2proj(p));
|
||||
}
|
||||
|
||||
void IMGMap::drawPolygons(QPainter *painter, const QList<IMG::Poly> &polygons)
|
||||
void IMGMap::drawPolygons(QPainter *painter, const QList<MapData::Poly> &polygons)
|
||||
{
|
||||
for (int n = 0; n < _img.style()->drawOrder().size(); n++) {
|
||||
for (int n = 0; n < _data->style()->drawOrder().size(); n++) {
|
||||
for (int i = 0; i < polygons.size(); i++) {
|
||||
const IMG::Poly &poly = polygons.at(i);
|
||||
if (poly.type != _img.style()->drawOrder().at(n))
|
||||
const MapData::Poly &poly = polygons.at(i);
|
||||
if (poly.type != _data->style()->drawOrder().at(n))
|
||||
continue;
|
||||
const Style::Polygon &style = _img.style()->polygon(poly.type);
|
||||
const Style::Polygon &style = _data->style()->polygon(poly.type);
|
||||
|
||||
painter->setPen(style.pen());
|
||||
painter->setBrush(style.brush());
|
||||
@ -338,13 +347,13 @@ void IMGMap::drawPolygons(QPainter *painter, const QList<IMG::Poly> &polygons)
|
||||
}
|
||||
}
|
||||
|
||||
void IMGMap::drawLines(QPainter *painter, const QList<IMG::Poly> &lines)
|
||||
void IMGMap::drawLines(QPainter *painter, const QList<MapData::Poly> &lines)
|
||||
{
|
||||
painter->setBrush(Qt::NoBrush);
|
||||
|
||||
for (int i = 0; i < lines.size(); i++) {
|
||||
const IMG::Poly &poly = lines.at(i);
|
||||
const Style::Line &style = _img.style()->line(poly.type);
|
||||
const MapData::Poly &poly = lines.at(i);
|
||||
const Style::Line &style = _data->style()->line(poly.type);
|
||||
|
||||
if (style.background() == Qt::NoPen)
|
||||
continue;
|
||||
@ -354,8 +363,8 @@ void IMGMap::drawLines(QPainter *painter, const QList<IMG::Poly> &lines)
|
||||
}
|
||||
|
||||
for (int i = 0; i < lines.size(); i++) {
|
||||
const IMG::Poly &poly = lines.at(i);
|
||||
const Style::Line &style = _img.style()->line(poly.type);
|
||||
const MapData::Poly &poly = lines.at(i);
|
||||
const Style::Line &style = _data->style()->line(poly.type);
|
||||
|
||||
if (!style.img().isNull())
|
||||
BitmapLine::draw(painter, poly.points, style.img());
|
||||
@ -372,12 +381,11 @@ void IMGMap::drawTextItems(QPainter *painter, const QList<TextItem*> &textItems)
|
||||
textItems.at(i)->paint(painter);
|
||||
}
|
||||
|
||||
|
||||
void IMGMap::processPolygons(QList<IMG::Poly> &polygons,
|
||||
void IMGMap::processPolygons(QList<MapData::Poly> &polygons,
|
||||
QList<TextItem*> &textItems)
|
||||
{
|
||||
for (int i = 0; i < polygons.size(); i++) {
|
||||
IMG::Poly &poly = polygons[i];
|
||||
MapData::Poly &poly = polygons[i];
|
||||
for (int j = 0; j < poly.points.size(); j++) {
|
||||
QPointF &p = poly.points[j];
|
||||
p = ll2xy(Coordinates(p.x(), p.y()));
|
||||
@ -389,7 +397,7 @@ void IMGMap::processPolygons(QList<IMG::Poly> &polygons,
|
||||
if (_zoom <= 23 && (Style::isWaterArea(poly.type)
|
||||
|| Style::isMilitaryArea(poly.type)
|
||||
|| Style::isNatureReserve(poly.type))) {
|
||||
const Style::Polygon &style = _img.style()->polygon(poly.type);
|
||||
const Style::Polygon &style = _data->style()->polygon(poly.type);
|
||||
TextPointItem *item = new TextPointItem(
|
||||
centroid(poly.points).toPoint(), &poly.label.text(),
|
||||
poiFont(), 0, &style.brush().color());
|
||||
@ -402,13 +410,13 @@ void IMGMap::processPolygons(QList<IMG::Poly> &polygons,
|
||||
}
|
||||
}
|
||||
|
||||
void IMGMap::processLines(QList<IMG::Poly> &lines, const QRect &tileRect,
|
||||
void IMGMap::processLines(QList<MapData::Poly> &lines, const QRect &tileRect,
|
||||
QList<TextItem*> &textItems)
|
||||
{
|
||||
qStableSort(lines);
|
||||
|
||||
for (int i = 0; i < lines.size(); i++) {
|
||||
IMG::Poly &poly = lines[i];
|
||||
MapData::Poly &poly = lines[i];
|
||||
for (int j = 0; j < poly.points.size(); j++) {
|
||||
QPointF &p = poly.points[j];
|
||||
p = ll2xy(Coordinates(p.x(), p.y()));
|
||||
@ -420,12 +428,12 @@ void IMGMap::processLines(QList<IMG::Poly> &lines, const QRect &tileRect,
|
||||
processShields(lines, tileRect, textItems);
|
||||
}
|
||||
|
||||
void IMGMap::processStreetNames(QList<IMG::Poly> &lines, const QRect &tileRect,
|
||||
QList<TextItem*> &textItems)
|
||||
void IMGMap::processStreetNames(QList<MapData::Poly> &lines,
|
||||
const QRect &tileRect, QList<TextItem*> &textItems)
|
||||
{
|
||||
for (int i = 0; i < lines.size(); i++) {
|
||||
IMG::Poly &poly = lines[i];
|
||||
const Style::Line &style = _img.style()->line(poly.type);
|
||||
MapData::Poly &poly = lines[i];
|
||||
const Style::Line &style = _data->style()->line(poly.type);
|
||||
|
||||
if (style.img().isNull() && style.foreground() == Qt::NoPen)
|
||||
continue;
|
||||
@ -449,7 +457,7 @@ void IMGMap::processStreetNames(QList<IMG::Poly> &lines, const QRect &tileRect,
|
||||
}
|
||||
}
|
||||
|
||||
void IMGMap::processShields(QList<IMG::Poly> &lines, const QRect &tileRect,
|
||||
void IMGMap::processShields(QList<MapData::Poly> &lines, const QRect &tileRect,
|
||||
QList<TextItem*> &textItems)
|
||||
{
|
||||
for (int type = FIRST_SHIELD; type <= LAST_SHIELD; type++) {
|
||||
@ -460,7 +468,7 @@ void IMGMap::processShields(QList<IMG::Poly> &lines, const QRect &tileRect,
|
||||
QHash<Label::Shield, const Label::Shield*> sp;
|
||||
|
||||
for (int i = 0; i < lines.size(); i++) {
|
||||
const IMG::Poly &poly = lines.at(i);
|
||||
const MapData::Poly &poly = lines.at(i);
|
||||
const Label::Shield &shield = poly.label.shield();
|
||||
if (!shield.isValid() || shield.type() != type
|
||||
|| !Style::isMajorRoad(poly.type))
|
||||
@ -513,14 +521,14 @@ void IMGMap::processShields(QList<IMG::Poly> &lines, const QRect &tileRect,
|
||||
}
|
||||
}
|
||||
|
||||
void IMGMap::processPoints(QList<IMG::Point> &points,
|
||||
void IMGMap::processPoints(QList<MapData::Point> &points,
|
||||
QList<TextItem*> &textItems)
|
||||
{
|
||||
qSort(points);
|
||||
|
||||
for (int i = 0; i < points.size(); i++) {
|
||||
IMG::Point &point = points[i];
|
||||
const Style::Point &style = _img.style()->point(point.type);
|
||||
MapData::Point &point = points[i];
|
||||
const Style::Point &style = _data->style()->point(point.type);
|
||||
|
||||
if (point.poi && _zoom < minPOIZoom(Style::poiClass(point.type)))
|
||||
continue;
|
||||
@ -574,7 +582,7 @@ void IMGMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
||||
for (int j = 0; j < height; j++) {
|
||||
QPixmap pm;
|
||||
QPoint ttl(tl.x() + i * TILE_SIZE, tl.y() + j * TILE_SIZE);
|
||||
QString key = _img.fileName() + "-" + QString::number(_zoom) + "_"
|
||||
QString key = _data->fileName() + "-" + QString::number(_zoom) + "_"
|
||||
+ QString::number(ttl.x()) + "_" + QString::number(ttl.y());
|
||||
if (QPixmapCache::find(key, pm))
|
||||
painter->drawPixmap(ttl, pm);
|
||||
@ -584,13 +592,13 @@ void IMGMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
||||
|
||||
RectD polyRect(_transform.img2proj(ttl), _transform.img2proj(
|
||||
QPointF(ttl.x() + TILE_SIZE, ttl.y() + TILE_SIZE)));
|
||||
_img.polys(polyRect.toRectC(_projection, 4), _zoom,
|
||||
_data->polys(polyRect.toRectC(_projection, 4), _zoom,
|
||||
&(tile.polygons()), &(tile.lines()));
|
||||
|
||||
RectD pointRect(_transform.img2proj(QPointF(ttl.x() - TEXT_EXTENT,
|
||||
ttl.y() - TEXT_EXTENT)), _transform.img2proj(QPointF(ttl.x()
|
||||
+ TILE_SIZE + TEXT_EXTENT, ttl.y() + TILE_SIZE + TEXT_EXTENT)));
|
||||
_img.points(pointRect.toRectC(_projection, 4), _zoom,
|
||||
_data->points(pointRect.toRectC(_projection, 4), _zoom,
|
||||
&(tile.points()));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user