Git commit e2e3e1989783c8b5640ad703e2d7001d87f05dcc by Bernhard Beschow. Committed on 03/10/2016 at 14:30. Pushed by beschow into branch 'master'. set the bboxe's height to the building height and use that for building ren= dering M +3 -27 src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphi= csItem.cpp M +0 -1 src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphi= csItem.h M +40 -2 src/plugins/runner/osm/OsmWay.cpp M +2 -0 src/plugins/runner/osm/OsmWay.h http://commits.kde.org/marble/e2e3e1989783c8b5640ad703e2d7001d87f05dcc diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphics= Item.cpp b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsIt= em.cpp index cf86ea7..e9f73d3 100644 --- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp +++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.cpp @@ -14,6 +14,7 @@ #include "ViewportParams.h" #include "GeoDataTypes.h" #include "GeoDataPlacemark.h" +#include "GeoDataLatLonAltBox.h" #include "GeoDataLinearRing.h" #include "GeoDataPolygon.h" #include "GeoDataIconStyle.h" @@ -27,7 +28,7 @@ namespace Marble BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphicsItem(const GeoDa= taPlacemark *placemark, const GeoDa= taPolygon *polygon) : AbstractGeoPolygonGraphicsItem(placemark, polygon) - , m_buildingHeight(extractBuildingHeight(*placemark)) + , m_buildingHeight(polygon->latLonAltBox().maxAltitude() - polygon->la= tLonAltBox().minAltitude()) , m_buildingLabel(extractBuildingLabel(*placemark)) , m_entries(extractNamedEntries(*placemark)) { @@ -43,7 +44,7 @@ BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphic= sItem(const GeoDataPlac BuildingGeoPolygonGraphicsItem::BuildingGeoPolygonGraphicsItem(const GeoDa= taPlacemark *placemark, const GeoDa= taLinearRing* ring) : AbstractGeoPolygonGraphicsItem(placemark, ring) - , m_buildingHeight(extractBuildingHeight(*placemark)) + , m_buildingHeight(ring->latLonAltBox().maxAltitude() - ring->latLonAl= tBox().minAltitude()) , m_buildingLabel(extractBuildingLabel(*placemark)) , m_entries(extractNamedEntries(*placemark)) { @@ -134,31 +135,6 @@ QPointF BuildingGeoPolygonGraphicsItem::buildingOffset= (const QPointF &point, con return QPointF(shiftX, shiftY); } = -double BuildingGeoPolygonGraphicsItem::extractBuildingHeight(const GeoData= Placemark &placemark) -{ - double height =3D 8.0; - - const OsmPlacemarkData &osmData =3D placemark.osmData(); - - QHash::const_iterator tagIter; - if ((tagIter =3D osmData.findTag(QStringLiteral("height"))) !=3D osmDa= ta.tagsEnd()) { - /** @todo Also parse non-SI units, see https://wiki.openstreetmap.= org/wiki/Key:height#Height_of_buildings */ - QString const heightValue =3D QString(tagIter.value()).remove(QStr= ingLiteral(" meters")).remove(QStringLiteral(" m")); - bool extracted =3D false; - double extractedHeight =3D heightValue.toDouble(&extracted); - if (extracted) { - height =3D extractedHeight; - } - } else if ((tagIter =3D osmData.findTag(QStringLiteral("building:level= s"))) !=3D osmData.tagsEnd()) { - int const levels =3D tagIter.value().toInt(); - int const skipLevels =3D osmData.tagValue(QStringLiteral("building= :min_level")).toInt(); - /** @todo Is 35 as an upper bound for the number of levels sane? */ - height =3D 3.0 * qBound(1, 1+levels-skipLevels, 35); - } - - return qBound(1.0, height, 1000.0); -} - QString BuildingGeoPolygonGraphicsItem::extractBuildingLabel(const GeoData= Placemark &placemark) { if (!placemark.name().isEmpty()) { diff --git a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphics= Item.h b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem= .h index 8514cc5..bb7a662 100644 --- a/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h +++ b/src/lib/marble/geodata/graphicsitem/BuildingGeoPolygonGraphicsItem.h @@ -46,7 +46,6 @@ private: static QPointF centroid(const QPolygonF &polygon, double &area); static void screenPolygons(const ViewportParams *viewport, const GeoDa= taPolygon* polygon, QVector &polygons, QVector &outlines); - static double extractBuildingHeight(const GeoDataPlacemark &placemark); static QString extractBuildingLabel(const GeoDataPlacemark &placemark); static QVector extractNamedEntries(const GeoDataPlacemark = &placemark); = diff --git a/src/plugins/runner/osm/OsmWay.cpp b/src/plugins/runner/osm/Osm= Way.cpp index 151f91d..1b2a02b 100644 --- a/src/plugins/runner/osm/OsmWay.cpp +++ b/src/plugins/runner/osm/OsmWay.cpp @@ -25,6 +25,8 @@ QSet OsmWay::s_areaTags; = void OsmWay::create(GeoDataDocument *document, const OsmNodes &nodes, QSet= &usedNodes) const { + const double height =3D extractBuildingHeight(m_osmData); + OsmPlacemarkData osmData =3D m_osmData; GeoDataGeometry *geometry =3D 0; = @@ -43,7 +45,12 @@ void OsmWay::create(GeoDataDocument *document, const Osm= Nodes &nodes, QSetsetAltitudeMode(RelativeToGround); + } = OsmObjectManager::registerId(m_osmData.id()); = @@ -180,4 +195,27 @@ bool OsmWay::isAreaTag(const StyleBuilder::OsmTag &key= Value) return s_areaTags.contains(keyValue); } = +double OsmWay::extractBuildingHeight(const OsmPlacemarkData &osmData) +{ + double height =3D 8.0; + + QHash::const_iterator tagIter; + if ((tagIter =3D osmData.findTag(QStringLiteral("height"))) !=3D osmDa= ta.tagsEnd()) { + /** @todo Also parse non-SI units, see https://wiki.openstreetmap.= org/wiki/Key:height#Height_of_buildings */ + QString const heightValue =3D QString(tagIter.value()).remove(QStr= ingLiteral(" meters")).remove(QStringLiteral(" m")); + bool extracted =3D false; + double extractedHeight =3D heightValue.toDouble(&extracted); + if (extracted) { + height =3D extractedHeight; + } + } else if ((tagIter =3D osmData.findTag(QStringLiteral("building:level= s"))) !=3D osmData.tagsEnd()) { + int const levels =3D tagIter.value().toInt(); + int const skipLevels =3D osmData.tagValue(QStringLiteral("building= :min_level")).toInt(); + /** @todo Is 35 as an upper bound for the number of levels sane? */ + height =3D 3.0 * qBound(1, 1+levels-skipLevels, 35); + } + + return qBound(1.0, height, 1000.0); +} + } diff --git a/src/plugins/runner/osm/OsmWay.h b/src/plugins/runner/osm/OsmWa= y.h index 3a9efa0..7672ba6 100644 --- a/src/plugins/runner/osm/OsmWay.h +++ b/src/plugins/runner/osm/OsmWay.h @@ -38,6 +38,8 @@ private: = static bool isAreaTag(const StyleBuilder::OsmTag &keyValue); = + static double extractBuildingHeight(const OsmPlacemarkData &osmData); + OsmPlacemarkData m_osmData; QVector m_references; =