Skip to content

Instantly share code, notes, and snippets.

@devjaime
Created April 19, 2019 13:36
Show Gist options
  • Select an option

  • Save devjaime/d12625c1443b9730378a37c5c0b67ca2 to your computer and use it in GitHub Desktop.

Select an option

Save devjaime/d12625c1443b9730378a37c5c0b67ca2 to your computer and use it in GitHub Desktop.
Geocoding ViewModel
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