有没有可以在Python中使用的GPS库?
我在找一个可以处理GPS坐标的Python库。比如说,我有一串坐标:
>>> gps = [
... (53.25012925, −6.24479338, 349.9, '2011-08-20T09:35:00Z'),
... (53.25028285, -6.24441800, 359.9, '2011-08-20T09:35:30Z'),
... (53.25049500, -6.24266032, 395.9, '2011-08-20T09:36:00Z'),
... # and so on...
... ]
>>>
我想计算平均速度、距离、最高点和其他一些信息。我知道这些计算其实很简单,但我在想有没有现成的代码可以用(我不想重新发明轮子)。
注意:在StackOverflow上有类似的问题(你会推荐哪个Python的GPS库?),但那个是关于GPSD的。我并不在使用任何设备,我只是有一个文本文件里存了GPS坐标。
2 个回答
3
你可以考虑使用GPSD的一部分数据,而不是从头开始写代码。下面的代码来自GPSD的源代码,它有一个模块可以从GPS数据流中生成路径(然后可以计算路径的长度等等)。
http://code.google.com/p/python-gpsd/source/browse/src/nmea/track.py
class Track(object):
def __init__(self, recordDelay=10, maxSize=3600, ignoreDuplicates=True, duplicateRange=0.0001):
""" Constructor
The default values allow for 10 hours worth of data recorded
at 10 second intervals.
recordDelay - Delay between recording data points
maxSize - Maximum number of points to record
ignoreDuplicates - Ignore entries that are very similar (ie moved a minimal distance)
duplicateRange - Varience range within a duplicate is detected (adjust to account for
subtle gps position drift)
"""
self.recordDelay = recordDelay
self.maxSize = maxSize
self.ignoreDuplicates = ignoreDuplicates
self.duplicateRange = duplicateRange
self.positions = []
self.latest = None
def append(self, position, heading, timeStamp=None):
""" Append position and heading information """
if timeStamp is None: timeStamp = datetime.utcnow()
self.latest = (timeStamp, position, heading)
if len(self.positions):
last = self.positions[0]
else:
last = None
# Make sure we re in range
if last is None or (timeStamp - last[0]).seconds >= self.recordDelay:
self.positions.insert(0, self.latest)
self.latest = None
# Clear extra data
if len(self.positions) > self.maxSize: pass
def clear(self):
""" Clear all items from track """
self.positions = []
self.latest = None
def __len__(self):
""" Return the length of the track """
if self.latest is None: return len(self.positions)
return len(self.positions) + 1
def __getslice__(self, i, j):
return self.positions[i:j]
def __getitem__(self, i):
return self.positions[i]
def get_latest(self):
if self.latest is None and len(self.positions) > 0:
return self.positions
def get_by_time(self, timeRange, now=datetime.utcnow()):
""" Returns the last n items within the time range """
result = []
if self.latest is not None: result.append(self.latest)
for position in self.positions:
if (now - position[0]).seconds > timeRange: break
result.append(position)
return result
4
我发现了一个有趣的库,叫做 geopy。这个库可以计算两个GPS点之间的距离(它使用的是大圆距离和文森提距离的方法)。更棒的是,geopy 还可以进行地理编码(也就是说,它可以从地址中获取GPS坐标)。
至于其他功能(比如平均速度、最高点等等),我可以自己动手搞定。