SVN checkout 11/12/2010
[monav:monav.git] / interfaces / iimporter.h
1 /*
2 Copyright 2010  Christian Vetter veaac.fdirct@gmail.com
3
4 This file is part of MoNav.
5
6 MoNav is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 MoNav is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with MoNav.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #ifndef IIMPORTER_H
21 #define IIMPORTER_H
22
23 #include <vector>
24 #include <QString>
25 #include <QtPlugin>
26 #include "utils/config.h"
27 #include "utils/coordinates.h"
28
29 class QWidget;
30 class QSettings;
31
32 class IImporter
33 {
34 public:
35
36         struct BoundingBox {
37                 UnsignedCoordinate min;
38                 UnsignedCoordinate max;
39         };
40
41         struct RoutingEdge {
42                 NodeID source;
43                 NodeID target;
44                 unsigned short edgeIDAtSource; // uniquely identifies this edge among all outgoing edges adjacent to the source, at most degree( source ) - 1
45                 unsigned short edgeIDAtTarget; // uniquely identifies this edge among all incoming edges adjacent to the target, at most degree( target ) - 1
46                 double distance; // travel time metric -> seconds
47                 bool bidirectional : 1; // can the edge be traversed in both directions? edgeIDAtSource / edgeIDAtTarget are also unique for incoming / outgoing edges in this case.
48                 bool branchingPossible : 1; // is there more than one subsequent edge to traverse ( turing around and traversing this edge in the opposite direction does not count )
49                 unsigned nameID; // id of the way's name
50                 unsigned pathID; // id of the way's path's description
51                 unsigned short type; // id of the way's type's name
52                 unsigned short pathLength; // length of the way's path's description
53         };
54
55         struct RoutingNode {
56                 UnsignedCoordinate coordinate;
57         };
58
59         struct Place {
60                 QString name;
61                 int population;
62                 UnsignedCoordinate coordinate;
63                 enum Type
64                 {
65                         City = 0, Town = 1, Hamlet = 2, Suburb = 3, Village = 4, None = 5
66                 } type;
67                 bool operator<( const Place& right ) const {
68                         if ( name != right.name )
69                                 return name < right.name;
70                         if ( type != right.type )
71                                 return type < right.type;
72                         return population < right.population;
73                 }
74         };
75
76         struct Address {
77                 unsigned name;
78                 unsigned pathID; // start of the address' description
79                 unsigned pathLength; // length of the address' description
80                 unsigned nearPlace; // id of the nearest place
81                 bool operator<( const Address& right ) const {
82                         if ( nearPlace != right.nearPlace )
83                                 return nearPlace < right.nearPlace;
84                         return name < right.name;
85                 }
86         };
87
88         virtual QString GetName() = 0;
89         virtual void SetOutputDirectory( const QString& dir ) = 0;
90         virtual QWidget* GetSettings() = 0;
91         virtual bool LoadSettings( QSettings* settings ) = 0;
92         virtual bool SaveSettings( QSettings* settings ) = 0;
93         virtual bool Preprocess( QString filename ) = 0;
94         // IRouter is allowed to remap node ids and must set the resulting id map
95         virtual bool SetIDMap( const std::vector< NodeID >& idMap ) = 0;
96         // IGPSLookup has to use the router's id map
97         virtual bool GetIDMap( std::vector< NodeID >* idMap ) = 0;
98         // IRouter is allowed to remap edge ids and must set the resulting id map
99         virtual bool SetEdgeIDMap( const std::vector< NodeID >& idMap ) = 0;
100         // IGPSLookup has to use the router's edge id map
101         virtual bool GetEdgeIDMap( std::vector< NodeID >* idMap ) = 0;
102         // get all routing edges
103         virtual bool GetRoutingEdges( std::vector< RoutingEdge >* data ) = 0;
104         // get all routing edges' path descriptions
105         virtual bool GetRoutingEdgePaths( std::vector< RoutingNode >* data ) = 0;
106         // get all routing nodes
107         virtual bool GetRoutingNodes( std::vector< RoutingNode >* data ) = 0;
108         // get all way names
109         virtual bool GetRoutingWayNames( std::vector< QString >* data ) = 0;
110         // get all way names
111         virtual bool GetRoutingWayTypes( std::vector< QString >* data ) = 0;
112         // get all turning penalties. Each node has a table inDegree[node] * outDegree[node] of penalties.
113         // the tables are serialized in the penalties vector
114         // access a penalty for turning from edgeID "a" into edgeID "b" with penalties[a * outDegree[node] + b + beginTable]
115         virtual bool GetRoutingPenalties( std::vector< char >* inDegree, std::vector< char >* outDegree, std::vector< double >* penalties ) = 0;
116         // get address data
117         virtual bool GetAddressData( std::vector< Place >* dataPlaces, std::vector< Address >* dataAddresses, std::vector< UnsignedCoordinate >* dataWayBuffer, std::vector< QString >* addressNames ) = 0;
118         // get the bounding bos of all routing coordinates ( routing nodes + way descriptions )
119         virtual bool GetBoundingBox( BoundingBox* box ) = 0;
120         // delete preprocessed IImporter files
121         virtual void DeleteTemporaryFiles() = 0;
122         virtual ~IImporter() {}
123 };
124
125 Q_DECLARE_INTERFACE( IImporter, "monav.IImporter/1.0" )
126
127 #endif // IIMPORTER_H