Python,有效的方式来操作坐标对

sfa*_*tor 2 python tuples list coordinates

我有一个数据文件,其中包含纬度和经度信息,我已将其存储为表单的元组列表

[(lat1, lon1), (lat1, lon1), (lat2, lon2), (lat3, lon3), (lat3, lon3)  ...]
Run Code Online (Sandbox Code Playgroud)

如上所示,如果数据文件中的位置没有改变,则连续位置(lat,lon)可以是相同的.因此,订单在这里非常重要.我感兴趣的是一种相当有效的方法来检查坐标何时改变lat1, lon1 -> lat2, lon2等,然后获得这两个坐标之间的距离.

我已经有了一个函数来获取表单的距离,该距离getDistance(lat1, lon1, lat2, lon2)返回这些位置之间的计算距离.我想将这些距离存储在一个列表中,稍后我可以从中做一些绘图.

Nat*_*usa 5

您可以组合一个过滤掉重复项的函数和一个遍历对的函数:

首先,请注意消除列表中的重复后续条目.由于我们希望保留顺序,以及允许彼此不相邻的副本,因此我们不能使用简单的集合.因此,如果我们有一个坐标列表,例如[(0, 0), (4, 4), (4, 4), (1, 1), (0, 0)]正确的输出[(0, 0), (4, 4), (1, 1), (0, 0)].完成此任务的简单功能是:

def filter_duplicates(items):
  """A generator that ignores subsequent entires that are duplicates

  >>> items = [0, 1, 1, 2, 3, 3, 3, 4, 1]
  >>> list(filter_duplicates(items))
  [0, 1, 2, 3, 4, 1]

  """
  prev = None
  for item in items:
    if item != prev:
        yield item 
        prev = item
Run Code Online (Sandbox Code Playgroud)

yield声明是像一个return实际上不回来.每次调用它都会将值传递回调用函数.请参阅"yield"关键字在Python中的作用是什么?为了更好的解释.

这只是遍历每个项目并将其与前一项目进行比较.如果该项目不同,则将其返回给调用函数并将其存储为当前上一项.编写此函数的另一种方法是:

def filter_duplicates_2(items):result = [] prev =项目中的项目无:if item!= prev:result.append(item)prev = item return result

虽然完成了同样的事情,但这种方式最终会需要更多内存并且效率会降低,因为它必须创建一个新列表来存储所有内容.

现在我们已经有办法确保每个项目与其邻居不同,我们需要计算后续对之间的距离.一个简单的方法是:

def pairs(iterable):
    """A generate over pairs of items in iterable

    >>> list(pairs([0, 8, 2, 1, 3]))
    [(0, 8), (8, 2), (2, 1), (1, 3)]

    """
    iterator = iter(iterable)
    prev = next(iterator)
    for j in iterator:
        yield prev, j
        prev = j
Run Code Online (Sandbox Code Playgroud)

此功能类似于该filter_duplicates功能.它只是跟踪它观察到的前一个项目,并且对于它处理的每个项目,它产生该项目和前一个项目.它使用的唯一技巧是它prev使用next()函数调用分配给列表中的第一个项目.

如果我们将这两个函数结合起来,我们最终得到:

for (x1, y1), (x2, y2) in pairs(filter_duplicates(coords)):
   distance = getDistance(x1, y1, x2, y2)
Run Code Online (Sandbox Code Playgroud)