libosmscout 1.1.1
Loading...
Searching...
No Matches
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
33#include <osmscout/TypeConfig.h>
34
35// Datafiles
41
44
45// In area index
50
51// Location index
53
54// Water index
56
57// SRTM index
59
61
63
65
66namespace osmscout {
67
74
82 class OSMSCOUT_API DatabaseParameter CLASS_FINAL
83 {
84 private:
85 unsigned long areaAreaIndexCacheSize=5000;
86
87 unsigned long nodeDataCacheSize=5'000;
88 unsigned long wayDataCacheSize=40'000;
89 unsigned long areaDataCacheSize=5'000;
90 unsigned long routeDataCacheSize=1'500;
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 db 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;
138 bool GetIndexMMap() const;
139
140 // Temporary
141 std::string GetSRTMDirectory() const
142 {
143 return srtmDirectory;
144 }
145 };
146
147 class Database;
148
149 class OSMSCOUT_API NodeRegionSearchResultEntry
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
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
188 class OSMSCOUT_API WayRegionSearchResultEntry
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
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
233 class OSMSCOUT_API AreaRegionSearchResultEntry
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
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 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 runningTime;
360
361 bool result=dataFile->GetByOffset(offsets.begin(), offsets.end(), offsets.size(), objects);
362
363 if (runningTime.GetMilliseconds()>100) {
364 log.Warn() << "Retrieving " << objects.size() << " " << typeName << " by offset took " << runningTime.ResultString();
365 }
366
367 return result;
368 }
369
370 public:
371 explicit Database(const DatabaseParameter& parameter);
373
374 bool Open(const std::string& path);
375 bool IsOpen() const;
376 void Close();
377
378 std::string GetPath() const;
380
382 {
383 return parameter;
384 }
385
387
392
397
399
401
404
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
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
472 const TypeInfoSet& types,
473 Distance maxDistance=Distance::Of<Meter>(100)) const;
474
488 const TypeInfoSet& types,
489 Distance maxDistance=Distance::Of<Meter>(100)) const;
490
504 const TypeInfoSet& types,
505 Distance maxDistance=Distance::Of<Meter>(100)) const;
506
519 const GeoBox& boundingBox) const;
520
533 const GeoBox& boundingBox) const;
534
547 const GeoBox& boundingBox) const;
548
549 void DumpStatistics() const;
550
552 };
553
555 using DatabaseRef = std::shared_ptr<Database>;
556
567}
568
569#endif
#define CLASS_FINAL
Definition Compiler.h:26
#define OSMSCOUT_API
Definition CoreImportExport.h:45
Distance GetDistance() const
Definition Database.h:255
bool IsInArea() const
Definition Database.h:265
friend Database
Definition Database.h:248
GeoCoord GetClosestPoint() const
Definition Database.h:260
AreaRef GetArea() const
Definition Database.h:250
Definition Database.h:272
std::list< AreaRegionSearchResultEntry > GetAreaResults() const
Definition Database.h:279
friend Database
Definition Database.h:277
Definition Area.h:88
WayDataFileRef GetWayDataFile() const
AreaAreaIndexRef GetAreaAreaIndex() const
SRTMRef GetSRTMIndex() const
bool GetAreasByOffset(const OffsetsCol &offsets, DataCol &areas) const
Definition Database.h:427
TypeConfigRef GetTypeConfig() const
bool GetNodeByOffset(const FileOffset &offset, NodeRef &node) const
void SetNodeDataCacheSize(unsigned long size)
OptimizeAreasLowZoomRef GetOptimizeAreasLowZoom() const
bool GetNodesByOffset(const std::set< FileOffset > &offsets, std::unordered_map< FileOffset, NodeRef > &dataMap) const
void SetIndexMMap(bool mmap)
std::vector< Point > nodes
List of nodes.
Definition Way.h:57
std::vector< RouteRef > routes
Routes as retrieved from db.
Definition MapData.h:51
void SetAreasDataMMap(bool mmap)
void SetWayDataCacheSize(unsigned long size)
bool GetIndexMMap() const
bool GetBoundingBox(GeoBox &boundingBox) const
bool Open(const std::string &path)
void SetAreaAreaIndexCacheSize(unsigned long areaAreaIndexCacheSize)
std::string GetSRTMDirectory() const
Definition Database.h:141
void SetSRTMDirectory(const std::string &directory)
Definition Database.h:121
bool GetAreasByBlockSpan(const DataBlockSpan &span, std::vector< AreaRef > &area) const
NodeRegionSearchResult LoadNodesInRadius(const GeoCoord &location, const TypeInfoSet &types, Distance maxDistance=Distance::Of< Meter >(100)) const
const DatabaseParameter & GetParameter() const
Definition Database.h:381
void SetRoutesDataMMap(bool mmap)
WayRegionSearchResult LoadWaysInArea(const TypeInfoSet &types, const GeoBox &boundingBox) const
bool GetRoutesDataMMap() const
void SetNodesDataMMap(bool mmap)
bool GetNodesDataMMap() const
AreaDataFileRef GetAreaDataFile() const
bool GetWaysDataMMap() const
AreaRegionSearchResult LoadAreasInRadius(const GeoCoord &location, const TypeInfoSet &types, Distance maxDistance=Distance::Of< Meter >(100)) const
void SetRouteDataCacheSize(unsigned long size)
bool GetNodesByOffset(const std::vector< FileOffset > &offsets, std::vector< NodeRef > &nodes) const
bool GetNodesByOffset(const std::list< FileOffset > &offsets, std::vector< NodeRef > &nodes) const
std::vector< AreaRef > areas
Areas as retrieved from db.
Definition MapData.h:49
void SetWaysDataMMap(bool mmap)
WaterIndexRef GetWaterIndex() const
bool GetAreaByOffset(const FileOffset &offset, AreaRef &area) const
unsigned long GetRouteDataCacheSize() const
BoundingBoxDataFileRef GetBoundingBoxDataFile() const
bool GetWayByOffset(const FileOffset &offset, WayRef &way) const
NodeDataFileRef GetNodeDataFile() const
unsigned long GetWayDataCacheSize() const
AreaWayIndexRef GetAreaWayIndex() const
unsigned long GetNodeDataCacheSize() const
void DumpStatistics() const
bool GetRoutesByOffset(const OffsetsCol &offsets, DataCol &routes) const
Definition Database.h:452
void SetAreaDataCacheSize(unsigned long size)
bool GetAreasDataMMap() const
std::string GetPath() const
AreaRegionSearchResult LoadAreasInArea(const TypeInfoSet &types, const GeoBox &boundingBox) const
OptimizeWaysLowZoomRef GetOptimizeWaysLowZoom() const
void SetRouterDataMMap(bool mmap)
Database(const DatabaseParameter &parameter)
LocationIndexRef GetLocationIndex() const
WayRegionSearchResult LoadWaysInRadius(const GeoCoord &location, const TypeInfoSet &types, Distance maxDistance=Distance::Of< Meter >(100)) const
AreaRouteIndexRef GetAreaRouteIndex() const
unsigned long GetAreaDataCacheSize() const
bool GetOptimizeLowZoomMMap() const
bool GetNodesByOffset(const std::vector< FileOffset > &offsets, const GeoBox &boundingBox, std::vector< NodeRef > &nodes) const
DatabaseParameter()=default
RouteDataFileRef GetRouteDataFile() const
void SetOptimizeLowZoomMMap(bool mmap)
unsigned long GetAreaAreaIndexCacheSize() const
AreaNodeIndexRef GetAreaNodeIndex() const
NodeRegionSearchResult LoadNodesInArea(const TypeInfoSet &types, const GeoBox &boundingBox) const
bool GetRouterDataMMap() const
bool GetNodesByOffset(const std::set< FileOffset > &offsets, std::vector< NodeRef > &nodes) const
bool GetWaysByOffset(const OffsetsCol &offsets, DataCol &ways) const
Definition Database.h:444
bool GetAreasByBlockSpans(const std::vector< DataBlockSpan > &spans, std::vector< AreaRef > &areas) const
Log & Warn(bool state)
Definition Logger.h:407
NodeRef GetNode() const
Definition Database.h:162
friend Database
Definition Database.h:160
Distance GetDistance() const
Definition Database.h:167
Definition Database.h:174
friend Database
Definition Database.h:179
std::list< NodeRegionSearchResultEntry > GetNodeResults() const
Definition Database.h:181
friend Database
Definition Database.h:201
WayRef GetWay() const
Definition Database.h:203
GeoCoord GetClosestPoint() const
Definition Database.h:213
Distance GetDistance() const
Definition Database.h:208
Definition Database.h:220
std::list< WayRegionSearchResultEntry > GetWayResults() const
Definition Database.h:227
friend Database
Definition Database.h:225
OSMSCOUT_API Log log
Definition LoggerImpl.h:95
uint64_t FileOffset
Definition OSMScoutTypes.h:46
std::shared_ptr< TypeConfig > TypeConfigRef
Definition TypeConfig.h:1396
Definition Area.h:39
std::shared_ptr< AreaDataFile > AreaDataFileRef
Definition AreaDataFile.h:52
std::shared_ptr< Way > WayRef
Definition Way.h:213
std::shared_ptr< WaterIndex > WaterIndexRef
Definition WaterIndex.h:107
std::shared_ptr< Area > AreaRef
Definition Area.h:360
std::shared_ptr< RouteDataFile > RouteDataFileRef
Definition RouteDataFile.h:51
std::shared_ptr< OptimizeWaysLowZoom > OptimizeWaysLowZoomRef
Definition OptimizeWaysLowZoom.h:112
std::shared_ptr< AreaWayIndex > AreaWayIndexRef
Definition AreaWayIndex.h:68
std::shared_ptr< AreaRouteIndex > AreaRouteIndexRef
Definition AreaRouteIndex.h:69
std::shared_ptr< SRTM > SRTMRef
Definition SRTM.h:95
std::shared_ptr< Database > DatabaseRef
Reference counted reference to an Database instance.
Definition Database.h:555
std::shared_ptr< BoundingBoxDataFile > BoundingBoxDataFileRef
Definition BoundingBoxDataFile.h:68
std::shared_ptr< AreaAreaIndex > AreaAreaIndexRef
Definition AreaAreaIndex.h:159
std::shared_ptr< Node > NodeRef
Definition Node.h:125
std::shared_ptr< WayDataFile > WayDataFileRef
Definition WayDataFile.h:52
std::shared_ptr< OptimizeAreasLowZoom > OptimizeAreasLowZoomRef
Definition OptimizeAreasLowZoom.h:116
std::shared_ptr< AreaNodeIndex > AreaNodeIndexRef
Definition AreaNodeIndex.h:121
std::shared_ptr< LocationIndex > LocationIndexRef
Definition LocationIndex.h:273
std::shared_ptr< NodeDataFile > NodeDataFileRef
Definition NodeDataFile.h:52
Definition DataFile.h:46