From 17fdde66d94155fc62a034fa6658995bef6fd6e5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Mar 2016 13:02:25 -0700 Subject: Initial import --- Xamarin.Forms.Maps.iOS/GeocoderBackend.cs | 61 +++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Xamarin.Forms.Maps.iOS/GeocoderBackend.cs (limited to 'Xamarin.Forms.Maps.iOS/GeocoderBackend.cs') 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> GetAddressesForPositionAsync(Position position) + { + var location = new CLLocation(position.Latitude, position.Longitude); + var geocoder = new CLGeocoder(); + var source = new TaskCompletionSource>(); + geocoder.ReverseGeocodeLocation(location, (placemarks, error) => + { + if (placemarks == null) + placemarks = new CLPlacemark[0]; + IEnumerable addresses = placemarks.Select(p => ABAddressFormatting.ToString(p.AddressDictionary, false)); + source.SetResult(addresses); + }); + return source.Task; + } + + static Task> GetPositionsForAddressAsync(string address) + { + var geocoder = new CLGeocoder(); + var source = new TaskCompletionSource>(); + geocoder.GeocodeAddress(address, (placemarks, error) => + { + if (placemarks == null) + placemarks = new CLPlacemark[0]; + IEnumerable 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 -- cgit v1.2.3