/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠDavid ĠAg ui ar ĠG on z ale z Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġgc . david . df m . map Ċ Ċ import Ġjava . text . Decimal Format Ċ import Ġjava . util .* Ċ import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* ĠHa vers ine Ġclass Ġimplements Ġstatic Ġmethods Ġto Ġcalculate Ġdistances Ġbetween Ġtwo Ċ Ġ* Ġpoints Ġon Ġa Ġsphere , Ġin Ġthis Ġcase , Ġthe ĠEarth , Ġfrom Ġtheir Ġlongitude s Ġand Ċ Ġ* Ġlatitude s . ĠIt Ġalso Ġdefines Ġstatic Ġmethods Ġto Ġcalculate Ġelevation Ġpoints . Ċ Ġ* Ċ Ġ* Ġ@ author ĠDavid Ċ Ġ* Ġ@ see Ġ[ Ha vers ine ]( http :// en . wikipedia . org / wiki / Ha vers ine _ formula ) Ċ Ġ*/ Ċ object ĠHa vers ine Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠE AR TH _ RADIUS _ IN _ MET RES Ġ= Ġ 6 3 7 1 0 0 0 . 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠM ILE _ IN _ MET RES Ġ= Ġ 1 6 0 9 . 3 4 4 ĊĠĠĠ Ġprivate Ġconst Ġval ĠK I LO MET RE _ IN _ MET RES Ġ= Ġ 1 0 0 0 . 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠY ARD _ IN _ MET RES Ġ= Ġ 1 . 0 9 3 6 1 3 2 9 8 3 3 7 7 0 8 ĊĠĠĠ Ġprivate Ġconst Ġval ĠFE ET _ IN _ MET RES Ġ= Ġ 0 . 3 0 4 8 ĊĠĠĠ Ġprivate Ġval ĠDIST ANCE _ FORMAT Ġ= ĠDecimal Format (" ## , ## 0 . 0 0 ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġdistance Ġbetween Ġtwo Ġpositions Ġin Ġmet res . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlatitude A Ġ ĠCurrent Ġposition Ġlatitude Ġin Ġdegrees . ĊĠĠĠĠ Ġ* Ġ@ param Ġlongitude A ĠCurrent Ġposition Ġlongitude Ġin Ġdegrees . ĊĠĠĠĠ Ġ* Ġ@ param Ġlatitude B Ġ ĠDestination Ġposition Ġlatitude Ġin Ġdegrees . ĊĠĠĠĠ Ġ* Ġ@ param Ġlongitude B ĠDestination Ġposition Ġlongitude Ġin Ġdegrees . ĊĠĠĠĠ Ġ* Ġ@ return ĠDistance Ġin Ġmeters . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Distance ( latitude A : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlongitude A : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatitude B : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlongitude B : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlatitude A In Radians Ġ= ĠMath . to Radians ( latitude A ) ĊĠĠĠĠĠĠĠ Ġval Ġlongitude A In Radians Ġ= ĠMath . to Radians ( longitude A ) ĊĠĠĠĠĠĠĠ Ġval Ġlatitude B In Radians Ġ= ĠMath . to Radians ( latitude B ) ĊĠĠĠĠĠĠĠ Ġval Ġlongitude B In Radians Ġ= ĠMath . to Radians ( longitude B ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdistance Latitude s Ġ= Ġlatitude B In Radians Ġ- Ġlatitude A In Radians ĊĠĠĠĠĠĠĠ Ġval Ġdistance Longitude s Ġ= Ġlongitude B In Radians Ġ- Ġlongitude A In Radians ĊĊĠĠĠĠĠĠĠ Ġval Ġsin Latitude Ġ= Ġsin ( distance Latitude s Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġsin Longitude Ġ= Ġsin ( distance Longitude s Ġ/ Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġsin Latitude Ġ* Ġsin Latitude Ġ+ Ġcos ( latitude A In Radians ) Ġ* Ġcos ( latitude B In Radians ) Ġ* Ġ( sin Longitude Ġ* Ġsin Longitude ) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġ 2 Ġ* Ġas in ( min ( 1 . 0 , Ġsqrt ( a ))) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠE AR TH _ RADIUS _ IN _ MET RES Ġ* Ġc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNormal izes Ġdistance Ġcorresponding Ġto Ġits Ġunit Ġand Ġthe Ġdevice Ġlocale Ġand Ġwith Ġonly Ġtwo Ġdecimal ĊĠĠĠĠ Ġ* Ġdigits . ĠThis Ġstatic Ġfunction Ġdistinguish Ġbetween Ġmetric Ġand Ġimp erial Ġand ĠUS Ġcustom ary Ġunits . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdistance In Met res ĠUn formatted Ġdistance Ġin Ġmet res . ĊĠĠĠĠ Ġ* Ġ@ param Ġlocale ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġcurrent Ġlocale Ġof Ġthe Ġdevice . ĊĠĠĠĠ Ġ* Ġ@ return ĠA ĠString Ġwith Ġthe Ġamount Ġand Ġthe Ġunit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnormalize Distance ( distance In Met res : ĠDouble , Ġlocale : ĠLocale ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( measure Unit , Ġdistance By Locale ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is American Locale ( locale )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance In Met res Ġ>= ĠM ILE _ IN _ MET RES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mi " Ġto Ġdistance In Met res Ġ/ ĠM ILE _ IN _ MET RES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" yd " Ġto Ġdistance In Met res Ġ* ĠY ARD _ IN _ MET RES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance In Met res Ġ>= ĠK I LO MET RE _ IN _ MET RES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" km " Ġto Ġdistance In Met res Ġ/ ĠK I LO MET RE _ IN _ MET RES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" m " Ġto Ġdistance In Met res ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ DISTANCE _ FORMAT . format ( distance By Locale )} Ġ$ measure Unit " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNormal izes Ġalt itude Ġcorresponding Ġto Ġits Ġunit Ġand Ġthe Ġdevice Ġlocale Ġand Ġwith Ġonly Ġtwo Ġdecimal ĊĠĠĠĠ Ġ* Ġdigits . ĠThis Ġstatic Ġfunction Ġdistinguish Ġbetween Ġmetric Ġand Ġimp erial Ġand ĠUS Ġcustom ary Ġunits . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġalt itude ĠUn formatted Ġalt itude Ġin Ġmet res . ĊĠĠĠĠ Ġ* Ġ@ param Ġlocale ĠĠ ĠThe Ġcurrent Ġlocale Ġof Ġthe Ġdevice . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġdouble Ġwith Ġonly Ġthe Ġnormalized Ġamount . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnormalize Alt itude By Locale ( altitude : ĠDouble , Ġlocale : ĠLocale ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmeasure Ġ= Ġif Ġ( is English Locale ( locale )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalt itude Ġ/ ĠFE ET _ IN _ MET RES ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalt itude ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTwo Ġdecimal Ġdigits ĊĠĠĠĠĠĠĠ Ġreturn Ġ( measure Ġ* Ġ 1 e 2 ). round To Long () Ġ/ Ġ 1 e 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġstring Ġwith Ġthe Ġalt itude Ġunit , Ġm Ġor Ġft , Ġbased Ġin Ġthe Ġcurrent Ġlocale . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocale ĠCurrent Ġlocale . ĊĠĠĠĠ Ġ* Ġ@ return ĠString Ġwith Ġalt itude Ġunit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Alt itude Unit By Locale ( locale : ĠLocale ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is English Locale ( locale )) Ġ" ft " Ġelse Ġ" m " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis English Locale ( locale : ĠLocale ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocale Ġ== ĠLocale . CAN ADA Ġ|| Ġlocale Ġ== ĠLocale . UK Ġ|| Ġlocale Ġ== ĠLocale . US ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis American Locale ( locale : ĠLocale ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( locale Ġ== ĠLocale . CAN ADA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocale Ġ== ĠLocale . CH INA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocale Ġ== ĠLocale . J AP AN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocale Ġ== ĠLocale . K ORE A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocale Ġ== ĠLocale . TA IW AN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocale Ġ== ĠLocale . UK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocale Ġ== ĠLocale . US ) ĊĠĠĠ Ġ} Ċ } Ċ