GPS data with Python for Symbian

Апрель 19, 2009

Разбираюсь по-тихоньку с питоном под Симбиан… Недавно приобрел себе девайс вот такой, для занятий спортом — есть хорошая программа под нокию, которая умеет считать сколько вы пробежали, построить графики и много прочего, — ну да не о ней пока. Как-то сразу вспомнилось, что был пример в книженции, что можно вот так вот запросто получить информацию с жпс-приемника и даже дан коротенький пример…

import socket

address, services = socket.bt_discover()
print "Discovered: %s, %s" % (address, services)
target = (address, services.values()[0])

conn = socket.socket(socket.AF_BT, socket.SOCK_STREAM)
conn.connect(target)
to_gps = conn.makefile("r", 0)

while True:
	msg = to_gps.readline()
	if msg.startswith("$GPGGA"):
		gps_data = msg.split(",")
		lat = gps_data[2]
		lon = gps_data[4]
		break

to_gps.close()
conn.close()

print "You are now at latitude %s and longitude %s" % (lat, lon)

Отлично, думаю, пригодится — загоняю в телефон не работает! — говорит, что у socket нет такого метода bt_discover — блин, чуваки изменили интерфейс, теперь данный метод переместили в btsocket и надо писать так:

from e32 import pys60_version
if ((pys60_version.split())[0] >= '1.9.1'):
    import btsocket as socket
else:
    import socket

Хорошо, заработало — причем выкидывает стандартный диалог подключения к синезубому девайсу и получает данные, но… они напрочь не совпадают с теми, что я вижу в стандартной программе «Данные GPS» и той спортивной (эти две программы показывают, естественно, одинаково, и, видимо, правильно). Роюсь дальше… Нахожу пример для логирования жпс данных, в котором не просто получаются широта и долгота, но и над ними проводятся нехитрые манипуляции:

 self.utc,
 self.latitude,
 self.northsouth,
 self.longitude,
 self.eastwest,
 self.quality,
 self.number_of_satellites_in_use,
 self.horizontal_dilution,
 self.altitude,
 self.above_sea_unit,
 self.geoidal_separation,
 self.geoidal_separation_unit,
 self.data_age,
 self.diff_ref_stationID) = sentance.split(",")

latitude_in=float(self.latitude)
longitude_in=float(self.longitude)
if self.northsouth == 'S':
	latitude_in = -latitude_in
if self.eastwest == 'W':
	longitude_in = -longitude_in

latitude_degrees = int(latitude_in/100)
latitude_minutes = latitude_in - latitude_degrees*100

longitude_degrees = int(longitude_in/100)
longitude_minutes = longitude_in - longitude_degrees*100

self.latitude = latitude_degrees + (latitude_minutes/60)
self.longitude = longitude_degrees + (longitude_minutes/60)

self.timeOfFix = time.strftime("%H:%M:%S", time.strptime(self.utc.split(".")[0],"%H%M%S"))
self.altitude = float(self.altitude)

После применения данного алгоритма данные начали совпадать! Почти! Последней ложкой дегтя было поведения функции float(), которая преобразует строку в вещественное число, здесь она почему-то откидывает цифирки после запятой — сразу скажу, что питон у меня 1.9.2, последний 1.9.3 не встал, может там это исправили — так что пришлось написать еще и свою реализацию перевода из строки в вещественное число. Теперь все ок. Однако, повозится пришлось: самое неприятное то, что пример в книге неправильный, как так можно?

tags: , ,
posted in Python, Symbian by dmitko

2 Comments to "GPS data with Python for Symbian"

  1. Мичлов wrote:

    Слушай, аффтар, а ты сам писал или перписывал откуда-то?

  2. Heather wrote:

    Ah, i see. Well tht’as not too tricky at all!»

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org