File indexing completed on 2024-04-28 03:50:32

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 "LocalOsmSearchRunner.h"
0008 #include "DatabaseQuery.h"
0009 
0010 #include "MarbleDebug.h"
0011 #include "GeoDataPoint.h"
0012 
0013 #include <QString>
0014 #include <QVector>
0015 #include <QUrl>
0016 
0017 namespace Marble
0018 {
0019 
0020 QMap<OsmPlacemark::OsmCategory, GeoDataPlacemark::GeoDataVisualCategory> LocalOsmSearchRunner::m_categoryMap;
0021 
0022 LocalOsmSearchRunner::LocalOsmSearchRunner( const QStringList &databaseFiles, QObject *parent ) :
0023     SearchRunner( parent ),
0024     m_database( databaseFiles )
0025 {
0026     if ( m_categoryMap.isEmpty() ) {
0027         m_categoryMap[OsmPlacemark::UnknownCategory] = GeoDataPlacemark::OsmSite;
0028         m_categoryMap[OsmPlacemark::Address] = GeoDataPlacemark::OsmSite;
0029         m_categoryMap[OsmPlacemark::AccomodationCamping] = GeoDataPlacemark::AccomodationCamping;
0030         m_categoryMap[OsmPlacemark::AccomodationHostel] = GeoDataPlacemark::AccomodationHostel;
0031         m_categoryMap[OsmPlacemark::AccomodationHotel] = GeoDataPlacemark::AccomodationHotel;
0032         m_categoryMap[OsmPlacemark::AccomodationMotel] = GeoDataPlacemark::AccomodationMotel;
0033         m_categoryMap[OsmPlacemark::AccomodationYouthHostel] = GeoDataPlacemark::AccomodationYouthHostel;
0034         m_categoryMap[OsmPlacemark::AmenityLibrary] = GeoDataPlacemark::AmenityLibrary;
0035         m_categoryMap[OsmPlacemark::EducationCollege] = GeoDataPlacemark::EducationCollege;
0036         m_categoryMap[OsmPlacemark::EducationSchool] = GeoDataPlacemark::EducationSchool;
0037         m_categoryMap[OsmPlacemark::EducationUniversity] = GeoDataPlacemark::EducationUniversity;
0038         m_categoryMap[OsmPlacemark::FoodBar] = GeoDataPlacemark::FoodBar;
0039         m_categoryMap[OsmPlacemark::FoodBiergarten] = GeoDataPlacemark::FoodBiergarten;
0040         m_categoryMap[OsmPlacemark::FoodCafe] = GeoDataPlacemark::FoodCafe;
0041         m_categoryMap[OsmPlacemark::FoodFastFood] = GeoDataPlacemark::FoodFastFood;
0042         m_categoryMap[OsmPlacemark::FoodPub] = GeoDataPlacemark::FoodPub;
0043         m_categoryMap[OsmPlacemark::FoodRestaurant] = GeoDataPlacemark::FoodRestaurant;
0044         m_categoryMap[OsmPlacemark::HealthDoctors] = GeoDataPlacemark::HealthDoctors;
0045         m_categoryMap[OsmPlacemark::HealthHospital] = GeoDataPlacemark::HealthHospital;
0046         m_categoryMap[OsmPlacemark::HealthPharmacy] = GeoDataPlacemark::HealthPharmacy;
0047         m_categoryMap[OsmPlacemark::MoneyAtm] = GeoDataPlacemark::MoneyAtm;
0048         m_categoryMap[OsmPlacemark::MoneyBank] = GeoDataPlacemark::MoneyBank;
0049         m_categoryMap[OsmPlacemark::ShoppingBeverages] = GeoDataPlacemark::ShopBeverages;
0050         m_categoryMap[OsmPlacemark::ShoppingHifi] = GeoDataPlacemark::ShopHifi;
0051         m_categoryMap[OsmPlacemark::ShoppingSupermarket] = GeoDataPlacemark::ShopSupermarket;
0052         m_categoryMap[OsmPlacemark::TouristAttraction] = GeoDataPlacemark::TourismAttraction;
0053         m_categoryMap[OsmPlacemark::TouristCastle] = GeoDataPlacemark::HistoricCastle;
0054         m_categoryMap[OsmPlacemark::TouristCinema] = GeoDataPlacemark::AmenityCinema;
0055         m_categoryMap[OsmPlacemark::TouristMonument] = GeoDataPlacemark::HistoricMonument;
0056         m_categoryMap[OsmPlacemark::TouristMuseum] = GeoDataPlacemark::TourismMuseum;
0057         m_categoryMap[OsmPlacemark::TouristRuin] = GeoDataPlacemark::HistoricRuins;
0058         m_categoryMap[OsmPlacemark::TouristTheatre] = GeoDataPlacemark::AmenityTheatre;
0059         m_categoryMap[OsmPlacemark::TouristThemePark] = GeoDataPlacemark::TourismThemePark;
0060         m_categoryMap[OsmPlacemark::TouristViewPoint] = GeoDataPlacemark::TourismViewPoint;
0061         m_categoryMap[OsmPlacemark::TouristZoo] = GeoDataPlacemark::TourismZoo;
0062         m_categoryMap[OsmPlacemark::HistoricMemorial] = GeoDataPlacemark::HistoricMemorial;
0063         m_categoryMap[OsmPlacemark::TransportAirport] = GeoDataPlacemark::TransportAerodrome;
0064         m_categoryMap[OsmPlacemark::TransportAirportTerminal] = GeoDataPlacemark::TransportAirportTerminal;
0065         m_categoryMap[OsmPlacemark::TransportAirportRunway] = GeoDataPlacemark::TransportAirportRunway;
0066         m_categoryMap[OsmPlacemark::TransportAirportApron] = GeoDataPlacemark::TransportAirportApron;
0067         m_categoryMap[OsmPlacemark::TransportAirportTaxiway] = GeoDataPlacemark::TransportAirportTaxiway;
0068         m_categoryMap[OsmPlacemark::TransportBusStation] = GeoDataPlacemark::TransportBusStation;
0069         m_categoryMap[OsmPlacemark::TransportBusStop] = GeoDataPlacemark::TransportBusStop;
0070         m_categoryMap[OsmPlacemark::TransportCarShare] = GeoDataPlacemark::TransportCarShare;
0071         m_categoryMap[OsmPlacemark::TransportFuel] = GeoDataPlacemark::TransportFuel;
0072         m_categoryMap[OsmPlacemark::TransportParking] = GeoDataPlacemark::TransportParking;
0073         m_categoryMap[OsmPlacemark::TransportTrainStation] = GeoDataPlacemark::TransportTrainStation;
0074         m_categoryMap[OsmPlacemark::TransportTramStop] = GeoDataPlacemark::TransportTramStop;
0075         m_categoryMap[OsmPlacemark::TransportRentalBicycle] = GeoDataPlacemark::TransportRentalBicycle;
0076         m_categoryMap[OsmPlacemark::TransportRentalCar] = GeoDataPlacemark::TransportRentalCar;
0077         m_categoryMap[OsmPlacemark::TransportSpeedCamera] = GeoDataPlacemark::TransportSpeedCamera;
0078         m_categoryMap[OsmPlacemark::TransportTaxiRank] = GeoDataPlacemark::TransportTaxiRank;
0079         m_categoryMap[OsmPlacemark::PlacesRegion] = GeoDataPlacemark::OsmSite;
0080         m_categoryMap[OsmPlacemark::PlacesCounty] = GeoDataPlacemark::OsmSite;
0081         m_categoryMap[OsmPlacemark::PlacesCity] = GeoDataPlacemark::PlaceCity;
0082         m_categoryMap[OsmPlacemark::PlacesTown] = GeoDataPlacemark::PlaceTown;
0083         m_categoryMap[OsmPlacemark::PlacesVillage] = GeoDataPlacemark::PlaceVillage;
0084         m_categoryMap[OsmPlacemark::PlacesHamlet] = GeoDataPlacemark::PlaceHamlet;
0085         m_categoryMap[OsmPlacemark::PlacesIsolatedDwelling] = GeoDataPlacemark::OsmSite;
0086         m_categoryMap[OsmPlacemark::PlacesSuburb] = GeoDataPlacemark::PlaceSuburb;
0087         m_categoryMap[OsmPlacemark::PlacesLocality] = GeoDataPlacemark::PlaceLocality;
0088         m_categoryMap[OsmPlacemark::PlacesIsland] = GeoDataPlacemark::OsmSite;
0089     }
0090 }
0091 
0092 LocalOsmSearchRunner::~LocalOsmSearchRunner()
0093 {
0094 }
0095 
0096 
0097 void LocalOsmSearchRunner::search( const QString &searchTerm, const GeoDataLatLonBox &preferred )
0098 {
0099     const DatabaseQuery userQuery( model(), searchTerm, preferred );
0100 
0101     QVector<OsmPlacemark> placemarks = m_database.find( userQuery );
0102 
0103     QVector<GeoDataPlacemark*> result;
0104     for( const OsmPlacemark &placemark: placemarks ) {
0105         GeoDataPlacemark* hit = new GeoDataPlacemark;
0106         hit->setName( placemark.name() );
0107         if ( placemark.category() == OsmPlacemark::Address && !placemark.houseNumber().isEmpty() ) {
0108             hit->setName(hit->name() + QLatin1Char(' ') + placemark.houseNumber());
0109         }
0110         if ( !placemark.additionalInformation().isEmpty() ) {
0111             hit->setName(hit->name() + QLatin1Char('(') + placemark.additionalInformation() + QLatin1Char(')'));
0112         }
0113         if ( placemark.category() != OsmPlacemark::UnknownCategory ) {
0114             hit->setVisualCategory( m_categoryMap[placemark.category()] );
0115         }
0116         hit->setGeometry( new GeoDataPoint( placemark.longitude(), placemark.latitude(), 0.0, GeoDataCoordinates::Degree ) );
0117         result << hit;
0118     }
0119 
0120     emit searchFinished( result );
0121 }
0122 
0123 } // namespace Marble
0124 
0125 #include "moc_LocalOsmSearchRunner.cpp"