source: subversion/applications/editors/osm-editor/qt3/RouteMetaDataHandler.cpp @ 16590

Last change on this file since 16590 was 1158, checked in by nick, 13 years ago

moved current version to qt3 directory in preparation for qt4

File size: 4.9 KB
Line 
1#include "RouteMetaDataHandler.h"
2#include <qstringlist.h>
3
4#include <iostream>
5using std::cout;
6using std::cerr;
7using std::endl;
8
9namespace OpenStreetMap
10{
11
12// Tests an incoming set of matadata against the required criteria
13bool RouteMetaData::testmatch(const RouteMetaData& indata)
14{ 
15        return testmatch(foot,indata.foot) && testmatch(horse,indata.horse)
16                                && testmatch(bike,indata.bike) && testmatch(car,indata.car)
17                                && testmatch(routeClass,indata.routeClass);
18}
19
20// Tests an incoming aspect of the metadata (foot, horse etc) against the
21// required criteria.
22// Note that allowed values are separated with a |
23// Note that a * means match anything
24bool RouteMetaData::testmatch(const QString& requiredCriteria, 
25                                                                const QString& indata)
26{
27        if(requiredCriteria!="*")
28        {
29                QStringList allowed = QStringList::split("|",requiredCriteria);
30                for(int count=0; count<allowed.size(); count++)
31                {
32                        if(indata==allowed[count]) 
33                        {
34                                return true;
35                        }
36                }
37                return false;
38        }
39        return true;
40}
41
42// Returns the 'preferred' meta data i.e. the first of the list of allowed
43// values e.g. footway rather than path.
44RouteMetaData RouteMetaData::preferred()
45{
46        return RouteMetaData(preferred(foot),preferred(bike),
47                                                        preferred(horse),preferred(car),
48                                                        preferred(routeClass) );
49}
50
51// Parse an OSM key/value pair
52// 130506 reads new style keys such as 'bicycle' and 'highway'
53void RouteMetaData::parseKV(const QString &key, const QString& value)
54{
55        //cerr << "Trying key " << key << " value " << value << endl;
56        if(key == "foot")
57                foot = value;
58        else if(key == "horse")
59                horse = value;
60        // prevent conflicting 'bicycle' and 'bike' keys
61        else if(key == "bike" || key == "bicycle")
62        {
63                if(key=="bicycle")
64                {
65                        doneBicycle=true;
66                        bike = value;
67                }
68                else if(!doneBicycle)
69                {
70                        bike=value;
71                }
72        }
73        // same with 'motorcar' and 'car'
74        else if(key == "car" || key == "motorcar")
75        {
76                if(key=="motorcar")
77                {
78                        doneMotorcar=true;
79                        car = value;
80                }
81                else if (!doneMotorcar)
82                {
83                        car = value;
84                }
85        }
86        // same with 'class' and 'highway'
87        else if(key == "class" || key == "highway")
88        {
89                if(key=="highway")
90                {
91                        doneHighway=true;
92                        routeClass = value;
93                }
94                else if (!doneHighway)
95                {
96                        routeClass=value;
97                }
98        }
99
100        else if (key=="railway")
101                railway = value;
102}
103
104// Returns the preferred value for a particular property (foot etc)
105// This will be the first in the list.
106QString RouteMetaData::preferred(const QString& property)
107{
108        QStringList allowed=QStringList::split("|",property);
109        return allowed[0];
110}
111
112RouteMetaDataHandler::RouteMetaDataHandler()
113{
114        rData["footpath"] = RouteMetaData ("yes","no", "no", "no",   
115                                                        "footway|path");
116        rData["path"] = RouteMetaData ("unknown","unknown", "unknown", 
117                                                "no",   "footway|path");
118        rData["permissive footpath"]=RouteMetaData ("permissive|unofficial", 
119                                                                                                "no", "no", "no",
120                                                                                                  "footway|path");
121        rData["bridleway"] = RouteMetaData ("yes", "yes", "yes", "no", 
122                                                "bridleway|path"); 
123        rData["permissive bridleway"] = RouteMetaData ("permissive|unofficial", 
124                                                                                                        "no",
125                                                                                                        "permissive|unofficial", 
126                                                                                                 "no",  "bridleway|path");
127        rData["cycle path"] = RouteMetaData ("permissive|unofficial", 
128                                                                                        "permissive|unofficial", "no",
129                                                                                "no", "cycleway|path");
130        rData["byway"] = RouteMetaData ("yes", "yes", "yes", "yes",  "unsurfaced");
131        rData["minor road"] = RouteMetaData ("yes", "yes", "yes", "yes", 
132                                                                "unclassified|minor");
133        rData["residential road"] = RouteMetaData ("yes", "yes", "yes", "yes", 
134                                                                                                "residential");
135        rData["B road"] = RouteMetaData ("yes", "yes", "yes", "yes",  "secondary");
136        rData["A road"] = RouteMetaData ("yes", "yes", "yes", "yes",  "primary");
137        rData["motorway"] = RouteMetaData ("no", "no", "no", "yes",  "motorway");
138        rData["railway"] = RouteMetaData ("no", "no", "no", "no",  "", "rail");
139        rData["new forest track"] = RouteMetaData ("permissive|unofficial", 
140                                                                                                "no", "permissive|unofficial", 
141                                                                                                "no", 
142                                                                                                "unsurfaced"); 
143        rData["new forest cycle path"] = RouteMetaData ("permissive|unofficial", 
144                                                                                                "permissive|unofficial", 
145                                                                                                "permissive|unofficial", "no", 
146                                                                                                "unsurfaced"); 
147}
148
149// Returns the metadata matching a type
150// Note that the PREFERRED values will be returned (e.g. footway rather than
151// path); this will be useful if we wish to write out the data.
152RouteMetaData RouteMetaDataHandler::getMetaData(const QString& type) 
153{
154        std::map<QString,RouteMetaData>::iterator i = rData.find(type);
155        if (i==rData.end())
156                return RouteMetaData("no","no","no","no","");
157        return i->second.preferred();
158}
159
160
161QString RouteMetaDataHandler::getRouteType(const RouteMetaData &rd) 
162{
163                /*
164        cerr << "Trying RouteMetaData: foot=" << rd.foot <<
165                        " horse=" << rd.horse << " bike=" << rd.bike << " car=" << rd.car
166                        << " routelcass=" << rd.routeClass <<endl;
167                        */
168        for(std::map<QString,RouteMetaData>::iterator i=rData.begin();
169                i!=rData.end(); i++)
170        {
171                if (i->second.testmatch(rd))
172                        return i->first;
173        }
174        return "track";
175}
176
177}
Note: See TracBrowser for help on using the repository browser.