A.Goutam
A.Goutam

Reputation: 3494

How to get Address from Lat Long

Hello i am creating App for iOS and Android. The issue i want to fix that on the load on page i want to display the map with the address. I can get Lat Long successfully but i cannot getting address that i want to display on a label. Below is my code that i am using.

using Plugin.Geolocator;
using Xamarin.Forms.Maps;

  private Position _position;
    // Map map;
    double Lat, Long;
    string address = "";

   public TestPage()
    {
        NavigationPage.SetHasNavigationBar(this, false);
        InitializeComponent();

        GetPosition();
        if (_position != null)
        {
            Lat = _position.Latitude;
            Long = _position.Longitude;
        }
        //Task<String> str = GetAddress();
        map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(Lat, Long), Distance.FromMiles(1)));
        var position = new Position(Lat, Long);
        var pin = new Pin
        {
            Type = PinType.Place,
            Position = position,
            Label = ""                
        };
        map.Pins.Add(pin);
        var zoomLevel = 17.83;
        var latlongdegrees = 360 / (Math.Pow(2, zoomLevel));

        map.MoveToRegion(new MapSpan(position, latlongdegrees, latlongdegrees));

        LabelTime.Text = DateTime.Now.ToString("hh:mm tt") + " " + DateTime.Now.ToString("MM/dd/yyyy");
        string recentAddress = address;  // trying to get adderss for location 
    }

GetPosition()

public async void GetPosition()
    {
        Plugin.Geolocator.Abstractions.Position position = null;
        try
        {
            var locator = CrossGeolocator.Current;
            locator.DesiredAccuracy = 100.0;

            position = await locator.GetLastKnownLocationAsync();

            if (position != null)
            {
                _position = new Position(position.Latitude, position.Longitude);
                //got a cahched position, so let's use it.
                return;
            }

            if (!locator.IsGeolocationAvailable || !locator.IsGeolocationEnabled)
            {
                //not available or enabled
                return;
            }

            position = await locator.GetPositionAsync(TimeSpan.FromSeconds(10), null, true);

        }
        catch (Exception ex)
        {
            // error(ex.Message, Convert.ToString(ex.InnerException), ex.Source, ex.StackTrace);
        }
        _position = new Position(position.Latitude, position.Longitude);
        if (position == null)
            return;

    }

GetAddress()

 public async Task<String> GetAddress()
        {
           // string Addrsss = "";
            try
            {
                Geocoder geoCoder = new Geocoder();

                if (_position != null)
                {
                    var possibleAddresses = await geoCoder.GetAddressesForPositionAsync(_position);
                    await Task.Delay(2000);
                    foreach (var a in possibleAddresses)
                    {
                        address += a + "\n";
                    }
                }
                return address;
            }
            catch (Exception ex)
            {

                throw;
            }
        }

I also try to get the current address on OnAppearing()

protected override void OnAppearing()
    {
        this.Appearing += TestPage_Appearing; //Subscribe to event
        base.OnAppearing();
    }

    protected async void TestPage_Appearing(object sender, EventArgs args)
    {
         GetPosition();
        address= await GetAddress();
        string a = address;
        this.Appearing -= TestPage_Appearing; //Unsubscribe 
    }

Upvotes: 0

Views: 845

Answers (1)

Abdul Gani
Abdul Gani

Reputation: 689

You can get placemark address using Xamarin.Essentials as below,

 protected async override void OnAppearing()
    {
        await GetAddress();
    }

    private async Task GetAddress()
    {
        var lat = 47.673988;
        var lon = -122.121513;

        var placemarks = await Geocoding.GetPlacemarksAsync(lat, lon);

        var placemark = placemarks?.FirstOrDefault();
        if (placemark != null)
        {
            var geocodeAddress =
                $"AdminArea:       {placemark.AdminArea}\n" +
                $"CountryCode:     {placemark.CountryCode}\n" +
                $"CountryName:     {placemark.CountryName}\n" +
                $"FeatureName:     {placemark.FeatureName}\n" +
                $"Locality:        {placemark.Locality}\n" +
                $"PostalCode:      {placemark.PostalCode}\n" +
                $"SubAdminArea:    {placemark.SubAdminArea}\n" +
                $"SubLocality:     {placemark.SubLocality}\n" +
                $"SubThoroughfare: {placemark.SubThoroughfare}\n" +
                $"Thoroughfare:    {placemark.Thoroughfare}\n";

            Console.WriteLine(geocodeAddress);
        }
    }

refer this link for in depth details Also this one for detailed implementation

Upvotes: 3

Related Questions