libosmscout  1.1.1
GenRouteDat.h
Go to the documentation of this file.
1 #ifndef OSMSCOUT_IMPORT_GENROUTEDAT_H
2 #define OSMSCOUT_IMPORT_GENROUTEDAT_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 <map>
25 #include <unordered_map>
26 #include <vector>
27 
28 #include <osmscout/NumericIndex.h>
29 
32 
33 #include <osmscout/OSMScoutTypes.h>
34 
35 #include <osmscout/TypeFeatures.h>
36 #include <osmscout/FeatureReader.h>
37 
38 #include <osmscout/Area.h>
39 #include <osmscout/Way.h>
40 
41 #include <osmscout/ObjectRef.h>
42 
45 
46 #include <osmscout/import/Import.h>
47 
49 
50 namespace osmscout {
51 
52  class RouteDataGenerator CLASS_FINAL : public ImportModule
53  {
54  private:
55 
56  struct RawRouteNode
57  {
58  Id id;
59  Pixel cell;
60  std::list<ObjectFileRef> objects;
61  };
62 
63  struct TurnRestrictionData
64  {
65  enum Type
66  {
67  Allow = 0,
68  Forbit = 1
69  };
70 
71  FileOffset fromWayOffset;
72  Id viaNodeId;
73  FileOffset toWayOffset;
74  Type type;
75  };
76 
77  struct IndexEntry
78  {
79  FileOffset offset;
80  uint32_t count;
81 
82  IndexEntry()
83  : offset(0),
84  count(0)
85  {
86  }
87 
88  explicit IndexEntry(FileOffset offset)
89  : offset(offset),
90  count(0)
91  {
92  }
93  };
94 
95  typedef std::unordered_map<FileOffset,WayRef> FileOffsetWayMap;
96  typedef std::unordered_map<FileOffset,AreaRef> FileOffsetAreaMap;
97  typedef std::unordered_set<Id> RouteNodeIdSet;
98  typedef std::list<RawRouteNode> RawRouteNodeList;
99  typedef std::map<Id,std::list<ObjectFileRef>> NodeIdObjectsMap;
100  typedef std::unordered_map<Id,std::vector<TurnRestrictionData>> ViaTurnRestrictionMap;
101 
102  AccessFeatureValueReader *accessReader;
103  AccessRestrictedFeatureValueReader *accessRestrictedReader;
104  MaxSpeedFeatureValueReader *maxSpeedReader;
105  GradeFeatureValueReader *gradeReader;
106 
107  private:
108  AccessFeatureValue GetAccess(const FeatureValueBuffer& buffer) const;
109 
110  inline AccessFeatureValue GetAccess(const Way& way) const
111  {
112  return GetAccess(way.GetFeatureValueBuffer());
113  }
114 
115  uint8_t GetMaxSpeed(const Way& way) const;
116  uint8_t GetGrade(const Way& way) const;
117 
118  uint8_t CopyFlags(const Area::Ring& ring) const;
119  uint8_t CopyFlagsForward(const Way& way) const;
120  uint8_t CopyFlagsBackward(const Way& way) const;
121 
122  uint16_t RegisterOrUseObjectVariantData(std::map<ObjectVariantData,uint16_t>& routeDataMap,
123  const TypeInfoRef& type,
124  uint8_t maxSpeed,
125  uint8_t grade);
126 
127  bool IsAnyRoutable(Progress& progress,
128  const RawRouteNode& node,
129  const std::unordered_map<FileOffset,WayRef>& waysMap,
130  const std::unordered_map<FileOffset,AreaRef>& areasMap,
131  VehicleMask vehicles) const;
132 
136  bool ReadTurnRestrictionIds(const ImportParameter& parameter,
137  Progress& progress,
138  std::map<OSMId,FileOffset>& wayIdOffsetMap,
139  std::map<OSMId,Id>& nodeMap);
140 
144  bool ResolveWayIds(const ImportParameter& parameter,
145  Progress& progress,
146  std::map<OSMId,FileOffset>& wayIdOffsetMap);
147 
151  bool ResolveNodeIds(const ImportParameter& parameter,
152  Progress& progress,
153  std::map<OSMId,Id>& nodeIdMap);
154 
158  bool ReadTurnRestrictionData(const ImportParameter& parameter,
159  Progress& progress,
160  const std::map<OSMId,Id>& nodeIdMap,
161  const std::map<OSMId,FileOffset>& wayIdOffsetMap,
162  ViaTurnRestrictionMap& restrictions);
163 
168  bool ReadTurnRestrictions(const ImportParameter& parameter,
169  Progress& progress,
170  ViaTurnRestrictionMap& restrictions);
171 
176  bool CanTurn(const std::vector<TurnRestrictionData>& restrictions,
177  FileOffset from,
178  FileOffset to) const;
179 
183  bool ReadIntersections(const ImportParameter& parameter,
184  Progress& progress,
185  const TypeConfig& typeConfig,
186  NodeUseMap& nodeUseMap);
187 
191  bool ReadObjectsAtIntersections(const ImportParameter& parameter,
192  Progress& progress,
193  const TypeConfig& typeConfig,
194  const NodeUseMap& nodeUseMap,
195  NodeIdObjectsMap& nodeObjectsMap);
196 
197  bool WriteIntersections(const ImportParameter& parameter,
198  Progress& progress,
199  NodeIdObjectsMap& nodeIdObjectsMap);
200 
204  FileOffsetWayMap LoadWays(Progress& progress,
205  const TypeConfig& typeConfig,
206  FileScanner& scanner,
207  RawRouteNodeList::const_iterator startNode,
208  RawRouteNodeList::const_iterator endNode);
209 
213  FileOffsetAreaMap LoadAreas(Progress& progress,
214  const TypeConfig& typeConfig,
215  FileScanner& scanner,
216  RawRouteNodeList::const_iterator startNode,
217  RawRouteNodeList::const_iterator endNode);
218 
219  bool GetRouteNodePoint(Progress& progress,
220  const RawRouteNode& node,
221  FileOffsetWayMap& waysMap,
222  FileOffsetAreaMap& areasMap,
223  Point& point) const;
224 
225  /*
226  uint8_t CalculateEncodedBearing(const Way& way,
227  size_t currentNode,
228  size_t nextNode,
229  bool clockwise) const;*/
230 
234  void CalculateAreaPaths(RouteNode& routeNode,
235  const Area& area,
236  uint16_t objectVariantIndex,
237  const RouteNodeIdSet& routeNodeIdSet);
238 
242  void CalculateCircularWayPaths(RouteNode& routeNode,
243  const Way& way,
244  uint16_t objectVariantIndex,
245  const RouteNodeIdSet& routeNodeIdSet);
246 
250  void CalculateWayPaths(RouteNode& routeNode,
251  const Way& way,
252  uint16_t objectVariantIndex,
253  const RouteNodeIdSet& routeNodeIdSet);
254 
258  void FillRoutePathExcludes(RouteNode& routeNode,
259  const RawRouteNode& node,
260  const ViaTurnRestrictionMap& restrictions);
261 
262  bool WriteObjectVariantData(Progress& progress,
263  const std::string& variantFilename,
264  const std::map<ObjectVariantData,uint16_t>& routeDataMap);
265 
266  bool WriteRouteGraph(const ImportParameter& parameter,
267  Progress& progress,
268  const TypeConfig& typeConfig,
269  const RawRouteNodeList& rawRouteNodes,
270  const RouteNodeIdSet& routeNodeIdSet,
271  const ViaTurnRestrictionMap& restrictions,
272  VehicleMask vehicles,
273  const std::string& dataFilename,
274  const std::string& variantFilename);
275 
276  public:
277  RouteDataGenerator() = default;
278 
279  void GetDescription(const ImportParameter& parameter,
280  ImportModuleDescription& description) const override;
281 
282  bool Import(const TypeConfigRef& typeConfig,
283  const ImportParameter& parameter,
284  Progress& progress) override;
285  };
286 }
287 
288 #endif
uint64_t Id
Definition: OSMScoutTypes.h:41
FeatureValueReader< MaxSpeedFeature, MaxSpeedFeatureValue > MaxSpeedFeatureValueReader
Definition: FeatureReader.h:269
Definition: Area.h:38
#define CLASS_FINAL
Definition: Compiler.h:26
FeatureValueReader< AccessRestrictedFeature, AccessRestrictedFeatureValue > AccessRestrictedFeatureValueReader
Definition: FeatureReader.h:266
FeatureValueReader< AccessFeature, AccessFeatureValue > AccessFeatureValueReader
Definition: FeatureReader.h:265
std::shared_ptr< TypeInfo > TypeInfoRef
Definition: TypeConfig.h:58
uint64_t FileOffset
Definition: OSMScoutTypes.h:47
uint8_t VehicleMask
Definition: OSMScoutTypes.h:62
std::shared_ptr< TypeConfig > TypeConfigRef
Definition: TypeConfig.h:1227
FeatureValueReader< GradeFeature, GradeFeatureValue > GradeFeatureValueReader
Definition: FeatureReader.h:270