package Ġid k . met ropol ia . fi . my application . utils Ċ Ċ import Ġid k . met ropol ia . fi . my application . model . Coordinate Ċ Ċ object ĠPoly line Utils Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn codes Ġa Ġpoly line Ġusing ĠGoogle 's Ġpoly line Ġalgorithm ĊĠĠĠĠ Ġ* Ġ( See Ġhttp :// code . google . com / apis / maps / documentation / poly line algorithm . html Ġfor Ġmore Ġinformation ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcode Ġderived Ġfrom Ġ: Ġhttps :// gist . github . com / signed 0 / 2 0 3 1 1 5 7 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ( x , y )- Coordinates ĊĠĠĠĠ Ġ* Ġ@ return Ġpoly line - string ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġencode ( coords : ĠList < Coordinate >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġvar Ġprev Lat Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġprev Long Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( long , lat ) Ġin Ġcoords ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Lat Ġ= Ġ( lat Ġ* Ġ 1 e 5 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Long Ġ= Ġ( long Ġ* Ġ 1 e 5 ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Lat Ġ= Ġencode Value ( i Lat Ġ- Ġprev Lat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Long Ġ= Ġencode Value ( i Long Ġ- Ġprev Long ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Lat Ġ= Ġi Lat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Long Ġ= Ġi Long ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( delta Lat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( delta Long ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . join ToString ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencode Value ( value : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 2 Ġ& Ġ 4 ĊĠĠĠĠĠĠĠ Ġvar Ġactual Value Ġ= Ġif Ġ( value Ġ< Ġ 0 ) Ġ( value Ġshl Ġ 1 ). inv () Ġelse Ġ( value Ġshl Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 5 - 8 ĊĠĠĠĠĠĠĠ Ġval Ġchunks : ĠList < Int > Ġ= Ġsplit Into Chunks ( actual Value ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 9 - 1 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġchunks . map Ġ{ Ġ( it Ġ+ Ġ 6 3 ). to Char () Ġ}. join ToString ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit Into Chunks ( to Encode : ĠInt ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 5 - 8 ĊĠĠĠĠĠĠĠ Ġval Ġchunks Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġto Encode ĊĠĠĠĠĠĠĠ Ġwhile ( value Ġ>= Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunks . add (( value Ġand Ġ 3 1 ) Ġor Ġ( 0 x 2 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue Ġshr Ġ 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchunks . add ( value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġchunks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDe codes Ġa Ġpoly line Ġthat Ġhas Ġbeen Ġencoded Ġusing ĠGoogle 's Ġalgorithm ĊĠĠĠĠ Ġ* Ġ( http :// code . google . com / apis / maps / documentation / poly line algorithm . html ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġcode Ġderived Ġfrom Ġ: Ġhttps :// gist . github . com / signed 0 / 2 0 3 1 1 5 7 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpoly line - string ĊĠĠĠĠ Ġ* Ġ@ return Ġ( long , lat )- Coordinates ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdecode ( poly line : ĠString ): ĠList < Coordinate > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoordinate Chunks : ĠMutable List < Mutable List < Int >> Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġcoordinate Chunks . add ( mutable ListOf ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( char Ġin Ġpoly line . toCharArray ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconvert Ġeach Ġcharacter Ġto Ġdecimal Ġfrom Ġascii ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġchar . toInt () Ġ- Ġ 6 3 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvalues Ġthat Ġhave Ġa Ġchunk Ġfollowing Ġhave Ġan Ġextra Ġ 1 Ġon Ġthe Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Last Of Chunk Ġ= Ġ( value Ġand Ġ 0 x 2 0 ) Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue Ġand Ġ( 0 x 1 F ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate Chunks . last (). add ( value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Last Of Chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate Chunks . add ( mutable ListOf ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcoordinate Chunks . remove At ( coordinate Chunks . last Index ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcoordinates : ĠMutable List < Double > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( coordinate Chunk Ġin Ġcoordinate Chunks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcoordinate Ġ= Ġcoordinate Chunk . map Indexed Ġ{ Ġi , Ġchunk Ġ-> Ġchunk Ġshl Ġ( i Ġ* Ġ 5 ) Ġ}. reduce Ġ{ Ġi , Ġj Ġ-> Ġi Ġor Ġj Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġis Ġa Ġ 1 Ġon Ġthe Ġright Ġif Ġthe Ġcoordinate Ġis Ġnegative ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( coordinate Ġand Ġ 0 x 1 Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate Ġ= Ġ( coordinate ). inv () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate Ġ= Ġcoordinate Ġshr Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinates . add (( coordinate ). toDouble () Ġ/ Ġ 1 0 0 0 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpoints : ĠMutable List < Coordinate > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġvar Ġprevious X Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Y Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 .. coordinates . size - 1 Ġstep Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( coordinates [ i ] Ġ== Ġ 0 . 0 Ġ&& Ġcoordinates [ i + 1 ] Ġ== Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious X Ġ+= Ġcoordinates [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Y Ġ+= Ġcoordinates [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( Coordinate ( round ( previous X , Ġ 5 ), Ġround ( previous Y , Ġ 5 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpoints ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġround ( value : ĠDouble , Ġprecision : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( value Ġ* ĠMath . pow ( 1 0 . 0 , precision . toDouble ())). toInt (). toDouble () Ġ/ ĠMath . pow ( 1 0 . 0 , precision . toDouble ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġhttps :// en . wikipedia . org / wiki / R amer % E 2 % 8 0 % 9 3 D ou glas % E 2 % 8 0 % 9 3 Pe u cker _ algorithm ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsimplify ( points : ĠList < Coordinate >, Ġepsilon : ĠDouble ): ĠList < Coordinate > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġpoint Ġwith Ġthe Ġmaximum Ġdistance ĊĠĠĠĠĠĠĠ Ġvar Ġd max Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġend Ġ= Ġpoints . size ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 1 .. ( end Ġ- Ġ 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġd Ġ= Ġper pend icular Distance ( points [ i ], Ġpoints [ 0 ], Ġpoints [ end - 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġd Ġ> Ġd max Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd max Ġ= Ġd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġmax Ġdistance Ġis Ġgreater Ġthan Ġepsilon , Ġrecursively Ġsimplify ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( d max Ġ> Ġepsilon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRecursive Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrec Results 1 : ĠList < Coordinate > Ġ= Ġsimplify ( points . sub List ( 0 , index + 1 ), Ġepsilon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrec Results 2 : ĠList < Coordinate > Ġ= Ġsimplify ( points . sub List ( index , end ), Ġepsilon ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBuild Ġthe Ġresult Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( rec Results 1 . sub List ( 0 , rec Results 1 . last Index ), Ġrec Results 2 ). flatMap Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( points [ 0 ], Ġpoints [ end Ġ- Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġper pend icular Distance ( pt : ĠCoordinate , Ġline From : ĠCoordinate , Ġline To : ĠCoordinate ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs (( lineTo . longitude Ġ- Ġline From . longitude )*( line From . latitude Ġ- Ġpt . latitude ) Ġ- Ġ( line From . longitude - Ġpt . longitude )*( lineTo . latitude Ġ- Ġline From . latitude ))/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . sqrt ( Math . pow ( lineTo . longitude Ġ- Ġline From . longitude , Ġ 2 . 0 ) Ġ+ ĠMath . pow ( lineTo . latitude Ġ- Ġline From . latitude , Ġ 2 . 0 )) Ċ }