在计算Haversine距离时,主for循环只运行一次

Posted

技术标签:

【中文标题】在计算Haversine距离时,主for循环只运行一次【英文标题】:While calculating Haversine distance, the main for loop is running only once 【发布时间】:2021-05-03 13:34:33 【问题描述】:

我有一个由城市名称、经度和纬度组成的数据框。我想要做的是创建一个城市周围 100 公里半径的城市数据框。我的意思是如果我的数据看起来像

City    Latitude Longitude
Delhi       lat1     long1
Noida       lat2     long2 
Gurgaon     lat3     long3
Mumbai      lat4     long4

处理后我希望我的数据看起来像:

City    nearby city  distance
Delhi       Noida       x1
Delhi       Gurgaon     x2
Noida       Delhi       x3 
Noida       Gurgaon     x4
Gurgaon     Delhi       x5
Gurgaon     Noida       x6

Mumbai 被省略了,因为我只想查看该城市 100 公里半径范围内的城市周围的城市。出于这个原因,我使用Haversine 公式。这是我的代码:

for idx, val in enumerate(city_list):
    lat1 = city_latitude[idx]
    long1 = city_longitude[idx]
    for next_idx, next_val in enumerate(copy_city_list):
        if val == next_val:
            pass
        else:
            lat2 = city_latitude[next_idx]
            long2 = city_longitude[next_idx]
            lat1, long1, lat2, long2 = map(radians, [lat1, long1, lat2, long2])
            # haversine formula
            dlon = long2 - long1
            dlat = lat2 - lat1
            a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
            c = 2 * asin(sqrt(a))
            # Radius of earth in kilometers is 6371
            km = 6371 * c
            if(km > 100):
                pass
            else:
                city.append(val)
                near_by_city.append(next_val)
                distance.append(km)
    print("Record appeneded")

我将我的数据分成 3 个列表,city_list,city_latitude,city_longitude,因为当我第一次使用 pandas 数据框时,我在将近 10 分钟后得到了输出,因为我有 3368 条记录。将其拆分为列表并执行计算会在 2-3 分钟内给我一个输出,但问题仍然存在。主循环只执行了 3368 次中的一次迭代,附加值也变得混乱。

我想看到的输出是我的city 列表中的Delhi,Delhi,Noida,Noida,Gurgaon,Gurgaon 和我的near_by_city 列表中的Noida,Gurgaon,Delhi,Gurgaon,Delhi,Noida。相反,我在city 列表中看到Noida,Gurgaon,在near_by_city 列表中看到Delhi,Delhi

我哪里错了?

【问题讨论】:

如果您暂时取消城市之间的距离必须小于 100 公里的条件,会发生什么情况。是否所有组合都以正确的距离显示? copy_city_list 到底是什么?您的结果与仅包含德里的列表一致,而不是实际上是完整的城市列表。 @quamrana,是的,当条件被删除时,信息将被附加到所需的列表中 @jasonharper copy_city_list 是列表 city_list 的副本。它与德里的情况不一致,因为我希望city 列表存储德里的两次出现,但目前应该在near_by_city 列表中的信息正在存储在当前的city 列表中。 您应该使用以下内容更新您的问题:city_list, copy_city_list, city_latitude and city_longitude 【参考方案1】:

我认为只使用你的 city_data 而不将其分成单独的列表可能会更容易。

我喜欢列表推导式,因此我将使用一个推导式将城市列表与自身相乘并计算它们之间的距离。然后我们将只打印彼此靠近的对。

可能需要进行一些优化,例如,如果您知道从“A”到“B”的距离,那么您可能不需要计算从“B”到“A”的距离。我留给你考虑。

from haversine import haversine

cities = [
    ["Delhi", 28.7041, 77.1025],
    ["Noida", 28.5355, 77.3910],
    ["Gurgaon", 28.4595, 77.0266],
    ["Mumbai", 19.0760, 72.8777]
]

cities_crossed = [
    [x[0], y[0], haversine((x[1], x[2]), (y[1], y[2]))]
    for x in cities
    for y in cities if x[0] != y[0]
]

print("City\tNearby\tDistance")
for nearby_cities in [city_pair for city_pair in cities_crossed if city_pair[2] < 100]:
    print("\t\t".format(*nearby_cities))

【讨论】:

以上是关于在计算Haversine距离时,主for循环只运行一次的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中两点之间的Haversine距离计算

如何使用 Haversine 公式计算行驶距离(不是位移)?

PowerApps 循环中坐标之间的距离

用haversine和float计算距离......有点工作

计算两个经纬度点之间的距离? (Haversine 公式)

python - 如何使用python中的haversine库计算大距离矩阵?