File indexing completed on 2024-05-12 03:50:16

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2004-2007 Torsten Rahn <tackat@kde.org>
0004 // SPDX-FileCopyrightText: 2007 Inge Wallin <ingwa@kde.org>
0005 // SPDX-FileCopyrightText: 2008-2009 Patrick Spendrin <ps_ml@gmx.de>
0006 //
0007 
0008 
0009 // Own
0010 #include "GeoDataPlacemark.h"
0011 
0012 // Private
0013 #include "GeoDataPlacemark_p.h"
0014 
0015 #include "GeoDataMultiGeometry.h"
0016 #include "GeoDataLatLonAltBox.h"
0017 #include "GeoDataData.h"
0018 #include "osm/OsmPlacemarkData.h"
0019 
0020 // Qt
0021 #include <QDataStream>
0022 #include "MarbleDebug.h"
0023 #include "GeoDataTrack.h"
0024 #include "GeoDataModel.h"
0025 #include <QString>
0026 #include <QXmlStreamWriter>
0027 
0028 namespace Marble
0029 {
0030 
0031 const OsmPlacemarkData GeoDataPlacemarkPrivate::s_nullOsmPlacemarkData = OsmPlacemarkData();
0032 const GeoDataPlacemarkExtendedData GeoDataPlacemarkPrivate::s_nullPlacemarkExtendedData = GeoDataPlacemarkExtendedData();
0033 
0034 GeoDataPlacemark::GeoDataPlacemark()
0035     : GeoDataFeature( new GeoDataPlacemarkPrivate )
0036 {
0037     Q_D(GeoDataPlacemark);
0038     d->m_geometry->setParent(this);
0039 }
0040 
0041 
0042 GeoDataPlacemark::GeoDataPlacemark( const GeoDataPlacemark& other )
0043     : GeoDataFeature(other, new GeoDataPlacemarkPrivate(*other.d_func()))
0044 {
0045     Q_D(GeoDataPlacemark);
0046     if (d->m_geometry) {
0047         d->m_geometry->setParent(this);
0048     }
0049 }
0050 
0051 GeoDataPlacemark::GeoDataPlacemark( const QString& name )
0052     : GeoDataFeature( new GeoDataPlacemarkPrivate )
0053 {
0054     Q_D(GeoDataPlacemark);
0055     d->m_name = name;
0056     d->m_geometry->setParent(this);
0057 }
0058 
0059 GeoDataPlacemark::~GeoDataPlacemark()
0060 {
0061     // nothing to do
0062 }
0063 
0064 GeoDataPlacemark &GeoDataPlacemark::operator=( const GeoDataPlacemark &other )
0065 {
0066     if (this != &other) {
0067         Q_D(GeoDataPlacemark);
0068         *d = *other.d_func();
0069         if (d->m_geometry) {
0070             d->m_geometry->setParent(this);
0071         }
0072     }
0073 
0074     return *this;
0075 }
0076 
0077 bool GeoDataPlacemark::operator==( const GeoDataPlacemark& other ) const
0078 { 
0079     Q_D(const GeoDataPlacemark);
0080     const GeoDataPlacemarkPrivate* const other_d = other.d_func();
0081     if (!equals(other) ||
0082         d->m_population != other_d->m_population) {
0083         return false;
0084     }
0085 
0086     if ((d->m_placemarkExtendedData && !other_d->m_placemarkExtendedData) &&
0087         (*d->m_placemarkExtendedData != GeoDataPlacemarkExtendedData())) {
0088         return false;
0089     }
0090 
0091     if ((!d->m_placemarkExtendedData && other_d->m_placemarkExtendedData) &&
0092         (GeoDataPlacemarkExtendedData() != *other_d->m_placemarkExtendedData)) {
0093         return false;
0094     }
0095 
0096     if (d->m_placemarkExtendedData && other_d->m_placemarkExtendedData &&
0097             !(*d->m_placemarkExtendedData == *other_d->m_placemarkExtendedData)) {
0098         return false;
0099     }
0100 
0101     if (!d->m_geometry && !other_d->m_geometry) {
0102         return true;
0103     }
0104     if ((!d->m_geometry && other_d->m_geometry) ||
0105         (d->m_geometry && !other_d->m_geometry)) {
0106         return false;
0107     }
0108 
0109     if (*d->m_geometry != *other_d->m_geometry) {
0110         return false;
0111     }
0112 
0113     return true;
0114 }
0115 
0116 bool GeoDataPlacemark::operator!=( const GeoDataPlacemark& other ) const
0117 {
0118     return !this->operator==( other );
0119 }
0120 
0121 const char* GeoDataPlacemark::nodeType() const
0122 {
0123     return GeoDataTypes::GeoDataPlacemarkType;
0124 }
0125 
0126 
0127 GeoDataFeature * GeoDataPlacemark::clone() const
0128 {
0129     return new GeoDataPlacemark(*this);
0130 }
0131 
0132 
0133 GeoDataPlacemark::GeoDataVisualCategory GeoDataPlacemark::visualCategory() const
0134 {
0135     Q_D(const GeoDataPlacemark);
0136     return d->m_visualCategory;
0137 }
0138 
0139 void GeoDataPlacemark::setVisualCategory(GeoDataPlacemark::GeoDataVisualCategory index)
0140 {
0141     Q_D(GeoDataPlacemark);
0142     d->m_visualCategory = index;
0143 }
0144 
0145 GeoDataGeometry* GeoDataPlacemark::geometry()
0146 {
0147     Q_D(GeoDataPlacemark);
0148     return d->m_geometry;
0149 }
0150 
0151 const GeoDataGeometry* GeoDataPlacemark::geometry() const
0152 {
0153     Q_D(const GeoDataPlacemark);
0154     return d->m_geometry;
0155 }
0156 
0157 const OsmPlacemarkData& GeoDataPlacemark::osmData() const
0158 {
0159     Q_D(const GeoDataPlacemark);
0160     return d->osmPlacemarkData();
0161 }
0162 
0163 void GeoDataPlacemark::setOsmData( const OsmPlacemarkData &osmData )
0164 {
0165     Q_D(GeoDataPlacemark);
0166     d->osmPlacemarkData() = osmData;
0167 }
0168 
0169 OsmPlacemarkData& GeoDataPlacemark::osmData()
0170 {
0171     Q_D(GeoDataPlacemark);
0172     return d->osmPlacemarkData();
0173 }
0174 
0175 bool GeoDataPlacemark::hasOsmData() const
0176 {
0177     Q_D(const GeoDataPlacemark);
0178     return d->m_osmPlacemarkData != nullptr;
0179 }
0180 
0181 void GeoDataPlacemark::clearOsmData()
0182 {
0183     Q_D(GeoDataPlacemark);
0184     delete d->m_osmPlacemarkData;
0185     d->m_osmPlacemarkData = nullptr;
0186 }
0187 
0188 const GeoDataLookAt *GeoDataPlacemark::lookAt() const
0189 {
0190     return dynamic_cast<const GeoDataLookAt*>( abstractView() );
0191 }
0192 
0193 GeoDataLookAt *GeoDataPlacemark::lookAt()
0194 {
0195     return dynamic_cast<GeoDataLookAt*>( abstractView() );
0196 }
0197 
0198 bool GeoDataPlacemark::placemarkLayoutOrderCompare(const GeoDataPlacemark *left, const GeoDataPlacemark *right)
0199 {
0200     const GeoDataPlacemarkPrivate * const left_d = left->d_func();
0201     const GeoDataPlacemarkPrivate * const right_d = right->d_func();
0202 
0203     if (left_d->m_zoomLevel != right_d->m_zoomLevel) {
0204         return (left_d->m_zoomLevel < right_d->m_zoomLevel); // lower zoom level comes first
0205     }
0206 
0207     if (left_d->m_popularity != right_d->m_popularity) {
0208         return (left_d->m_popularity > right_d->m_popularity); // higher popularity comes first
0209     }
0210 
0211     return left < right; // lower pointer value comes first
0212 }
0213 
0214 GeoDataCoordinates GeoDataPlacemark::coordinate( const QDateTime &dateTime, bool *iconAtCoordinates ) const
0215 {
0216     Q_D(const GeoDataPlacemark);
0217     bool hasIcon = false;
0218     GeoDataCoordinates coord;
0219  
0220     if (d->m_geometry) {
0221         // Beware: comparison between pointers, not strings.
0222         if (geodata_cast<GeoDataPoint>(d->m_geometry)
0223                 || geodata_cast<GeoDataPolygon>(d->m_geometry)
0224                 || geodata_cast<GeoDataLinearRing>(d->m_geometry)) {
0225             hasIcon = true;
0226             coord = d->m_geometry->latLonAltBox().center();
0227         } else if (const auto multiGeometry = geodata_cast<GeoDataMultiGeometry>(d->m_geometry)) {
0228             QVector<GeoDataGeometry*>::ConstIterator it = multiGeometry->constBegin();
0229             QVector<GeoDataGeometry*>::ConstIterator end = multiGeometry->constEnd();
0230             for ( ; it != end; ++it ) {
0231                 if (geodata_cast<GeoDataPoint>(*it)
0232                         || geodata_cast<GeoDataPolygon>(*it)
0233                         || geodata_cast<GeoDataLinearRing>(*it)) {
0234                     hasIcon = true;
0235                     break;
0236                 }
0237             }
0238 
0239             coord = d->m_geometry->latLonAltBox().center();
0240         } else if (const auto track = geodata_cast<GeoDataTrack>(d->m_geometry)) {
0241             hasIcon = track->size() != 0 && track->firstWhen() <= dateTime;
0242             coord = track->coordinatesAt( dateTime );
0243         } else if (const auto lineString = geodata_cast<GeoDataLineString>(d->m_geometry)) {
0244             auto const size = lineString->size();
0245             if (size == 0) {
0246                 return GeoDataCoordinates();
0247             } else if (size < 3) {
0248                 // Approximate center if there are just two coordinates
0249                 return lineString->latLonAltBox().center();
0250             } else {
0251                 return lineString->at(size / 2);
0252             }
0253         } else {
0254             coord = d->m_geometry->latLonAltBox().center();
0255         }
0256     }
0257 
0258     if ( iconAtCoordinates != nullptr ) {
0259         *iconAtCoordinates = hasIcon;
0260     }
0261     return coord;
0262 }
0263 
0264 void GeoDataPlacemark::coordinate( qreal& lon, qreal& lat, qreal& alt ) const
0265 {
0266     coordinate().geoCoordinates( lon, lat, alt );
0267 }
0268 
0269 void GeoDataPlacemark::setCoordinate( qreal lon, qreal lat, qreal alt, GeoDataPoint::Unit _unit)
0270 {
0271     setGeometry( new GeoDataPoint(lon, lat, alt, _unit ) );
0272 }
0273 
0274 void GeoDataPlacemark::setCoordinate( const GeoDataCoordinates &point )
0275 {
0276     setGeometry ( new GeoDataPoint( point ) );
0277 }
0278 
0279 void GeoDataPlacemark::setGeometry( GeoDataGeometry *entry )
0280 {
0281     Q_D(GeoDataPlacemark);
0282     delete d->m_geometry;
0283     d->m_geometry = entry;
0284     d->m_geometry->setParent(this);
0285 }
0286 
0287 
0288 QString GeoDataPlacemark::displayName() const
0289 {
0290     if (hasOsmData()) {
0291         OsmPlacemarkData const &data = osmData();
0292         QStringList const uiLanguages = QLocale::system().uiLanguages();
0293         for (const QString &uiLanguage: uiLanguages) {
0294             for (auto tagIter = data.tagsBegin(), end = data.tagsEnd(); tagIter != end; ++tagIter) {
0295                 if (tagIter.key().startsWith(QLatin1String("name:"))) {
0296                     QStringRef const tagLanguage = tagIter.key().midRef(5);
0297                     if (tagLanguage == uiLanguage) {
0298                         return tagIter.value();
0299                     }
0300                 }
0301             }
0302         }
0303     }
0304 
0305     return name();
0306 }
0307 
0308 QString GeoDataPlacemark::categoryName() const
0309 {
0310     Q_D(const GeoDataPlacemark);
0311     switch (d->m_visualCategory) {
0312     case Valley: return GeoDataPlacemarkPrivate::tr("Valley");
0313     case OtherTerrain: return GeoDataPlacemarkPrivate::tr("Terrain");
0314     case Crater: return GeoDataPlacemarkPrivate::tr("Crater");
0315     case Mare: return GeoDataPlacemarkPrivate::tr("Sea");
0316     case MannedLandingSite: return GeoDataPlacemarkPrivate::tr("Manned Landing Site");
0317     case RoboticRover: return GeoDataPlacemarkPrivate::tr("Robotic Rover");
0318     case UnmannedSoftLandingSite: return GeoDataPlacemarkPrivate::tr("Unmanned Soft Landing Site");
0319     case UnmannedHardLandingSite: return GeoDataPlacemarkPrivate::tr("Unmanned Hard Landing Site");
0320     case Mons: return GeoDataPlacemarkPrivate::tr("Mountain");
0321     case SmallCity: return GeoDataPlacemarkPrivate::tr("City");
0322     case SmallCountyCapital: return GeoDataPlacemarkPrivate::tr("County Capital");
0323     case SmallStateCapital: return GeoDataPlacemarkPrivate::tr("State Capital");
0324     case SmallNationCapital: return GeoDataPlacemarkPrivate::tr("Nation Capital");
0325     case MediumCity: return GeoDataPlacemarkPrivate::tr("City");
0326     case MediumCountyCapital: return GeoDataPlacemarkPrivate::tr("County Capital");
0327     case MediumStateCapital: return GeoDataPlacemarkPrivate::tr("State Capital");
0328     case MediumNationCapital: return GeoDataPlacemarkPrivate::tr("Nation Capital");
0329     case BigCity: return GeoDataPlacemarkPrivate::tr("City");
0330     case BigCountyCapital: return GeoDataPlacemarkPrivate::tr("County Capital");
0331     case BigStateCapital: return GeoDataPlacemarkPrivate::tr("State Capital");
0332     case BigNationCapital: return GeoDataPlacemarkPrivate::tr("Nation Capital");
0333     case LargeCity: return GeoDataPlacemarkPrivate::tr("City");
0334     case LargeCountyCapital: return GeoDataPlacemarkPrivate::tr("County Capital");
0335     case LargeStateCapital: return GeoDataPlacemarkPrivate::tr("State Capital");
0336     case LargeNationCapital: return GeoDataPlacemarkPrivate::tr("Nation Capital");
0337     case Nation: return GeoDataPlacemarkPrivate::tr("Nation");
0338     case Mountain: return GeoDataPlacemarkPrivate::tr("Mountain");
0339     case Volcano: return GeoDataPlacemarkPrivate::tr("Volcano");
0340     case Continent: return GeoDataPlacemarkPrivate::tr("Continent");
0341     case Ocean: return GeoDataPlacemarkPrivate::tr("Ocean");
0342     case GeographicPole: return GeoDataPlacemarkPrivate::tr("Geographic Pole");
0343     case MagneticPole: return GeoDataPlacemarkPrivate::tr("Magnetic Pole");
0344     case ShipWreck: return GeoDataPlacemarkPrivate::tr("Ship Wreck");
0345     case AirPort: return GeoDataPlacemarkPrivate::tr("Air Port");
0346     case Observatory: return GeoDataPlacemarkPrivate::tr("Observatory");
0347     case MilitaryDangerArea: return GeoDataPlacemarkPrivate::tr("Military Danger Area");
0348     case OsmSite: return GeoDataPlacemarkPrivate::tr("OSM Site");
0349     case Coordinate: return GeoDataPlacemarkPrivate::tr("Coordinate");
0350     case Bookmark: return GeoDataPlacemarkPrivate::tr("Bookmark");
0351     case Satellite: return GeoDataPlacemarkPrivate::tr("Satellite");
0352 
0353     // OpenStreetMap categories
0354     case PlaceCity: return GeoDataPlacemarkPrivate::tr("City");
0355     case PlaceCityCapital: return GeoDataPlacemarkPrivate::tr("City Capital");
0356     case PlaceCityNationalCapital: return GeoDataPlacemarkPrivate::tr("National Capital");
0357     case PlaceSuburb: return GeoDataPlacemarkPrivate::tr("Suburb");
0358     case PlaceHamlet: return GeoDataPlacemarkPrivate::tr("Hamlet");
0359     case PlaceLocality: return GeoDataPlacemarkPrivate::tr("Locality");
0360     case PlaceTown: return GeoDataPlacemarkPrivate::tr("Town");
0361     case PlaceTownCapital: return GeoDataPlacemarkPrivate::tr("Town Capital");
0362     case PlaceTownNationalCapital: return GeoDataPlacemarkPrivate::tr("National Capital");
0363     case PlaceVillage: return GeoDataPlacemarkPrivate::tr("Village");
0364     case PlaceVillageCapital: return GeoDataPlacemarkPrivate::tr("Village Capital");
0365     case PlaceVillageNationalCapital: return GeoDataPlacemarkPrivate::tr("National Capital");
0366     case NaturalWater: return GeoDataPlacemarkPrivate::tr("Water");
0367     case NaturalReef: return GeoDataPlacemarkPrivate::tr("Reef");
0368     case NaturalWood: return GeoDataPlacemarkPrivate::tr("Wood");
0369     case NaturalBeach: return GeoDataPlacemarkPrivate::tr("Beach");
0370     case NaturalWetland: return GeoDataPlacemarkPrivate::tr("Wetland");
0371     case NaturalGlacier: return GeoDataPlacemarkPrivate::tr("Glacier");
0372     case NaturalIceShelf: return GeoDataPlacemarkPrivate::tr("Ice Shelf");
0373     case NaturalScrub: return GeoDataPlacemarkPrivate::tr("Scrub");
0374     case NaturalCliff: return GeoDataPlacemarkPrivate::tr("Cliff");
0375     case NaturalHeath: return GeoDataPlacemarkPrivate::tr("Heath");
0376     case HighwayTrafficSignals: return GeoDataPlacemarkPrivate::tr("Traffic Signals");
0377     case HighwayElevator: return GeoDataPlacemarkPrivate::tr("Elevator");
0378     case HighwaySteps: return GeoDataPlacemarkPrivate::tr("Steps");
0379     case HighwayUnknown: return GeoDataPlacemarkPrivate::tr("Unknown Road");
0380     case HighwayPath: return GeoDataPlacemarkPrivate::tr("Path");
0381     case HighwayFootway: return GeoDataPlacemarkPrivate::tr("Footway");
0382     case HighwayTrack: return GeoDataPlacemarkPrivate::tr("Track");
0383     case HighwayPedestrian: return GeoDataPlacemarkPrivate::tr("Footway");
0384     case HighwayCycleway: return GeoDataPlacemarkPrivate::tr("Cycleway");
0385     case HighwayService: return GeoDataPlacemarkPrivate::tr("Service Road");
0386     case HighwayRoad: return GeoDataPlacemarkPrivate::tr("Road");
0387     case HighwayResidential: return GeoDataPlacemarkPrivate::tr("Residential Road");
0388     case HighwayLivingStreet: return GeoDataPlacemarkPrivate::tr("Living Street");
0389     case HighwayUnclassified: return GeoDataPlacemarkPrivate::tr("Unclassified Road");
0390     case HighwayTertiaryLink: return GeoDataPlacemarkPrivate::tr("Tertiary Link Road");
0391     case HighwayTertiary: return GeoDataPlacemarkPrivate::tr("Tertiary Road");
0392     case HighwaySecondaryLink: return GeoDataPlacemarkPrivate::tr("Secondary Link Road");
0393     case HighwaySecondary: return GeoDataPlacemarkPrivate::tr("Secondary Road");
0394     case HighwayPrimaryLink: return GeoDataPlacemarkPrivate::tr("Primary Link Road");
0395     case HighwayPrimary: return GeoDataPlacemarkPrivate::tr("Primary Road");
0396     case HighwayRaceway: return GeoDataPlacemarkPrivate::tr("Raceway");
0397     case HighwayTrunkLink: return GeoDataPlacemarkPrivate::tr("Trunk Link Road");
0398     case HighwayTrunk: return GeoDataPlacemarkPrivate::tr("Trunk Road");
0399     case HighwayMotorwayLink: return GeoDataPlacemarkPrivate::tr("Motorway Link Road");
0400     case HighwayMotorway: return GeoDataPlacemarkPrivate::tr("Motorway");
0401     case HighwayCorridor: return GeoDataPlacemarkPrivate::tr("Corridor");
0402     case Building: return GeoDataPlacemarkPrivate::tr("Building");
0403     case AccomodationCamping: return GeoDataPlacemarkPrivate::tr("Camping");
0404     case AccomodationHostel: return GeoDataPlacemarkPrivate::tr("Hostel");
0405     case AccomodationHotel: return GeoDataPlacemarkPrivate::tr("Hotel");
0406     case AccomodationMotel: return GeoDataPlacemarkPrivate::tr("Motel");
0407     case AccomodationYouthHostel: return GeoDataPlacemarkPrivate::tr("Youth Hostel");
0408     case AccomodationGuestHouse: return GeoDataPlacemarkPrivate::tr("Guest House");
0409     case AmenityLibrary: return GeoDataPlacemarkPrivate::tr("Library");
0410     case AmenityKindergarten: return GeoDataPlacemarkPrivate::tr("Kindergarten");
0411     case EducationCollege: return GeoDataPlacemarkPrivate::tr("College");
0412     case EducationSchool: return GeoDataPlacemarkPrivate::tr("School");
0413     case EducationUniversity: return GeoDataPlacemarkPrivate::tr("University");
0414     case FoodBar: return GeoDataPlacemarkPrivate::tr("Bar");
0415     case FoodBiergarten: return GeoDataPlacemarkPrivate::tr("Biergarten");
0416     case FoodCafe: return GeoDataPlacemarkPrivate::tr("Cafe");
0417     case FoodFastFood: return GeoDataPlacemarkPrivate::tr("Fast Food");
0418     case FoodPub: return GeoDataPlacemarkPrivate::tr("Pub");
0419     case FoodRestaurant: return GeoDataPlacemarkPrivate::tr("Restaurant");
0420     case HealthDentist: return GeoDataPlacemarkPrivate::tr("Dentist");
0421     case HealthDoctors: return GeoDataPlacemarkPrivate::tr("Doctors");
0422     case HealthHospital: return GeoDataPlacemarkPrivate::tr("Hospital");
0423     case HealthPharmacy: return GeoDataPlacemarkPrivate::tr("Pharmacy");
0424     case HealthVeterinary: return GeoDataPlacemarkPrivate::tr("Veterinary");
0425     case MoneyAtm: return GeoDataPlacemarkPrivate::tr("ATM");
0426     case MoneyBank: return GeoDataPlacemarkPrivate::tr("Bank");
0427     case HistoricArchaeologicalSite: return GeoDataPlacemarkPrivate::tr("Archaeological Site");
0428     case AmenityEmbassy: return GeoDataPlacemarkPrivate::tr("Embassy");
0429     case AmenityEmergencyPhone: return GeoDataPlacemarkPrivate::tr("Emergency Phone");
0430     case AmenityMountainRescue: return GeoDataPlacemarkPrivate::tr("Mountain Rescue");
0431     case LeisureWaterPark: return GeoDataPlacemarkPrivate::tr("Water Park");
0432     case AmenityCommunityCentre: return GeoDataPlacemarkPrivate::tr("Community Centre");
0433     case AmenityFountain: return GeoDataPlacemarkPrivate::tr("Fountain");
0434     case AmenityNightClub: return GeoDataPlacemarkPrivate::tr("Night Club");
0435     case AmenityBench: return GeoDataPlacemarkPrivate::tr("Bench");
0436     case AmenityCourtHouse: return GeoDataPlacemarkPrivate::tr("Court House");
0437     case AmenityFireStation: return GeoDataPlacemarkPrivate::tr("Fire Station");
0438     case AmenityHuntingStand: return GeoDataPlacemarkPrivate::tr("Hunting Stand");
0439     case AmenityPolice: return GeoDataPlacemarkPrivate::tr("Police");
0440     case AmenityPostBox: return GeoDataPlacemarkPrivate::tr("Post Box");
0441     case AmenityPostOffice: return GeoDataPlacemarkPrivate::tr("Post Office");
0442     case AmenityPrison: return GeoDataPlacemarkPrivate::tr("Prison");
0443     case AmenityRecycling: return GeoDataPlacemarkPrivate::tr("Recycling");
0444     case AmenityShelter: return GeoDataPlacemarkPrivate::tr("Shelter");
0445     case AmenityTelephone: return GeoDataPlacemarkPrivate::tr("Telephone");
0446     case AmenityToilets: return GeoDataPlacemarkPrivate::tr("Toilets");
0447     case AmenityTownHall: return GeoDataPlacemarkPrivate::tr("Town Hall");
0448     case AmenityWasteBasket: return GeoDataPlacemarkPrivate::tr("Waste Basket");
0449     case AmenityDrinkingWater: return GeoDataPlacemarkPrivate::tr("Drinking Water");
0450     case AmenityGraveyard: return GeoDataPlacemarkPrivate::tr("Graveyard");
0451     case AmenityChargingStation: return GeoDataPlacemarkPrivate::tr("Charging Station");
0452     case AmenityCarWash: return GeoDataPlacemarkPrivate::tr("Car Wash");
0453     case AmenitySocialFacility: return GeoDataPlacemarkPrivate::tr("Social Facility");
0454     case BarrierCityWall: return GeoDataPlacemarkPrivate::tr("City Wall");
0455     case BarrierGate: return GeoDataPlacemarkPrivate::tr("Gate");
0456     case BarrierLiftGate: return GeoDataPlacemarkPrivate::tr("Lift Gate");
0457     case BarrierWall: return GeoDataPlacemarkPrivate::tr("Wall");
0458     case NaturalVolcano: return GeoDataPlacemarkPrivate::tr("Volcano");
0459     case NaturalPeak: return GeoDataPlacemarkPrivate::tr("Peak");
0460     case NaturalTree: return GeoDataPlacemarkPrivate::tr("Tree");
0461     case NaturalCave: return GeoDataPlacemarkPrivate::tr("Cave Entrance");
0462     case ShopBeverages: return GeoDataPlacemarkPrivate::tr("Beverages");
0463     case ShopHifi: return GeoDataPlacemarkPrivate::tr("Hifi");
0464     case ShopSupermarket: return GeoDataPlacemarkPrivate::tr("Supermarket");
0465     case ShopAlcohol: return GeoDataPlacemarkPrivate::tr("Liquor Store");
0466     case ShopBakery: return GeoDataPlacemarkPrivate::tr("Bakery");
0467     case ShopButcher: return GeoDataPlacemarkPrivate::tr("Butcher");
0468     case ShopConfectionery: return GeoDataPlacemarkPrivate::tr("Confectionery");
0469     case ShopConvenience: return GeoDataPlacemarkPrivate::tr("Convenience Shop");
0470     case ShopGreengrocer: return GeoDataPlacemarkPrivate::tr("Greengrocer");
0471     case ShopSeafood: return GeoDataPlacemarkPrivate::tr("Seafood Shop");
0472     case ShopDepartmentStore: return GeoDataPlacemarkPrivate::tr("Department Store");
0473     case ShopKiosk: return GeoDataPlacemarkPrivate::tr("Kiosk");
0474     case ShopBag: return GeoDataPlacemarkPrivate::tr("Bag Shop");
0475     case ShopClothes: return GeoDataPlacemarkPrivate::tr("Clothes Shop");
0476     case ShopFashion: return GeoDataPlacemarkPrivate::tr("Fashion Shop");
0477     case ShopJewelry: return GeoDataPlacemarkPrivate::tr("Jewelry Shop");
0478     case ShopShoes: return GeoDataPlacemarkPrivate::tr("Shoe Shop");
0479     case ShopVarietyStore: return GeoDataPlacemarkPrivate::tr("Variety Store");
0480     case ShopBeauty: return GeoDataPlacemarkPrivate::tr("Beauty Services");
0481     case ShopChemist: return GeoDataPlacemarkPrivate::tr("Chemist");
0482     case ShopCosmetics: return GeoDataPlacemarkPrivate::tr("Cosmetics");
0483     case ShopHairdresser: return GeoDataPlacemarkPrivate::tr("Hairdresser");
0484     case ShopOptician: return GeoDataPlacemarkPrivate::tr("Optician");
0485     case ShopPerfumery: return GeoDataPlacemarkPrivate::tr("Perfumery");
0486     case ShopDoitYourself: return GeoDataPlacemarkPrivate::tr("Hardware Store");
0487     case ShopFlorist: return GeoDataPlacemarkPrivate::tr("Florist");
0488     case ShopHardware: return GeoDataPlacemarkPrivate::tr("Hardware Store");
0489     case ShopFurniture: return GeoDataPlacemarkPrivate::tr("Furniture Store");
0490     case ShopElectronics: return GeoDataPlacemarkPrivate::tr("Electronics Shop");
0491     case ShopMobilePhone: return GeoDataPlacemarkPrivate::tr("Mobile Phone Shop");
0492     case ShopBicycle: return GeoDataPlacemarkPrivate::tr("Bicycle Shop");
0493     case ShopCar: return GeoDataPlacemarkPrivate::tr("Car Dealer");
0494     case ShopCarRepair: return GeoDataPlacemarkPrivate::tr("Car Repair Shop");
0495     case ShopCarParts: return GeoDataPlacemarkPrivate::tr("Car Parts");
0496     case ShopMotorcycle: return GeoDataPlacemarkPrivate::tr("Motorcycle Shop");
0497     case ShopOutdoor: return GeoDataPlacemarkPrivate::tr("Outdoor Shop");
0498     case ShopSports: return GeoDataPlacemarkPrivate::tr("Sports Shop");
0499     case ShopCopy: return GeoDataPlacemarkPrivate::tr("Printing Services");
0500     case ShopArt: return GeoDataPlacemarkPrivate::tr("Art Shop");
0501     case ShopMusicalInstrument: return GeoDataPlacemarkPrivate::tr("Musical Instrument Shop");
0502     case ShopPhoto: return GeoDataPlacemarkPrivate::tr("Photo Shop");
0503     case ShopBook: return GeoDataPlacemarkPrivate::tr("Bookshop");
0504     case ShopGift: return GeoDataPlacemarkPrivate::tr("Gift Shop");
0505     case ShopStationery: return GeoDataPlacemarkPrivate::tr("Stationery");
0506     case ShopLaundry: return GeoDataPlacemarkPrivate::tr("Laundry");
0507     case ShopPet: return GeoDataPlacemarkPrivate::tr("Pet Shop");
0508     case ShopToys: return GeoDataPlacemarkPrivate::tr("Toy Store");
0509     case ShopTravelAgency: return GeoDataPlacemarkPrivate::tr("Travel Agency");
0510     case ShopDeli: return GeoDataPlacemarkPrivate::tr("Deli");
0511     case ShopTobacco: return GeoDataPlacemarkPrivate::tr("Tobacco Shop");
0512     case ShopTea: return GeoDataPlacemarkPrivate::tr("Tea Shop");
0513     case ShopComputer: return GeoDataPlacemarkPrivate::tr("Computer Shop");
0514     case ShopGardenCentre: return GeoDataPlacemarkPrivate::tr("Garden Centre");
0515     case Shop: return GeoDataPlacemarkPrivate::tr("Shop");
0516     case ManmadeBridge: return GeoDataPlacemarkPrivate::tr("Bridge");
0517     case ManmadeLighthouse: return GeoDataPlacemarkPrivate::tr("Lighthouse");
0518     case ManmadePier: return GeoDataPlacemarkPrivate::tr("Pier");
0519     case ManmadeWaterTower: return GeoDataPlacemarkPrivate::tr("Water Tower");
0520     case ManmadeWindMill: return GeoDataPlacemarkPrivate::tr("Wind Mill");
0521     case ManmadeCommunicationsTower: return GeoDataPlacemarkPrivate::tr("Communications Tower");
0522     case TourismAttraction: return GeoDataPlacemarkPrivate::tr("Tourist Attraction");
0523     case TourismArtwork: return GeoDataPlacemarkPrivate::tr("Artwork");
0524     case HistoricCastle: return GeoDataPlacemarkPrivate::tr("Castle");
0525     case AmenityCinema: return GeoDataPlacemarkPrivate::tr("Cinema");
0526     case TourismInformation: return GeoDataPlacemarkPrivate::tr("Information");
0527     case HistoricMonument: return GeoDataPlacemarkPrivate::tr("Monument");
0528     case TourismMuseum: return GeoDataPlacemarkPrivate::tr("Museum");
0529     case HistoricRuins: return GeoDataPlacemarkPrivate::tr("Ruin");
0530     case AmenityTheatre: return GeoDataPlacemarkPrivate::tr("Theatre");
0531     case TourismThemePark: return GeoDataPlacemarkPrivate::tr("Theme Park");
0532     case TourismViewPoint: return GeoDataPlacemarkPrivate::tr("View Point");
0533     case TourismZoo: return GeoDataPlacemarkPrivate::tr("Zoo");
0534     case TourismAlpineHut: return GeoDataPlacemarkPrivate::tr("Alpine Hut");
0535     case TourismWildernessHut: return GeoDataPlacemarkPrivate::tr("Wilderness Hut");
0536     case HistoricMemorial: return GeoDataPlacemarkPrivate::tr("Memorial");
0537     case TransportAerodrome: return GeoDataPlacemarkPrivate::tr("Aerodrome");
0538     case TransportHelipad: return GeoDataPlacemarkPrivate::tr("Helipad");
0539     case TransportAirportGate: return GeoDataPlacemarkPrivate::tr("Airport Gate");
0540     case TransportAirportRunway: return GeoDataPlacemarkPrivate::tr("Airport Runway");
0541     case TransportAirportApron: return GeoDataPlacemarkPrivate::tr("Airport Apron");
0542     case TransportAirportTaxiway: return GeoDataPlacemarkPrivate::tr("Airport Taxiway");
0543     case TransportAirportTerminal: return GeoDataPlacemarkPrivate::tr("Airport Terminal");
0544     case TransportBusStation: return GeoDataPlacemarkPrivate::tr("Bus Station");
0545     case TransportBusStop: return GeoDataPlacemarkPrivate::tr("Bus Stop");
0546     case TransportCarShare: return GeoDataPlacemarkPrivate::tr("Car Sharing");
0547     case TransportFuel: return GeoDataPlacemarkPrivate::tr("Gas Station");
0548     case TransportParking: return GeoDataPlacemarkPrivate::tr("Parking");
0549     case TransportParkingSpace: return GeoDataPlacemarkPrivate::tr("Parking Space");
0550     case TransportPlatform: return GeoDataPlacemarkPrivate::tr("Platform");
0551     case TransportRentalBicycle: return GeoDataPlacemarkPrivate::tr("Bicycle Rental");
0552     case TransportRentalCar: return GeoDataPlacemarkPrivate::tr("Car Rental");
0553     case TransportRentalSki: return GeoDataPlacemarkPrivate::tr("Ski Rental");
0554     case TransportTaxiRank: return GeoDataPlacemarkPrivate::tr("Taxi Rank");
0555     case TransportTrainStation: return GeoDataPlacemarkPrivate::tr("Train Station");
0556     case TransportTramStop: return GeoDataPlacemarkPrivate::tr("Tram Stop");
0557     case TransportBicycleParking: return GeoDataPlacemarkPrivate::tr("Bicycle Parking");
0558     case TransportMotorcycleParking: return GeoDataPlacemarkPrivate::tr("Motorcycle Parking");
0559     case TransportSubwayEntrance: return GeoDataPlacemarkPrivate::tr("Subway Entrance");
0560     case TransportSpeedCamera: return GeoDataPlacemarkPrivate::tr("Speed Camera");
0561     case ReligionPlaceOfWorship: return GeoDataPlacemarkPrivate::tr("Place Of Worship");
0562     case ReligionBahai: return GeoDataPlacemarkPrivate::tr("Bahai");
0563     case ReligionBuddhist: return GeoDataPlacemarkPrivate::tr("Buddhist");
0564     case ReligionChristian: return GeoDataPlacemarkPrivate::tr("Christian");
0565     case ReligionMuslim: return GeoDataPlacemarkPrivate::tr("Muslim");
0566     case ReligionHindu: return GeoDataPlacemarkPrivate::tr("Hindu");
0567     case ReligionJain: return GeoDataPlacemarkPrivate::tr("Jain");
0568     case ReligionJewish: return GeoDataPlacemarkPrivate::tr("Jewish");
0569     case ReligionShinto: return GeoDataPlacemarkPrivate::tr("Shinto");
0570     case ReligionSikh: return GeoDataPlacemarkPrivate::tr("Sikh");
0571     case ReligionTaoist: return GeoDataPlacemarkPrivate::tr("Taoist");
0572     case LeisureGolfCourse: return GeoDataPlacemarkPrivate::tr("Golf Course");
0573     case LeisureMarina: return GeoDataPlacemarkPrivate::tr("Marina");
0574     case LeisurePark: return GeoDataPlacemarkPrivate::tr("Park");
0575     case LeisurePlayground: return GeoDataPlacemarkPrivate::tr("Playground");
0576     case LeisurePitch: return GeoDataPlacemarkPrivate::tr("Pitch");
0577     case LeisureSportsCentre: return GeoDataPlacemarkPrivate::tr("Sports Centre");
0578     case LeisureStadium: return GeoDataPlacemarkPrivate::tr("Stadium");
0579     case LeisureTrack: return GeoDataPlacemarkPrivate::tr("Track");
0580     case LeisureSwimmingPool: return GeoDataPlacemarkPrivate::tr("Swimming Pool");
0581     case LeisureMinigolfCourse: return GeoDataPlacemarkPrivate::tr("Miniature Golf Course");
0582     case LanduseAllotments: return GeoDataPlacemarkPrivate::tr("Allotments");
0583     case LanduseBasin: return GeoDataPlacemarkPrivate::tr("Basin");
0584     case LanduseCemetery: return GeoDataPlacemarkPrivate::tr("Cemetery");
0585     case LanduseCommercial: return GeoDataPlacemarkPrivate::tr("Commercial");
0586     case LanduseConstruction: return GeoDataPlacemarkPrivate::tr("Construction");
0587     case LanduseFarmland: return GeoDataPlacemarkPrivate::tr("Farmland");
0588     case LanduseFarmyard: return GeoDataPlacemarkPrivate::tr("Farmyard");
0589     case LanduseGarages: return GeoDataPlacemarkPrivate::tr("Garages");
0590     case LanduseGrass: return GeoDataPlacemarkPrivate::tr("Grass");
0591     case LanduseIndustrial: return GeoDataPlacemarkPrivate::tr("Industrial");
0592     case LanduseLandfill: return GeoDataPlacemarkPrivate::tr("Landfill");
0593     case LanduseMeadow: return GeoDataPlacemarkPrivate::tr("Meadow");
0594     case LanduseMilitary: return GeoDataPlacemarkPrivate::tr("Military");
0595     case LanduseQuarry: return GeoDataPlacemarkPrivate::tr("Quarry");
0596     case LanduseRailway: return GeoDataPlacemarkPrivate::tr("Railway");
0597     case LanduseReservoir: return GeoDataPlacemarkPrivate::tr("Reservoir");
0598     case LanduseResidential: return GeoDataPlacemarkPrivate::tr("Residential");
0599     case LanduseRetail: return GeoDataPlacemarkPrivate::tr("Retail");
0600     case LanduseOrchard: return GeoDataPlacemarkPrivate::tr("Orchard");
0601     case LanduseVineyard: return GeoDataPlacemarkPrivate::tr("Vineyard");
0602     case RailwayRail: return GeoDataPlacemarkPrivate::tr("Rail");
0603     case RailwayNarrowGauge: return GeoDataPlacemarkPrivate::tr("Narrow Gauge");
0604     case RailwayTram: return GeoDataPlacemarkPrivate::tr("Tram");
0605     case RailwayLightRail: return GeoDataPlacemarkPrivate::tr("Light Rail");
0606     case RailwayAbandoned: return GeoDataPlacemarkPrivate::tr("Abandoned Railway");
0607     case RailwaySubway: return GeoDataPlacemarkPrivate::tr("Subway");
0608     case RailwayPreserved: return GeoDataPlacemarkPrivate::tr("Preserved Railway");
0609     case RailwayMiniature: return GeoDataPlacemarkPrivate::tr("Miniature Railway");
0610     case RailwayConstruction: return GeoDataPlacemarkPrivate::tr("Railway Construction");
0611     case RailwayMonorail: return GeoDataPlacemarkPrivate::tr("Monorail");
0612     case RailwayFunicular: return GeoDataPlacemarkPrivate::tr("Funicular Railway");
0613     case PowerTower: return GeoDataPlacemarkPrivate::tr("Power Tower");
0614     case AerialwayStation:  return GeoDataPlacemarkPrivate::tr("Aerialway Station");
0615     case AerialwayPylon: return GeoDataPlacemarkPrivate::tr("Pylon", "A pylon supporting the aerialway cable e.g. on a ski lift");
0616     case AerialwayCableCar: return GeoDataPlacemarkPrivate::tr("Cable Car");
0617     case AerialwayGondola: return GeoDataPlacemarkPrivate::tr("Gondola");
0618     case AerialwayChairLift: return GeoDataPlacemarkPrivate::tr("Chair Lift");
0619     case AerialwayMixedLift: return GeoDataPlacemarkPrivate::tr("Mixed Lift");
0620     case AerialwayDragLift: return GeoDataPlacemarkPrivate::tr("Drag Lift");
0621     case AerialwayTBar: return GeoDataPlacemarkPrivate::tr("T-Bar");
0622     case AerialwayJBar: return GeoDataPlacemarkPrivate::tr("J-Bar");
0623     case AerialwayPlatter: return GeoDataPlacemarkPrivate::tr("Platter");
0624     case AerialwayRopeTow: return GeoDataPlacemarkPrivate::tr("Rope Tow");
0625     case AerialwayMagicCarpet: return GeoDataPlacemarkPrivate::tr("Magic Carpet");
0626     case AerialwayZipLine: return GeoDataPlacemarkPrivate::tr("Zip Line");
0627     case AerialwayGoods: return GeoDataPlacemarkPrivate::tr("Goods");
0628     case PisteDownhill: return GeoDataPlacemarkPrivate::tr("Downhill Piste");
0629     case PisteNordic: return GeoDataPlacemarkPrivate::tr("Nordic Piste");
0630     case PisteSkitour: return GeoDataPlacemarkPrivate::tr("Skitour");
0631     case PisteSled: return GeoDataPlacemarkPrivate::tr("Sled Piste");
0632     case PisteHike: return GeoDataPlacemarkPrivate::tr("Winter Hike");
0633     case PisteSleigh: return GeoDataPlacemarkPrivate::tr("Sleigh Piste");
0634     case PisteIceSkate: return GeoDataPlacemarkPrivate::tr("Ice Skate");
0635     case PisteSnowPark: return GeoDataPlacemarkPrivate::tr("Snow Park");
0636     case PistePlayground: return GeoDataPlacemarkPrivate::tr("Ski Playground");
0637     case PisteSkiJump: return GeoDataPlacemarkPrivate::tr("Ski Jump");
0638     case AdminLevel1: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 1)");
0639     case AdminLevel2: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 2)");
0640     case AdminLevel3: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 3)");
0641     case AdminLevel4: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 4)");
0642     case AdminLevel5: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 5)");
0643     case AdminLevel6: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 6)");
0644     case AdminLevel7: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 7)");
0645     case AdminLevel8: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 8)");
0646     case AdminLevel9: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 9)");
0647     case AdminLevel10: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 10)");
0648     case AdminLevel11: return GeoDataPlacemarkPrivate::tr("Admin Boundary (Level 11)");
0649     case BoundaryMaritime: return GeoDataPlacemarkPrivate::tr("Boundary (Maritime)");
0650     case Landmass: return GeoDataPlacemarkPrivate::tr("Land Mass");
0651     case UrbanArea: return GeoDataPlacemarkPrivate::tr("Urban Area");
0652     case InternationalDateLine: return GeoDataPlacemarkPrivate::tr("International Date Line");
0653     case Bathymetry: return GeoDataPlacemarkPrivate::tr("Bathymetry");
0654     case WaterwayCanal: return GeoDataPlacemarkPrivate::tr("Canal");
0655     case WaterwayDrain: return GeoDataPlacemarkPrivate::tr("Drain");
0656     case WaterwayDitch: return GeoDataPlacemarkPrivate::tr("Ditch");
0657     case WaterwayStream: return GeoDataPlacemarkPrivate::tr("Stream");
0658     case WaterwayRiver: return GeoDataPlacemarkPrivate::tr("River");
0659     case WaterwayWeir: return GeoDataPlacemarkPrivate::tr("Weir");
0660     case CrossingSignals: return GeoDataPlacemarkPrivate::tr("Crosswalk");
0661     case CrossingIsland: return GeoDataPlacemarkPrivate::tr("Crosswalk");
0662     case CrossingZebra: return GeoDataPlacemarkPrivate::tr("Crosswalk");
0663     case CrossingRailway: return GeoDataPlacemarkPrivate::tr("Railway Crossing");
0664     case IndoorDoor: return GeoDataPlacemarkPrivate::tr("Door");
0665     case IndoorWall: return GeoDataPlacemarkPrivate::tr("Wall");
0666     case IndoorRoom: return GeoDataPlacemarkPrivate::tr("Room");
0667 
0668     case Default:
0669     case Unknown:
0670     case None:
0671     case LastIndex: return QString();
0672     }
0673 
0674     return QString();
0675 }
0676 
0677 qreal GeoDataPlacemark::area() const
0678 {
0679     Q_D(const GeoDataPlacemark);
0680     return d->m_placemarkExtendedData ? d->m_placemarkExtendedData->m_area : -1.0;
0681 }
0682 
0683 void GeoDataPlacemark::setArea( qreal area )
0684 {
0685     if (area == -1.0 && !d_func()->m_placemarkExtendedData) {
0686         return; // nothing to do
0687     }
0688 
0689     Q_D(GeoDataPlacemark);
0690     d->placemarkExtendedData().m_area = area;
0691 }
0692 
0693 qint64 GeoDataPlacemark::population() const
0694 {
0695     Q_D(const GeoDataPlacemark);
0696     return d->m_population;
0697 }
0698 
0699 void GeoDataPlacemark::setPopulation( qint64 population )
0700 {
0701     Q_D(GeoDataPlacemark);
0702     d->m_population = population;
0703 }
0704 
0705 const QString GeoDataPlacemark::state() const
0706 {
0707     Q_D(const GeoDataPlacemark);
0708     return d->m_placemarkExtendedData ? d->m_placemarkExtendedData->m_state : QString();
0709 }
0710 
0711 void GeoDataPlacemark::setState( const QString &state )
0712 {
0713     if (state.isEmpty() && !d_func()->m_placemarkExtendedData) {
0714         return; // nothing to do
0715     }
0716 
0717     Q_D(GeoDataPlacemark);
0718     d->placemarkExtendedData().m_state = state;
0719 }
0720 
0721 const QString GeoDataPlacemark::countryCode() const
0722 {
0723     Q_D(const GeoDataPlacemark);
0724     return d->m_placemarkExtendedData ? d->m_placemarkExtendedData->m_countrycode : QString();
0725 }
0726 
0727 void GeoDataPlacemark::setCountryCode( const QString &countrycode )
0728 {
0729     if (countrycode.isEmpty() && !d_func()->m_placemarkExtendedData) {
0730         return; // nothing to do
0731     }
0732 
0733     Q_D(GeoDataPlacemark);
0734     d->placemarkExtendedData().m_countrycode = countrycode;
0735 }
0736 
0737 bool GeoDataPlacemark::isBalloonVisible() const
0738 {
0739     Q_D(const GeoDataPlacemark);
0740     return d->m_placemarkExtendedData ? d->m_placemarkExtendedData->m_isBalloonVisible : false;
0741 }
0742 
0743 void GeoDataPlacemark::setBalloonVisible( bool visible )
0744 {
0745     if (!visible && !d_func()->m_placemarkExtendedData) {
0746         return; // nothing to do
0747     }
0748 
0749     Q_D(GeoDataPlacemark);
0750     d->placemarkExtendedData().m_isBalloonVisible = visible;
0751 }
0752 
0753 void GeoDataPlacemark::pack( QDataStream& stream ) const
0754 {
0755     Q_D(const GeoDataPlacemark);
0756     GeoDataFeature::pack( stream );
0757 
0758     stream << d->placemarkExtendedData().m_countrycode;
0759     stream << d->placemarkExtendedData().m_area;
0760     stream << d->m_population;
0761     if (d->m_geometry) {
0762         stream << d->m_geometry->geometryId();
0763         d->m_geometry->pack( stream );
0764     }
0765     else
0766     {
0767         stream << InvalidGeometryId;
0768     }
0769 }
0770 
0771 QXmlStreamWriter& GeoDataPlacemark::pack( QXmlStreamWriter& stream ) const
0772 {
0773     stream.writeStartElement( "placemark" );
0774 
0775     stream.writeEndElement();
0776     return stream;
0777 }
0778 
0779 QXmlStreamWriter& GeoDataPlacemark::operator <<( QXmlStreamWriter& stream ) const
0780 {
0781     pack( stream );
0782     return stream;
0783 }
0784 
0785 void GeoDataPlacemark::unpack( QDataStream& stream )
0786 {
0787     Q_D(GeoDataPlacemark);
0788     GeoDataFeature::unpack( stream );
0789 
0790     stream >> d->placemarkExtendedData().m_countrycode;
0791     stream >> d->placemarkExtendedData().m_area;
0792     stream >> d->m_population;
0793     int geometryId;
0794     stream >> geometryId;
0795     GeoDataGeometry *geometry = nullptr;
0796     switch( geometryId ) {
0797         case InvalidGeometryId:
0798             break;
0799         case GeoDataPointId:
0800             {
0801             GeoDataPoint* point = new GeoDataPoint;
0802             point->unpack( stream );
0803             geometry = point;
0804             }
0805             break;
0806         case GeoDataLineStringId:
0807             {
0808             GeoDataLineString* lineString = new GeoDataLineString;
0809             lineString->unpack( stream );
0810             geometry = lineString;
0811             }
0812             break;
0813         case GeoDataLinearRingId:
0814             {
0815             GeoDataLinearRing* linearRing = new GeoDataLinearRing;
0816             linearRing->unpack( stream );
0817             geometry = linearRing;
0818             }
0819             break;
0820         case GeoDataPolygonId:
0821             {
0822             GeoDataPolygon* polygon = new GeoDataPolygon;
0823             polygon->unpack( stream );
0824             geometry = polygon;
0825             }
0826             break;
0827         case GeoDataMultiGeometryId:
0828             {
0829             GeoDataMultiGeometry* multiGeometry = new GeoDataMultiGeometry;
0830             multiGeometry->unpack( stream );
0831             geometry = multiGeometry;
0832             }
0833             break;
0834         case GeoDataModelId:
0835             break;
0836         default: break;
0837     };
0838     if (geometry) {
0839        delete d->m_geometry;
0840        d->m_geometry = geometry;
0841        d->m_geometry->setParent(this);
0842     }
0843 }
0844 
0845 }