在计算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循环只运行一次的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Haversine 公式计算行驶距离(不是位移)?