blob: 42b964572e2d57d208411b5b61de7b4c73cebf3a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;
}
}
}
|