2011-09-08 28 views
4

我正在寻找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(Which gps library would you recommend for python?)中也有类似的问题,但它是关于GPSD的。我没有使用任何设备,我只是在文本文件中有GPS坐标。

+0

一个很好的问题。澄清:对于距离,你是指理想的表面距离(将地球视为理想的椭球体),基于大地水准面的实际表面距离,还是基于测量的地形的实际表面距离?最后需要一个地形数据库。 – wberry

+0

距离我的意思是理想的表面距离。只需计算两点之间的距离。 – vasco

+0

@vasco由于您已经在坐标上操作,所以此问题与GPS完全无关。因此,对于北斗,伽利略,格洛纳斯或人力投入所获得的职位,它可以很好地工作。 – phihag

回答

2

我已发现命名geopy一个有趣的库中的模块。它可以计算两个GPS点之间的距离(它使用大圆距离和Vincenty距离方法)。最重要的是,geopy可以做地理编码(它可以从地址获得GPS坐标)。

其他功能(平均速度,最高点等)我可以自己破解。

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 
+1

感谢您的回答。我查看了代码,但最后,我会使用geopy库。 – vasco

+1

感谢您发布您最终使用的解决方案! –

相关问题