blob: 08ffbbec507eec4e3d3e37845ab216d48d0fb64d (
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
|
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AddressBookUI;
using CoreLocation;
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;
}
}
}
|