Windows phone 8 gps / проблемы с высотой

ОБНОВЛЕНИЕ: используя образец отсюда — http://code.msdn.microsoft.com/wpapps/Location-sample-f11aa4e7 и добавив показания высоты, я получаю то же самое, что и мой код. Плохая точность отклоняется на 50 футов. Переход туда и обратно между 720 (правильно) и 300 футов означает, что что-то не так. Я просто не вижу, где...

Я начинаю делать приложение GPS-слежения для Windows Phone 8, но что-то идет не так. В моем приложении (и в примере приложения определения местоположения) я получаю правильные показания, а некоторые нет. В общем, высота прыгает туда-сюда между ~95 и ~215 (при правильном значении 215). Расстояние, которое я получаю, также чрезвычайно неточное, быстро прыгая на несколько миль, когда я сижу за своим столом или прогуливаюсь по улице.

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

    double maxSpeed = 0.0;
    double maxAlt = -9999999.0;
    double minAlt = 9999999.0;
    double curDistance = 0.0;
    GeoCoordinate lastCoord = null;
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        if ((bool)IsolatedStorageSettings.ApplicationSettings["LocationConsent"] != true)
        {
            // The user has opted out of Location.
            return;
        }


        if (App.Geolocator == null)
        {
            // Use the app's global Geolocator variable
            App.Geolocator = new Geolocator();
        }

        App.Geolocator.DesiredAccuracy = PositionAccuracy.High;
        //App.Geolocator.MovementThreshold = 1; // The units are meters.
        App.Geolocator.ReportInterval = 1000;
        //App.Geolocator.DesiredAccuracyInMeters = 50;
        App.Geolocator.StatusChanged += geolocator_StatusChanged;
        App.Geolocator.PositionChanged += geolocator_PositionChanged;

        /*
        geolocator = new Geolocator();
        geolocator.DesiredAccuracy = PositionAccuracy.High;
        //geolocator.MovementThreshold = 1; // The units are meters.
        geolocator.ReportInterval = 1000;
        geolocator.StatusChanged += geolocator_StatusChanged;
        geolocator.PositionChanged += geolocator_PositionChanged;
         * 
         * */
        logging = true;

        startTime = DateTime.Now;


    }
public static GeoCoordinate ConvertGeocoordinate(Geocoordinate geocoordinate)
    {
        return new GeoCoordinate
            (
            geocoordinate.Latitude,
            geocoordinate.Longitude,
            geocoordinate.Altitude ?? Double.NaN,
            geocoordinate.Accuracy,
            geocoordinate.AltitudeAccuracy ?? Double.NaN,
            geocoordinate.Speed ?? Double.NaN,
            geocoordinate.Heading ?? Double.NaN
            );
    }
void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
    {
        Dispatcher.BeginInvoke(() =>
        {
            if (lastCoord == null)
            {
                lastCoord = ConvertGeocoordinate(args.Position.Coordinate);
            }
            DateTime currentTime = DateTime.Now;

            TimeSpan totalTime = currentTime - startTime;

            timeValue.Text = totalTime.ToString(@"hh\:mm\:ss");


            System.Diagnostics.Debug.WriteLine(args.Position.Coordinate.Altitude.ToString());


            GeoCoordinate thisLocation = ConvertGeocoordinate(args.Position.Coordinate);



            if (true)  //units check true = standard
            {
                double speed = (double)thisLocation.Speed;
                speed *= 2.23694; //m/s -> mph
                speedValue.Text = speed.ToString("0");

                double alt = (double)thisLocation.Altitude;
                if (alt > maxAlt)
                {
                    maxAlt = alt;
                }
                if (alt < minAlt)
                {
                    minAlt = alt;
                }
                /*
                double currentAlt = (maxAlt - minAlt);
                currentAlt *= 3.28084; //m -> ft
                 * */
                alt *= 3.28084;
                altValue.Text = alt.ToString("0");

                double distance = thisLocation.GetDistanceTo(lastCoord);

                curDistance += distance;

                distance = curDistance * 0.000621371; // m -> miles

                distanceValue.Text = distance.ToString("0.00");

                distanceUnits.Text = "(mi)";
                speedUnits.Text = "(mph)";
                altUnits.Text = "(ft)";

            }


        });
    }

РЕДАКТИРОВАТЬ: я не упоминал, но скорость в порядке, как к вашему сведению. широта и долгота в целом довольно близки к тому, где я нахожусь, поэтому я не думаю, что это аппаратная проблема.

ОБНОВЛЕНИЕ: при остановке в отладчике для проверки значения вместо того, чтобы просто распечатать его, выдается следующее:

Высота = Произошла внутренняя ошибка при оценке метода Windows.Devices.Geolocation.Geocoordinate.get_Altitude()

Я пытался найти это, но ошибка нигде не найдена в Интернете...

В документации указано, что высота и некоторые другие параметры не гарантируются, но также говорится, что значение будет нулевым, если его нет. Я проверяю, и он никогда не равен нулю. Он всегда печатает значение, либо правильное, либо отклоненное примерно на 400 футов.

ОБНОВЛЕНИЕ: Пример кода:

void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
    {
        System.Diagnostics.Debug.WriteLine(args.Position.Coordinate.Altitude.ToString());


        if (!App.RunningInBackground)
        {
            Dispatcher.BeginInvoke(() =>
            {
                LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.00");
                LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.00");

            });
        }
        else
        {
            Microsoft.Phone.Shell.ShellToast toast = new Microsoft.Phone.Shell.ShellToast();
            toast.Content = args.Position.Coordinate.Latitude.ToString("0.00");
            toast.Title = "Location: ";
            toast.NavigationUri = new Uri("/MainPage.xaml", UriKind.Relative);
            toast.Show();

        }
    }

person clarky    schedule 11.12.2012    source источник
comment
У меня такой же опыт, но не решение.   -  person Guldan    schedule 20.03.2013


Ответы (1)


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

person David Hayes    schedule 14.05.2013