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 @@ -166,6 +166,8 @@ m_defaultMinZoomLevels[GeoDataFeature::Landmass] = 0; m_defaultMinZoomLevels[GeoDataFeature::UrbanArea] = 3; m_defaultMinZoomLevels[GeoDataFeature::InternationalDateLine] = 1; + m_defaultMinZoomLevels[GeoDataFeature::Bathymetry] = 1; + m_defaultMinZoomLevels[GeoDataFeature::AdminLevel1] = 0; m_defaultMinZoomLevels[GeoDataFeature::AdminLevel2] = 1; @@ -720,6 +722,7 @@ m_defaultStyle[GeoDataFeature::Landmass] = StyleBuilder::Private::createWayStyle( "#F1EEE8", "#F1EEE8", true, true ); m_defaultStyle[GeoDataFeature::UrbanArea] = StyleBuilder::Private::createWayStyle( "#E6E3DD", "#E6E3DD", true, true ); m_defaultStyle[GeoDataFeature::InternationalDateLine] = StyleBuilder::Private::createStyle( 1.0, 0.0, "#000000", "#000000", false, true, Qt::SolidPattern, Qt::SolidLine, Qt::FlatCap, false ); + m_defaultStyle[GeoDataFeature::Bathymetry] = StyleBuilder::Private::createWayStyle( waterColor, waterColor, true, true ); m_defaultStyle[GeoDataFeature::AdminLevel1] = StyleBuilder::Private::createStyle(0.0, 0.0, "#DF9CCF", "#DF9CCF", false, true, Qt::SolidPattern, Qt::CustomDashLine, Qt::FlatCap, false, QVector< qreal >() << 0.3 << 0.3 ); m_defaultStyle[GeoDataFeature::AdminLevel2] = StyleBuilder::Private::createStyle(2.0, 0.0, "#DF9CCF", "#DF9CCF", false, true, Qt::SolidPattern, Qt::SolidLine, Qt::FlatCap, false, QVector< qreal >() << 0.3 << 0.3 ); @@ -884,7 +887,17 @@ adjustStyle = true; } } - if(visualCategory == GeoDataFeature::AmenityGraveyard || visualCategory == GeoDataFeature::LanduseCemetery) { + else if (visualCategory == GeoDataFeature::Bathymetry) { + if (osmData.containsTagKey("ele")) { + QString elevation = osmData.tagValue("ele"); + if (elevation == "4000") { + polyStyle.setColor("#a5c9c9"); + lineStyle.setColor("#a5c9c9"); + adjustStyle = true; + } + } + } + else if (visualCategory == GeoDataFeature::AmenityGraveyard || visualCategory == GeoDataFeature::LanduseCemetery) { if( osmData.containsTag("religion","jewish") ){ polyStyle.setTexturePath(MarbleDirs::path("bitmaps/osmcarto/patterns/grave_yard_jewish.png")); adjustStyle = true; @@ -991,6 +1004,28 @@ } style = newStyle; + } else if (placemark->geometry()->nodeType() == GeoDataTypes::GeoDataPolygonType) { + GeoDataPolyStyle polyStyle = style->polyStyle(); + GeoDataLineStyle lineStyle = style->lineStyle(); + bool adjustStyle = false; + if (visualCategory == GeoDataFeature::Bathymetry) { + if (osmData.containsTagKey("ele")) { + QString elevation = osmData.tagValue("ele"); + if (elevation == "4000") { + polyStyle.setColor("#a5c9c9"); + lineStyle.setColor("#a5c9c9"); + adjustStyle = true; + } + } + } + + if (adjustStyle) { + GeoDataStyle::Ptr newStyle(new GeoDataStyle(*style)); + newStyle->setPolyStyle(polyStyle); + newStyle->setLineStyle(lineStyle); + style = newStyle; + } + } return style; @@ -1022,6 +1057,7 @@ paintLayerOrder << Private::createPaintLayerItem("Polygon", (GeoDataFeature::GeoDataVisualCategory)i); } } + paintLayerOrder << Private::createPaintLayerItem("Polygon", GeoDataFeature::Bathymetry); paintLayerOrder << Private::createPaintLayerItem("Polygon", GeoDataFeature::NaturalBeach); paintLayerOrder << Private::createPaintLayerItem("Polygon", GeoDataFeature::NaturalWetland); paintLayerOrder << Private::createPaintLayerItem("Polygon", GeoDataFeature::NaturalGlacier); @@ -1095,7 +1131,7 @@ for ( int i = GeoDataFeature::AdminLevel1; i <= GeoDataFeature::AdminLevel11; i++ ) { paintLayerOrder << Private::createPaintLayerItem("LineString", (GeoDataFeature::GeoDataVisualCategory)i, "label"); } - + paintLayerOrder << Private::createPaintLayerItem("Point", GeoDataFeature::Bathymetry); paintLayerOrder << Private::createPaintLayerItem("Point", GeoDataFeature::AmenityGraveyard); paintLayerOrder << Private::createPaintLayerItem("Point", GeoDataFeature::NaturalWood); paintLayerOrder << Private::createPaintLayerItem("Point", GeoDataFeature::NaturalBeach); @@ -1425,6 +1461,7 @@ visualCategoryNames[GeoDataFeature::Landmass] = "Landmass"; visualCategoryNames[GeoDataFeature::UrbanArea] = "UrbanArea"; visualCategoryNames[GeoDataFeature::InternationalDateLine] = "InternationalDateLine"; + visualCategoryNames[GeoDataFeature::Bathymetry] = "Bathymetry"; visualCategoryNames[GeoDataFeature::AdminLevel1] = "AdminLevel1"; visualCategoryNames[GeoDataFeature::AdminLevel2] = "AdminLevel2"; visualCategoryNames[GeoDataFeature::AdminLevel3] = "AdminLevel3"; diff --git a/src/lib/marble/declarative/Placemark.cpp b/src/lib/marble/declarative/Placemark.cpp --- a/src/lib/marble/declarative/Placemark.cpp +++ b/src/lib/marble/declarative/Placemark.cpp @@ -445,6 +445,7 @@ case GeoDataFeature::Landmass: return tr("Land Mass"); case GeoDataFeature::UrbanArea: return tr("Urban Area"); case GeoDataFeature::InternationalDateLine: return tr("International Date Line"); + case GeoDataFeature::Bathymetry: return tr("Bathymetry"); case GeoDataFeature::Valley: return tr("Valley"); case GeoDataFeature::OtherTerrain: return tr("Terrain"); case GeoDataFeature::Crater: return tr("Crater"); diff --git a/src/lib/marble/geodata/data/GeoDataFeature.h b/src/lib/marble/geodata/data/GeoDataFeature.h --- a/src/lib/marble/geodata/data/GeoDataFeature.h +++ b/src/lib/marble/geodata/data/GeoDataFeature.h @@ -416,6 +416,7 @@ Landmass, UrbanArea, InternationalDateLine, + Bathymetry, // Important: Make sure that this is always the last // item and just use it to specify the array size diff --git a/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.h b/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.h --- a/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.h +++ b/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.h @@ -48,6 +48,7 @@ void paintRoof( GeoPainter* painter, const ViewportParams *viewport ); QPointF buildingOffset(const QPointF &point, const ViewportParams *viewport, bool* isCameraAboveBuilding=0) const; + int extractBathymetryElevation(const GeoDataFeature *feature); static double extractBuildingHeight(const GeoDataFeature *feature); static QString extractBuildingLabel(const GeoDataFeature *feature); static QList extractNamedEntries(const GeoDataFeature *feature); diff --git a/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.cpp b/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.cpp --- a/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.cpp +++ b/src/lib/marble/geodata/graphicsitem/GeoPolygonGraphicsItem.cpp @@ -46,6 +46,12 @@ paintLayers << QString("Polygon/Building/roof"); setPaintLayers(paintLayers); } + else if (visualCategory == GeoDataFeature::Bathymetry) { + int elevation = extractBathymetryElevation(feature); + setZValue(this->zValue() + elevation); + const QString paintLayer = QString("Polygon/%1").arg(StyleBuilder::visualCategoryName(visualCategory)); + setPaintLayers(QStringList() << paintLayer); + } else { const QString paintLayer = QString("Polygon/%1").arg(StyleBuilder::visualCategoryName(visualCategory)); @@ -72,13 +78,41 @@ paintLayers << QString("Polygon/Building/roof"); setPaintLayers(paintLayers); } + else if (visualCategory == GeoDataFeature::Bathymetry) { + int elevation = extractBathymetryElevation(feature); + setZValue(this->zValue() + elevation); + const QString paintLayer = QString("Polygon/%1").arg(StyleBuilder::visualCategoryName(visualCategory)); + setPaintLayers(QStringList() << paintLayer); + } else { const QString paintLayer = QString("Polygon/%1").arg(StyleBuilder::visualCategoryName(visualCategory)); setPaintLayers(QStringList() << paintLayer); } } +int GeoPolygonGraphicsItem::extractBathymetryElevation(const GeoDataFeature *feature) +{ + const GeoDataFeature::GeoDataVisualCategory visualCategory = feature->visualCategory(); + if (visualCategory != GeoDataFeature::Bathymetry) { + return 0; + } + + int elevation = 0; + + if (feature->nodeType() == GeoDataTypes::GeoDataPlacemarkType) { + const GeoDataPlacemark *placemark = static_cast(feature); + + if (placemark->osmData().containsTagKey("ele")) { + elevation = placemark->osmData().tagValue("ele").toInt(); + } + } + + return elevation; + + +} + bool GeoPolygonGraphicsItem::isBuilding(GeoDataFeature::GeoDataVisualCategory visualCategory) { switch (visualCategory) { diff --git a/src/lib/marble/layers/GeometryLayer.cpp b/src/lib/marble/layers/GeometryLayer.cpp --- a/src/lib/marble/layers/GeometryLayer.cpp +++ b/src/lib/marble/layers/GeometryLayer.cpp @@ -242,7 +242,9 @@ const GeoDataPolygon *poly = static_cast( object ); item = new GeoPolygonGraphicsItem( placemark, poly ); - item->setZValue(poly->renderOrder()); + if (item->zValue() == 0) { + item->setZValue(poly->renderOrder()); + } } else if ( object->nodeType() == GeoDataTypes::GeoDataMultiGeometryType ) { diff --git a/src/lib/marble/osm/OsmPresetLibrary.cpp b/src/lib/marble/osm/OsmPresetLibrary.cpp --- a/src/lib/marble/osm/OsmPresetLibrary.cpp +++ b/src/lib/marble/osm/OsmPresetLibrary.cpp @@ -329,6 +329,7 @@ s_visualCategories[ OsmTag( "marble_land", "landmass" ) ] = GeoDataFeature::Landmass; s_visualCategories[ OsmTag( "settlement", "yes" ) ] = GeoDataFeature::UrbanArea; s_visualCategories[ OsmTag( "marble_line", "date" ) ] = GeoDataFeature::InternationalDateLine; + s_visualCategories[ OsmTag( "marble:feature", "bathymetry" ) ] = GeoDataFeature::Bathymetry; // Default for buildings foreach(const QString &value, buildingValues() ) { diff --git a/src/plugins/runner/osm/OsmRelation.cpp b/src/plugins/runner/osm/OsmRelation.cpp --- a/src/plugins/runner/osm/OsmRelation.cpp +++ b/src/plugins/runner/osm/OsmRelation.cpp @@ -114,6 +114,16 @@ // @todo: How to get the reference here? // placemark->osmData().addMemberReference(-1, ); + if (placemark->visualCategory() == GeoDataFeature::Bathymetry) { + // In case of a bathymetry store elevation info since it is required during styling + // The ele=* tag is present in the outermost way + OsmPlacemarkData outerWayData = ways[*outerWays.begin()].osmData(); + if (outerWayData.containsTagKey("ele")) { + QString value = outerWayData.tagValue("ele"); + placemark->osmData().addTag("ele", value); + } + } + QStringList const innerRoles = QStringList() << "inner"; QSet innerWays; QList inner = rings(innerRoles, ways, nodes, usedNodes, innerWays); diff --git a/tools/shp2osm/polyshp2osm.py b/tools/shp2osm/polyshp2osm.py --- a/tools/shp2osm/polyshp2osm.py +++ b/tools/shp2osm/polyshp2osm.py @@ -115,7 +115,7 @@ if 'prim_purp' in data: if data['prim_purp'] in keys: return keys[data['prim_purp']] - + def road_map(data): keys = { @@ -273,7 +273,8 @@ '1st Order Admin Lines': [('boundary', 'administrative'), ('admin_level', '4')], 'Claim': [('boundary', 'administrative'), ('admin_level', '4')], 'Airport': [('aeroway', 'aerodrome')], - 'Date line': [('marble_line', 'date')] + 'Date line': [('marble_line', 'date')], + 'Bathymetry': [('marble:feature', 'bathymetry'), ('ele', data['depth'])] } if 'featurecla' in data: if data['featurecla'] in feat_dict: