Гладкие данные GPS - PullRequest
       47

Гладкие данные GPS

138 голосов
/ 16 июля 2009

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

Я задавался вопросом о каком-нибудь достаточно простом способе избежать этого. В качестве первой идеи я подумал об отбрасывании значений с точностью выше определенного порога, но я думаю, что есть и другие более эффективные способы. Как это обычно делают программы?

Ответы [ 11 ]

0 голосов
/ 06 ноября 2014

Отображается на CoffeeScript, если кому-то интересно. ** редактировать -> извините, используя магистраль тоже, но вы поняли идею.

Немного изменен, чтобы принимать маяк с атрибутами

{широта: item.lat, долгота: item.lng, дата: новая Дата (item.effective_at), точность: item.gps_accuracy}

MIN_ACCURACY = 1

# mapped from /1145855/gladkie-dannye-gps

class v.Map.BeaconFilter

  constructor: ->
    _.extend(this, Backbone.Events)

  process: (decay,beacon) ->

    accuracy     = Math.max beacon.accuracy, MIN_ACCURACY

    unless @variance?
      # if variance nil, inititalise some values
      @variance     = accuracy * accuracy
      @timestamp_ms = beacon.date.getTime();
      @lat          = beacon.latitude
      @lng          = beacon.longitude

    else

      @timestamp_ms = beacon.date.getTime() - @timestamp_ms

      if @timestamp_ms > 0
        # time has moved on, so the uncertainty in the current position increases
        @variance += @timestamp_ms * decay * decay / 1000;
        @timestamp_ms = beacon.date.getTime();

      # Kalman gain matrix K = Covarariance * Inverse(Covariance + MeasurementVariance)
      # NB: because K is dimensionless, it doesn't matter that variance has different units to lat and lng
      _k  = @variance / (@variance + accuracy * accuracy)
      @lat = _k * (beacon.latitude  - @lat)
      @lng = _k * (beacon.longitude - @lng)

      @variance = (1 - _k) * @variance

    [@lat,@lng]
...