Плохое расположение Google Maps Xamarin Forms (Середина океана) - PullRequest
0 голосов
/ 18 декабря 2018

Я использую Xamarin.forms.Maps и ExtendedMap, я сделал собственный элемент управления, здесь я могу получить местоположение, когда пользователь нажимает на карту, но по умолчанию положение карты находится в середине океана, что-то вродеэто 0,0756931, 0,0786793.Я искал и пытался некоторое время, но я не нашел решения.Я видел, что карта загружает region.LatitudeDegrees и region.LongitudeDegrees, но я действительно не понимаю, почему это происходит.

Xamarin.Forms 3.0.0.482510

Xamarin.Forms.Maps3.0.0.482510

Xamarin.Plugin.ExternalMaps 4.0.1

MapGoogleView.xaml

<local:ExtendedMap 
                WidthRequest="320" HeightRequest="200"
                x:Name="MyMap"  Tap="OnTap"
                IsShowingUser="true"
                MapType="Street"/>

MapGoogleView.xaml.cs

public MapGoogleView(double lat, double lon)
        {

                InitializeComponent();
                NavigationPage.SetHasNavigationBar(this, false);

                var map = new ExtendedMap(
                    MapSpan.FromCenterAndRadius(
                        new Position(lat, lon), Distance.FromMiles(0.3)))
                {
                    IsShowingUser = true,
                    HeightRequest = 100,
                    WidthRequest = 900,
                    VerticalOptions = LayoutOptions.FillAndExpand,
                    MapType = MapType.Street
                };
 var stack = new StackLayout { Spacing = 0 };
                stack.Children.Add(map);
                Content = stack;

var position = new Position(lat, lon); // Latitude, Longitude
                var pin = new Pin
                {
                    Type = PinType.Generic,
                    Position = position,
                    Label = "Ubicación",
                    Address = "Latitud: " + lat.ToString() + ", Longitud: " + lon.ToString(),
                };
                MyMap.Pins.Add(pin);
                map.MoveToRegion(
                MapSpan.FromCenterAndRadius(
                new Position(lat, lon), Distance.FromMiles(1)));
}

ExtendedMap.cs

public class ExtendedMap : Map
    {
        public event EventHandler<TapEventArgs> Tap;

        public ExtendedMap()
        {

        }

        public ExtendedMap(MapSpan region) : base(region)
        {

        }

        public void OnTap(Position coordinate)
        {
            OnTap(new TapEventArgs { Position = coordinate });
        }

public async void OnTap(Position coordinate)
        {
            try
            {

                    OnTap(new TapEventArgs { Position = coordinate });
            }
            catch (Exception error)
            {

                await Application.Current.MainPage.DisplayAlert(
                    "Error",
                    error.Message,
                    "Aceptar");

                return;
            }
        }

        protected virtual void OnTap(TapEventArgs e)
        {
            var handler = Tap;
            if (handler != null) handler(this, e);
        }
    }

    public class TapEventArgs : EventArgs
    {
        public Position Position { get; set; }
    }
}

Droid ExtendedMapRenderer.cs

public class ExtendedMapRenderer : MapRenderer, IOnMapReadyCallback
    {
        private GoogleMap _map;



        public void OnMapReady(GoogleMap googleMap)
        {
            _map = googleMap;
            if (_map != null)
                //_map.GestureRecognizer.Add(new);
                _map.MapClick += googleMap_MapClick;
        }

        public ExtendedMapRenderer()
        {

        }
        protected override void OnElementChanged(ElementChangedEventArgs<Map> e) //cambiar a xamarin.forms.view
        {
            if (_map != null)
                _map.MapClick -= googleMap_MapClick;
            base.OnElementChanged(e);
            if (Control != null)
                ((MapView)Control).GetMapAsync(this);
        }

        private void googleMap_MapClick(object sender, GoogleMap.MapClickEventArgs e)
        {

            ((ExtendedMap)Element).OnTap(new Position(e.Point.Latitude, e.Point.Longitude));
        }


    }

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я нашел решение, реализовав всю логику в проекте Android, потому что я не решил проблему в переносимом проекте.

Существует решение

https://forums.xamarin.com/discussion/comment/358953#Comment_358953

0 голосов
/ 19 декабря 2018

Если вы пытаетесь получить координаты широты и долготы с помощью плагинов, описанных выше, вы можете получить свои устройства lon / lat, выполнив следующие действия:

Загрузите и установите в свое приложение Плагин геолокации .Сделанный человеком мифом легенда Джеймс Монтемагно .

После этого вы можете следовать этому руководству, чтобы получить координаты долготы и широты вашего устройства.

После этого вы можете назначить свои глобальные переменные lat и lon значениям, полученным с помощью этого плагина.Я не знаю, делали ли вы это до создания ваших карт или использовали другой метод, но я получаю свои устройства Lat & Lon.

В качестве запасного варианта, если устройство отключило местоположение или нетИмея возможность извлекать свои GPS-данные, я всегда устанавливаю свой широту по умолчанию для столицы региона страны устройства.

RegionInfo.CurrentRegion

тогда, если Великобритания установит широту, например, в центр Лондона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...