如何从拉特朗获得地址

时间:2018-12-10 12:22:04

标签: google-maps xamarin.forms location

您好,我正在为iOS和Android创建App。我想在页面上的负载上解决该问题,我想显示带有地址的地图。我可以成功获得Lat Long,但是我无法获得要在标签上显示的地址。以下是我正在使用的代码。

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;
            }
        }

我还尝试获取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 
    }

1 个答案:

答案 0 :(得分:3)

您可以使用Xamarin.Essentials如下获得地标地址,

 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);
        }
    }

请参阅此link以获取详细信息 此外,this one用于详细实施