计算坐标列表之间的地理距离(纬度、经度)

2024-01-08

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

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

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

positions = [(lat_1, lng_1), (lat_2, lng_2), ..., (lat_n, lng_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是一个列表元素,包含有关行程的信息键值对的字典(持续时间、距离、起点和终点坐标等),并且 trips 内的位置对象是元组坐标列表,如上所示。

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

这是我最终使用的解决方案。如果您想了解一下它的作用,它称为半正矢(距离)函数。

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

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算坐标列表之间的地理距离(纬度、经度) 的相关文章

随机推荐