首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++中的haversine公式计算纬度/经度的结果

用C++中的haversine公式计算纬度/经度的结果
EN

Stack Overflow用户
提问于 2014-10-19 01:25:09
回答 2查看 4.7K关注 0票数 0

所以现在,我正在为一个C++课做作业。作业说,我需要根据用户给出的经度和纬度的输入,使用haversine公式计算两个地方之间的距离。然后,haversine公式计算出两个地方之间的距离。

我遇到的问题是,当使用老师给出的测试值时,我得到的答案比他得到的答案更大。

我在计算33.9425/N 118.4081/W (洛杉矶机场)和20.8987/N 156.4305/W (Kahului机场)之间的距离,洛杉矶机场是起点。

他对这个距离的回答是2483.3英里。我的答案是2052.1英里。

这是我的haversine公式代码:

代码语言:javascript
复制
double haversine(double lat1, double lat2, double lon1, double lon2) {
    // get differences first
    double dlon = difference(lon1, lon2); // difference for longitude
    double dlat = difference(lat1, lat2); // difference for latitude
    // part a of algorithm
    double a = pow(sin(dlat/2), 2) + cos(lat1) * cos(lat2) * pow(sin(dlon/2), 2);
    // part b of algorithm
    double b = 2 * atan2(sqrt(a), sqrt(1 - a));
    // our result, or the great-circle distance between two locations
    double result = EARTH_RADIUS * b;
    return result;
}

在这种情况下,差分只返回y-x。我的计算似乎出了什么问题?据我所知,在计算一切时,我的括号似乎没问题,所以我不太清楚为什么要得到不同的答案。

更新:通过将经度和纬度转换成弧度来修正问题。在C++中,我通过定义PI = 3.14159265来实现这一点,对于我使用的每个trig函数,将其中的任何内容乘以* PI/180。(即)pow(sin((dlat/2) * (PI/180)),2)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-19 03:34:24

您需要将lats/longs转换为弧度,因为Java中的trig函数接受弧度参数。

代码语言:javascript
复制
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
    double dLat = Math.toRadians(lat2 - lat1);
    double dLon = Math.toRadians(lon2 - lon1);
    lat1 = Math.toRadians(lat1);
    lat2 = Math.toRadians(lat2);

这一行:

代码语言:javascript
复制
// part b of algorithm
double b = 2 * atan2(sqrt(a), sqrt(1 - a));

是同一件事

代码语言:javascript
复制
// part b of algorithm
double b = 2 * Math.asin(Math.sqrt(a));

现在你的功能应该起作用了。(:

此外,仅供参考:

代码语言:javascript
复制
// our result, or the great-circle distance between two locations
double result = EARTH_RADIUS * b;
return result;

应缩短为:

代码语言:javascript
复制
// our result, or the great-circle distance between two locations
return EARTH_RADIUS * b;

你应该总是简明扼要!

票数 2
EN

Stack Overflow用户

发布于 2014-10-19 03:29:40

这是我用弧度写的东西,如果你不能使用你老师给你的东西的话。一段时间前,我做了一个类似的项目,把公式从不同的网站上提取出来。

代码语言:javascript
复制
#include <iostream>

using namespace std;

static const double DEG_TO_RAD = 0.017453292519943295769236907684886;
static const double EARTH_RADIUS_IN_METERS = 6372797.560856;
static const double EARTH_RADIUS_IN_MILES = 3959;

struct Position {
    Position(double lat, double lon) : _lat(lat), _lon(lon) {}
    void lat(double lat) { _lat = lat; }
    double lat() const { return _lat; }
    void lon(double lon) { _lon = lon; }
    double lon() const { return _lon; }
private:
    double _lat;
    double _lon;
};

double haversine(const Position& from, const Position& to) {
    double lat_arc = (from.lat() - to.lat()) * DEG_TO_RAD;
    double lon_arc = (from.lon() - to.lon()) * DEG_TO_RAD;
    double lat_h = sin(lat_arc * 0.5);
    lat_h *= lat_h;
    double lon_h = sin(lon_arc * 0.5);
    lon_h *= lon_h;
    double tmp = cos(from.lat()*DEG_TO_RAD) * cos(to.lat()*DEG_TO_RAD);
    return 2.0 * asin(sqrt(lat_h + tmp*lon_h));
}

double distance_in_meters(const Position& from, const Position& to) {
    return EARTH_RADIUS_IN_METERS*haversine(from, to);
}

double distance_in_miles(const Position& from, const Position& to)
{
    return EARTH_RADIUS_IN_MILES*haversine(from, to);
}

int main()
{
    double meters   = distance_in_meters(Position(33.9425, 118.4081), Position(20.8987, 156.4305));
    double miles    = distance_in_miles(Position(33.9425, 118.4081), Position(20.8987, 156.4305));
    cout << "\nDistance in meters is: " << meters;
    cout << "\nDistance in miles is: " << miles;


    cout << endl;
    system("PAUSE");
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26446308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档