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/BuildingGeoPolygonGraphi= csItem.cpp M +2 -0 src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphi= csItem.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/mar= ble/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( cons= t QDateTime &dateTime, bool = if (d->m_geometry) { // Beware: comparison between pointers, not strings. - if (d->m_geometry->nodeType() =3D=3D GeoDataTypes::GeoDataPointType - || d->m_geometry->nodeType() =3D=3D GeoDataTypes::GeoDataP= olygonType - || d->m_geometry->nodeType() =3D=3D GeoDataTypes::GeoDataL= inearRingType) { + if (d->m_geometry->nodeType() =3D=3D GeoDataTypes::GeoDataPointTyp= e) { hasIcon =3D true; - coord =3D d->m_geometry->latLonAltBox().center(); + coord =3D static_cast(d->m_geometry)->co= ordinates(); } else if (d->m_geometry->nodeType() =3D=3D GeoDataTypes::GeoDataM= ultiGeometryType) { const GeoDataMultiGeometry *multiGeometry =3D static_cast(d->m_geometry); = QVector::ConstIterator it =3D multiGeometry-= >constBegin(); QVector::ConstIterator end =3D multiGeometry= ->constEnd(); for ( ; it !=3D end; ++it ) { - if ((*it)->nodeType() =3D=3D GeoDataTypes::GeoDataPointType - || (*it)->nodeType() =3D=3D GeoDataTypes::GeoDataP= olygonType - || (*it)->nodeType() =3D=3D GeoDataTypes::GeoDataL= inearRingType) { + if ( (*it)->nodeType() =3D=3D GeoDataTypes::GeoDataPointTy= pe ) { hasIcon =3D true; break; } diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphics= Item.cpp b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsIt= em.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::BuildingGeoPolygonGraphic= sItem(const GeoDataPlac const GeoDa= taPolygon *polygon) : AbstractGeoPolygonGraphicsItem(placemark, polygon) , m_buildingHeight(polygon->latLonAltBox().maxAltitude() - polygon->la= tLonAltBox().minAltitude()) + , m_buildingLabel(extractBuildingLabel(*placemark)) , m_entries(extractNamedEntries(*placemark)) { setZValue(this->zValue() + m_buildingHeight); @@ -44,6 +45,7 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphic= sItem(const GeoDataPlac const GeoDa= taLinearRing* ring) : AbstractGeoPolygonGraphicsItem(placemark, ring) , m_buildingHeight(ring->latLonAltBox().maxAltitude() - ring->latLonAl= tBox().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 GeoData= Placemark &placemark) +{ + if (!placemark.name().isEmpty()) { + return placemark.name(); + } + + const OsmPlacemarkData &osmData =3D placemark.osmData(); + + auto tagIter =3D osmData.findTag(QStringLiteral("addr:housename")); + if (tagIter !=3D osmData.tagsEnd()) { + return tagIter.value(); + } + + tagIter =3D osmData.findTag(QStringLiteral("addr:housenumber")); + if (tagIter !=3D osmData.tagsEnd()) { + return tagIter.value(); + } + + return QString(); +} + QVector BuildingGeoPolygonGrap= hicsItem::extractNamedEntries(const GeoDataPlacemark &placemark) { QVector entries; @@ -177,6 +200,7 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPaint= er* painter, const Viewpo painter->save(); QPen const currentPen =3D configurePainter(painter, viewport); = + bool const hasIcon =3D !style()->iconStyle().iconPath().isEmpty(); qreal maxSize(0.0); QPointF roofCenter; = @@ -190,7 +214,7 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPaint= er* painter, const Viewpo foreach(QPolygonF* outlinePolygon, outlinePolygons) { QRectF const boundingRect =3D outlinePolygon->boundingRect(); QPolygonF buildingRoof; - if (!m_entries.isEmpty()) { + if (hasIcon || !m_buildingLabel.isEmpty() || !m_entries.isEmpty())= { QSizeF const polygonSize =3D boundingRect.size(); qreal size =3D polygonSize.width() * polygonSize.height(); if (size > maxSize) { @@ -234,6 +258,25 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPain= ter* painter, const Viewpo painter->drawPolygon(*outlinePolygon); painter->translate(-offset); } + + if (hasIcon && !roofCenter.isNull()) { + QImage const icon =3D 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() && !roofCe= nter.isNull()) { + double const w2 =3D 0.5 * painter->fontMetrics().width(m_build= ingLabel); + double const ascent =3D painter->fontMetrics().ascent(); + double const descent =3D painter->fontMetrics().descent(); + double const a2 =3D 0.5 * painter->fontMetrics().ascent(); + QPointF const textPosition =3D roofCenter - QPointF(w2, -a2); + if (buildingRoof.containsPoint(textPosition + QPointF(-2, -asc= ent), 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/BuildingGeoPolygonGraphics= Item.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 GeoDa= taPolygon* polygon, QVector &polygons, QVector &outlines); + static QString extractBuildingLabel(const GeoDataPlacemark &placemark); static QVector extractNamedEntries(const GeoDataPlacemark = &placemark); = private: const double m_buildingHeight; + const QString m_buildingLabel; const QVector m_entries; }; = diff --git a/src/plugins/runner/osm/OsmWay.cpp b/src/plugins/runner/osm/Osm= Way.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 Osm= Nodes &nodes, QSetname().isEmpty()) { placemark->setName(m_osmData.tagValue(QStringLiteral("ref"))); } - if (placemark->name().isEmpty()) { - placemark->setName(m_osmData.tagValue(QStringLiteral("addr:housena= me"))); - } - if (placemark->name().isEmpty()) { - placemark->setName(m_osmData.tagValue(QStringLiteral("addr:housenu= mber"))); - } placemark->setOsmData(osmData); placemark->setVisible(placemark->visualCategory() !=3D GeoDataPlacemar= k::None); =