libosmscout 1.1.1
Loading...
Searching...
No Matches
LookupModule.h
Go to the documentation of this file.
1#ifndef OSMSCOUT_CLIENT_QT_LOOKUPMODULE_H
2#define OSMSCOUT_CLIENT_QT_LOOKUPMODULE_H
3
4/*
5 OSMScout - a Qt backend for libosmscout and libosmscout-map
6 Copyright (C) 2017 Lukas Karas
7
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23#include <iostream>
24
25#include <QObject>
26#include <QThread>
27#include <QRectF>
28#include <QMutex>
29
31
35
36#include <osmscoutclient/DBThread.h>
37
41
42namespace osmscout {
43
48 Q_OBJECT
49
50 friend class SearchRunnable;
52
53public:
54
72
73 class ObjectInfo {
74 public:
75 QString type; // node / way / area
76 QString objectType;
77 QString name;
78 QString altLangName;
79 QString phone;
80 QString website;
81 QString openingHours;
84 QList<AdminRegionInfoRef> adminRegionList;
85 uint64_t id;
86 osmscout::GeoCoord center;
87 std::vector<osmscout::Point> points;
88 };
89
90private:
91 QMutex mutex;
92 QThread *thread;
93 DBThreadRef dbThread;
94 DBLoadJob *loadJob;
95 MapViewStruct view;
96 QRectF filterRectangle;
97 std::map<QString,std::map<osmscout::FileOffset,AdminRegionInfoRef>> adminRegionCache;
98
99 Slot<osmscout::GeoBox> dbLoadedSlot{
100 [this](const osmscout::GeoBox &b) {
102 }
103 };
104
105signals:
106 void initialisationFinished(const osmscout::GeoBox& response);
107 void viewObjectsLoaded(const MapViewStruct&,
108 const QList<LookupModule::ObjectInfo> &objects);
109
111 const QList<LookupModule::ObjectInfo> &objects);
112
113 void locationDescription(const osmscout::GeoCoord location,
114 const QString database,
115 const osmscout::LocationDescription description,
116 const QList<AdminRegionInfoRef> regions);
117 void locationDescriptionFinished(const osmscout::GeoCoord location);
118
119 void locationAdminRegions(const osmscout::GeoCoord location,
120 QList<AdminRegionInfoRef> adminRegionList);
121 void locationAdminRegionFinished(const osmscout::GeoCoord location);
122
123public slots:
124 void requestObjectsOnView(const MapViewStruct&, const QRectF &filterRectangle);
125 void requestObjects(const LocationEntry&, bool reverseLookupAddresses);
126 void onDatabaseLoaded(QString dbPath,QList<osmscout::TileRef> tiles);
127 void onLoadJobFinished(QMap<QString,QMap<osmscout::TileKey,osmscout::TileRef>> tiles);
128
139 void requestLocationDescription(const osmscout::GeoCoord location);
140
151 void requestRegionLookup(const osmscout::GeoCoord location);
152
153public:
154 LookupModule(QThread *thread,DBThreadRef dbThread);
156
165 static QStringList AdminRegionNames(const QList<AdminRegionInfoRef> &regionList, bool useAltNames);
166
177 static QStringList IndexedAdminRegionNames(const QList<AdminRegionInfoRef> &regionList, bool useAltNames);
178
179private:
180
181 void addObjectInfo(QList<ObjectInfo> &objectList, // output
182 QString type,
183 const ObjectFileRef &ref,
184 const std::vector<osmscout::Point> &points,
185 const osmscout::GeoCoord &center,
186 const osmscout::TypeInfoRef &objectType,
187 const osmscout::FeatureValueBuffer &features,
188 const std::map<ObjectFileRef,LocationDescriptionService::ReverseLookupResult> &reverseLookupMap,
189 const DBInstanceRef &db,
190 std::map<osmscout::FileOffset,osmscout::AdminRegionRef> &regionMap)
191 {
192 ObjectInfo info;
193 //std::cout << " - "<<type.toStdString()<<": " << o->GetType()->GetName() << " " << ref.GetName();
194
195 info.type=type;
196 info.objectType=QString::fromStdString(objectType->GetName());
197 info.id=ref.GetFileOffset();
198
199 if (const osmscout::NameFeatureValue *name=features.findValue<osmscout::NameFeatureValue>(); name!=nullptr){
200 info.name=QString::fromStdString(name->GetLabel(Locale(), 0));
201 }
202
203 if (const osmscout::NameAltFeatureValue *nameAlt=features.findValue<osmscout::NameAltFeatureValue>(); nameAlt!=nullptr){
204 info.altLangName=QString::fromStdString(nameAlt->GetLabel(Locale(), 0));
205 }
206
207 if (const osmscout::PhoneFeatureValue *phone=features.findValue<osmscout::PhoneFeatureValue>(); phone!=nullptr){
208 info.phone=QString::fromStdString(phone->GetPhone());
209 }
210
211 if (const osmscout::WebsiteFeatureValue *website=features.findValue<osmscout::WebsiteFeatureValue>(); website!=nullptr){
212 info.website=QString::fromStdString(website->GetWebsite());
213 }
214
215 if (const osmscout::OpeningHoursFeatureValue *openingHours=features.findValue<osmscout::OpeningHoursFeatureValue>(); openingHours!=nullptr){
216 info.openingHours=QString::fromStdString(openingHours->GetValue());
217 }
218
219 if (const osmscout::AddressFeatureValue *address=features.findValue<osmscout::AddressFeatureValue>(); address!=nullptr){
220 info.addressNumber=QString::fromStdString(address->GetAddress());
221 }
222
223 if (const auto &it=reverseLookupMap.find(ref); it!=reverseLookupMap.end()){
224 info.adminRegionList=BuildAdminRegionList(db, it->second.adminRegion, regionMap);
225 info.reverseLookupRef=std::make_shared<LocationDescriptionService::ReverseLookupResult>(it->second);
226 }
227 info.center=center;
228 info.points=points;
229
230 objectList << info;
231 }
232
233 template<class T> void addObjectInfo(QList<ObjectInfo> &objectList, // output
234 QString type,
235 const ObjectFileRef &ref,
236 const std::vector<osmscout::Point> &points,
237 const osmscout::GeoCoord &center,
238 const T &o,
239 const std::map<ObjectFileRef,LocationDescriptionService::ReverseLookupResult> &reverseLookupMap,
240 const DBInstanceRef &db,
241 std::map<osmscout::FileOffset,osmscout::AdminRegionRef> &regionMap)
242 {
243 addObjectInfo(objectList,type,ref,points,center,o->GetType(),o->GetFeatureValueBuffer(),reverseLookupMap,db,regionMap);
244 }
245
246 void addObjectInfo(QList<ObjectInfo> &objectList, // output
247 const NodeRef &node,
248 const std::map<ObjectFileRef,LocationDescriptionService::ReverseLookupResult> &reverseLookupMap,
249 const DBInstanceRef &db,
250 std::map<osmscout::FileOffset,osmscout::AdminRegionRef> &regionMap);
251
252 void addObjectInfo(QList<ObjectInfo> &objectList, // output
253 const WayRef &way,
254 const std::map<ObjectFileRef,LocationDescriptionService::ReverseLookupResult> &reverseLookupMap,
255 const DBInstanceRef &db,
256 std::map<osmscout::FileOffset,osmscout::AdminRegionRef> &regionMap);
257
258 void addObjectInfo(QList<ObjectInfo> &objectList, // output
259 const AreaRef &area,
260 const std::map<ObjectFileRef,LocationDescriptionService::ReverseLookupResult> &reverseLookupMap,
261 const DBInstanceRef &db,
262 std::map<osmscout::FileOffset,osmscout::AdminRegionRef> &regionMap);
263
264 static AdminRegionInfoRef buildAdminRegionInfo(const DBInstanceRef &db,const osmscout::AdminRegionRef &region);
265
266 static QList<AdminRegionInfoRef> BuildAdminRegionInfoList(AdminRegionInfoRef &bottom,
267 std::map<osmscout::FileOffset,AdminRegionInfoRef> &regionInfoMap);
268
269 static QList<AdminRegionInfoRef> BuildAdminRegionList(const DBInstanceRef &db,
270 const osmscout::AdminRegionRef& adminRegion,
271 std::map<osmscout::FileOffset,osmscout::AdminRegionRef> &regionMap);
272
273 void filterObjectInView(const osmscout::MapData &data,
274 QList<ObjectInfo> &objectList);
275};
276
280typedef std::shared_ptr<LookupModule> LookupModuleRef;
281
282}
283
284#endif /* OSMSCOUT_CLIENT_QT_LOOKUPMODULE_H */
#define OSMSCOUT_CLIENT_QT_API
Definition ClientQtImportExport.h:45
Definition DBLoadJob.h:47
std::shared_ptr< ReverseLookupResult > ReverseLookupRef
Definition LocationDescriptionService.h:370
Definition LocationEntry.h:47
Definition LookupModule.h:73
QString phone
Definition LookupModule.h:79
QString altLangName
Definition LookupModule.h:78
QString objectType
Definition LookupModule.h:76
QString addressNumber
Definition LookupModule.h:82
uint64_t id
Definition LookupModule.h:85
QString type
Definition LookupModule.h:75
QString name
Definition LookupModule.h:77
LocationDescriptionService::ReverseLookupRef reverseLookupRef
Definition LookupModule.h:83
std::vector< osmscout::Point > points
Definition LookupModule.h:87
QString openingHours
Definition LookupModule.h:81
QString website
Definition LookupModule.h:80
QList< AdminRegionInfoRef > adminRegionList
Definition LookupModule.h:84
osmscout::GeoCoord center
Definition LookupModule.h:86
AdminRegionLevel
Definition LookupModule.h:61
@ Country
Definition LookupModule.h:63
@ Town
Definition LookupModule.h:69
@ Neighbourhood
Definition LookupModule.h:70
@ Region
Definition LookupModule.h:67
@ District
Definition LookupModule.h:68
@ NA5
Definition LookupModule.h:66
@ State
Definition LookupModule.h:65
@ NA1
Definition LookupModule.h:62
@ Territory
Definition LookupModule.h:64
void initialisationFinished(const osmscout::GeoBox &response)
void requestRegionLookup(const osmscout::GeoCoord location)
void requestObjectsOnView(const MapViewStruct &, const QRectF &filterRectangle)
void locationDescription(const osmscout::GeoCoord location, const QString database, const osmscout::LocationDescription description, const QList< AdminRegionInfoRef > regions)
void onDatabaseLoaded(QString dbPath, QList< osmscout::TileRef > tiles)
void locationAdminRegionFinished(const osmscout::GeoCoord location)
void locationAdminRegions(const osmscout::GeoCoord location, QList< AdminRegionInfoRef > adminRegionList)
static QStringList AdminRegionNames(const QList< AdminRegionInfoRef > &regionList, bool useAltNames)
void onLoadJobFinished(QMap< QString, QMap< osmscout::TileKey, osmscout::TileRef > > tiles)
LookupModule(QThread *thread, DBThreadRef dbThread)
static QStringList IndexedAdminRegionNames(const QList< AdminRegionInfoRef > &regionList, bool useAltNames)
void locationDescriptionFinished(const osmscout::GeoCoord location)
void requestObjects(const LocationEntry &, bool reverseLookupAddresses)
void requestLocationDescription(const osmscout::GeoCoord location)
friend class SearchLocationsRunnable
Definition LookupModule.h:51
void viewObjectsLoaded(const MapViewStruct &, const QList< LookupModule::ObjectInfo > &objects)
void objectsLoaded(const LocationEntry &, const QList< LookupModule::ObjectInfo > &objects)
friend class SearchRunnable
Definition LookupModule.h:50
Definition NameAltFeature.h:31
Definition NameFeature.h:31
Definition PhoneFeature.h:31
Definition Signal.h:98
std::shared_ptr< LookupModule > LookupModuleRef
Definition LookupModule.h:280
Definition Area.h:39
std::shared_ptr< TypeInfo > TypeInfoRef
Definition TypeConfig.h:61
std::shared_ptr< AdminRegion > AdminRegionRef
Definition Location.h:83