diff --git a/src/lib/marble/StyleBuilder.cpp b/src/lib/marble/StyleBuilder.cpp --- a/src/lib/marble/StyleBuilder.cpp +++ b/src/lib/marble/StyleBuilder.cpp @@ -19,6 +19,7 @@ #include "GeoDataGeometry.h" #include "GeoDataLinearRing.h" #include "GeoDataLineString.h" +#include "GeoDataBuilding.h" #include "GeoDataPlacemark.h" #include "GeoDataPoint.h" #include "GeoDataPolygon.h" @@ -106,7 +107,7 @@ bool m_defaultStyleInitialized; QHash m_styleCache; - QHash m_buildingStyles; + GeoDataStyle::Ptr m_buildingStyle; QSet m_oceanianCountries; /** @@ -310,16 +311,8 @@ OsmPlacemarkData const & osmData = placemark->osmData(); auto const visualCategory = placemark->visualCategory(); - if (visualCategory == GeoDataPlacemark::Building) { - auto const tagMap = osmTagMapping(); - auto const & osmData = placemark->osmData(); - auto const buildingTag = QStringLiteral("building"); - for (auto iter = osmData.tagsBegin(), end = osmData.tagsEnd(); iter != end; ++iter) { - auto const osmTag = StyleBuilder::OsmTag(iter.key(), iter.value()); - if (iter.key() != buildingTag && tagMap.contains(osmTag)) { - return m_buildingStyles.value(tagMap.value(osmTag), m_defaultStyle[visualCategory]); - } - } + if (geodata_cast(placemark->geometry())) { + return m_buildingStyle; } GeoDataStyle::ConstPtr style = presetStyle(visualCategory); @@ -1301,17 +1294,8 @@ m_defaultStyle[GeoDataPlacemark::LargeNationCapital]->labelStyle().setFont(tmp); // Buildings - m_defaultStyle[GeoDataPlacemark::Building] = createStyle(1, 0, buildingColor, buildingColor.darker(), + m_buildingStyle = createStyle(1, 0, buildingColor, buildingColor.darker(), true, true, Qt::SolidPattern, Qt::SolidLine, Qt::RoundCap, false, QVector(), osmFont); - for (int i = 0; i < GeoDataPlacemark::LastIndex; ++i) { - if (m_defaultStyle[i] && !m_defaultStyle[i]->iconStyle().iconPath().isEmpty()) { - auto const category = GeoDataPlacemark::GeoDataVisualCategory(i); - m_buildingStyles[category] = GeoDataStyle::Ptr(new GeoDataStyle(*m_defaultStyle[GeoDataPlacemark::Building])); - m_buildingStyles[category]->iconStyle() = m_defaultStyle[i]->iconStyle(); - m_buildingStyles[category]->labelStyle() = m_defaultStyle[i]->labelStyle(); - } - } - } QString StyleBuilder::Private::createPaintLayerItem(const QString &itemType, GeoDataPlacemark::GeoDataVisualCategory visualCategory, const QString &subType) @@ -1689,11 +1673,6 @@ s_visualCategories[OsmTag("settlement", "yes")] = GeoDataPlacemark::UrbanArea; s_visualCategories[OsmTag("marble_line", "date")] = GeoDataPlacemark::InternationalDateLine; s_visualCategories[OsmTag("marble:feature", "bathymetry")] = GeoDataPlacemark::Bathymetry; - - // Default for buildings - for (const auto &tag: buildingTags()) { - s_visualCategories[tag] = GeoDataPlacemark::Building; - } } void StyleBuilder::Private::initializeMinimumZoomLevels() @@ -1759,8 +1738,6 @@ s_defaultMinZoomLevels[GeoDataPlacemark::BoundaryMaritime] = 1; - s_defaultMinZoomLevels[GeoDataPlacemark::Building] = 17; - s_defaultMinZoomLevels[GeoDataPlacemark::Default] = 1; s_defaultMinZoomLevels[GeoDataPlacemark::EducationCollege] = 15; @@ -2546,7 +2523,6 @@ visualCategoryNames[GeoDataPlacemark::HighwayMotorway] = "HighwayMotorway"; visualCategoryNames[GeoDataPlacemark::HighwayCorridor] = "HighwayCorridor"; visualCategoryNames[GeoDataPlacemark::HighwayElevator] = "HighwayElevator"; - visualCategoryNames[GeoDataPlacemark::Building] = "Building"; visualCategoryNames[GeoDataPlacemark::AccomodationCamping] = "AccomodationCamping"; visualCategoryNames[GeoDataPlacemark::AccomodationHostel] = "AccomodationHostel"; visualCategoryNames[GeoDataPlacemark::AccomodationHotel] = "AccomodationHotel"; @@ -2930,10 +2906,6 @@ return GeoDataPlacemark::None; } - if (osmData.containsTag(QStringLiteral("building"), yes)) { - return GeoDataPlacemark::Building; - } - if (osmData.containsTag(QStringLiteral("historic"), QStringLiteral("castle")) && osmData.containsTag(QStringLiteral("castle_type"), QStringLiteral("kremlin"))) { return GeoDataPlacemark::None; } diff --git a/src/lib/marble/geodata/data/GeoDataPlacemark.h b/src/lib/marble/geodata/data/GeoDataPlacemark.h --- a/src/lib/marble/geodata/data/GeoDataPlacemark.h +++ b/src/lib/marble/geodata/data/GeoDataPlacemark.h @@ -209,9 +209,6 @@ HighwayMotorwayLink, HighwayMotorway, // please keep order (used in for loops) - //OSM building - Building, - // OpenStreetMap category Accomodation AccomodationCamping, AccomodationHostel, diff --git a/src/lib/marble/geodata/data/GeoDataPlacemark.cpp b/src/lib/marble/geodata/data/GeoDataPlacemark.cpp --- a/src/lib/marble/geodata/data/GeoDataPlacemark.cpp +++ b/src/lib/marble/geodata/data/GeoDataPlacemark.cpp @@ -405,7 +405,6 @@ case HighwayMotorwayLink: return GeoDataPlacemarkPrivate::tr("Motorway Link Road"); case HighwayMotorway: return GeoDataPlacemarkPrivate::tr("Motorway"); case HighwayCorridor: return GeoDataPlacemarkPrivate::tr("Corridor"); - case Building: return GeoDataPlacemarkPrivate::tr("Building"); case AccomodationCamping: return GeoDataPlacemarkPrivate::tr("Camping"); case AccomodationHostel: return GeoDataPlacemarkPrivate::tr("Hostel"); case AccomodationHotel: return GeoDataPlacemarkPrivate::tr("Hotel"); diff --git a/src/plugins/runner/osm/OsmWay.cpp b/src/plugins/runner/osm/OsmWay.cpp --- a/src/plugins/runner/osm/OsmWay.cpp +++ b/src/plugins/runner/osm/OsmWay.cpp @@ -83,15 +83,17 @@ GeoDataPlacemark *placemark = new GeoDataPlacemark; placemark->setGeometry(geometry); - placemark->setVisualCategory(StyleBuilder::determineVisualCategory(m_osmData)); + if (!isBuilding()) { + placemark->setVisualCategory(StyleBuilder::determineVisualCategory(m_osmData)); + } placemark->setName(m_osmData.tagValue(QStringLiteral("name"))); if (placemark->name().isEmpty()) { placemark->setName(m_osmData.tagValue(QStringLiteral("ref"))); } placemark->setOsmData(osmData); - placemark->setZoomLevel(StyleBuilder::minimumZoomLevel(placemark->visualCategory())); + placemark->setZoomLevel(isBuilding() ? 17 : StyleBuilder::minimumZoomLevel(placemark->visualCategory())); placemark->setPopularity(StyleBuilder::popularity(placemark)); - placemark->setVisible(placemark->visualCategory() != GeoDataPlacemark::None); + placemark->setVisible(isBuilding() ? true : placemark->visualCategory() != GeoDataPlacemark::None); return placemark; }