Git commit c5aff6a993e0f17d5dc62b636b41adcbec291c5f by Bernhard Beschow. Committed on 03/10/2016 at 14:42. Pushed by beschow into branch 'master'. have house entries rendered by PlacemarkLayer * allows them to be opened in the placemark dialog to see e.g. the address M +0 -60 src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphi= csItem.cpp M +0 -7 src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphi= csItem.h M +39 -3 src/plugins/runner/osm/OsmWay.cpp M +7 -0 src/plugins/runner/osm/OsmWay.h http://commits.kde.org/marble/c5aff6a993e0f17d5dc62b636b41adcbec291c5f diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphics= Item.cpp b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsIt= em.cpp index a44fa2a..96bc51c 100644 --- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp +++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp @@ -29,7 +29,6 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphic= sItem(const GeoDataPlac const GeoDa= taPolygon *polygon) : AbstractGeoPolygonGraphicsItem(placemark, polygon) , m_buildingHeight(polygon->latLonAltBox().maxAltitude() - polygon->la= tLonAltBox().minAltitude()) - , m_entries(extractNamedEntries(*placemark)) { setZValue(this->zValue() + m_buildingHeight); Q_ASSERT(m_buildingHeight > 0.0); @@ -44,7 +43,6 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphic= sItem(const GeoDataPlac const GeoDa= taLinearRing* ring) : AbstractGeoPolygonGraphicsItem(placemark, ring) , m_buildingHeight(ring->latLonAltBox().maxAltitude() - ring->latLonAl= tBox().minAltitude()) - , m_entries(extractNamedEntries(*placemark)) { setZValue(this->zValue() + m_buildingHeight); Q_ASSERT(m_buildingHeight > 0.0); @@ -133,24 +131,6 @@ QPointF BuildingGeoPolygonGraphicsItem::buildingOffset= (const QPointF &point, con return QPointF(shiftX, shiftY); } = -QVector BuildingGeoPolygonGrap= hicsItem::extractNamedEntries(const GeoDataPlacemark &placemark) -{ - QVector entries; - - const auto end =3D placemark.osmData().nodeReferencesEnd(); - for (auto iter =3D placemark.osmData().nodeReferencesBegin(); iter != =3D end; ++iter) { - const auto tagIter =3D iter.value().findTag(QStringLiteral("addr:h= ousenumber")); - if (tagIter !=3D iter.value().tagsEnd()) { - NamedEntry entry; - entry.point =3D iter.key(); - entry.label =3D tagIter.value(); - entries.push_back(entry); - } - } - - return entries; -} - void BuildingGeoPolygonGraphicsItem::paint(GeoPainter* painter, const View= portParams* viewport, const QString &layer) { if (layer.endsWith(QLatin1String("/frame"))) { @@ -177,30 +157,15 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPai= nter* painter, const Viewpo painter->save(); QPen const currentPen =3D configurePainter(painter, viewport); = - qreal maxSize(0.0); - QPointF roofCenter; - if (hasInnerBoundaries) { painter->setPen(Qt::NoPen); } = // first paint the area and icon (and the outline if there are no inne= r boundaries) = - double maxArea =3D 0.0; foreach(QPolygonF* outlinePolygon, outlinePolygons) { QRectF const boundingRect =3D outlinePolygon->boundingRect(); QPolygonF buildingRoof; - if (!m_entries.isEmpty()) { - QSizeF const polygonSize =3D boundingRect.size(); - qreal size =3D polygonSize.width() * polygonSize.height(); - if (size > maxSize) { - maxSize =3D size; - double area; - roofCenter =3D centroid(*outlinePolygon, area); - maxArea =3D qMax(area, maxArea); - roofCenter +=3D buildingOffset(roofCenter, viewport); - } - } if ( drawAccurate3D) { buildingRoof.reserve(outlinePolygon->size()); foreach(const QPointF &point, *outlinePolygon) { @@ -236,32 +201,7 @@ void BuildingGeoPolygonGraphicsItem::paintRoof(GeoPain= ter* painter, const Viewpo } } = - // Render additional housenumbers at building entries - if (!m_entries.isEmpty() && maxArea > 1600 * m_entries.size()) { - QBrush brush =3D painter->brush(); - QColor const brushColor =3D brush.color(); - QColor lighterColor =3D brushColor.lighter(110); - lighterColor.setAlphaF(0.9); - brush.setColor(lighterColor); - painter->setBrush(brush); - foreach(const auto &entry, m_entries) { - qreal x, y; - viewport->screenCoordinates(entry.point, x, y); - QPointF point(x, y); - point +=3D buildingOffset(point, viewport); - auto const width =3D painter->fontMetrics().width(entry.label); - auto const height =3D painter->fontMetrics().height(); - QRectF rectangle(point, QSizeF(qMax(1.2*width, 1.1*height), 1.= 2*height)); - rectangle.moveCenter(point); - painter->drawRoundedRect(rectangle, 3, 3); - painter->drawText(rectangle, Qt::AlignCenter, entry.label); - } - brush.setColor(brushColor); - painter->setBrush(brush); - } - // then paint the outlines if there are inner boundaries - if (hasInnerBoundaries) { painter->setPen(currentPen); foreach(QPolygonF * polygon, outlinePolygons) { diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphics= Item.h b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem= .h index 64f7d6e..936ec18 100644 --- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h +++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h @@ -29,11 +29,6 @@ public: virtual void paint(GeoPainter* painter, const ViewportParams *viewport= , const QString &layer); = private: - struct NamedEntry { - GeoDataCoordinates point; - QString label; - }; - void paintFrame(GeoPainter* painter, const ViewportParams *viewport); void paintRoof(GeoPainter* painter, const ViewportParams *viewport); void configureFramePainter(GeoPainter *painter) const; @@ -46,11 +41,9 @@ private: static QPointF centroid(const QPolygonF &polygon, double &area); static void screenPolygons(const ViewportParams *viewport, const GeoDa= taPolygon* polygon, QVector &polygons, QVector &outlines); - static QVector extractNamedEntries(const GeoDataPlacemark = &placemark); = private: const double m_buildingHeight; - const QVector m_entries; }; = } diff --git a/src/plugins/runner/osm/OsmWay.cpp b/src/plugins/runner/osm/Osm= Way.cpp index f369790..9d2aa1c 100644 --- a/src/plugins/runner/osm/OsmWay.cpp +++ b/src/plugins/runner/osm/OsmWay.cpp @@ -10,8 +10,9 @@ = #include #include -#include #include +#include +#include #include #include #include @@ -81,9 +82,11 @@ void OsmWay::create(GeoDataDocument *document, const Osm= Nodes &nodes, QSetsetGeometry(geometry); - placemark->setVisualCategory(StyleBuilder::determineVisualCategory(m_o= smData)); + placemark->setVisualCategory(visualCategory); placemark->setName(m_osmData.tagValue(QStringLiteral("name"))); if (placemark->name().isEmpty()) { placemark->setName(m_osmData.tagValue(QStringLiteral("ref"))); @@ -95,9 +98,23 @@ void OsmWay::create(GeoDataDocument *document, const Osm= Nodes &nodes, QSetsetName(m_osmData.tagValue(QStringLiteral("addr:housenu= mber"))); } placemark->setOsmData(osmData); - placemark->setVisible(placemark->visualCategory() !=3D GeoDataPlacemar= k::None); + placemark->setVisible(visualCategory !=3D GeoDataPlacemark::None); = document->append(placemark); + + QVector namedEntries =3D extractNamedEntries(osmData); + if (!namedEntries.isEmpty()) { + foreach (const auto &namedEntry, namedEntries) { + GeoDataPlacemark *entry =3D new GeoDataPlacemark(); + entry->setCoordinate(namedEntry.coordinates); + entry->setName(namedEntry.label); + entry->setOsmData(namedEntry.osmData); + entry->setVisualCategory(visualCategory); + entry->setVisible(visualCategory !=3D GeoDataPlacemark::None); + + document->append(entry); + } + } } = const QVector &OsmWay::references() const @@ -224,4 +241,23 @@ double OsmWay::extractBuildingHeight(const OsmPlacemar= kData &osmData) return qBound(1.0, height, 1000.0); } = +QVector OsmWay::extractNamedEntries(const OsmPlacemark= Data &osmData) +{ + QVector entries; + + const auto end =3D osmData.nodeReferencesEnd(); + for (auto iter =3D osmData.nodeReferencesBegin(); iter !=3D end; ++ite= r) { + const auto tagIter =3D iter.value().findTag(QStringLiteral("addr:h= ousenumber")); + if (tagIter !=3D iter.value().tagsEnd()) { + NamedEntry entry; + entry.coordinates =3D iter.key(); + entry.label =3D tagIter.value(); + entry.osmData =3D *iter; + entries.push_back(entry); + } + } + + return entries; +} + } diff --git a/src/plugins/runner/osm/OsmWay.h b/src/plugins/runner/osm/OsmWa= y.h index 7672ba6..213f61e 100644 --- a/src/plugins/runner/osm/OsmWay.h +++ b/src/plugins/runner/osm/OsmWay.h @@ -34,11 +34,18 @@ public: void create(GeoDataDocument* document, const OsmNodes &nodes, QSet &usedNodes) const; = private: + struct NamedEntry { + GeoDataCoordinates coordinates; + QString label; + OsmPlacemarkData osmData; + }; + bool isArea() const; = static bool isAreaTag(const StyleBuilder::OsmTag &keyValue); = static double extractBuildingHeight(const OsmPlacemarkData &osmData); + static QVector extractNamedEntries(const OsmPlacemarkData = &osmData); = OsmPlacemarkData m_osmData; QVector m_references;