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.UWP/GeocoderBackend.cs | 86 +++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Xamarin.Forms.Maps.UWP/GeocoderBackend.cs (limited to 'Xamarin.Forms.Maps.UWP/GeocoderBackend.cs') diff --git a/Xamarin.Forms.Maps.UWP/GeocoderBackend.cs b/Xamarin.Forms.Maps.UWP/GeocoderBackend.cs new file mode 100644 index 00000000..10f624a6 --- /dev/null +++ b/Xamarin.Forms.Maps.UWP/GeocoderBackend.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Windows.Devices.Geolocation; +using Windows.Services.Maps; + +#if WINDOWS_UWP + +namespace Xamarin.Forms.Maps.UWP +#else + +namespace Xamarin.Forms.Maps.WinRT +#endif +{ + internal class GeocoderBackend + { + public static void Register() + { + Geocoder.GetPositionsForAddressAsyncFunc = GetPositionsForAddress; + Geocoder.GetAddressesForPositionFuncAsync = GetAddressesForPositionAsync; + } + + static string AddressToString(MapAddress address) + { + string building = "", house = "", city = "", country = ""; + + var bldg = new List(); + if (!"".Equals(address.BuildingRoom)) + bldg.Add(address.BuildingRoom); + if (!"".Equals(address.BuildingFloor)) + bldg.Add(address.BuildingFloor); + if (!"".Equals(address.BuildingName)) + bldg.Add(address.BuildingName); + if (!"".Equals(address.BuildingWing)) + bldg.Add(address.BuildingWing); + if (bldg.Count > 0) + building = string.Join(" ", bldg) + Environment.NewLine; + + var hs = new List(); + if (!"".Equals(address.StreetNumber)) + hs.Add(address.StreetNumber); + if (!"".Equals(address.Street)) + hs.Add(address.Street); + if (hs.Count > 0) + house = string.Join(" ", hs) + Environment.NewLine; + + var cs = new List(); + if (!"".Equals(address.Town)) + cs.Add(address.Town); + if (!"".Equals(address.Neighborhood)) + cs.Add(address.Neighborhood); + else if (!"".Equals(address.Region)) + cs.Add(address.Region); + if (!"".Equals(address.PostCode)) + cs.Add(address.PostCode); + if (cs.Count > 0) + city = string.Join(" ", cs) + Environment.NewLine; + + if (!"".Equals(address.Country)) + country = address.Country; + return building + house + city + country; + } + + static async Task> GetAddressesForPositionAsync(Position position) + { + var queryResults = + await + MapLocationFinder.FindLocationsAtAsync( + new Geopoint(new BasicGeoposition { Latitude = position.Latitude, Longitude = position.Longitude })); + var addresses = new List(); + foreach (var result in queryResults?.Locations) + addresses.Add(AddressToString(result.Address)); + + return addresses; + } + + static async Task> GetPositionsForAddress(string address) + { + var queryResults = await MapLocationFinder.FindLocationsAsync(address, null, 10); + var positions = new List(); + foreach (var result in queryResults?.Locations) + positions.Add(new Position(result.Point.Position.Latitude, result.Point.Position.Longitude)); + return positions; + } + } +} \ No newline at end of file -- cgit v1.2.3