C#中的地理定位技术

13

我正在尝试开发一款类似游戏的应用程序。用户会在城市中有一些位置,需要在每个位置上进行相应的操作。为了追踪用户的位置,我尝试使用以下代码来获取地理位置:

Geolocator geolocator = new Geolocator();
//geolocator.DesiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.High;
geolocator.DesiredAccuracyInMeters = 50;
try
{
    Geoposition geoposition = await geolocator.GetGeopositionAsync(TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));
    textLatitude.Text = "Latitude: " + geoposition.Coordinate.Latitude.ToString("0.0000000000");
    textLongitude.Text = "Longitude: " + geoposition.Coordinate.Longitude.ToString("0.0000000000");
    textAccuracy.Text = "Accuracy: " + geoposition.Coordinate.Accuracy.ToString("0.0000000000");
}

我使用以下方法获取坐标,并尝试使用以下代码测试设备是否可以正确定位我的位置:

使用以下方式获取坐标,我尝试使用以下代码测试设备是否能够正确地定位我的位置:

if( Math.Abs(geoposition.Coordinate.Latitude - 45.3285) < 0.001 ){
    if (Math.Abs(geoposition.Coordinate.Longitude - 14.4474) < 0.001)
    {
        txt.Text = "KONT";              
    }
}

问题在于位置的准确度非常低,如果我尝试使用更精确的坐标,它再也无法获得相同的坐标,并且使用这个代码后准确度非常差(甚至可能会失败300米)。

有人有什么办法可以获取更可靠的位置,或者另一种修复方法吗?

3个回答

9

我认为问题出现的原因是你给了Geolocator.GetGeopositionAsync - timeout太少的时间,以至于无法进行适当的读取:

Geoposition geoposition = await geolocator.GetGeopositionAsync(TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));

你只给了它1秒钟的时间,而获取更准确的位置需要时间。
我的例子:
Geolocator geolocator;
Geoposition geoposition;
public MainPage()
{
   this.InitializeComponent();
   geolocator = new Geolocator();
   geolocator.DesiredAccuracyInMeters = 10;
   geolocator.ReportInterval = 0;

   myButton.Click += async (sender, e) =>
       {
           geoposition = await geolocator.GetGeopositionAsync();
           string latitude = geoposition.Coordinate.Latitude.ToString("0.0000000000");
           string Longitude = geoposition.Coordinate.Longitude.ToString("0.0000000000");
           string Accuracy = geoposition.Coordinate.Accuracy.ToString("0.0000000000");
       };
}

上面的代码返回一个位置(在我的情况下),精度约为35米,但需要等待大约20-30秒。请注意,精度取决于可用卫星数量。
此外,MSDN中还有一些说明:
  1. Geolocator.ReportInterval 设置为0:

    需要实时数据的应用程序应将ReportInterval设置为0,表示未指定最小间隔。在Windows上,当报告间隔为0时,应用程序以最准确的位置源发送事件的频率接收事件。在Windows Phone上,应用程序将以由应用程序请求的精度决定的速率接收更新。

  2. Geolocator.DesiredAccuracyInMeters 设置为10米:

    ◾如果用户正在尝试共享其位置,则应用程序应请求约10米的精度。

  3. 尝试在启动Geolocator和读取它之间进行延迟:

    考虑启动延迟。第一次应用程序请求位置数据时,位置提供程序可能会有短暂的延迟(1-2秒)启动。在设计应用程序的UI时请考虑这一点。例如,您可能希望避免阻塞其他任务,直到完成对GetGeopositionAsync的调用。


谢谢,我明天会尝试(我现在没有手机来测试) 希望它能够正常工作 :) - user2700896
如果您不确定,请不要将其标记为已解决 - 在测试后再进行标记 :) 在这种情况下,它应该可以工作,但可能存在其他问题。 - Romasz

0

至少对我来说,代码运行正常,我得到了“txt.Text =“KONT” 你在哪里找到你的常量纬度或经度?


嗯...很奇怪你会到达写着txt.Text = "KONT"的那一行,因为那是克罗地亚的一个位置。我去过那里并记录了坐标,只是为了测试而硬编码它们 :) - user2700896
我使用了我的坐标 :-P 我将我的坐标取到与你相同的小数位数,然后尝试了这种方法。你是在使用真实设备还是模拟器?如果是设备,那么是哪一款? - Mulflar

-2

试试这个:

Geolocator.DesiredAccuracy = PositionAccuracy.High;

我已经尝试过那个(这就是为什么Geolocator.DesiredAccuracy = PositionAccuracy.High;这一行被注释掉的原因)。准确度仍然非常低...我尝试重新测试,准确度为1342米。 - user2700896

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接