libosmscout  1.1.1
LocationDescriptionService.h
Go to the documentation of this file.
1 #ifndef OSMSCOUT_LOCATIONDESCRIPTIONSERVICE_H
2 #define OSMSCOUT_LOCATIONDESCRIPTIONSERVICE_H
3 
4 /*
5  This source is part of the libosmscout library
6  Copyright (C) 2017 Tim Teulings
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 <list>
24 #include <memory>
25 
26 #include <osmscout/Database.h>
27 #include <osmscout/Location.h>
28 
29 #include <osmscout/TypeInfoSet.h>
30 
32 
33 namespace osmscout {
34 
40  class OSMSCOUT_API LocationCoordDescription CLASS_FINAL
41  {
42  private:
43  GeoCoord location;
44 
45  public:
46  explicit LocationCoordDescription(const GeoCoord& location);
47 
48  GeoCoord GetLocation() const;
49  };
50 
53  using LocationCoordDescriptionRef = std::shared_ptr<LocationCoordDescription>;
54 
55  class OSMSCOUT_API LocationDescriptionCandicate CLASS_FINAL
56  {
57  private:
58  ObjectFileRef ref;
59  std::string name;
60  Distance distance;
61  Bearing bearing;
62  bool atPlace;
63  double size;
64 
65  public:
66  inline LocationDescriptionCandicate(const ObjectFileRef &ref,
67  const std::string& name,
68  const Distance &distance,
69  const Bearing &bearing,
70  const bool atPlace,
71  const double size)
72  : ref(ref),
73  name(name),
74  distance(distance),
75  bearing(bearing),
76  atPlace(atPlace),
77  size(size)
78  {
79  // no code
80  }
81 
82  inline ObjectFileRef GetRef() const
83  {
84  return ref;
85  }
86 
87  inline std::string GetName() const
88  {
89  return name;
90  }
91 
92  inline Distance GetDistance() const
93  {
94  return distance;
95  }
96 
97  inline Bearing GetBearing() const
98  {
99  return bearing;
100  }
101 
102  inline bool IsAtPlace() const
103  {
104  return atPlace;
105  }
106 
107  inline double GetSize() const
108  {
109  return size;
110  }
111  };
112 
118  class OSMSCOUT_API LocationAtPlaceDescription CLASS_FINAL
119  {
120  private:
121  Place place;
122  bool atPlace;
123  Distance distance;
124  Bearing bearing;
125 
126  public:
127  explicit LocationAtPlaceDescription(const Place& place);
128  LocationAtPlaceDescription(const Place& place,
129  const Distance &distance,
130  const Bearing &bearing);
131 
135  inline Place GetPlace() const
136  {
137  return place;
138  }
139 
143  inline bool IsAtPlace() const
144  {
145  return atPlace;
146  }
147 
151  inline Distance GetDistance() const
152  {
153  return distance;
154  }
155 
159  inline Bearing GetBearing() const
160  {
161  return bearing;
162  }
163  };
164 
167  using LocationAtPlaceDescriptionRef = std::shared_ptr<LocationAtPlaceDescription>;
168 
174  class OSMSCOUT_API LocationWayDescription CLASS_FINAL
175  {
176  private:
177  Place way;
178  Distance distance;
179 
180  public:
181  explicit LocationWayDescription(const Place& way);
182 
183  LocationWayDescription(const Place& way,
184  const Distance &distance);
188  inline Place GetWay() const
189  {
190  return way;
191  }
192 
196  inline Distance GetDistance() const
197  {
198  return distance;
199  }
200  };
201 
204  using LocationWayDescriptionRef = std::shared_ptr<LocationWayDescription>;
205 
211  class OSMSCOUT_API LocationCrossingDescription CLASS_FINAL
212  {
213  private:
214  GeoCoord crossing;
215  bool atPlace;
216  std::list<Place> ways;
217  Distance distance;
218  Bearing bearing;
219 
220  public:
221  LocationCrossingDescription(const GeoCoord& crossing,
222  const std::list<Place>& ways);
223 
224  LocationCrossingDescription(const GeoCoord& crossing,
225  const std::list<Place>& ways,
226  const Distance &distance,
227  const Bearing &bearing);
231  inline std::list<Place> GetWays() const
232  {
233  return ways;
234  }
235 
239  inline bool IsAtPlace() const
240  {
241  return atPlace;
242  }
243 
247  inline Distance GetDistance() const
248  {
249  return distance;
250  }
251 
255  inline Bearing GetBearing() const
256  {
257  return bearing;
258  }
259 
260  inline GeoCoord GetCrossing() const
261  {
262  return crossing;
263  }
264  };
265 
268  using LocationCrossingDescriptionRef = std::shared_ptr<LocationCrossingDescription>;
269 
276  class OSMSCOUT_API LocationDescription CLASS_FINAL
277  {
278  private:
279  LocationCoordDescriptionRef coordDescription;
280  LocationAtPlaceDescriptionRef atNameDescription;
281  LocationAtPlaceDescriptionRef atAddressDescription;
282  LocationAtPlaceDescriptionRef atPOIDescription;
283  LocationWayDescriptionRef wayDescription;
284  LocationCrossingDescriptionRef crossingDescription;
285 
286  public:
287  void SetCoordDescription(const LocationCoordDescriptionRef& description);
288  void SetAtNameDescription(const LocationAtPlaceDescriptionRef& description);
289  void SetAtAddressDescription(const LocationAtPlaceDescriptionRef& description);
290  void SetAtPOIDescription(const LocationAtPlaceDescriptionRef& description);
291  void SetWayDescription(const LocationWayDescriptionRef& description);
292  void SetCrossingDescription(const LocationCrossingDescriptionRef& description);
293 
298  LocationCoordDescriptionRef GetCoordDescription() const;
299 
304  LocationAtPlaceDescriptionRef GetAtNameDescription() const;
305 
310  LocationAtPlaceDescriptionRef GetAtAddressDescription() const;
311 
316  LocationAtPlaceDescriptionRef GetAtPOIDescription() const;
317 
322  LocationWayDescriptionRef GetWayDescription() const;
323 
328  LocationCrossingDescriptionRef GetCrossingDescription() const;
329  };
330 
352  {
353  public:
360  {
361  ObjectFileRef object;
367  };
368 
369  using ReverseLookupRef = std::shared_ptr<ReverseLookupResult>;
370 
371  private:
372  DatabaseRef database;
373 
374  private:
375  static bool DistanceComparator(const LocationDescriptionCandicate &a,
376  const LocationDescriptionCandicate &b);
377 
378  const FeatureValueBufferRef GetObjectFeatureBuffer(const ObjectFileRef &object);
379 
380  Place GetPlace(const std::list<ReverseLookupResult>& lookupResult);
381 
382  bool VisitAdminRegions(AdminRegionVisitor& visitor) const;
383 
384  void AddToCandidates(std::vector<LocationDescriptionCandicate>& candidates,
385  const GeoCoord& location,
386  const NodeRegionSearchResult& results,
387  bool requireAddress,
388  bool requireName);
389  void AddToCandidates(std::vector<LocationDescriptionCandicate>& candidates,
390  const GeoCoord& location,
391  const WayRegionSearchResult& results);
392  void AddToCandidates(std::vector<LocationDescriptionCandicate>& candidates,
393  const GeoCoord& location,
394  const AreaRegionSearchResult& results,
395  bool requireAddress,
396  bool requireName);
397 
398  public:
399  explicit LocationDescriptionService(const DatabaseRef& database);
400 
401  bool ReverseLookupRegion(const GeoCoord &coord,
402  std::list<ReverseLookupResult>& result) const;
403 
404  bool ReverseLookupObjects(const std::list<ObjectFileRef>& objects,
405  std::list<ReverseLookupResult>& result) const;
406  bool ReverseLookupObject(const ObjectFileRef& object,
407  std::list<ReverseLookupResult>& result) const;
408 
409  bool DescribeLocation(const GeoCoord& location,
410  LocationDescription& description,
411  const Distance& lookupDistance=Distance::Of<Meter>(100),
412  double sizeFilter=1.0);
413 
414  bool DescribeLocationByName(const GeoCoord& location,
415  LocationDescription& description,
416  const Distance& lookupDistance=Distance::Of<Meter>(100),
417  double sizeFilter=1.0);
418 
419  bool DescribeLocationByAddress(const GeoCoord& location,
420  LocationDescription& description,
421  const Distance& lookupDistance=Distance::Of<Meter>(100),
422  double sizeFilter=1.0);
423 
424  bool DescribeLocationByPOI(const GeoCoord& location,
425  LocationDescription& description,
426  const Distance& lookupDistance=Distance::Of<Meter>(100),
427  double sizeFilter=1.0);
428 
429  bool DescribeLocationByCrossing(const GeoCoord& location,
430  LocationDescription& description,
431  const Distance& lookupDistance=Distance::Of<Meter>(100));
432 
433  bool DescribeLocationByWay(const GeoCoord& location,
434  LocationDescription& description,
435  const Distance& lookupDistance=Distance::Of<Meter>(100));
436  };
437 
440  using LocationDescriptionServiceRef = std::shared_ptr<LocationDescriptionService>;
441 }
442 
443 
444 #endif
Definition: Database.h:173
Distance GetDistance() const
Definition: LocationDescriptionService.h:92
std::shared_ptr< LocationAtPlaceDescription > LocationAtPlaceDescriptionRef
Definition: LocationDescriptionService.h:167
std::string GetName() const
Definition: LocationDescriptionService.h:87
AdminRegionRef adminRegion
Region the object is in, if set.
Definition: LocationDescriptionService.h:362
bool IsAtPlace() const
Definition: LocationDescriptionService.h:102
ObjectFileRef GetRef() const
Definition: LocationDescriptionService.h:82
Definition: Area.h:86
double GetSize() const
Definition: LocationDescriptionService.h:107
LocationDescriptionCandicate(const ObjectFileRef &ref, const std::string &name, const Distance &distance, const Bearing &bearing, const bool atPlace, const double size)
Definition: LocationDescriptionService.h:66
std::shared_ptr< LocationWayDescription > LocationWayDescriptionRef
Definition: LocationDescriptionService.h:204
LocationRef location
Location data, if set.
Definition: LocationDescriptionService.h:365
std::shared_ptr< Database > DatabaseRef
Reference counted reference to an Database instance.
Definition: Database.h:555
ObjectFileRef object
object used for lookup
Definition: LocationDescriptionService.h:361
std::shared_ptr< LocationCoordDescription > LocationCoordDescriptionRef
Definition: LocationDescriptionService.h:53
std::shared_ptr< Address > AddressRef
Definition: Location.h:191
std::shared_ptr< FeatureValueBuffer > FeatureValueBufferRef
Definition: TypeConfig.h:871
Definition: Area.h:38
std::list< Place > GetWays() const
Definition: LocationDescriptionService.h:231
std::shared_ptr< PostalArea > PostalAreaRef
Definition: Location.h:45
Bearing GetBearing() const
Definition: LocationDescriptionService.h:97
Definition: Database.h:271
Definition: LocationDescriptionService.h:359
#define CLASS_FINAL
Definition: Compiler.h:26
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
Place GetPlace() const
Definition: LocationDescriptionService.h:135
std::shared_ptr< ReverseLookupResult > ReverseLookupRef
Definition: LocationDescriptionService.h:369
Definition: Database.h:219
std::shared_ptr< LocationDescriptionService > LocationDescriptionServiceRef
Definition: LocationDescriptionService.h:440
PostalAreaRef postalArea
Postal area the object is in, if set.
Definition: LocationDescriptionService.h:363
std::shared_ptr< POI > POIRef
Definition: Location.h:123
Definition: LocationDescriptionService.h:351
Definition: Location.h:90
Place GetWay() const
Definition: LocationDescriptionService.h:188
Definition: Location.h:253
GeoCoord GetCrossing() const
Definition: LocationDescriptionService.h:260
POIRef poi
POI data, if set.
Definition: LocationDescriptionService.h:364
std::shared_ptr< AdminRegion > AdminRegionRef
Definition: Location.h:83
std::shared_ptr< Location > LocationRef
Definition: Location.h:156
std::shared_ptr< LocationCrossingDescription > LocationCrossingDescriptionRef
Definition: LocationDescriptionService.h:268
AddressRef address
Address data if set.
Definition: LocationDescriptionService.h:366