package Ġcom . k ross ov och kin . k weather . weather map . domain Ċ Ċ import Ġcom . k ross ov och kin . k weather . domain . City Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . as inh Ċ import Ġkotlin . math . atan Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sin h Ċ import Ġkotlin . math . tan Ċ Ċ interface ĠGet Weather Map Data Interactor Ġ{ ĊĊĠĠĠ Ġfun Ġget ( city : ĠCity ): ĠWeather Map Data Ċ } Ċ Ċ private Ġconst Ġval ĠZ O OM Ġ= Ġ 8 Ċ Ċ internal Ġclass ĠGet Weather Map Data Interactor Impl ( ĊĠĠĠ Ġprivate Ġval Ġmap box ApiKey : ĠString , ĊĠĠĠ Ġprivate Ġval Ġopen Weather Map ApiKey : ĠString , Ċ ) Ġ: ĠGet Weather Map Data Interactor Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget ( city : ĠCity ): ĠWeather Map Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġget XY Tile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlat Ġ= Ġcity . location . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlon Ġ= Ġcity . location . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Ġ= ĠZ O OM ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġtile Bounds Ġ= Ġget Tile Bounds ( x , Ġy , ĠZ O OM ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstart X Ġ= Ġx Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġend X Ġ= Ġx Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġy Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġend Y Ġ= Ġy Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġreturn ĠWeather Map Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcity Ġ= Ġcity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile Bounds Ġ= Ġtile Bounds , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Ġ= ĠZ O OM , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Tile Urls Ġ= Ġ( start Y .. end Y ). map Ġ{ Ġcurrent Y Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( start X .. end X ). map Ġ{ Ġcurrent X Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Map Url ( current X , Ġcurrent Y , ĠZ O OM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre cip itation Tile Urls Ġ= Ġ( start Y .. end Y ). map Ġ{ Ġcurrent Y Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( start X .. end X ). map Ġ{ Ġcurrent X Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Pre cip itation Url ( current X , Ġcurrent Y , ĠZ O OM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Map Url ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" https :// api . mapbox . com / styles / v 1 / mapbox / light - v 1 0 / tiles / 2 5 6 /$ z /$ x /$ y ? access _ token =$ mapbox ApiKey " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Pre cip itation Url ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" https :// tile . open weather map . org / map / prec ip itation _ new /$ z /$ x /$ y . png ? appid =$ open Weather Map ApiKey " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget XY Tile ( lat : ĠDouble , Ġlon : ĠDouble , Ġzoom : ĠInt ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlat Rad Ġ= Ġlat Ġ* ĠPI Ġ/ Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġvar Ġx tile Ġ= Ġfloor (( lon Ġ+ Ġ 1 8 0 ) Ġ/ Ġ 3 6 0 Ġ* Ġ( 1 Ġshl Ġzoom )). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġy tile Ġ= Ġfloor (( 1 . 0 Ġ- Ġas inh ( tan ( lat Rad )) Ġ/ ĠPI ) Ġ/ Ġ 2 Ġ* Ġ( 1 Ġshl Ġzoom )). toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( xt ile Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx tile Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( xt ile Ġ>= Ġ( 1 Ġshl Ġzoom )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx tile Ġ= Ġ( 1 Ġshl Ġzoom ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( y tile Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy tile Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( y tile Ġ>= Ġ( 1 Ġshl Ġzoom )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy tile Ġ= Ġ( 1 Ġshl Ġzoom ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( xt ile , Ġy tile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tile Bounds ( x : ĠInt , Ġy : ĠInt , Ġzoom : ĠInt ): ĠTile Bounds Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTile Bounds ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnorth Ġ= Ġtile 2 lat ( y , Ġzoom ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsouth Ġ= Ġtile 2 lat ( y Ġ+ Ġ 1 , Ġzoom ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeast Ġ= Ġtile 2 lon ( x , Ġzoom ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwest Ġ= Ġtile 2 lon ( x Ġ+ Ġ 1 , Ġzoom ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtile 2 lon ( x : ĠInt , Ġz : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ/ Ġ 2 . 0 . pow ( z . toDouble ()) Ġ* Ġ 3 6 0 . 0 Ġ- Ġ 1 8 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtile 2 lat ( y : ĠInt , Ġz : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= ĠPI Ġ- Ġ 2 . 0 Ġ* ĠPI Ġ* Ġy Ġ/ Ġ 2 . 0 . pow ( z . toDouble ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġatan ( sin h ( n )) Ġ* Ġ 1 8 0 Ġ/ ĠPI ĊĠĠĠ Ġ} Ċ } Ċ