web-dev-qa-db-ja.com

C#でのジオロケーション

ゲームのようなアプリケーションを開発しようとしています。ユーザーは都市にいくつかの場所を持ち、それぞれの場所で何かをしなければなりません。ユーザーの位置を追跡するために、次のコードで位置情報を使用してみました。

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メートルでも失敗する可能性があります)。

より信頼性の高い場所を取得する方法、またはそれを修正する別の方法を誰かが考えていますか?

12
user2700896

Geolocator.GetGeopositionAsync-timeout :を使用して、Geolocatorが適切な読み取りを行うための時間が少なすぎるため、問題が発生すると思います。

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の呼び出しが完了するまで、他のタスクをブロックしないようにすることができます。

9
Romasz

少なくとも私にとっては、コードは正常に機能しています。「txt.Text = "KONT」にアクセスします。緯度または経度が一定しているのはどこですか?

0
Mulflar