void OsmNode::create(GeoDataDocument *document) const { GeoDataFeature::GeoDataVisualCategory const category = OsmPresetLibrary::determineVisualCategory(m_osmData); if (category == GeoDataFeature::None || (category >= GeoDataFeature::HighwaySteps && category <= GeoDataFeature::HighwayMotorway)) { return; } GeoDataPlacemark* placemark = new GeoDataPlacemark; placemark->setOsmData(m_osmData); placemark->setCoordinate(m_coordinates); if ((category == GeoDataFeature::TransportCarShare || category == GeoDataFeature::MoneyAtm) && m_osmData.containsTagKey("operator")) { placemark->setName(m_osmData.tagValue("operator")); } else { placemark->setName(m_osmData.tagValue("name")); } placemark->setZoomLevel( 18 ); placemark->setVisualCategory(category); placemark->setStyle( 0 ); if (category == GeoDataFeature::NaturalTree) { qreal const lat = m_coordinates.latitude(GeoDataCoordinates::Degree); if (qAbs(lat) > 15) { /** @todo Should maybe auto-adjust to MarbleClock at some point */ QDate const date = QDate::currentDate(); bool const southernHemisphere = lat < 0; QDate const autumnStart = QDate(date.year(), southernHemisphere ? 3 : 9, 15); QDate const winterEnd = southernHemisphere ? QDate(date.year(), 8, 15) : QDate(date.year()+1, 2, 15); if (date > autumnStart && date < winterEnd) { QDate const autumnEnd = QDate(date.year(), southernHemisphere ? 5 : 11, 15); QString const season = date < autumnEnd ? "autumn" : "winter"; GeoDataIconStyle iconStyle = placemark->style()->iconStyle(); QString const bitmap = QString("bitmaps/osmcarto/symbols/48/individual/tree-29-%1.png").arg(season); iconStyle.setIconPath(MarbleDirs::path(bitmap)); GeoDataStyle* style = new GeoDataStyle(*placemark->style()); style->setIconStyle(iconStyle); placemark->setStyle(style); } } } OsmObjectManager::registerId(m_osmData.id()); document->append(placemark); }
void OsmNode::create(GeoDataDocument *document) const { GeoDataFeature::GeoDataVisualCategory const category = OsmPresetLibrary::determineVisualCategory(m_osmData); if (category == GeoDataFeature::None || (category >= GeoDataFeature::HighwaySteps && category <= GeoDataFeature::HighwayMotorway)) { return; } GeoDataPlacemark* placemark = new GeoDataPlacemark; placemark->setOsmData(m_osmData); placemark->setCoordinate(m_coordinates); if ((category == GeoDataFeature::TransportCarShare || category == GeoDataFeature::MoneyAtm) && m_osmData.containsTagKey("operator")) { placemark->setName(m_osmData.tagValue("operator")); } else { placemark->setName(m_osmData.tagValue("name")); } placemark->setVisualCategory(category); placemark->setStyle( GeoDataStyle::Ptr() ); if (category == GeoDataFeature::NaturalTree) { qreal const lat = m_coordinates.latitude(GeoDataCoordinates::Degree); if (qAbs(lat) > 15) { /** @todo Should maybe auto-adjust to MarbleClock at some point */ QDate const date = QDate::currentDate(); bool const southernHemisphere = lat < 0; QDate const autumnStart = QDate(date.year(), southernHemisphere ? 3 : 9, 15); QDate const winterEnd = southernHemisphere ? QDate(date.year(), 8, 15) : QDate(date.year()+1, 2, 15); if (date > autumnStart && date < winterEnd) { QDate const autumnEnd = QDate(date.year(), southernHemisphere ? 5 : 11, 15); QString const season = date < autumnEnd ? "autumn" : "winter"; GeoDataIconStyle iconStyle = placemark->style()->iconStyle(); QString const bitmap = QString("bitmaps/osmcarto/symbols/48/individual/tree-29-%1.png").arg(season); iconStyle.setIconPath(MarbleDirs::path(bitmap)); GeoDataStyle::Ptr style(new GeoDataStyle(*placemark->style())); style->setIconStyle(iconStyle); placemark->setStyle(style); } } } placemark->setZoomLevel( 18 ); if (category >= GeoDataFeature::PlaceCity && category <= GeoDataFeature::PlaceVillage) { int const population = m_osmData.tagValue("population").toInt(); placemark->setPopulation(qMax(0, population)); if (population > 0) { placemark->setZoomLevel(populationIndex(population)); placemark->setPopularity(population); } else { switch (category) { case GeoDataFeature::PlaceCity: placemark->setZoomLevel(9); break; case GeoDataFeature::PlaceSuburb: placemark->setZoomLevel(13); break; case GeoDataFeature::PlaceHamlet: placemark->setZoomLevel(15); break; case GeoDataFeature::PlaceLocality: placemark->setZoomLevel(15); break; case GeoDataFeature::PlaceTown: placemark->setZoomLevel(11); break; case GeoDataFeature::PlaceVillage: placemark->setZoomLevel(13); break; default: placemark->setZoomLevel(10); break; } } } else if (category == GeoDataFeature::NaturalPeak) { placemark->setZoomLevel(11); bool isInteger = false; int const elevation = m_osmData.tagValue("ele").toInt(&isInteger); if (isInteger) { placemark->setName(QString("%1 (%2 m)").arg(placemark->name()).arg(elevation)); } } OsmObjectManager::registerId(m_osmData.id()); document->append(placemark); }
void TestGeoData::parentingTest() { GeoDataDocument *document = new GeoDataDocument; GeoDataFolder *folder = new GeoDataFolder; /// simple parenting test GeoDataPlacemark *placemark = new GeoDataPlacemark; placemark->setParent(document); QCOMPARE(placemark->parent(), document); /// simple append and child count test document->append(placemark); /// appending folder to document before feeding folder document->append(folder); QCOMPARE(document->size(), 2); GeoDataPlacemark *placemark2 = new GeoDataPlacemark; folder->append(placemark2); QCOMPARE(folder->size(), 1); /// retrieve child and check it matches placemark GeoDataPlacemark *placemarkPtr; QCOMPARE(document->child(0)->nodeType(), placemark->nodeType()); placemarkPtr = static_cast<GeoDataPlacemark*>(document->child(0)); QCOMPARE(placemarkPtr, placemark); /// check retrieved placemark matches intented child int position = document->childPosition(placemarkPtr); QCOMPARE(position, 0); /// retrieve child two and check it matches folder GeoDataFolder *folderPtr; QCOMPARE(document->child(1)->nodeType(), folder->nodeType()); folderPtr = static_cast<GeoDataFolder*>(document->child(1)); QCOMPARE(folderPtr, folder); /// check retrieved folder matches intended child position = document->childPosition(folderPtr); QCOMPARE(position, 1); /// retrieve child three and check it matches placemark QCOMPARE(folderPtr->size(), 1); placemarkPtr = static_cast<GeoDataPlacemark*>(folderPtr->child(0)); QCOMPARE(placemarkPtr->nodeType(), placemark2->nodeType()); QCOMPARE(placemarkPtr, placemark2); /// check retrieved placemark matches intended child QCOMPARE(folderPtr->childPosition(placemarkPtr), 0); /// Set a style GeoDataIconStyle iconStyle; iconStyle.setIconPath( "myicon.png" ); GeoDataStyle* style = new GeoDataStyle; style->setStyleId( "mystyle" ); style->setIconStyle( iconStyle ); GeoDataObject* noParent = 0; QCOMPARE( style->parent(), noParent ); QCOMPARE( iconStyle.parent(), noParent ); document->setStyle( style ); QCOMPARE( style->parent(), document ); // Parent should be assigned now QCOMPARE( style->iconStyle().parent(), style ); QCOMPARE( iconStyle.parent(), noParent ); // setIconStyle copies QCOMPARE( placemark->style()->parent(), noParent ); placemark->setStyle( style ); QCOMPARE( placemark->style()->parent(), placemark ); // Parent should be assigned now /// Set a style map GeoDataStyleMap* styleMap = new GeoDataStyleMap; styleMap->setStyleId( "mystylemap" ); styleMap->insert( "normal", "#mystyle" ); styleMap->insert( "highlight", "#mystyle" ); document->addStyle( *style ); document->setStyleMap( styleMap ); QCOMPARE( placemark2->style()->parent(), noParent ); placemark2->setStyleUrl( "#mystyle" ); QCOMPARE( placemark2->style()->parent(), document ); // Parent is document, not placemark2 QCOMPARE( iconStyle.iconPath(), QString( "myicon.png" ) ); QCOMPARE( placemark2->style()->iconStyle().iconPath(), QString( "myicon.png" ) ); }