moved files
This commit is contained in:
		
							parent
							
								
									44235d427d
								
							
						
					
					
						commit
						7295811965
					
				| @ -1,112 +0,0 @@ | |||||||
| /*
 |  | ||||||
|  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.
 |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <boost/foreach.hpp> |  | ||||||
| 
 |  | ||||||
| #include "../typedefs.h" |  | ||||||
| #include "DescriptionFactory.h" |  | ||||||
| 
 |  | ||||||
| DescriptionFactory::DescriptionFactory() { } |  | ||||||
| 
 |  | ||||||
| DescriptionFactory::~DescriptionFactory() { } |  | ||||||
| 
 |  | ||||||
| double DescriptionFactory::GetAngleBetweenCoordinates() const { |  | ||||||
|     return 0.;//GetAngleBetweenTwoEdges(previousCoordinate, currentCoordinate, nextCoordinate);
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DescriptionFactory::SetStartSegment(const PhantomNode & _startPhantom) { |  | ||||||
|     startPhantom = _startPhantom; |  | ||||||
|     AppendSegment(_startPhantom.location, _PathData(0, _startPhantom.nodeBasedEdgeNameID, 10, _startPhantom.weight1)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DescriptionFactory::SetEndSegment(const PhantomNode & _targetPhantom) { |  | ||||||
|     targetPhantom = _targetPhantom; |  | ||||||
|     AppendSegment(_targetPhantom.location, _PathData(0, _targetPhantom.nodeBasedEdgeNameID, 0, _targetPhantom.weight1)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DescriptionFactory::AppendSegment(const _Coordinate & coordinate, const _PathData & data ) { |  | ||||||
|     //Segment information has following format:
 |  | ||||||
|     //["instruction","streetname",length,position,time,"length","earth_direction",azimuth]
 |  | ||||||
|     //Example: ["Turn left","High Street",200,4,10,"200m","NE",22.5]
 |  | ||||||
|     //See also: http://developers.cloudmade.com/wiki/navengine/JSON_format
 |  | ||||||
| //    (_Coordinate & loc, NodeID nam, unsigned len, unsigned dur, short tInstr)
 |  | ||||||
| 
 |  | ||||||
|     //Is a new instruction necessary?
 |  | ||||||
|     //yes: data.turnInstruction != 0;
 |  | ||||||
|     //no: data.turnInstruction == 0;
 |  | ||||||
|     pathDescription.push_back(SegmentInformation(coordinate, data.nameID, 0, data.durationOfSegment, data.turnInstruction) ); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DescriptionFactory::AppendRouteInstructionString(std::string & output) { |  | ||||||
|     output += "[\"Turn left\",\"High Street\",200,0,10,\"200m\",\"NE\",22.5]"; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DescriptionFactory::AppendEncodedPolylineString(std::string & output, bool isEncoded) { |  | ||||||
|     if(isEncoded) |  | ||||||
|         pc.printEncodedString(pathDescription, output); |  | ||||||
|     else |  | ||||||
|         pc.printUnencodedString(pathDescription, output); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DescriptionFactory::AppendEncodedPolylineString(std::string &output) { |  | ||||||
|     pc.printEncodedString(pathDescription, output); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DescriptionFactory::AppendUnencodedPolylineString(std::string &output) { |  | ||||||
|     pc.printUnencodedString(pathDescription, output); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| unsigned DescriptionFactory::Run() { |  | ||||||
|     unsigned entireLength = 0; |  | ||||||
|     /** starts at index 1 */ |  | ||||||
|     pathDescription[0].length = 0; |  | ||||||
|     for(unsigned i = 1; i < pathDescription.size(); ++i) { |  | ||||||
|         pathDescription[i].length = ApproximateDistance(pathDescription[i-1].location, pathDescription[i].location); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     unsigned lengthOfSegment = 0; |  | ||||||
|     unsigned durationOfSegment = 0; |  | ||||||
|     unsigned indexOfSegmentBegin = 0; |  | ||||||
| 
 |  | ||||||
|     for(unsigned i = 1; i < pathDescription.size(); ++i) { |  | ||||||
|         entireLength += pathDescription[i].length; |  | ||||||
|         lengthOfSegment += pathDescription[i].length; |  | ||||||
|         durationOfSegment += pathDescription[i].duration; |  | ||||||
|         pathDescription[indexOfSegmentBegin].length = lengthOfSegment; |  | ||||||
|         pathDescription[indexOfSegmentBegin].duration = durationOfSegment; |  | ||||||
|         if(pathDescription[i].turnInstruction != 0) { |  | ||||||
|             //INFO("Turn after " << lengthOfSegment << "m into way with name id " << segment.nameID);
 |  | ||||||
|             assert(pathDescription[i].necessary); |  | ||||||
|             lengthOfSegment = 0; |  | ||||||
|             durationOfSegment = 0; |  | ||||||
|             indexOfSegmentBegin = i; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     //Generalize poly line
 |  | ||||||
|     BOOST_FOREACH(SegmentInformation & segment, pathDescription) { |  | ||||||
|         //TODO: Replace me by real generalization
 |  | ||||||
|         segment.necessary = true; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     //fix what needs to be fixed else
 |  | ||||||
|     return entireLength; |  | ||||||
| } |  | ||||||
| @ -1,176 +0,0 @@ | |||||||
| /*
 |  | ||||||
|  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 DESCRIPTIONFACTORY_H_ |  | ||||||
| #define DESCRIPTIONFACTORY_H_ |  | ||||||
| 
 |  | ||||||
| #include <vector> |  | ||||||
| 
 |  | ||||||
| #include "../Algorithms/PolylineCompressor.h" |  | ||||||
| #include "ExtractorStructs.h" |  | ||||||
| #include "SegmentInformation.h" |  | ||||||
| 
 |  | ||||||
| /* This class is fed with all way segments in consecutive order
 |  | ||||||
|  *  and produces the description plus the encoded polyline */ |  | ||||||
| 
 |  | ||||||
| class DescriptionFactory { |  | ||||||
|     PolylineCompressor pc; |  | ||||||
|     PhantomNode startPhantom, targetPhantom; |  | ||||||
| public: |  | ||||||
|     //I know, declaring this public is considered bad. I'm lazy
 |  | ||||||
|     std::vector <SegmentInformation> pathDescription; |  | ||||||
|     DescriptionFactory(); |  | ||||||
|     virtual ~DescriptionFactory(); |  | ||||||
|     double GetAngleBetweenCoordinates() const; |  | ||||||
|     void AppendEncodedPolylineString(std::string &output); |  | ||||||
|     void AppendUnencodedPolylineString(std::string &output); |  | ||||||
|     void AppendSegment(const _Coordinate & coordinate, const _PathData & data); |  | ||||||
|     void AppendRouteInstructionString(std::string & output); |  | ||||||
|     void SetStartSegment(const PhantomNode & startPhantom); |  | ||||||
|     void SetEndSegment(const PhantomNode & startPhantom); |  | ||||||
|     void AppendEncodedPolylineString(std::string & output, bool isEncoded); |  | ||||||
|     unsigned Run(); |  | ||||||
| 
 |  | ||||||
| //    static inline void getDirectionOfInstruction(double angle, DirectionOfInstruction & dirInst) {
 |  | ||||||
| //        if(angle >= 23 && angle < 67) {
 |  | ||||||
| //            dirInst.direction = "southeast";
 |  | ||||||
| //            dirInst.shortDirection = "SE";
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if(angle >= 67 && angle < 113) {
 |  | ||||||
| //            dirInst.direction = "south";
 |  | ||||||
| //            dirInst.shortDirection = "S";
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if(angle >= 113 && angle < 158) {
 |  | ||||||
| //            dirInst.direction = "southwest";
 |  | ||||||
| //            dirInst.shortDirection = "SW";
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if(angle >= 158 && angle < 202) {
 |  | ||||||
| //            dirInst.direction = "west";
 |  | ||||||
| //            dirInst.shortDirection = "W";
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if(angle >= 202 && angle < 248) {
 |  | ||||||
| //            dirInst.direction = "northwest";
 |  | ||||||
| //            dirInst.shortDirection = "NW";
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if(angle >= 248 && angle < 292) {
 |  | ||||||
| //            dirInst.direction = "north";
 |  | ||||||
| //            dirInst.shortDirection = "N";
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if(angle >= 292 && angle < 336) {
 |  | ||||||
| //            dirInst.direction = "northeast";
 |  | ||||||
| //            dirInst.shortDirection = "NE";
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        dirInst.direction = "East";
 |  | ||||||
| //        dirInst.shortDirection = "E";
 |  | ||||||
| //        return;
 |  | ||||||
| //    }
 |  | ||||||
| //
 |  | ||||||
| //    static inline void getTurnDirectionOfInstruction(double angle, std::string & output) {
 |  | ||||||
| //        if(angle >= 23 && angle < 67) {
 |  | ||||||
| //            output = "Turn sharp right";
 |  | ||||||
| //    //        cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if (angle >= 67 && angle < 113) {
 |  | ||||||
| //            output = "Turn right";
 |  | ||||||
| //    //        cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if (angle >= 113 && angle < 158) {
 |  | ||||||
| //            output = "Bear right";
 |  | ||||||
| //    //        cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //
 |  | ||||||
| //        if (angle >= 158 && angle < 202) {
 |  | ||||||
| //            output = "Continue";
 |  | ||||||
| //    //        cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if (angle >= 202 && angle < 248) {
 |  | ||||||
| //            output = "Bear left";
 |  | ||||||
| //    //        cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if (angle >= 248 && angle < 292) {
 |  | ||||||
| //            output = "Turn left";
 |  | ||||||
| //    //        cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        if (angle >= 292 && angle < 336) {
 |  | ||||||
| //            output = "Turn sharp left";
 |  | ||||||
| //    //        cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //            return;
 |  | ||||||
| //        }
 |  | ||||||
| //        output = "U-Turn";
 |  | ||||||
| //    //    cout << "angle " << angle << "-> " << output << endl;
 |  | ||||||
| //    }
 |  | ||||||
| //private:
 |  | ||||||
| //    void appendInstructionNameToString(const std::string & nameOfStreet, const std::string & instructionOrDirection, std::string &output, bool firstAdvice = false) {
 |  | ||||||
| //        output += "[";
 |  | ||||||
| //        if(config.instructions) {
 |  | ||||||
| //            output += "\"";
 |  | ||||||
| //            if(firstAdvice) {
 |  | ||||||
| //                output += "Head ";
 |  | ||||||
| //            }
 |  | ||||||
| //            output += instructionOrDirection;
 |  | ||||||
| //            output += "\",\"";
 |  | ||||||
| //            output += nameOfStreet;
 |  | ||||||
| //            output += "\",";
 |  | ||||||
| //        }
 |  | ||||||
| //    }
 |  | ||||||
| //
 |  | ||||||
| //    void appendInstructionLengthToString(unsigned length, std::string &output) {
 |  | ||||||
| //        if(config.instructions){
 |  | ||||||
| //            std::string tmpDistance;
 |  | ||||||
| //            intToString(10*(round(length/10.)), tmpDistance);
 |  | ||||||
| //            output += tmpDistance;
 |  | ||||||
| //            output += ",";
 |  | ||||||
| //            intToString(descriptionFactory.startIndexOfGeometry, tmp);
 |  | ||||||
| //            output += tmp;
 |  | ||||||
| //            output += ",";
 |  | ||||||
| //            intToString(descriptionFactory.durationOfInstruction, tmp);
 |  | ||||||
| //            output += tmp;
 |  | ||||||
| //            output += ",";
 |  | ||||||
| //            output += "\"";
 |  | ||||||
| //            output += tmpDistance;
 |  | ||||||
| //            output += "\",";
 |  | ||||||
| //            double angle = descriptionFactory.GetAngleBetweenCoordinates();
 |  | ||||||
| //            DirectionOfInstruction direction;
 |  | ||||||
| //            getDirectionOfInstruction(angle, direction);
 |  | ||||||
| //            output += "\"";
 |  | ||||||
| //            output += direction.shortDirection;
 |  | ||||||
| //            output += "\",";
 |  | ||||||
| //            std::stringstream numberString;
 |  | ||||||
| //            numberString << fixed << setprecision(2) << angle;
 |  | ||||||
| //            output += numberString.str();
 |  | ||||||
| //        }
 |  | ||||||
| //        output += "]";
 |  | ||||||
| //    }
 |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #endif /* DESCRIPTIONFACTORY_H_ */ |  | ||||||
| @ -1,49 +0,0 @@ | |||||||
| /*
 |  | ||||||
|  * LevelInformation.h |  | ||||||
|  * |  | ||||||
|  *  Created on: 10.03.2011 |  | ||||||
|  *      Author: dennis |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef LEVELINFORMATION_H_ |  | ||||||
| #define LEVELINFORMATION_H_ |  | ||||||
| 
 |  | ||||||
| #include <vector> |  | ||||||
| 
 |  | ||||||
| class LevelInformation { |  | ||||||
| public: |  | ||||||
| 	LevelInformation() { |  | ||||||
| 		levelInfos = new std::vector<std::vector<unsigned> >(); |  | ||||||
| 	} |  | ||||||
| 	~LevelInformation() { |  | ||||||
| 		delete levelInfos; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	void Add(const unsigned level, const unsigned entry) { |  | ||||||
| 		if(levelInfos->size() <= level) |  | ||||||
| 			levelInfos->resize(level+1); |  | ||||||
| 		assert(levelInfos->size() >= level); |  | ||||||
| 		(*levelInfos)[level].push_back(entry); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	unsigned GetNumberOfLevels() const { |  | ||||||
| 		return levelInfos->size(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	std::vector<unsigned> & GetLevel(unsigned level) { |  | ||||||
| 		if(levelInfos->size() <= level) |  | ||||||
| 			levelInfos->resize(level+1); |  | ||||||
| 		assert(levelInfos->size() >= level); |  | ||||||
| 		return (*levelInfos)[level]; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	void Reset() { |  | ||||||
| 		delete levelInfos; |  | ||||||
| 		levelInfos = new std::vector<std::vector<unsigned> >(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	std::vector<std::vector<unsigned> > * levelInfos; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #endif /* LEVELINFORMATION_H_ */ |  | ||||||
| @ -1,94 +0,0 @@ | |||||||
| /*
 |  | ||||||
|     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 POLYLINECOMPRESSOR_H_ |  | ||||||
| #define POLYLINECOMPRESSOR_H_ |  | ||||||
| 
 |  | ||||||
| #include <string> |  | ||||||
| 
 |  | ||||||
| #include "ExtractorStructs.h" |  | ||||||
| 
 |  | ||||||
| #include "../Util/StringUtil.h" |  | ||||||
| 
 |  | ||||||
| class PolylineCompressor { |  | ||||||
| private: |  | ||||||
| 	inline void encodeVectorSignedNumber(vector<int> & numbers, string & output) { |  | ||||||
| 		for(unsigned i = 0; i < numbers.size(); ++i) { |  | ||||||
| 			numbers[i] <<= 1; |  | ||||||
| 			if (numbers[i] < 0) { |  | ||||||
| 				numbers[i] = ~(numbers[i]); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		for(unsigned i = 0; i < numbers.size(); ++i) { |  | ||||||
| 			encodeNumber(numbers[i], output); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	inline void encodeNumber(int numberToEncode, string & output) { |  | ||||||
| 		while (numberToEncode >= 0x20) { |  | ||||||
| 			int nextValue = (0x20 | (numberToEncode & 0x1f)) + 63; |  | ||||||
| 			output += (static_cast<char> (nextValue)); |  | ||||||
| 			if(92 == nextValue) |  | ||||||
| 				output += (static_cast<char> (nextValue)); |  | ||||||
| 			numberToEncode >>= 5; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		numberToEncode += 63; |  | ||||||
| 		output += (static_cast<char> (numberToEncode)); |  | ||||||
| 		if(92 == numberToEncode) |  | ||||||
| 			output += (static_cast<char> (numberToEncode)); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	inline void printEncodedString(const vector<_Coordinate>& polyline, string &output) { |  | ||||||
| 		vector<int> deltaNumbers(2*polyline.size()); |  | ||||||
| 		output += "\""; |  | ||||||
| 		if(!polyline.empty()) { |  | ||||||
| 			deltaNumbers[0] = polyline[0].lat; |  | ||||||
| 			deltaNumbers[1] = polyline[0].lon; |  | ||||||
| 			for(unsigned i = 1; i < polyline.size(); ++i) { |  | ||||||
| 				deltaNumbers[(2*i)]   = (polyline[i].lat - polyline[i-1].lat); |  | ||||||
| 				deltaNumbers[(2*i)+1] = (polyline[i].lon - polyline[i-1].lon); |  | ||||||
| 			} |  | ||||||
| 			encodeVectorSignedNumber(deltaNumbers, output); |  | ||||||
| 		} |  | ||||||
| 		output += "\""; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
|     inline void printUnencodedString(vector<_Coordinate> & polyline, string & output) { |  | ||||||
|         output += "["; |  | ||||||
|         string tmp; |  | ||||||
|         for(unsigned i = 0; i < polyline.size(); i++) { |  | ||||||
|             convertInternalLatLonToString(polyline[i].lat, tmp); |  | ||||||
|             output += "["; |  | ||||||
|             output += tmp; |  | ||||||
|             convertInternalLatLonToString(polyline[i].lon, tmp); |  | ||||||
|             output += ", "; |  | ||||||
|             output += tmp; |  | ||||||
|             output += "]"; |  | ||||||
|             if( i < polyline.size()-1 ) { |  | ||||||
|                 output += ","; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         output += "]"; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #endif /* POLYLINECOMPRESSOR_H_ */ |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user