2015-07-11 2 views
2

Я выскабливание веб-API, который отображает широту и долготу автобуса.Расчет скорости с использованием данных общих GPS

Веб-сервис не кажется, есть фиксированное время обновления для позиции GPS, это может занять от 1 секунды до до 30 секунд.

Когда обновление длится долго, я получаю разумную скорость (10 км/ч ~ 80 км/ч), но когда обновление происходит менее чем за 10 секунд, я получаю нереальные скорости до 1000 км/ч.

def haversine(lon1, lat1, lon2, lat2): 
    """Calculate the distance between two points""" 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles 
    return c * r 

def get_speed(new_lat, new_lng, cur_time): 
    old_lat, old_lng, old_time = buses[bus_prefix] 
    if (new_lat, new_lng) != (old_lat, old_lng): 
     distance = haversine(old_lng, old_lat, new_lng, new_lat) 
     speed = distance/(cur_time - old_time) * 3600 
     _speed = "%.1f km/h" % speed 
     updated_time = "%02d:%02d"%(divmod(cur_time-old_time, 60)) 
     return _speed, updated_time 

    return None, None 

url = 'http://api.plataforma.cittati.com.br/m3p/js/vehicles/service/22233' 

buses = {} 

with requests.session() as s: 
    while True: 
     response = s.get(url) 
     t = time.time() 
     content = json.loads(response.content) 
     for bus in content: 
      bus_prefix = bus['prefix'] 
      latitude = bus['lat'] 
      longitude = bus['lng'] 
      if bus_prefix in buses: 
       speed, update_time = get_speed(latitude, longitude, t) 
       if speed and update_time: 
        print "Bus {bus_prefix} is traveling at {speed}\t" \ 
        "Last update in: {update_time}".format(**locals()) 
      buses[bus_prefix] = latitude, longitude, t 
     time.sleep(1) 

Может быть, я делаю некоторые математики неправильно, или автобусы в моем городе мчатся, но я проверил все, включая гонки!

Вот отладки я сделал, чтобы попытаться выяснить, что происходит:

old_lat = -32.0916777778 
new_lat = -32.0937277778 

new_lng = -52.1608333333 
old_lng = -52.1598611111 

distance = 0.245660526035 in kms 

old_time = 1436580324.66 in epoch seconds 
cur_time = 1436580325.94 in epoch seconds 

delta time = 1.28700017929 in seconds 
speed = 687.162214861 in km/h 

Bus 1145 is traveling at 687.2 km/h Last update in: 00:01 

Можно ли обнаружить какую-либо ошибку? Или это правильный подход? Является ли Haversine правильным инструментом для этой работы?

+1

Там будет все виды латентности в системе отчетности, которая приходится на переменной скорости вы видите. Если вы не можете получить отметку времени для отчета GPS, это будет чревато неточностями. Вы можете попробовать скользящую среднюю за несколько минут, чтобы убедиться, что это помогает. –

+0

Я вижу это поле в вашей публикуемой 'url':' «TS»: 1436582318000' .. не правда ли этот штамп времени для '' lat' и значение long' ... если это так, то вы должны прочитать это также и использовать его для ваших вычислений, нет? –

+0

О, да, мне было интересно, что это за номер, я предположил, что это какая-то информация для отслеживания, но это временная метка. Благодаря :) –

ответ

2

С Опубликованная url, я получил происходит некорректно вывод:

[{"plate":"IUZ4600","prefix":"1310","ts":1436583122000,"lat":-32.061505555555556,"lng":-52.147172222222224,"bearing":37},{"plate":"ISO8600","prefix":"1145","ts":1436583099000,"lat":-32.15838333333333,"lng":-52.19098888888889,"bearing":309}]

Это список словарей, в которых я предполагаю каждый словарь имеет в виду одну шину,

В каждом словаре, есть key, называемый ts, он должен быть отметкой времени для каждого обновленного lat и long, его соответствующие value должны использоваться в ваших расчетах для, чтобы дать вам более точные результаты:

t = bus["ts"]

0

Возможная проблема является то, что, так как GPS не супер точный, если измерение 1 и измерения 2 оба охлаждает 100m в противоположных направлениях, что является дополнительными 200 м от расстояния. Чем дольше время, тем меньше это несоответствие влияет на результаты. Я бы сказал, что лучшим решением является только получение обновлений, которые составляют более 15 секунд или около того, и, следовательно, минимизировать ошибку.

Смежные вопросы