libosmscout  1.1.1
Database.h
Go to the documentation of this file.
1 #ifndef OSMSCOUT_DATABASE_H
2 #define OSMSCOUT_DATABASE_H
3 
4 /*
5  This source is part of the libosmscout library
6  Copyright (C) 2009 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 #include <mutex>
26 #include <set>
27 #include <unordered_map>
28 #include <vector>
29 #include <string_view>
30 
31 // Type and style sheet configuration
32 #include <osmscout/OSMScoutTypes.h>
33 #include <osmscout/TypeConfig.h>
34 
35 // Datafiles
36 #include <osmscout/AreaDataFile.h>
38 #include <osmscout/NodeDataFile.h>
39 #include <osmscout/WayDataFile.h>
40 #include <osmscout/RouteDataFile.h>
41 
44 
45 // In area index
46 #include <osmscout/AreaAreaIndex.h>
47 #include <osmscout/AreaNodeIndex.h>
48 #include <osmscout/AreaWayIndex.h>
50 
51 // Location index
52 #include <osmscout/LocationIndex.h>
53 
54 // Water index
55 #include <osmscout/WaterIndex.h>
56 
57 // SRTM index
58 #include <osmscout/SRTM.h>
59 
61 
62 #include <osmscout/util/GeoBox.h>
63 
65 
66 namespace osmscout {
67 
82  class OSMSCOUT_API DatabaseParameter CLASS_FINAL
83  {
84  private:
85  unsigned long areaAreaIndexCacheSize=5000;
86 
87  unsigned long nodeDataCacheSize=5000;
88  unsigned long wayDataCacheSize=40000;
89  unsigned long areaDataCacheSize=5000;
90  unsigned long routeDataCacheSize=1500;
91 
92  bool routerDataMMap=true;
93  bool nodesDataMMap=true;
94  bool areasDataMMap=true;
95  bool waysDataMMap=true;
96  bool routesDataMMap=true;
97  bool optimizeLowZoomMMap=true;
98  bool indexMMap=true;
99 
100  // temporary, until we have our own database file
101  std::string srtmDirectory;
102 
103  public:
104  DatabaseParameter() = default;
105 
106  void SetAreaAreaIndexCacheSize(unsigned long areaAreaIndexCacheSize);
107  void SetNodeDataCacheSize(unsigned long size);
108  void SetWayDataCacheSize(unsigned long size);
109  void SetAreaDataCacheSize(unsigned long size);
110  void SetRouteDataCacheSize(unsigned long size);
111 
112  void SetRouterDataMMap(bool mmap);
113  void SetNodesDataMMap(bool mmap);
114  void SetAreasDataMMap(bool mmap);
115  void SetWaysDataMMap(bool mmap);
116  void SetRoutesDataMMap(bool mmap);
117  void SetOptimizeLowZoomMMap(bool mmap);
118  void SetIndexMMap(bool mmap);
119 
120  // Temporary
121  void SetSRTMDirectory(const std::string& directory)
122  {
123  this->srtmDirectory=directory;
124  }
125 
126  unsigned long GetAreaAreaIndexCacheSize() const;
127  unsigned long GetNodeDataCacheSize() const;
128  unsigned long GetWayDataCacheSize() const;
129  unsigned long GetRouteDataCacheSize() const;
130  unsigned long GetAreaDataCacheSize() const;
131 
132  bool GetRouterDataMMap() const;
133  bool GetNodesDataMMap() const;
134  bool GetAreasDataMMap() const;
135  bool GetWaysDataMMap() const;
136  bool GetRoutesDataMMap() const;
137  bool GetOptimizeLowZoomMMap() const;
138  bool GetIndexMMap() const;
139 
140  // Temporary
141  std::string GetSRTMDirectory() const
142  {
143  return srtmDirectory;
144  }
145  };
146 
147  class Database;
148 
150  {
151  private:
152  NodeRef node;
153  Distance distance;
154 
155  private:
156  explicit NodeRegionSearchResultEntry(const NodeRef& node,
157  const Distance &distance);
158 
159  public:
160  friend Database;
161 
162  NodeRef GetNode() const
163  {
164  return node;
165  }
166 
167  Distance GetDistance() const
168  {
169  return distance;
170  }
171  };
172 
174  {
175  private:
176  std::list<NodeRegionSearchResultEntry> nodeResults;
177 
178  public:
179  friend Database;
180 
181  std::list<NodeRegionSearchResultEntry> GetNodeResults() const
182  {
183  return nodeResults;
184  }
185  };
186 
187 
189  {
190  private:
191  WayRef way;
192  Distance distance;
193  GeoCoord closestPoint;
194 
195  private:
196  explicit WayRegionSearchResultEntry(const WayRef &way,
197  const Distance &distance,
198  const GeoCoord &closestPoint);
199 
200  public:
201  friend Database;
202 
203  WayRef GetWay() const
204  {
205  return way;
206  }
207 
208  Distance GetDistance() const
209  {
210  return distance;
211  }
212 
213  GeoCoord GetClosestPoint() const
214  {
215  return closestPoint;
216  }
217  };
218 
220  {
221  private:
222  std::list<WayRegionSearchResultEntry> wayResults;
223 
224  public:
225  friend Database;
226 
227  std::list<WayRegionSearchResultEntry> GetWayResults() const
228  {
229  return wayResults;
230  }
231  };
232 
234  {
235  private:
236  AreaRef area;
237  Distance distance;
238  GeoCoord closestPoint;
239  bool inArea;
240 
241  private:
242  explicit AreaRegionSearchResultEntry(const AreaRef &area,
243  const Distance &distance,
244  const GeoCoord &closestPoint,
245  bool inArea);
246 
247  public:
248  friend Database;
249 
250  AreaRef GetArea() const
251  {
252  return area;
253  }
254 
255  Distance GetDistance() const
256  {
257  return distance;
258  }
259 
260  GeoCoord GetClosestPoint() const
261  {
262  return closestPoint;
263  }
264 
265  bool IsInArea() const
266  {
267  return inArea;
268  }
269  };
270 
272  {
273  private:
274  std::list<AreaRegionSearchResultEntry> areaResults;
275 
276  public:
277  friend Database;
278 
279  inline std::list<AreaRegionSearchResultEntry> GetAreaResults() const
280  {
281  return areaResults;
282  }
283  };
284 
296  class OSMSCOUT_API Database CLASS_FINAL
297  {
298  private:
299  DatabaseParameter parameter;
300 
301  std::string path;
302  bool isOpen=false;
303 
304  TypeConfigRef typeConfig;
305 
306  mutable BoundingBoxDataFileRef boundingBoxDataFile;
307  mutable std::mutex boundingBoxDataFileMutex;
308 
309  mutable NodeDataFileRef nodeDataFile;
310  mutable std::mutex nodeDataFileMutex;
311 
312  mutable AreaDataFileRef areaDataFile;
313  mutable std::mutex areaDataFileMutex;
314 
315  mutable WayDataFileRef wayDataFile;
316  mutable std::mutex wayDataFileMutex;
317 
318  mutable RouteDataFileRef routeDataFile;
319  mutable std::mutex routeDataFileMutex;
320 
321  mutable AreaNodeIndexRef areaNodeIndex;
322  mutable std::mutex areaNodeIndexMutex;
323 
324  mutable AreaWayIndexRef areaWayIndex;
325  mutable std::mutex areaWayIndexMutex;
326 
327  mutable AreaRouteIndexRef areaRouteIndex;
328  mutable std::mutex areaRouteIndexMutex;
329 
330  mutable AreaAreaIndexRef areaAreaIndex;
331  mutable std::mutex areaAreaIndexMutex;
332 
333  mutable LocationIndexRef locationIndex;
334  mutable std::mutex locationIndexMutex;
335 
336  mutable WaterIndexRef waterIndex;
337  mutable std::mutex waterIndexMutex;
338 
339  mutable OptimizeAreasLowZoomRef optimizeAreasLowZoom;
340  mutable std::mutex optimizeAreasMutex;
341 
342  mutable OptimizeWaysLowZoomRef optimizeWaysLowZoom;
343  mutable std::mutex optimizeWaysMutex;
344 
345  mutable SRTMRef srtmIndex;
346  mutable std::mutex srtmIndexMutex;
347 
348  private:
349  template<typename DataFile, typename OffsetsCol, typename DataCol>
350  bool GetObjectsByOffset(DataFile dataFile,
351  const OffsetsCol& offsets,
352  DataCol& objects,
353  const std::string_view &typeName) const
354  {
355  if (!dataFile) {
356  return false;
357  }
358 
359  StopClock time;
360 
361  bool result=dataFile->GetByOffset(offsets.begin(), offsets.end(), offsets.size(), objects);
362 
363  if (time.GetMilliseconds()>100) {
364  log.Warn() << "Retrieving " << objects.size() << " " << typeName << " by offset took " << time.ResultString();
365  }
366 
367  return result;
368  }
369 
370  public:
371  explicit Database(const DatabaseParameter& parameter);
372  ~Database();
373 
374  bool Open(const std::string& path);
375  bool IsOpen() const;
376  void Close();
377 
378  std::string GetPath() const;
379  TypeConfigRef GetTypeConfig() const;
380 
381  const DatabaseParameter& GetParameter() const
382  {
383  return parameter;
384  }
385 
386  BoundingBoxDataFileRef GetBoundingBoxDataFile() const;
387 
388  NodeDataFileRef GetNodeDataFile() const;
389  AreaDataFileRef GetAreaDataFile() const;
390  WayDataFileRef GetWayDataFile() const;
391  RouteDataFileRef GetRouteDataFile() const;
392 
393  AreaNodeIndexRef GetAreaNodeIndex() const;
394  AreaAreaIndexRef GetAreaAreaIndex() const;
395  AreaWayIndexRef GetAreaWayIndex() const;
396  AreaRouteIndexRef GetAreaRouteIndex() const;
397 
398  LocationIndexRef GetLocationIndex() const;
399 
400  WaterIndexRef GetWaterIndex() const;
401 
402  OptimizeAreasLowZoomRef GetOptimizeAreasLowZoom() const;
403  OptimizeWaysLowZoomRef GetOptimizeWaysLowZoom() const;
404 
405  SRTMRef GetSRTMIndex() const;
406 
407  bool GetBoundingBox(GeoBox& boundingBox) const;
408 
409  bool GetNodeByOffset(const FileOffset& offset,
410  NodeRef& node) const;
411  bool GetNodesByOffset(const std::vector<FileOffset>& offsets,
412  std::vector<NodeRef>& nodes) const;
413  bool GetNodesByOffset(const std::vector<FileOffset>& offsets,
414  const GeoBox& boundingBox,
415  std::vector<NodeRef>& nodes) const;
416  bool GetNodesByOffset(const std::set<FileOffset>& offsets,
417  std::vector<NodeRef>& nodes) const;
418  bool GetNodesByOffset(const std::list<FileOffset>& offsets,
419  std::vector<NodeRef>& nodes) const;
420  bool GetNodesByOffset(const std::set<FileOffset>& offsets,
421  std::unordered_map<FileOffset,NodeRef>& dataMap) const;
422 
423  bool GetAreaByOffset(const FileOffset& offset,
424  AreaRef& area) const;
425 
426  template<typename OffsetsCol, typename DataCol>
427  bool GetAreasByOffset(const OffsetsCol& offsets,
428  DataCol& areas) const
429  {
430  using namespace std::string_view_literals;
431  return GetObjectsByOffset(GetAreaDataFile(), offsets, areas, "areas"sv);
432  }
433 
434  bool GetAreasByBlockSpan(const DataBlockSpan& span,
435  std::vector<AreaRef>& area) const;
436  bool GetAreasByBlockSpans(const std::vector<DataBlockSpan>& spans,
437  std::vector<AreaRef>& areas) const;
438 
439 
440  bool GetWayByOffset(const FileOffset& offset,
441  WayRef& way) const;
442 
443  template<typename OffsetsCol, typename DataCol>
444  bool GetWaysByOffset(const OffsetsCol& offsets,
445  DataCol& ways) const
446  {
447  using namespace std::string_view_literals;
448  return GetObjectsByOffset(GetWayDataFile(), offsets, ways, "ways"sv);
449  }
450 
451  template<typename OffsetsCol, typename DataCol>
452  bool GetRoutesByOffset(const OffsetsCol& offsets,
453  DataCol& routes) const
454  {
455  using namespace std::string_view_literals;
456  return GetObjectsByOffset(GetRouteDataFile(), offsets, routes, "routes"sv);
457  }
458 
471  NodeRegionSearchResult LoadNodesInRadius(const GeoCoord& location,
472  const TypeInfoSet& types,
473  Distance maxDistance=Distance::Of<Meter>(100)) const;
474 
487  WayRegionSearchResult LoadWaysInRadius(const GeoCoord& location,
488  const TypeInfoSet& types,
489  Distance maxDistance=Distance::Of<Meter>(100)) const;
490 
503  AreaRegionSearchResult LoadAreasInRadius(const GeoCoord& location,
504  const TypeInfoSet& types,
505  Distance maxDistance=Distance::Of<Meter>(100)) const;
506 
518  NodeRegionSearchResult LoadNodesInArea(const TypeInfoSet& types,
519  const GeoBox& boundingBox) const;
520 
532  WayRegionSearchResult LoadWaysInArea(const TypeInfoSet& types,
533  const GeoBox& boundingBox) const;
534 
546  AreaRegionSearchResult LoadAreasInArea(const TypeInfoSet& types,
547  const GeoBox& boundingBox) const;
548 
549  void DumpStatistics() const;
550 
551  void FlushCache();
552  };
553 
555  using DatabaseRef = std::shared_ptr<Database>;
556 
567 }
568 
569 #endif
std::shared_ptr< AreaAreaIndex > AreaAreaIndexRef
Definition: AreaAreaIndex.h:159
OSMSCOUT_API Log log
Definition: Database.h:173
Distance GetDistance() const
Definition: Database.h:208
std::list< AreaRegionSearchResultEntry > GetAreaResults() const
Definition: Database.h:279
std::shared_ptr< Node > NodeRef
Definition: Node.h:124
std::shared_ptr< RouteDataFile > RouteDataFileRef
Definition: RouteDataFile.h:50
bool GetWaysByOffset(const OffsetsCol &offsets, DataCol &ways) const
Definition: Database.h:444
Definition: Database.h:233
std::list< WayRegionSearchResultEntry > GetWayResults() const
Definition: Database.h:227
std::shared_ptr< OptimizeAreasLowZoom > OptimizeAreasLowZoomRef
Definition: OptimizeAreasLowZoom.h:115
Prints details for debugging, if debug flag (performance, data) is set in renderer parameter...
Definition: MapPainter.h:58
friend Database
Definition: Database.h:248
std::shared_ptr< AreaDataFile > AreaDataFileRef
Definition: AreaDataFile.h:51
std::shared_ptr< WayDataFile > WayDataFileRef
Definition: WayDataFile.h:51
std::shared_ptr< Way > WayRef
Definition: Way.h:202
std::shared_ptr< NodeDataFile > NodeDataFileRef
Definition: NodeDataFile.h:51
std::shared_ptr< AreaWayIndex > AreaWayIndexRef
Definition: AreaWayIndex.h:66
void GetBoundingBox(const std::vector< N > &nodes, double &minLon, double &maxLon, double &minLat, double &maxLat)
Definition: Geometry.h:107
std::shared_ptr< Database > DatabaseRef
Reference counted reference to an Database instance.
Definition: Database.h:555
std::shared_ptr< OptimizeWaysLowZoom > OptimizeWaysLowZoomRef
Definition: OptimizeWaysLowZoom.h:111
GeoCoord GetClosestPoint() const
Definition: Database.h:260
Definition: Area.h:38
NodeRef GetNode() const
Definition: Database.h:162
Definition: Database.h:271
friend Database
Definition: Database.h:160
#define CLASS_FINAL
Definition: Compiler.h:26
std::shared_ptr< Area > AreaRef
Definition: Area.h:358
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
Distance GetDistance() const
Definition: Database.h:255
Definition: Database.h:149
bool GetRoutesByOffset(const OffsetsCol &offsets, DataCol &routes) const
Definition: Database.h:452
std::shared_ptr< AreaRouteIndex > AreaRouteIndexRef
Definition: AreaRouteIndex.h:66
friend Database
Definition: Database.h:277
Definition: Database.h:219
Distance GetDistance() const
Definition: Database.h:167
friend Database
Definition: Database.h:225
GeoCoord GetClosestPoint() const
Definition: Database.h:213
Definition: DataFile.h:44
const DatabaseParameter & GetParameter() const
Definition: Database.h:381
WayRef GetWay() const
Definition: Database.h:203
friend Database
Definition: Database.h:179
uint64_t FileOffset
Definition: OSMScoutTypes.h:47
AreaRef GetArea() const
Definition: Database.h:250
Log & Warn(bool state)
Definition: Logger.h:462
bool IsInArea() const
Definition: Database.h:265
std::shared_ptr< AreaNodeIndex > AreaNodeIndexRef
Definition: AreaNodeIndex.h:120
bool GetAreasByOffset(const OffsetsCol &offsets, DataCol &areas) const
Definition: Database.h:427
std::string GetSRTMDirectory() const
Definition: Database.h:141
std::shared_ptr< TypeConfig > TypeConfigRef
Definition: TypeConfig.h:1227
std::shared_ptr< WaterIndex > WaterIndexRef
Definition: WaterIndex.h:106
Definition: Database.h:188
std::shared_ptr< LocationIndex > LocationIndexRef
Definition: LocationIndex.h:272
std::shared_ptr< BoundingBoxDataFile > BoundingBoxDataFileRef
Definition: BoundingBoxDataFile.h:68
void SetSRTMDirectory(const std::string &directory)
Definition: Database.h:121
friend Database
Definition: Database.h:201
std::list< NodeRegionSearchResultEntry > GetNodeResults() const
Definition: Database.h:181
std::shared_ptr< SRTM > SRTMRef
Definition: SRTM.h:95