diff options
Diffstat (limited to 'Xamarin.Forms.Maps.iOS/GeocoderBackend.cs')
-rw-r--r-- | Xamarin.Forms.Maps.iOS/GeocoderBackend.cs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/Xamarin.Forms.Maps.iOS/GeocoderBackend.cs b/Xamarin.Forms.Maps.iOS/GeocoderBackend.cs new file mode 100644 index 00000000..42b96457 --- /dev/null +++ b/Xamarin.Forms.Maps.iOS/GeocoderBackend.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +#if __UNIFIED__ +using CoreLocation; +using AddressBookUI; +#else +using MonoTouch.AddressBookUI; +using MonoTouch.CoreLocation; +#endif +#if __UNIFIED__ +using RectangleF = CoreGraphics.CGRect; +using SizeF = CoreGraphics.CGSize; +using PointF = CoreGraphics.CGPoint; + +#else +using nfloat=global::System.Single; +using nint=global::System.Int32; +using nuint=global::System.UInt32; +#endif + +namespace Xamarin.Forms.Maps.iOS +{ + internal class GeocoderBackend + { + public static void Register() + { + Geocoder.GetPositionsForAddressAsyncFunc = GetPositionsForAddressAsync; + Geocoder.GetAddressesForPositionFuncAsync = GetAddressesForPositionAsync; + } + + static Task<IEnumerable<string>> GetAddressesForPositionAsync(Position position) + { + var location = new CLLocation(position.Latitude, position.Longitude); + var geocoder = new CLGeocoder(); + var source = new TaskCompletionSource<IEnumerable<string>>(); + geocoder.ReverseGeocodeLocation(location, (placemarks, error) => + { + if (placemarks == null) + placemarks = new CLPlacemark[0]; + IEnumerable<string> addresses = placemarks.Select(p => ABAddressFormatting.ToString(p.AddressDictionary, false)); + source.SetResult(addresses); + }); + return source.Task; + } + + static Task<IEnumerable<Position>> GetPositionsForAddressAsync(string address) + { + var geocoder = new CLGeocoder(); + var source = new TaskCompletionSource<IEnumerable<Position>>(); + geocoder.GeocodeAddress(address, (placemarks, error) => + { + if (placemarks == null) + placemarks = new CLPlacemark[0]; + IEnumerable<Position> positions = placemarks.Select(p => new Position(p.Location.Coordinate.Latitude, p.Location.Coordinate.Longitude)); + source.SetResult(positions); + }); + return source.Task; + } + } +}
\ No newline at end of file |