2011-11-17 12:56:45 -05:00
/*
2013-10-14 07:42:28 -04:00
Copyright ( c ) 2013 , Project OSRM , Dennis Luxen , others
All rights reserved .
Redistribution and use in source and binary forms , with or without modification ,
are permitted provided that the following conditions are met :
Redistributions of source code must retain the above copyright notice , this list
of conditions and the following disclaimer .
Redistributions in binary form must reproduce the above copyright notice , this
list of conditions and the following disclaimer in the documentation and / or
other materials provided with the distribution .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
2011-11-17 12:56:45 -05:00
# include "DescriptionFactory.h"
2012-03-22 05:25:04 -04:00
DescriptionFactory : : DescriptionFactory ( ) : entireLength ( 0 ) { }
2011-11-17 12:56:45 -05:00
DescriptionFactory : : ~ DescriptionFactory ( ) { }
2014-03-28 12:13:00 -04:00
inline double DescriptionFactory : : DegreeToRadian ( const double degree ) const
{
return degree * ( M_PI / 180. ) ;
2012-06-11 10:36:33 -04:00
}
2014-03-28 12:13:00 -04:00
inline double DescriptionFactory : : RadianToDegree ( const double radian ) const
{
return radian * ( 180. / M_PI ) ;
2012-06-11 10:36:33 -04:00
}
2014-03-28 12:13:00 -04:00
double DescriptionFactory : : GetBearing ( const FixedPointCoordinate & A , const FixedPointCoordinate & B ) const
{
2013-12-12 18:35:23 -05:00
double delta_long = DegreeToRadian ( B . lon / COORDINATE_PRECISION - A . lon / COORDINATE_PRECISION ) ;
2012-06-11 10:36:33 -04:00
2013-11-13 15:52:01 -05:00
const double lat1 = DegreeToRadian ( A . lat / COORDINATE_PRECISION ) ;
const double lat2 = DegreeToRadian ( B . lat / COORDINATE_PRECISION ) ;
2012-06-11 10:36:33 -04:00
2013-12-12 18:35:23 -05:00
const double y = sin ( delta_long ) * cos ( lat2 ) ;
const double x = cos ( lat1 ) * sin ( lat2 ) - sin ( lat1 ) * cos ( lat2 ) * cos ( delta_long ) ;
2012-06-11 10:36:33 -04:00
double result = RadianToDegree ( atan2 ( y , x ) ) ;
2014-03-28 12:13:00 -04:00
while ( result < 0. )
{
2012-06-11 10:36:33 -04:00
result + = 360. ;
2013-11-13 15:52:01 -05:00
}
2014-03-28 12:13:00 -04:00
while ( result > = 360. )
{
2012-06-11 10:36:33 -04:00
result - = 360. ;
2013-11-13 15:52:01 -05:00
}
2012-06-11 10:36:33 -04:00
return result ;
2011-11-17 12:56:45 -05:00
}
2014-03-28 12:13:00 -04:00
void DescriptionFactory : : SetStartSegment ( const PhantomNode & source , const bool source_traversed_in_reverse )
{
int fwd_weight = source . forward_weight ;
int rev_weight = source . reverse_weight ;
int fwd_offset = source . forward_offset ;
int rev_offset = source . reverse_offset ;
SimpleLogger ( ) . Write ( logDEBUG ) < < " df source, traversed in reverse: " < < ( source_traversed_in_reverse ? " y " : " n " ) < < " , location: " < < source . location < < " , fwd_weight: " < < fwd_weight < < " , fwd_offset: " < < fwd_offset < < " , rev_weight: " < < rev_weight < < " , rev_offset: " < < rev_offset ;
SimpleLogger ( ) . Write ( logDEBUG ) < < " duration of first segment: " < < ( source_traversed_in_reverse ? source . GetReverseWeightPlusOffset ( ) : source . GetForwardWeightPlusOffset ( ) ) ;
start_phantom = source ;
2013-11-13 15:52:01 -05:00
AppendSegment (
2014-03-28 12:13:00 -04:00
source . location ,
PathData ( 0 , source . name_id , 10 , source . forward_weight )
2013-11-13 15:52:01 -05:00
) ;
2011-11-17 12:56:45 -05:00
}
2014-03-28 12:13:00 -04:00
void DescriptionFactory : : SetEndSegment ( const PhantomNode & target , const bool target_traversed_in_reverse )
{
int fwd_weight = target . forward_weight ;
int rev_weight = target . reverse_weight ;
int fwd_offset = target . forward_offset ;
int rev_offset = target . reverse_offset ;
SimpleLogger ( ) . Write ( logDEBUG ) < < " df target, traversed in reverse: " < < ( target_traversed_in_reverse ? " y " : " n " ) < < " , location: " < < target . location < < " , fwd_weight: " < < fwd_weight < < " , fwd_offset: " < < fwd_offset < < " , rev_weight: " < < rev_weight < < " , rev_offset: " < < rev_offset ;
SimpleLogger ( ) . Write ( logDEBUG ) < < " duration of last segment: " < < ( target_traversed_in_reverse ? target . GetReverseWeightPlusOffset ( ) : target . GetForwardWeightPlusOffset ( ) ) ;
2013-12-12 18:35:23 -05:00
target_phantom = target ;
2013-11-13 15:52:01 -05:00
pathDescription . push_back (
SegmentInformation (
2013-12-12 18:35:23 -05:00
target . location ,
2014-02-11 05:42:24 -05:00
target . name_id ,
2013-11-13 15:52:01 -05:00
0 ,
2014-02-11 05:42:24 -05:00
target . reverse_weight ,
2013-11-13 15:52:01 -05:00
0 ,
true
)
) ;
2011-11-17 12:56:45 -05:00
}
2013-11-13 15:52:01 -05:00
void DescriptionFactory : : AppendSegment (
const FixedPointCoordinate & coordinate ,
2013-12-08 13:10:10 -05:00
const PathData & data
2013-11-13 15:52:01 -05:00
) {
2014-03-28 12:13:00 -04:00
// if(
// ( 1 == pathDescription.size()) &&
// ( pathDescription.back().location == coordinate)
// ) {
// pathDescription.back().name_id = data.name_id;
// } else {
pathDescription . push_back (
SegmentInformation (
coordinate ,
data . name_id ,
data . durationOfSegment ,
0 ,
data . turnInstruction
)
) ;
// }
2011-11-17 12:56:45 -05:00
}
2013-11-13 15:52:01 -05:00
void DescriptionFactory : : AppendEncodedPolylineString (
const bool return_encoded ,
2013-11-14 17:16:26 -05:00
std : : vector < std : : string > & output
2013-11-13 15:52:01 -05:00
) {
2013-11-14 17:16:26 -05:00
std : : string temp ;
2013-11-13 15:52:01 -05:00
if ( return_encoded ) {
2013-11-14 17:16:26 -05:00
polyline_compressor . printEncodedString ( pathDescription , temp ) ;
2013-11-13 15:52:01 -05:00
} else {
2013-11-14 17:16:26 -05:00
polyline_compressor . printUnencodedString ( pathDescription , temp ) ;
2013-11-13 15:52:01 -05:00
}
2013-11-14 17:16:26 -05:00
output . push_back ( temp ) ;
2011-11-17 12:56:45 -05:00
}
2013-11-14 17:16:26 -05:00
void DescriptionFactory : : AppendEncodedPolylineString (
std : : vector < std : : string > & output
) const {
std : : string temp ;
polyline_compressor . printEncodedString ( pathDescription , temp ) ;
output . push_back ( temp ) ;
2011-11-17 12:56:45 -05:00
}
2013-11-14 17:16:26 -05:00
void DescriptionFactory : : AppendUnencodedPolylineString (
std : : vector < std : : string > & output
) const {
std : : string temp ;
polyline_compressor . printUnencodedString ( pathDescription , temp ) ;
output . push_back ( temp ) ;
2011-11-17 12:56:45 -05:00
}
2013-11-13 15:52:01 -05:00
void DescriptionFactory : : BuildRouteSummary (
const double distance ,
const unsigned time
) {
2014-02-11 05:42:24 -05:00
summary . startName = start_phantom . name_id ;
summary . destName = target_phantom . name_id ;
2014-02-21 10:55:41 -05:00
2014-02-26 09:55:04 -05:00
// SimpleLogger().Write(logDEBUG) << "phantom start name: " << start_phantom.name_id << ", path: " << pathDescription.front().name_id;
// SimpleLogger().Write(logDEBUG) << "phantom target name: " << target_phantom.name_id << ", path: " << pathDescription.back().name_id;
2014-02-21 10:55:41 -05:00
2012-02-10 11:14:30 -05:00
summary . BuildDurationAndLengthStrings ( distance , time ) ;
2011-11-17 12:56:45 -05:00
}