package Ġmil . ng a . gi at . mage . data . gson Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Type Adapter Ċ import Ġcom . google . gson . Type Adapter Factory Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . google . gson . stream . Json Writer Ċ import Ġcom . mapbox . geojson . Geometry Adapter Factory Ċ import Ġmil . ng a . sf .* Ċ import Ġjava . io . IOException Ċ Ċ class ĠGeometry Type Adapter Factory Ġ: ĠType Adapter Factory Ġ{ ĊĊĠĠĠ Ġval Ġconverter Factory : ĠMap < String , Ġ( com . mapbox . geojson . Geometry ) Ġ-> ĠGeometry > Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Point " Ġto Ġ:: convert Point , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Multi Point " Ġto Ġ:: convert Multi Point , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Line String " Ġto Ġ:: convert Line String , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Multi Line String " Ġto Ġ:: convert Multi Line String , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Polygon " Ġto Ġ:: convert Polygon , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Multi Polygon " Ġto Ġ:: convert Multi Polygon , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Geometry Collection " Ġto Ġ:: convert Geometry Collection ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġcreate ( gson : ĠGson , Ġtype Token : ĠType Token < T >): ĠType Adapter < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Type : ĠClass < *> Ġ= Ġtype Token . raw Type ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( mil . ng a . sf . Geometry :: class . java . isAssignableFrom ( raw Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠGeometry Adapter Factory . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Adapter Ġ= Ġfactory . create ( gson , ĠType Token . get ( com . mapbox . geojson . Geometry :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeometry Type Adapter ( type Adapter ) Ġas ĠType Adapter < T > ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgeometry Type Adapter ( type Adapter : ĠType Adapter < com . mapbox . geojson . Geometry ?> ): ĠType Adapter < Geometry ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠType Adapter < Geometry ?> () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( out : ĠJson Writer , Ġvalue : ĠGeometry ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread (` in `: ĠJson Reader ): ĠGeometry ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeometry Ġ= Ġtype Adapter . read (` in `) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconverter Factory [ geometry . type ()] ?. invoke ( geometry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Point ( geometry : Ġcom . mapbox . geojson . Geometry ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġgeometry Ġas Ġcom . mapbox . geojson . Point ĊĠĠĠĠĠĠĠ Ġreturn ĠPoint ( point . longitude (), Ġpoint . latitude (), Ġpoint . altitude ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Multi Point ( geometry : Ġcom . mapbox . geojson . Geometry ): ĠMulti Point Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmulti Point Ġ= Ġgeometry Ġas Ġcom . mapbox . geojson . Multi Point ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= Ġmulti Point . coordinates (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Point ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMulti Point ( points ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Line String ( geometry : Ġcom . mapbox . geojson . Geometry ): ĠLine String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline String Ġ= Ġgeometry Ġas Ġcom . mapbox . geojson . Line String ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= Ġline String . coordinates (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Point ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠLine String ( points ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Multi Line String ( geometry : Ġcom . mapbox . geojson . Geometry ): ĠMulti Line String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmulti Line String Ġ= Ġgeometry Ġas Ġcom . mapbox . geojson . Multi Line String ĊĠĠĠĠĠĠĠ Ġval Ġline Strings Ġ= Ġmulti Line String . line Strings (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Line String ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMulti Line String ( line Strings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Polygon ( geometry : Ġcom . mapbox . geojson . Geometry ): ĠPolygon Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpolygon Ġ= Ġgeometry Ġas Ġcom . mapbox . geojson . Polygon ĊĊĠĠĠĠĠĠĠ Ġval Ġr ings Ġ= Ġmutable ListOf < Line String >() ĊĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= Ġpolygon . outer ()?. coordinates ()?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Point ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġr ings . add ( Linear Ring ( points )) ĊĊĠĠĠĠĠĠĠ Ġpolygon . inner ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Points Ġ= Ġit . coordinates (). map Ġ{ Ġpoint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Point ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ings . add ( Linear Ring ( inner Points )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPolygon ( r ings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Multi Polygon ( geometry : Ġcom . mapbox . geojson . Geometry ): ĠMulti Polygon Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmulti Polygon Ġ= Ġgeometry Ġas Ġcom . mapbox . geojson . Multi Polygon ĊĊĠĠĠĠĠĠĠ Ġval Ġpoly gons Ġ= Ġmulti Polygon . poly gons (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Polygon ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMulti Polygon ( poly gons ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Geometry Collection ( geometry : Ġcom . mapbox . geojson . Geometry ): ĠGeometry Collection < Geometry > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgeometry Collection Ġ= Ġgeometry Ġas Ġcom . mapbox . geojson . Geometry Collection ĊĊĠĠĠĠĠĠĠ Ġval Ġge ometries Ġ= Ġmutable ListOf < Geometry >() ĊĠĠĠĠĠĠĠ Ġgeometry Collection . ge ometries (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= Ġconverter Factory [ it . type ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( factory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ometries . add ( factory . invoke ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGeometry Collection ( ge ometries ) ĊĠĠĠ Ġ} Ċ }