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 }