C#中的地理位置

use*_*896 12 c# geolocation windows-phone windows-phone-8.1

我正在尝试开发一个应该像游戏一样的应用程序.用户在城市中会有一些位置,他必须在每个位置做一些事情.为了跟踪用户的位置,我尝试使用以下代码进行地理定位:

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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

问题是位置的准确性非常小,如果我尝试使用更精确的坐标,它将永远不会再次获得相同的坐标,并且使用此代码,准确度非常差(甚至可能无法达到300米).

有谁知道如何获得更可靠的位置,或其他方法来解决这个问题?

Rom*_*asz 9

我认为问题出现了,因为你给Geolocator提供太少的时间用Geolocator.GetGeopositionAsync做出正确的读数- 超时:

Geoposition geoposition = await geolocator.GetGeopositionAsync(TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));
Run Code Online (Sandbox Code Playgroud)

你给它只有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");
       };
}
Run Code Online (Sandbox Code Playgroud)

上面的代码恢复了一个位置(在我的情况下),精度为~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的调用之前阻止阻止其他任务.