Я выскабливание веб-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 правильным инструментом для этой работы?
Там будет все виды латентности в системе отчетности, которая приходится на переменной скорости вы видите. Если вы не можете получить отметку времени для отчета GPS, это будет чревато неточностями. Вы можете попробовать скользящую среднюю за несколько минут, чтобы убедиться, что это помогает. –
Я вижу это поле в вашей публикуемой 'url':' «TS»: 1436582318000' .. не правда ли этот штамп времени для '' lat' и значение long' ... если это так, то вы должны прочитать это также и использовать его для ваших вычислений, нет? –
О, да, мне было интересно, что это за номер, я предположил, что это какая-то информация для отслеживания, но это временная метка. Благодаря :) –