Python 计算坐标列表(lat、lng)之间的地理距离

Python 计算坐标列表(lat、lng)之间的地理距离,python,gps,distance,Python,Gps,Distance,我正在编写一个烧瓶应用程序,使用从GPS传感器提取的一些数据。我能够在地图上画出路线,我想计算GPS传感器行驶的距离。一种方法是只获取开始和结束坐标,但是由于传感器的移动方式,这是非常不准确的。因此,我对每50个传感器样本进行采样。如果实际传感器样本量为1000,我现在将有20个样本(通过提取每50个样本) 现在,我希望能够通过一个函数来计算距离,并将我的样本列表放入其中。到目前为止,我已经能够使用geopy软件包,但当我获取大型gps样本集时,我确实会收到“太多请求”错误,更不用说我将有额外的

我正在编写一个烧瓶应用程序,使用从GPS传感器提取的一些数据。我能够在地图上画出路线,我想计算GPS传感器行驶的距离。一种方法是只获取开始和结束坐标,但是由于传感器的移动方式,这是非常不准确的。因此,我对每50个传感器样本进行采样。如果实际传感器样本量为1000,我现在将有20个样本(通过提取每50个样本)

现在,我希望能够通过一个函数来计算距离,并将我的样本列表放入其中。到目前为止,我已经能够使用geopy软件包,但当我获取大型gps样本集时,我确实会收到“太多请求”错误,更不用说我将有额外的处理时间来处理请求,这不是我想要的

是否有更好的方法来计算包含纬度和经度坐标的列表元素的累积距离

位置=[(纬度1,液化天然气1),(纬度2,液化天然气2),…,(纬度n,液化天然气n)]

我找到了许多不同的数学方法,只使用2个坐标(lat1、lng1、lat2和lng2)计算距离,但没有一个支持坐标列表

以下是我当前使用geopy的代码:

from geopy.distance import vincenty

def calculate_distances(trips):
    temp = {}
    distance = 0
    for trip in trips:
        positions = trip['positions']
        for i in range(1, len(positions)):
            distance += ((vincenty(positions[i-1], positions[i]).meters) / 1000)
            if i == len(positions):
                temp = {'distance': distance}
                trip.update(temp)
                distance = 0
trips
是一个列表元素,包含关于trip(持续时间、距离、开始和停止坐标等)的键值对信息字典,trips中的positions对象是一个元组坐标列表,如上所示

trips = [{data_1}, {data_2}, ..., {data_n}]

我建议将(x,y)坐标转换为复数,因为计算距离要容易得多。因此,以下功能应起作用:

def calculate_distances(trips):
    for trip in trips:
        positions = trip['positions']
        c_pos = [complex(c[0],c[1]) for c in positions]
        distance = 0
        for i in range(1, len(c_pos)):
            distance += abs(c_pos[i] - c_pos[i-1])
        trip.update({'distance': distance})
我正在做的是将每个
(lat_1,lng_1)
转换为单个复数
c1=lat_1+j*lng_1
,并创建一个由
[c1,c2,…,cn]构成的列表

总而言之,复数是一个二维数,因此,如果你有二维坐标,你可以这样做,这对于地理定位来说是完美的,但是对于三维空间坐标来说是不可能的

一旦你得到了这个,你可以很容易地计算出两个复数之间的距离
c1
c2
作为
dist12=abs(c2-c1)
。递归地执行此操作可以获得总距离


希望这有帮助

这是我最后使用的解决方案。如果你想查看它对你自己的作用,它被称为哈弗森(距离)函数

我也稍微改变了我的方法。我的输入(
位置
)是元组坐标列表:

def calculate_distance(positions):
    results = []
    for i in range(1, len(positions)):
        loc1 = positions[i - 1]
        loc2 = positions[i]

        lat1 = loc1[0]
        lng1 = loc1[1]

        lat2 = loc2[0]
        lng2 = loc2[1]

        degreesToRadians = (math.pi / 180)
        latrad1 = lat1 * degreesToRadians
        latrad2 = lat2 * degreesToRadians
        dlat = (lat2 - lat1) * degreesToRadians
        dlng = (lng2 - lng1) * degreesToRadians

        a = math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(latrad1) * \
        math.cos(latrad2) * math.sin(dlng / 2) * math.sin(dlng / 2)
        c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
        r = 6371000

        results.append(r * c)

    return (sum(results) / 1000)  # Converting from m to km

你想知道每个点之间的距离吗?是的。或者,我想要所有距离的总和。谢谢你的回答。如果它在我的代码中按预期工作,我将使用se。但复数做什么呢?你们有一个(x,y)坐标,当你们把它转换成复数时,你们只需要做一个tipe x+yi。因此,例如,位置(1,2)将转换为复数1+2i,这更易于管理。但是,这只能对二维点进行,因此对于地理定位工作来说!我真的不明白其中的“复杂”数学。我确实听过很多关于它的讲座,但我从未真正有过那种“啊哈”的经历。但我会给它一个旋转,如果它工作的话,那就太棒了。不过再次非常感谢;)是 啊好极了。我刚刚注意到您将
distance=0
进一步移动到函数中,并删除了愚蠢的“列表末尾”if语句。优化也不错;)好吧,我完成了编辑,有点小错误。现在试试看,它对我有用!