2017-02-17 17 views
2

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

Я следовал учебник: https://www.youtube.com/watch?v=cx5O9GfOnS4

Но когда я пытаюсь сделать «position.Longitude» или «position.Latitude», строка 34, это говорит о том, что позиция не может быть найден. Мне нужна помощь, чтобы исправить эту ошибку и понять, как заставить ее работать.

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

namespace WorkingWithMaps 
{ 
    public class PinPage : ContentPage 
    { 
     Map map; 

     public PinPage() 
     { 
      map = new Map { 
       IsShowingUser = true, 
       HeightRequest = 100, 
       WidthRequest = 960, 
       VerticalOptions = LayoutOptions.FillAndExpand 


      }; 

      var locator = CrossGeolocator.Current; 
      locator.DesiredAccuracy = 50; 
      var position = locator.GetPositionAsync(timeoutMilliseconds: 10000); 
      map.MoveToRegion (MapSpan.FromCenterAndRadius (


      new Position (position.Longitude, position.Latitude), Distance.FromMiles (1))); // current pos 

      //var position = new Position(-26.077740, 28.010100); // Latitude, Longitude 

      var pin = new Pin { 
       Type = PinType.Place, 
       //Position = position, 
       Label = "Test", 
       Address = "Test..." 
      }; 
      map.Pins.Add(pin); 

      //this works but I need current location not hard coded lat/lng 
      //map.MoveToRegion (MapSpan.FromCenterAndRadius (
      //new Position (-26.077740, 28.010100), Distance.FromMiles (1))); // S4C location 

      //var position = new Position(-26.077740, 28.010100); // Latitude, Longitude 
      // var pin = new Pin { 
      // Type = PinType.Place, 
      // Position = position, 
      // Label = "Test", 
      // Address = "Test..." 
      // }; 
      // map.Pins.Add(pin); 


      // create buttons 
      var morePins = new Button { Text = "Show Pins Near Me" }; 
      morePins.Clicked += (sender, e) => { 
       map.Pins.Add(new Pin { 
        Position = new Position(-26.074932, 28.012136), 
        Label = "123" 
       }); 
       map.Pins.Add(new Pin { 
        Position = new Position(-26.080752, 28.026094), 
        Label = "321" 
       }); 
       map.MoveToRegion (MapSpan.FromCenterAndRadius (
        new Position (-26.077740, 28.010100), Distance.FromMiles (2))); // this distance shows dealerships to current position 

      }; 
      var reLocate = new Button { Text = "Re-center" }; 
      reLocate.Clicked += (sender, e) => { 
       map.MoveToRegion (MapSpan.FromCenterAndRadius (
        new Position (-26.077740, 28.010100), Distance.FromMiles (0.5))); 
      }; 
      var buttons = new StackLayout { 
       Orientation = StackOrientation.Horizontal, 
       Children = { 
        morePins, reLocate 
       } 
      }; 

      // put the page together 
      Content = new StackLayout { 
       Spacing = 0, 
       Children = { 
        map, 
        buttons 
       } 
      }; 
     } 
    } 
} 

EDIT: Новый код Текущий выпуск: * Она не показывает мое текущее местоположение и сравнить его с местом «Тест», чтобы показать расстояние между «Текущим местоположением» и их.

Обратите внимание: если я использую координаты, например, (022225,555552) вместо «position.Longitude, position.Latitude», то он работает, но он не использует GPS для получения моего текущего местоположения. Пожалуйста, сообщите, где я ошибся и как это исправить.

Вот новый код:

using Plugin.Geolocator; 
using System; 
using System.Threading.Tasks; 
using Xamarin.Forms; 
using Xamarin.Forms.Maps; 

namespace WorkingWithMaps 
{ 
public class PinPage : ContentPage 
{ 

    Map map; 



    public PinPage() 
    { 
     map = new Map { 
      IsShowingUser = true, 
      HeightRequest = 100, 
      WidthRequest = 960, 
      VerticalOptions = LayoutOptions.FillAndExpand 



     }; } 

     protected async override void OnAppearing() 
    { 

     // create buttons 


      var morePins = new Button { Text = "Show Tests Near Me" }; 
      //current pos 
      var locator = CrossGeolocator.Current; 
      locator.DesiredAccuracy = 50; 


      var position = await locator.GetPositionAsync(timeoutMilliseconds: 10000); 
      var reLocate = new Button { Text = "Re-center" }; 
      reLocate.Clicked += (sender, e) => { 
      map.MoveToRegion(MapSpan.FromCenterAndRadius(
      new Position(position.Longitude, position.Latitude), Distance.FromMiles(0.5))); 


      }; 


      var buttons = new StackLayout 
      { 
       Orientation = StackOrientation.Horizontal, 
       Children = { 
       morePins, reLocate 
      } 
      }; 

      morePins.Clicked += (sender, e) => { 
      map.Pins.Add(new Pin { 
       Position = new Position(-26.074932, 28.012136), 
       Label = "Test 1" 

      }); 
      map.Pins.Add(new Pin { 
       Position = new Position(-26.080752, 28.026094), 
       Label = "Test 2" 
      }); 
      map.MoveToRegion(MapSpan.FromCenterAndRadius(
      new Position(position.Longitude, position.Latitude), Distance.FromMiles(2))); // this distance shows tests to current position 

      }; 


     // put the page together 
     Content = new StackLayout { 
      Spacing = 0, 
      Children = { 
       map, 
       buttons 
      }}; 

     } 
    } 
    } 

ИСПРАВЛЕНО: Я имел порядок лат и долго местами так вот почему он не находил свою позицию. Глупая ошибка. Спасибо всем за вклад!

ответ

2

Вы получаете позицию от asyncmethod, которой у вас будет await.

var position = await locator.GetPositionAsync(timeoutMilliseconds: 10000);

Однако это одно изменение не будет работать в вашем случае, потому что вам нужно будет пометить конструктор, как async, которое не возможно.

Однако вы можете переопределить OnAppearing и сделать его ASync:

public async override OnAppearing() 
{ 
    var position = await locator.GetPositionAsync(timeoutMilliseconds: 10000); 
    // ... 
}  
+0

Привет, Я пробовал этот путь сейчас, и он не получает мое текущее местоположение и сравнивает его с «тестовыми» координатами. Я обновил свой пост выше и добавил новый код в разделе «Редактировать». Пожалуйста, взгляните и дайте мне знать, как я могу зафиксировать текущую позицию, которая не появляется. –

+0

Глядя на ваш первоначальный вопрос, кажется, вы его исправили! :-) – Krumelur

+0

У меня есть. Цените все входные данные! –

0

Вы должны ждать locator.GetPositionAsync(timeoutMilliseconds: 10000); перед передачей результата в map. Что-то вроде этого -

Task.Run(async() => 
     { 
      var position = await locator.GetPositionAsync(timeoutMilliseconds: 10000); 
      map.MoveToRegion (MapSpan.FromCenterAndRadius (


      new Position (position.Longitude, position.Latitude), Distance.FromMiles (1))); // current pos 

      //var position = new Position(-26.077740, 28.010100); // Latitude, Longitude 

      var pin = new Pin { 
       Type = PinType.Place, 
       //Position = position, 
       Label = "Test", 
       Address = "Test..." 
      }; 
      map.Pins.Add(pin); 
     }); 
+0

'GetPositionAsync()' уже async - зачем вы помещаете его в отдельный поток с помощью 'Task.Run()'? Хотя это работает, это неправильный способ решения этого. – Krumelur

+0

Кажется, исправил его, хотя местоположение неточно на эмуляторе, и попробовал его на устройстве для проверки в ближайшее время. Благодаря! –