/* open source routing machine Copyright (C) Dennis Luxen, others 2010 This program is free software; you can redistribute it and/or modify it under the terms of the GNU AFFERO General Public License as published by the Free Software Foundation; either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA or see http://www.gnu.org/licenses/agpl.txt. */ #ifndef EXTRACTORCALLBACKS_H_ #define EXTRACTORCALLBACKS_H_ #include #include #include "ExtractorStructs.h" typedef stxxl::vector STXXLNodeIDVector; typedef stxxl::vector<_Node> STXXLNodeVector; typedef stxxl::vector<_Edge> STXXLEdgeVector; typedef stxxl::vector<_Address> STXXLAddressVector; typedef stxxl::vector STXXLStringVector; typedef stxxl::vector<_RawRestrictionContainer> STXXLRestrictionsVector; typedef stxxl::vector<_WayIDStartAndEndEdge> STXXLWayIDStartEndVector; struct STXXLContainers { STXXLNodeIDVector usedNodeIDs; STXXLNodeVector allNodes; STXXLEdgeVector allEdges; STXXLAddressVector adressVector; STXXLStringVector nameVector; STXXLRestrictionsVector restrictionsVector; STXXLWayIDStartEndVector wayStartEndVector; }; class ExtractorCallbacks{ private: Settings settings; StringMap * stringMap; STXXLContainers * externalMemory; public: ExtractorCallbacks(STXXLContainers * ext, Settings set, StringMap * strMap){ externalMemory = ext; settings = set; stringMap = strMap; } ~ExtractorCallbacks() { } /** warning: caller needs to take care of synchronization! */ inline bool adressFunction(_Node n, HashTable &keyVals) { /* std::string housenumber(keyVals.Find("addr:housenumber")); std::string housename(keyVals.Find("addr:housename")); std::string street(keyVals.Find("addr:street")); std::string state(keyVals.Find("addr:state")); std::string country(keyVals.Find("addr:country")); std::string postcode(keyVals.Find("addr:postcode")); std::string city(keyVals.Find("addr:city")); if(housenumber != "" || housename != "" || street != "") { if(housenumber == "") housenumber = housename; addressVector->push_back(_Address(n, housenumber, street, state, country, postcode, city)); } */ return true; } /** warning: caller needs to take care of synchronization! */ inline bool nodeFunction(_Node &n) { externalMemory->allNodes.push_back(n); return true; } inline bool restrictionFunction(_RawRestrictionContainer &r) { externalMemory->restrictionsVector.push_back(r); return true; } /** warning: caller needs to take care of synchronization! */ inline bool wayFunction(_Way &w) { std::string accessClass( w.keyVals.Find(settings.accessTag) ); std::string access( w.keyVals.Find("access") ); std::string highway( w.keyVals.Find("highway") ); //class tag like bicycle=yes/no overrides everything else if("yes" == accessClass || "permissive" == accessClass || "designated" == accessClass || "official" == accessClass) w.access = true; else if("no" == accessClass) w.access = false; else { std::string route( w.keyVals.Find("route") ); std::string man_made( w.keyVals.Find("man_made") ); //speedprofile allows routing on this type of way/route/man_made? if(settings[highway] > 0 || settings[route] > 0 || settings[man_made] > 0) { if(0 < access.size()) { //fastest way to check for non-empty string if( access == "yes" || access == "permissive" || access == "designated" || access == "public" ) w.access = true; else w.access = false; } } else w.access = false; } if ( w.access == true && (1 < w.path.size()) ) { std::string name( w.keyVals.Find("name") ); std::string ref( w.keyVals.Find("ref")); std::string oneway( w.keyVals.Find("oneway")); std::string onewayClass( w.keyVals.Find("oneway:"+accessClass)); std::string junction( w.keyVals.Find("junction") ); double maxspeed( atoi(w.keyVals.Find("maxspeed").c_str()) ); std::string barrier( w.keyVals.Find("barrier") ); //name if ( 0 < ref.length() ) w.name = ref; else if ( 0 < name.length() ) w.name = name; //roundabout if(junction == "roundabout") w.roundabout = true; //speed if(0 < maxspeed && (maxspeed < settings[highway]) ) w.speed = maxspeed; else w.speed = settings[highway]; //TODO: type is not set, perhaps use a bimap'ed speed profile to do set the type correctly? w.type = 1; //oneway if( settings.obeyOneways ) { //TODO: handle cycleway=opposite_* if( oneway == "no" || oneway == "0" || oneway == "false" || onewayClass == "no" || onewayClass == "0" || onewayClass == "false") w.direction = _Way::bidirectional; else if( oneway == "yes" || oneway == "1" || oneway == "true" || onewayClass == "yes" || onewayClass == "1" || onewayClass == "true" || junction == "roundabout" || highway == "motorway_link" || highway == "motorway" ) w.direction = _Way::oneway; else if( oneway == "-1") { w.direction = _Way::opposite; std::reverse( w.path.begin(), w.path.end() ); } else w.direction = _Way::bidirectional; } //Get the unique identifier for the street name const StringMap::const_iterator strit = stringMap->find(w.name); if(strit == stringMap->end()) { w.nameID = externalMemory->nameVector.size(); externalMemory->nameVector.push_back(w.name); stringMap->insert(StringMap::value_type(w.name, w.nameID)); } else { w.nameID = strit->second; } if(-1 == w.speed) { WARN("found way with bogus speed, id: " << w.id); return true; } if(w.id == UINT_MAX) { WARN("found way with unknown type: " << w.id); return true; } for(vector< NodeID >::size_type n = 0; n < w.path.size()-1; ++n) { externalMemory->allEdges.push_back(_Edge(w.path[n], w.path[n+1], w.type, w.direction, w.speed, w.nameID, w.roundabout)); externalMemory->usedNodeIDs.push_back(w.path[n]); } externalMemory->usedNodeIDs.push_back(w.path[w.path.size()-1]); //The following information is needed to identify start and end segments of restrictions externalMemory->wayStartEndVector.push_back(_WayIDStartAndEndEdge(w.id, w.path[0], w.path[1], w.path[w.path.size()-2], w.path[w.path.size()-1])); } return true; } }; #endif /* EXTRACTORCALLBACKS_H_ */