Haskell - 从 Haversine 返回的距离不正确
Haskell - Incorrect distance returning from Haversine
我有下面的代码来计算机场列表之间的 Haversine 距离,但它始终返回不正确的值。例如,运行 以下代码仅由 运行 haversine (head $ allAirports) (last $ allAirports)
returns 在 ORD(芝加哥)和 JFK(纽约)
92.16479615931107
当 ORD 和 JFK 之间的实际距离约为 827 英里时。知道我在计算中做错了什么吗?
type Location = (Double, Double)
data Airport = Airport {
name :: String,
location :: Location
} deriving (Eq)
allAirports :: [Airport]
allAirports = [
Airport { name="ORD", location=(41.9786,-87.9048)},
Airport { name="JFK", location=(40.64505923593942, -73.777106518636)}]
haversine :: Airport -> Airport -> Double
haversine (Airport _ (x1,y1)) (Airport _ (x2,y2)) = radius * c
where radius = 3959.87433
to_rad :: Double -> Double
to_rad x = (x * pi) / 180
r_x1 = to_rad x1
r_x2 = to_rad x2
r_y1 = to_rad y1
r_y2 = to_rad y1
dlat = r_x2 - r_x1
dlon = r_y2 - r_y1
a = sin(dlat/2)**2 + cos(r_x1)*cos(r_x2)*sin(dlon/2)**2
c = 2 * asin(sqrt(a))
你这里有错字:
r_y2 = to_rad y1
— 应该是 y2
而不是 y1
。如果你修复它,你会得到 ~738
这是正确的答案。您想要的号码 827 似乎是 Google 地图显示的行驶距离、道路等。如果您 google “jfk 和 ord 之间的飞行距离”,您会得到 738。
我有下面的代码来计算机场列表之间的 Haversine 距离,但它始终返回不正确的值。例如,运行 以下代码仅由 运行 haversine (head $ allAirports) (last $ allAirports)
returns 在 ORD(芝加哥)和 JFK(纽约)
92.16479615931107
当 ORD 和 JFK 之间的实际距离约为 827 英里时。知道我在计算中做错了什么吗?
type Location = (Double, Double)
data Airport = Airport {
name :: String,
location :: Location
} deriving (Eq)
allAirports :: [Airport]
allAirports = [
Airport { name="ORD", location=(41.9786,-87.9048)},
Airport { name="JFK", location=(40.64505923593942, -73.777106518636)}]
haversine :: Airport -> Airport -> Double
haversine (Airport _ (x1,y1)) (Airport _ (x2,y2)) = radius * c
where radius = 3959.87433
to_rad :: Double -> Double
to_rad x = (x * pi) / 180
r_x1 = to_rad x1
r_x2 = to_rad x2
r_y1 = to_rad y1
r_y2 = to_rad y1
dlat = r_x2 - r_x1
dlon = r_y2 - r_y1
a = sin(dlat/2)**2 + cos(r_x1)*cos(r_x2)*sin(dlon/2)**2
c = 2 * asin(sqrt(a))
你这里有错字:
r_y2 = to_rad y1
— 应该是 y2
而不是 y1
。如果你修复它,你会得到 ~738
这是正确的答案。您想要的号码 827 似乎是 Google 地图显示的行驶距离、道路等。如果您 google “jfk 和 ord 之间的飞行距离”,您会得到 738。