File indexing completed on 2024-12-08 06:35:50
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2011 Dennis Nienhüser <nienhueser@kde.org> 0004 // SPDX-FileCopyrightText: 2013 Bernhard Beschow <bbeschow@cs.tu-berlin.de> 0005 // 0006 0007 #include "DatabaseQuery.h" 0008 0009 #include "GeoDataLatLonBox.h" 0010 #include "MarbleModel.h" 0011 #include "PositionTracking.h" 0012 0013 #include <QMap> 0014 0015 namespace Marble 0016 { 0017 0018 DatabaseQuery::DatabaseQuery( const MarbleModel* model, const QString &searchTerm, const GeoDataLatLonBox &preferred ) : 0019 m_queryType( BroadSearch ), m_resultFormat( AddressFormat ), m_searchTerm( searchTerm.trimmed() ), 0020 m_category( OsmPlacemark::UnknownCategory ) 0021 { 0022 if ( model && model->positionTracking()->status() == PositionProviderStatusAvailable ) { 0023 m_position = model->positionTracking()->currentLocation(); 0024 m_resultFormat = DistanceFormat; 0025 } else if ( !preferred.isEmpty() ) { 0026 m_position = preferred.center(); 0027 m_resultFormat = AddressFormat; 0028 } else { 0029 m_resultFormat = AddressFormat; 0030 } 0031 0032 QStringList terms = m_searchTerm.split(QLatin1Char(','), QString::SkipEmptyParts ); 0033 0034 QRegExp streetAndHouse( "^(.*)\\s+(\\d+\\D?)$" ); 0035 if ( streetAndHouse.indexIn( terms.first() ) != -1 ) { 0036 if ( streetAndHouse.capturedTexts().size() == 3 ) { 0037 terms.removeFirst(); 0038 terms.push_front( streetAndHouse.capturedTexts().at( 1 ) ); 0039 terms.push_front( streetAndHouse.capturedTexts().at( 2 ) ); 0040 } 0041 } 0042 0043 Q_ASSERT( terms.size() > 0 ); 0044 if ( terms.size() == 1 ) { 0045 m_queryType = isPointOfInterest( m_searchTerm ) ? CategorySearch : BroadSearch; 0046 } else if ( terms.size() == 2 ) { 0047 m_street = terms.first().trimmed(); 0048 m_region = terms.last().trimmed(); 0049 m_queryType = isPointOfInterest( m_street ) ? CategorySearch : AddressSearch; 0050 } else { 0051 m_houseNumber = terms.first().trimmed(); 0052 m_street = terms.at( 1 ).trimmed(); 0053 m_region = terms.last().trimmed(); // skips 2, 3, ..., if any 0054 m_queryType = AddressSearch; 0055 } 0056 } 0057 0058 bool DatabaseQuery::isPointOfInterest( const QString &category ) 0059 { 0060 static QMap<QString, OsmPlacemark::OsmCategory> pois; 0061 if ( pois.isEmpty() ) { 0062 pois[QObject::tr( "pois").toLower()] = OsmPlacemark::UnknownCategory; 0063 pois["pois"] = OsmPlacemark::UnknownCategory; 0064 pois[QObject::tr( "camping" ).toLower()] = OsmPlacemark::AccomodationCamping; 0065 pois["camping"] = OsmPlacemark::AccomodationCamping; 0066 pois[QObject::tr( "hostel" ).toLower()] = OsmPlacemark::AccomodationHostel; 0067 pois["hostel"] = OsmPlacemark::AccomodationHostel; 0068 pois[QObject::tr( "hotel" ).toLower()] = OsmPlacemark::AccomodationHotel; 0069 pois["hotel"] = OsmPlacemark::AccomodationHotel; 0070 pois[QObject::tr( "motel" ).toLower()] = OsmPlacemark::AccomodationMotel; 0071 pois["motel"] = OsmPlacemark::AccomodationMotel; 0072 pois[QObject::tr( "youth hostel" ).toLower()] = OsmPlacemark::AccomodationYouthHostel; 0073 pois["youth hostel"] = OsmPlacemark::AccomodationYouthHostel; 0074 pois[QObject::tr( "library" ).toLower()] = OsmPlacemark::AmenityLibrary; 0075 pois["library"] = OsmPlacemark::AmenityLibrary; 0076 pois[QObject::tr( "college" ).toLower()] = OsmPlacemark::EducationCollege; 0077 pois["college"] = OsmPlacemark::EducationCollege; 0078 pois[QObject::tr( "school" ).toLower()] = OsmPlacemark::EducationSchool; 0079 pois["school"] = OsmPlacemark::EducationSchool; 0080 pois[QObject::tr( "university" ).toLower()] = OsmPlacemark::EducationUniversity; 0081 pois["university"] = OsmPlacemark::EducationUniversity; 0082 pois[QObject::tr( "bar" ).toLower()] = OsmPlacemark::FoodBar; 0083 pois["bar"] = OsmPlacemark::FoodBar; 0084 pois[QObject::tr( "biergarten" ).toLower()] = OsmPlacemark::FoodBiergarten; 0085 pois["biergarten"] = OsmPlacemark::FoodBiergarten; 0086 pois[QObject::tr( "cafe" ).toLower()] = OsmPlacemark::FoodCafe; 0087 pois["cafe"] = OsmPlacemark::FoodCafe; 0088 pois[QObject::tr( "fast food" ).toLower()] = OsmPlacemark::FoodFastFood; 0089 pois["fast food"] = OsmPlacemark::FoodFastFood; 0090 pois[QObject::tr( "pub" ).toLower()] = OsmPlacemark::FoodPub; 0091 pois["pub"] = OsmPlacemark::FoodPub; 0092 pois[QObject::tr( "restaurant" ).toLower()] = OsmPlacemark::FoodRestaurant; 0093 pois["restaurant"] = OsmPlacemark::FoodRestaurant; 0094 pois[QObject::tr( "doctor" ).toLower()] = OsmPlacemark::HealthDoctors; 0095 pois["doctor"] = OsmPlacemark::HealthDoctors; 0096 pois[QObject::tr( "hospital" ).toLower()] = OsmPlacemark::HealthHospital; 0097 pois["hospital"] = OsmPlacemark::HealthHospital; 0098 pois[QObject::tr( "pharmacy" ).toLower()] = OsmPlacemark::HealthPharmacy; 0099 pois["pharmacy"] = OsmPlacemark::HealthPharmacy; 0100 pois[QObject::tr( "bank" ).toLower()] = OsmPlacemark::MoneyBank; 0101 pois["bank"] = OsmPlacemark::MoneyBank; 0102 pois[QObject::tr( "beverages" ).toLower()] = OsmPlacemark::ShoppingBeverages; 0103 pois["beverages"] = OsmPlacemark::ShoppingBeverages; 0104 pois[QObject::tr( "hifi" ).toLower()] = OsmPlacemark::ShoppingHifi; 0105 pois["hifi"] = OsmPlacemark::ShoppingHifi; 0106 pois[QObject::tr( "supermarket" ).toLower()] = OsmPlacemark::ShoppingSupermarket; 0107 pois["supermarket"] = OsmPlacemark::ShoppingSupermarket; 0108 pois[QObject::tr( "attraction" ).toLower()] = OsmPlacemark::TouristAttraction; 0109 pois["attraction"] = OsmPlacemark::TouristAttraction; 0110 pois[QObject::tr( "castle" ).toLower()] = OsmPlacemark::TouristCastle; 0111 pois["castle"] = OsmPlacemark::TouristCastle; 0112 pois[QObject::tr( "cinema" ).toLower()] = OsmPlacemark::TouristCinema; 0113 pois["cinema"] = OsmPlacemark::TouristCinema; 0114 pois[QObject::tr( "monument" ).toLower()] = OsmPlacemark::TouristMonument; 0115 pois["monument"] = OsmPlacemark::TouristMonument; 0116 pois[QObject::tr( "museum" ).toLower()] = OsmPlacemark::TouristMuseum; 0117 pois["museum"] = OsmPlacemark::TouristMuseum; 0118 pois[QObject::tr( "ruin" ).toLower()] = OsmPlacemark::TouristRuin; 0119 pois["ruin"] = OsmPlacemark::TouristRuin; 0120 pois[QObject::tr( "theatre" ).toLower()] = OsmPlacemark::TouristTheatre; 0121 pois["theatre"] = OsmPlacemark::TouristTheatre; 0122 pois[QObject::tr( "theme park" ).toLower()] = OsmPlacemark::TouristThemePark; 0123 pois["theme park"] = OsmPlacemark::TouristThemePark; 0124 pois[QObject::tr( "view point" ).toLower()] = OsmPlacemark::TouristViewPoint; 0125 pois["view point"] = OsmPlacemark::TouristViewPoint; 0126 pois[QObject::tr( "zoo" ).toLower()] = OsmPlacemark::TouristZoo; 0127 pois["zoo"] = OsmPlacemark::TouristZoo; 0128 pois[QObject::tr( "airport" ).toLower()] = OsmPlacemark::TransportAirportTerminal; 0129 pois["airport"] = OsmPlacemark::TransportAirportTerminal; 0130 pois[QObject::tr( "airport runway" ).toLower()] = OsmPlacemark::TransportAirportRunway; 0131 pois["airport runway"] = OsmPlacemark::TransportAirportRunway; 0132 pois[QObject::tr( "airport apron" ).toLower()] = OsmPlacemark::TransportAirportApron; 0133 pois["airport apron"] = OsmPlacemark::TransportAirportApron; 0134 pois[QObject::tr( "airport taxiway" ).toLower()] = OsmPlacemark::TransportAirportTaxiway; 0135 pois["airport taxiway"] = OsmPlacemark::TransportAirportTaxiway; 0136 pois[QObject::tr( "bus station" ).toLower()] = OsmPlacemark::TransportBusStation; 0137 pois["bus station"] = OsmPlacemark::TransportBusStation; 0138 pois[QObject::tr( "bus stop" ).toLower()] = OsmPlacemark::TransportBusStop; 0139 pois["bus stop"] = OsmPlacemark::TransportBusStop; 0140 pois[QObject::tr( "car share" ).toLower()] = OsmPlacemark::TransportCarShare; 0141 pois["car share"] = OsmPlacemark::TransportCarShare; 0142 pois[QObject::tr( "fuel" ).toLower()] = OsmPlacemark::TransportFuel; 0143 pois["fuel"] = OsmPlacemark::TransportFuel; 0144 pois[QObject::tr( "parking" ).toLower()] = OsmPlacemark::TransportParking; 0145 pois["parking"] = OsmPlacemark::TransportParking; 0146 pois[QObject::tr( "train station" ).toLower()] = OsmPlacemark::TransportTrainStation; 0147 pois["train station"] = OsmPlacemark::TransportTrainStation; 0148 pois[QObject::tr( "atm" ).toLower()] = OsmPlacemark::MoneyAtm; 0149 pois["atm"] = OsmPlacemark::MoneyAtm; 0150 pois[QObject::tr( "tram stop" ).toLower()] = OsmPlacemark::TransportTramStop; 0151 pois["tram stop"] = OsmPlacemark::TransportTramStop; 0152 pois[QObject::tr( "bicycle rental" ).toLower()] = OsmPlacemark::TransportRentalBicycle; 0153 pois["bicycle rental"] = OsmPlacemark::TransportRentalBicycle; 0154 pois[QObject::tr( "car rental" ).toLower()] = OsmPlacemark::TransportRentalCar; 0155 pois["car rental"] = OsmPlacemark::TransportRentalCar; 0156 pois[QObject::tr( "speed camera" ).toLower()] = OsmPlacemark::TransportSpeedCamera; 0157 pois["speed camera"] = OsmPlacemark::TransportSpeedCamera; 0158 pois[QObject::tr( "taxi" ).toLower()] = OsmPlacemark::TransportTaxiRank; 0159 pois["taxi"] = OsmPlacemark::TransportTaxiRank; 0160 pois[QObject::tr( "memorial" ).toLower()] = OsmPlacemark::HistoricMemorial; 0161 pois["memorial"] = OsmPlacemark::HistoricMemorial; 0162 } 0163 0164 Q_ASSERT( !pois.isEmpty() ); 0165 QString const searchTerm = category.toLower(); 0166 if ( pois.contains( searchTerm ) ) { 0167 m_category = pois[searchTerm]; 0168 return true; 0169 } 0170 0171 m_category = OsmPlacemark::UnknownCategory; 0172 return false; 0173 } 0174 0175 OsmPlacemark::OsmCategory DatabaseQuery::category() const 0176 { 0177 return m_category; 0178 } 0179 0180 DatabaseQuery::QueryType DatabaseQuery::queryType() const 0181 { 0182 return m_queryType; 0183 } 0184 0185 DatabaseQuery::ResultFormat DatabaseQuery::resultFormat() const 0186 { 0187 return m_resultFormat; 0188 } 0189 0190 QString DatabaseQuery::street() const 0191 { 0192 return m_street; 0193 } 0194 0195 QString DatabaseQuery::houseNumber() const 0196 { 0197 return m_houseNumber; 0198 } 0199 0200 QString DatabaseQuery::region() const 0201 { 0202 return m_region; 0203 } 0204 0205 QString DatabaseQuery::searchTerm() const 0206 { 0207 return m_searchTerm; 0208 } 0209 0210 GeoDataCoordinates DatabaseQuery::position() const 0211 { 0212 return m_position; 0213 } 0214 0215 }