package Ġmo e . sun j iao . osm unda . geo coder Ċ Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġandroid . location . Location Ċ import Ġmo e . sun j iao . osm unda . model . SearchResult Ċ import Ġorg . os md roid . api . IG eo Point Ċ import Ġorg . os md roid . util . Geo Point Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġsearch Ġplace Ġnames Ġusing Ġa Ġgeo graphic Ġcoordinates Ċ Ġ* Ġcreated Ġon Ġ 4 / 2 2 / 2 0 2 0 . Ċ Ġ* Ċ Ġ* Ġ@ author ĠSun ĠJ iao ( åŃ Ļ å¨ ĩ ï¼ī Ċ Ġ*/ Ċ Ċ class ĠReverse Geo coder ( val Ġdatabase : ĠSQLite Database ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġlatitude Ġlatitude Ġof Ġtarget Ġlocation ĊĠĠĠĠ Ġ* Ġ@ param Ġlongitude Ġlongitude Ġof Ġtarget Ġlocation ĊĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġnumber Ġof Ġresults ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġnumber Ġof Ġrows Ġto Ġskip Ġbefore Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof ĠSearch Result ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġlatitude : ĠDouble , ĊĠĠĠĠĠĠĠ Ġlongitude : ĠDouble , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠList < SearchResult >{ ĊĠĠĠĠĠĠĠ Ġif Ġ( latitude Ġ> Ġ 9 0 . 0 0 Ġ|| Ġlatitude Ġ< Ġ- 9 0 . 0 0 Ġ|| Ġlongitude Ġ> Ġ 1 8 0 . 0 0 Ġ|| Ġlongitude Ġ< Ġ- 1 8 0 . 0 0 Ġ|| Ġlimit Ġ< Ġ 0 Ġ|| Ġoffset Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġval Ġlat Ġ= Ġlatitude . toString () ĊĠĠĠĠĠĠĠ Ġval Ġlon Ġ= Ġlongitude . toString () ĊĠĠĠĠĠĠĠ Ġval Ġresult List : ĠMutable List < SearchResult > Ġ= ĠArrayList < SearchResult >() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor : ĠCursor Ġ= Ġdatabase . raw Query (" SELECT Ġ* ĠFROM Ġtag Ġleft Ġjoin Ġway _ no Ġon Ġtag . id Ġ= Ġway _ no . way _ id Ġleft Ġjoin Ġnodes Ġon Ġtag . id = nodes . id Ġor Ġnodes . id = way _ no . node _ id Ġwhere Ġk Ġ= Ġ\" name \" Ġand Ġlat Ġ> Ġ? Ġ- 0 . 0 1 Ġand Ġlat Ġ< Ġ? Ġ+ 0 . 0 1 Ġand Ġlon Ġ> Ġ? Ġ- 0 . 0 1 Ġand Ġlon Ġ< Ġ? Ġ+ 0 . 0 1 Ġgroup Ġby Ġtag . v Ġorder Ġby Ġ( lat Ġ- Ġ? ) Ġ* Ġ( lat Ġ- Ġ? ) Ġ+ Ġ( lon Ġ- Ġ? ) Ġ* Ġ( lon Ġ- Ġ? ) Ġ Ġasc Ġlimit Ġ? Ġoffset Ġ? Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( lat , Ġlat , Ġlon , Ġlon , Ġlat , Ġlat , Ġlon , Ġlon , Ġlimit . toString (), offset . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdatabase Id Ġ: ĠLong Ġ= Ġcursor . getLong ( cursor . getColumnIndex (" way _ id ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( database Id Ġ== Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Id Ġ= Ġcursor . getLong ( cursor . getColumnIndex (" id ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Result ( cursor . getDouble ( cursor . getColumnIndex (" lat ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getDouble ( cursor . getColumnIndex (" lon ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex (" v ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase , Ġdatabase Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . sortBy Ġ{ Ġ( it . lat Ġ- Ġlatitude ) Ġ* Ġ( it . lat Ġ- Ġlatitude ) Ġ+ Ġ( it . lon Ġ- Ġlongitude ) Ġ* Ġ( it . lon Ġ- Ġlongitude ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( Ġex ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġgeo Point Ġcoordinate Ġof Ġtarget Ġlocation Ġin Ġos md roid ĠGeo Point ĊĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġnumber Ġof Ġresults ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġnumber Ġof Ġrows Ġto Ġskip Ġbefore Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof ĠSearch Result ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġgeo Point : ĠGeo Point , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠList < SearchResult > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsearch ( geo Point . latitude , Ġgeo Point . longitude , Ġlimit , Ġoffset ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġi Geo Point Ġcoordinate Ġof Ġtarget Ġlocation Ġin Ġos md roid ĠI Geo Point ĊĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġnumber Ġof Ġresults ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġnumber Ġof Ġrows Ġto Ġskip Ġbefore Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof ĠSearch Result ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġi Geo Point : ĠI Geo Point , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠList < SearchResult > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsearch ( i Geo Point . latitude , Ġi Geo Point . longitude , Ġlimit , Ġoffset ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġlocation Ġcoordinate Ġof Ġtarget Ġlocation Ġin Ġandroid ĠLocation ĊĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġnumber Ġof Ġresults ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġnumber Ġof Ġrows Ġto Ġskip Ġbefore Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof ĠSearch Result ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġlocation : ĠLocation , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠList < SearchResult > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsearch ( location . latitude , Ġlocation . longitude , Ġlimit , Ġoffset ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġlatitude Ġlatitude Ġof Ġtarget Ġlocation ĊĠĠĠĠ Ġ* Ġ@ param Ġlongitude Ġlongitude Ġof Ġtarget Ġlocation ĊĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġnumber Ġof Ġresults ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġnumber Ġof Ġrows Ġto Ġskip Ġbefore Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof ĠSearch Result ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġlatitude : ĠString , ĊĠĠĠĠĠĠĠ Ġlongitude : ĠString , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠList < SearchResult > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsearch ( latitude . toDouble (), longitude . toDouble (), limit , offset ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġlatitude Ġlatitude Ġof Ġtarget Ġlocation ĊĠĠĠĠ Ġ* Ġ@ param Ġlongitude Ġlongitude Ġof Ġtarget Ġlocation ĊĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġnumber Ġof Ġresults ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġnumber Ġof Ġrows Ġto Ġskip Ġbefore Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof ĠSearch Result ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġlatitude : ĠFloat , ĊĠĠĠĠĠĠĠ Ġlongitude : ĠFloat , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠList < SearchResult > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsearch ( latitude . toDouble (), longitude . toDouble (), limit , offset ) Ċ }