[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [marble] src: Revert "have polygon and linear ring icons rendered by PlacemarkLayer"
From: Bernhard Beschow <bbeschow () cs ! tu-berlin ! de>
Date: 2016-10-23 12:21:29
Message-ID: E1byHmL-0004Hu-Od () code ! kde ! org
[Download RAW message or body]
Git commit 91d07d77a3726c7ece10c9d7770fdd7ed0f01797 by Bernhard Beschow.
Committed on 23/10/2016 at 12:08.
Pushed by beschow into branch 'master'.
Revert "have polygon and linear ring icons rendered by PlacemarkLayer"
This reverts commit b1a507ba5d9e2386bc2dd4b2432569910a5e030e.
M +3 -7 src/lib/marble/geodata/data/GeoDataPlacemark.cpp
M +44 -1 src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp
M +2 -0 src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h
M +0 -6 src/plugins/runner/osm/OsmWay.cpp
http://commits.kde.org/marble/91d07d77a3726c7ece10c9d7770fdd7ed0f01797
diff --git a/src/lib/marble/geodata/data/GeoDataPlacemark.cpp \
b/src/lib/marble/geodata/data/GeoDataPlacemark.cpp index ad7cbe4..5ccca5e 100644
--- a/src/lib/marble/geodata/data/GeoDataPlacemark.cpp
+++ b/src/lib/marble/geodata/data/GeoDataPlacemark.cpp
@@ -275,20 +275,16 @@ GeoDataCoordinates GeoDataPlacemark::coordinate( const \
QDateTime &dateTime, bool
if (d->m_geometry) {
// Beware: comparison between pointers, not strings.
- if (d->m_geometry->nodeType() == GeoDataTypes::GeoDataPointType
- || d->m_geometry->nodeType() == GeoDataTypes::GeoDataPolygonType
- || d->m_geometry->nodeType() == GeoDataTypes::GeoDataLinearRingType) \
{ + if (d->m_geometry->nodeType() == GeoDataTypes::GeoDataPointType) {
hasIcon = true;
- coord = d->m_geometry->latLonAltBox().center();
+ coord = static_cast<const GeoDataPoint *>(d->m_geometry)->coordinates();
} else if (d->m_geometry->nodeType() == \
GeoDataTypes::GeoDataMultiGeometryType) {
const GeoDataMultiGeometry *multiGeometry = static_cast<const \
GeoDataMultiGeometry *>(d->m_geometry);
QVector<GeoDataGeometry*>::ConstIterator it = \
multiGeometry->constBegin();
QVector<GeoDataGeometry*>::ConstIterator end = \
multiGeometry->constEnd(); for ( ; it != end; ++it ) {
- if ((*it)->nodeType() == GeoDataTypes::GeoDataPointType
- || (*it)->nodeType() == GeoDataTypes::GeoDataPolygonType
- || (*it)->nodeType() == GeoDataTypes::GeoDataLinearRingType) \
{ + if ( (*it)->nodeType() == GeoDataTypes::GeoDataPointType ) {
hasIcon = true;
break;
}
diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp \
b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp index \
a44fa2a..e9f73d3 100644
--- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp
+++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp
@@ -29,6 +29,7 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphicsItem(const \
GeoDataPlac
const GeoDataPolygon \
*polygon) : AbstractGeoPolygonGraphicsItem(placemark, polygon)
, m_buildingHeight(polygon->latLonAltBox().maxAltitude() - \
polygon->latLonAltBox().minAltitude()) + , \
m_buildingLabel(extractBuildingLabel(*placemark)) , \
m_entries(extractNamedEntries(*placemark)) {
setZValue(this->zValue() + m_buildingHeight);
@@ -44,6 +45,7 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphicsItem(const \
GeoDataPlac
const \
GeoDataLinearRing* ring) : AbstractGeoPolygonGraphicsItem(placemark, ring)
, m_buildingHeight(ring->latLonAltBox().maxAltitude() - \
ring->latLonAltBox().minAltitude()) + , \
m_buildingLabel(extractBuildingLabel(*placemark)) , \
m_entries(extractNamedEntries(*placemark)) {
setZValue(this->zValue() + m_buildingHeight);
@@ -133,6 +135,27 @@ QPointF BuildingGeoPolygonGraphicsItem::buildingOffset(const \
QPointF &point, con return QPointF(shiftX, shiftY);
}
+QString BuildingGeoPolygonGraphicsItem::extractBuildingLabel(const GeoDataPlacemark \
&placemark) +{
+ if (!placemark.name().isEmpty()) {
+ return placemark.name();
+ }
+
+ const OsmPlacemarkData &osmData = placemark.osmData();
+
+ auto tagIter = osmData.findTag(QStringLiteral("addr:housename"));
+ if (tagIter != osmData.tagsEnd()) {
+ return tagIter.value();
+ }
+
+ tagIter = osmData.findTag(QStringLiteral("addr:housenumber"));
+ if (tagIter != osmData.tagsEnd()) {
+ return tagIter.value();
+ }
+
+ return QString();
+}
+
QVector<BuildingGeoPolygonGraphicsItem::NamedEntry> \
BuildingGeoPolygonGraphicsItem::extractNamedEntries(const GeoDataPlacemark \
&placemark) {
QVector<NamedEntry> entries;
@@ -177,6 +200,7 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPainter* \
painter, const Viewpo painter->save();
QPen const currentPen = configurePainter(painter, viewport);
+ bool const hasIcon = !style()->iconStyle().iconPath().isEmpty();
qreal maxSize(0.0);
QPointF roofCenter;
@@ -190,7 +214,7 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPainter* \
painter, const Viewpo foreach(QPolygonF* outlinePolygon, outlinePolygons) {
QRectF const boundingRect = outlinePolygon->boundingRect();
QPolygonF buildingRoof;
- if (!m_entries.isEmpty()) {
+ if (hasIcon || !m_buildingLabel.isEmpty() || !m_entries.isEmpty()) {
QSizeF const polygonSize = boundingRect.size();
qreal size = polygonSize.width() * polygonSize.height();
if (size > maxSize) {
@@ -234,6 +258,25 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPainter* \
painter, const Viewpo painter->drawPolygon(*outlinePolygon);
painter->translate(-offset);
}
+
+ if (hasIcon && !roofCenter.isNull()) {
+ QImage const icon = style()->iconStyle().scaledIcon();
+ QPointF const iconCenter(icon.size().width()/2.0, \
icon.size().height()/2.0); + painter->drawImage(roofCenter-iconCenter, \
icon); + } else if (drawAccurate3D && !m_buildingLabel.isEmpty() && \
!roofCenter.isNull()) { + double const w2 = 0.5 * \
painter->fontMetrics().width(m_buildingLabel); + double const ascent = \
painter->fontMetrics().ascent(); + double const descent = \
painter->fontMetrics().descent(); + double const a2 = 0.5 * \
painter->fontMetrics().ascent(); + QPointF const textPosition = roofCenter \
- QPointF(w2, -a2); + if (buildingRoof.containsPoint(textPosition + \
QPointF(-2, -ascent), Qt::OddEvenFill) + && \
buildingRoof.containsPoint(textPosition + QPointF(-2, descent), Qt::OddEvenFill) + \
&& buildingRoof.containsPoint(textPosition + QPointF(2+2*w2, descent), \
Qt::OddEvenFill) + && buildingRoof.containsPoint(textPosition + \
QPointF(2+2*w2, -ascent), Qt::OddEvenFill) + ) {
+ painter->drawText(textPosition, m_buildingLabel);
+ }
+ }
}
// Render additional housenumbers at building entries
diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h \
b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h index \
64f7d6e..bb7a662 100644
--- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h
+++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h
@@ -46,10 +46,12 @@ private:
static QPointF centroid(const QPolygonF &polygon, double &area);
static void screenPolygons(const ViewportParams *viewport, const GeoDataPolygon* \
polygon,
QVector<QPolygonF*> &polygons, QVector<QPolygonF*> \
&outlines); + static QString extractBuildingLabel(const GeoDataPlacemark \
&placemark);
static QVector<NamedEntry> extractNamedEntries(const GeoDataPlacemark \
&placemark);
private:
const double m_buildingHeight;
+ const QString m_buildingLabel;
const QVector<NamedEntry> m_entries;
};
diff --git a/src/plugins/runner/osm/OsmWay.cpp b/src/plugins/runner/osm/OsmWay.cpp
index f369790..1b2a02b 100644
--- a/src/plugins/runner/osm/OsmWay.cpp
+++ b/src/plugins/runner/osm/OsmWay.cpp
@@ -88,12 +88,6 @@ void OsmWay::create(GeoDataDocument *document, const OsmNodes \
&nodes, QSet<qint6 if (placemark->name().isEmpty()) {
placemark->setName(m_osmData.tagValue(QStringLiteral("ref")));
}
- if (placemark->name().isEmpty()) {
- placemark->setName(m_osmData.tagValue(QStringLiteral("addr:housename")));
- }
- if (placemark->name().isEmpty()) {
- placemark->setName(m_osmData.tagValue(QStringLiteral("addr:housenumber")));
- }
placemark->setOsmData(osmData);
placemark->setVisible(placemark->visualCategory() != GeoDataPlacemark::None);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic