-
-
Save devjaime/d12625c1443b9730378a37c5c0b67ca2 to your computer and use it in GitHub Desktop.
Geocoding ViewModel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Linq; | |
| using System.Windows.Input; | |
| using Xamarin.Essentials; | |
| using Xamarin.Forms; | |
| namespace Samples.ViewModel | |
| { | |
| public class GeocodingViewModel : BaseViewModel | |
| { | |
| string lat = "47.673988"; | |
| string lon = "-122.121513"; | |
| string address = "Microsoft Building 25 Redmond WA USA"; | |
| string geocodeAddress; | |
| string geocodePosition; | |
| public GeocodingViewModel() | |
| { | |
| GetAddressCommand = new Command(OnGetAddress); | |
| GetPositionCommand = new Command(OnGetPosition); | |
| } | |
| public ICommand GetAddressCommand { get; } | |
| public ICommand GetPositionCommand { get; } | |
| public string Latitude | |
| { | |
| get => lat; | |
| set => SetProperty(ref lat, value); | |
| } | |
| public string Longitude | |
| { | |
| get => lon; | |
| set => SetProperty(ref lon, value); | |
| } | |
| public string GeocodeAddress | |
| { | |
| get => geocodeAddress; | |
| set => SetProperty(ref geocodeAddress, value); | |
| } | |
| public string Address | |
| { | |
| get => address; | |
| set => SetProperty(ref address, value); | |
| } | |
| public string GeocodePosition | |
| { | |
| get => geocodePosition; | |
| set => SetProperty(ref geocodePosition, value); | |
| } | |
| async void OnGetPosition() | |
| { | |
| if (IsBusy) | |
| return; | |
| IsBusy = true; | |
| try | |
| { | |
| var locations = await Geocoding.GetLocationsAsync(Address); | |
| var location = locations?.FirstOrDefault(); | |
| if (location == null) | |
| { | |
| GeocodePosition = "Unable to detect locations"; | |
| } | |
| else | |
| { | |
| GeocodePosition = | |
| $"{nameof(location.Latitude)}: {location.Latitude}\n" + | |
| $"{nameof(location.Longitude)}: {location.Longitude}\n"; | |
| } | |
| } | |
| catch (Exception ex) | |
| { | |
| GeocodePosition = $"Unable to detect locations: {ex.Message}"; | |
| } | |
| finally | |
| { | |
| IsBusy = false; | |
| } | |
| } | |
| async void OnGetAddress() | |
| { | |
| if (IsBusy) | |
| return; | |
| IsBusy = true; | |
| try | |
| { | |
| double.TryParse(lat, out var lt); | |
| double.TryParse(lon, out var ln); | |
| var placemarks = await Geocoding.GetPlacemarksAsync(lt, ln); | |
| var placemark = placemarks?.FirstOrDefault(); | |
| if (placemark == null) | |
| { | |
| GeocodeAddress = "Unable to detect placemarks."; | |
| } | |
| else | |
| { | |
| GeocodeAddress = | |
| $"{nameof(placemark.AdminArea)}: {placemark.AdminArea}\n" + | |
| $"{nameof(placemark.CountryCode)}: {placemark.CountryCode}\n" + | |
| $"{nameof(placemark.CountryName)}: {placemark.CountryName}\n" + | |
| $"{nameof(placemark.FeatureName)}: {placemark.FeatureName}\n" + | |
| $"{nameof(placemark.Locality)}: {placemark.Locality}\n" + | |
| $"{nameof(placemark.PostalCode)}: {placemark.PostalCode}\n" + | |
| $"{nameof(placemark.SubAdminArea)}: {placemark.SubAdminArea}\n" + | |
| $"{nameof(placemark.SubLocality)}: {placemark.SubLocality}\n" + | |
| $"{nameof(placemark.SubThoroughfare)}: {placemark.SubThoroughfare}\n" + | |
| $"{nameof(placemark.Thoroughfare)}: {placemark.Thoroughfare}\n"; | |
| } | |
| } | |
| catch (Exception ex) | |
| { | |
| GeocodeAddress = $"Unable to detect placemarks: {ex.Message}"; | |
| } | |
| finally | |
| { | |
| IsBusy = false; | |
| } | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment