diff options
Diffstat (limited to 'Xamarin.Forms.Maps.UWP/GeocoderBackend.cs')
-rw-r--r-- | Xamarin.Forms.Maps.UWP/GeocoderBackend.cs | 86 |
1 files changed, 86 insertions, 0 deletions
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<string>(); + 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<string>(); + 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<string>(); + 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<IEnumerable<string>> GetAddressesForPositionAsync(Position position) + { + var queryResults = + await + MapLocationFinder.FindLocationsAtAsync( + new Geopoint(new BasicGeoposition { Latitude = position.Latitude, Longitude = position.Longitude })); + var addresses = new List<string>(); + foreach (var result in queryResults?.Locations) + addresses.Add(AddressToString(result.Address)); + + return addresses; + } + + static async Task<IEnumerable<Position>> GetPositionsForAddress(string address) + { + var queryResults = await MapLocationFinder.FindLocationsAsync(address, null, 10); + var positions = new List<Position>(); + 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 |