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。