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

While calculating Haversine distance, the main for loop is running only once

我有一个包含城市名称、经度和纬度的数据框。我想要做的是创建一个城市周围 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

孟买被省略了,因为我只想看到该城市 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_listcity_latitudecity_longitude 因为当我第一次使用 pandas 数据帧时,我得到了一个输出将近 10 分钟,因为我有 3368 条记录。将它分成列表并执行计算会在 2-3 分钟内给我一个输出,但问题仍然存在。主循环仅执行 3368 次迭代中的一次,附加值也变得混乱。

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

我哪里错了?

我认为只使用您的 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))