name of way is now extracted and id of name is prepared.

This commit is contained in:
Dennis Luxen 2010-09-26 18:30:58 +00:00
parent 76488c58e8
commit affaa106d1
3 changed files with 72 additions and 22 deletions

View File

@ -43,6 +43,8 @@ or see http://www.gnu.org/licenses/agpl.txt.
ferry 5
*/
typedef google::dense_hash_map<string, NodeID> StringMap;
std::string names[14] = { "motorway", "motorway_link", "trunk", "trunk_link", "primary", "primary_link", "secondary", "secondary_link", "tertiary", "unclassified", "residential", "living_street", "service", "ferry" };
double speeds[14] = { 110, 90, 90, 70, 70, 60, 60, 50, 55, 25, 40 , 10, 30, 5};
@ -78,6 +80,7 @@ struct _Way {
enum {
notSure = 0, oneway, bidirectional, opposite
} direction;
unsigned nameID;
double maximumSpeed;
bool usefull:1;
bool access:1;
@ -99,6 +102,7 @@ struct _Edge {
short type;
short direction;
double speed;
unsigned nameID;
_Coordinate startCoord;
_Coordinate targetCoord;
@ -191,7 +195,7 @@ struct CmpNodeByID : public std::binary_function<_Node, _Node, bool>
};
_Way _ReadXMLWay( xmlTextReaderPtr& inputReader, Settings& settings ) {
_Way _ReadXMLWay( xmlTextReaderPtr& inputReader, Settings& settings, string& name) {
_Way way;
way.direction = _Way::notSure;
way.maximumSpeed = -1;
@ -226,7 +230,13 @@ _Way _ReadXMLWay( xmlTextReaderPtr& inputReader, Settings& settings ) {
if ( k != NULL && value != NULL ) {
if ( xmlStrEqual( k, ( const xmlChar* ) "name" ) == 1 ) {
//write into namedb and note nameid at edge.
name = string((char *) value);
} else if ( xmlStrEqual( k, ( const xmlChar* ) "ref" ) == 1 ) {
if(name == "")
{
name = string((char *) value);
// cout << ", ref: " << name << endl;
}
}
if ( xmlStrEqual( k, ( const xmlChar* ) "oneway" ) == 1 ) {
@ -458,4 +468,19 @@ double ApproximateDistance( const int lat1, const int lon1, const int lat2, cons
return EARTH_RADIUS_IN_METERS * distanceArc;
}
string GetRandomString() {
char s[128];
static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < 128; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}
s[128] = 0;
return string(s);
}
#endif /* EXTRACTORSTRUCTS_H_ */

View File

@ -44,6 +44,7 @@ typedef google::dense_hash_map<NodeID, _Node> NodeMap;
typedef stxxl::vector<NodeID> STXXLNodeIDVector;
typedef stxxl::vector<_Node> STXXLNodeVector;
typedef stxxl::vector<_Edge> STXXLEdgeVector;
typedef stxxl::vector<string> STXXLStringVector;
Settings settings;
vector<NodeID> SignalNodes;
@ -52,8 +53,10 @@ STXXLNodeVector allNodes;
STXXLNodeVector confirmedNodes;
STXXLEdgeVector allEdges;
STXXLEdgeVector confirmedEdges;
STXXLStringVector nameVector;
NodeMap * nodeMap = new NodeMap();
StringMap * stringMap = new StringMap();
int main (int argc, char *argv[])
{
@ -71,6 +74,7 @@ int main (int argc, char *argv[])
settings.speedProfile.speed.insert(settings.speedProfile.speed.begin(), speeds, speeds+14);
nodeMap->set_empty_key(UINT_MAX);
stringMap->set_empty_key(GetRandomString());
try {
while ( xmlTextReaderRead( inputReader ) == 1 ) {
const int type = xmlTextReaderNodeType( inputReader );
@ -91,35 +95,49 @@ int main (int argc, char *argv[])
}
if ( xmlStrEqual( currentName, ( const xmlChar* ) "way" ) == 1 ) {
_Way way = _ReadXMLWay( inputReader, settings );
string name;
_Way way = _ReadXMLWay( inputReader, settings, name );
if ( way.usefull && way.access && way.path.size() ) {
StringMap::iterator strit = stringMap->find(name);
if(name == "") {
way.nameID = UINT_MAX;
} else {
if(strit == stringMap->end())
{
way.nameID = nameVector.size();
nameVector.push_back(name);
stringMap->insert(std::make_pair(name, way.nameID) );
// cout << "found name ID: " << way.nameID << " (" << name << ")" << endl;
} else {
way.nameID = strit->second;
// cout << "name with ID " << way.nameID << " already existing (" << name << ")" << endl;
}
}
for ( unsigned i = 0; i < way.path.size(); ++i ) {
usedNodes.push_back(way.path[i]);
}
if ( way.direction == _Way::opposite )
if ( way.direction == _Way::opposite ){
std::reverse( way.path.begin(), way.path.end() );
}
vector< NodeID > & path = way.path;
assert(way.type > -1 || way.maximumSpeed != -1);
assert(path.size()>0);
if(way.maximumSpeed == -1)
way.maximumSpeed = settings.speedProfile.speed[way.type];
for(vector< NodeID >::size_type n = 0; n < path.size()-1; n++)
{
vector< NodeID > & path = way.path;
// double speed = way.maximumSpeed;
assert(way.type > -1 || way.maximumSpeed != -1);
assert(path.size()>0);
if(way.maximumSpeed == -1)
way.maximumSpeed = settings.speedProfile.speed[way.type];
for(vector< NodeID >::size_type n = 0; n < path.size()-1; n++)
{
_Edge e;
e.start = way.path[n];
e.target = way.path[n+1];
e.type = way.type;
e.direction = way.direction;
e.speed = way.maximumSpeed;
allEdges.push_back(e);
}
_Edge e;
e.start = way.path[n];
e.target = way.path[n+1];
e.type = way.type;
e.direction = way.direction;
e.speed = way.maximumSpeed;
e.nameID = way.nameID;
allEdges.push_back(e);
}
}
}
@ -128,6 +146,7 @@ int main (int argc, char *argv[])
}
xmlFree( currentName );
}
cout << "raw no. of names: " << nameVector.size() << endl;
cout << "raw no. of nodes: " << allNodes.size() << endl;
cout << "raw no. of edges: " << allEdges.size() << endl;
@ -251,6 +270,7 @@ int main (int argc, char *argv[])
int intDist = max(1, (int)distance);
int ferryIndex = settings.indexInAccessListOf("ferry");
//Todo: write nameID and type of edge to osrm
switch(eit->direction)
{
case _Way::notSure:
@ -270,6 +290,8 @@ int main (int argc, char *argv[])
break;
}
}
//Todo: serialize list of names
fout.close();
cout << "ok, after " << get_timestamp() - time << "s" << endl;
} catch ( const std::exception& e ) {
@ -288,8 +310,10 @@ int main (int argc, char *argv[])
confirmedNodes.clear();
allEdges.clear();
confirmedEdges.clear();
nameVector.clear();
xmlFreeTextReader(inputReader);
delete nodeMap;
delete stringMap;
cout << "finished." << endl;
return 0;
}

View File

@ -41,6 +41,7 @@ using namespace std;
typedef unsigned int NodeID;
typedef unsigned int EdgeID;
typedef unsigned int EdgeWeight;
static const NodeID SPECIAL_NODEID = UINT_MAX;
static const EdgeID SPECIAL_EDGEID = UINT_MAX;