我要做的是将球坐标中的两个点转换为地理坐标,以便它们利用Vincenty距离函数,以便准确地测量单位球面上两个点之间的距离。

以下代码无法将一对球形点转换为一对地理点,并返回p1_g和p2_g中元素的inf值。

对于我在做什么错的任何建议,我们将不胜感激。

VectorXd p1(2) ;
VectorXd p2(2) ;
p1 << -2.35619, 0.955317 ;
p2 << 1.47275, 2.53697 ;

namespace bg = boost::geometry;

typedef boost::geometry::srs::spheroid<double> SpheroidType;
SpheroidType spheriod(1.0,1.0);
typedef boost::geometry::strategy::distance::vincenty<SpheroidType>
    VincentyStrategy;
VincentyStrategy vincenty(spheriod);


bg::model::point<double, 2, bg::cs::spherical<bg::radian>> p1_s(p1(0), p1(1));
bg::model::point<double, 2, bg::cs::spherical<bg::radian>> p2_s(p2(0), p2(1));

bg::model::point<double, 2, bg::cs::geographic<bg::radian> > p1_g;
bg::model::point<double, 2, bg::cs::geographic<bg::radian> > p2_g;
bg::transform(p1_s, p1_g, vincenty);
bg::transform(p2_s, p2_g, vincenty);

auto dist = bg::distance(p1_g, p2_g, vincenty);

最佳答案

您似乎对spheresspheroids感到困惑。
sphere实际上是一个完美的圆形球。 spheroid是已沿轴压缩(或扩展)的sphere,请参阅:https://en.wikipedia.org/wiki/Spheroidspheroid的另一个名称是ellipsoid。最著名的spheroid是GPS系统使用的WGS-84 spheroid

可以使用haversine equation相对简单地计算sphere上的点之间的距离,而spheroid上的点之间的距离需要复杂的方程式,例如Vincenty或(更准确的)Karney方程。

要计算单位球面上的距离,只需使用boost haversine策略,然后乘以半径即可将弧度到所需单位的距离转换。非笛卡尔距离示例here表示它是以度为单位的坐标执行的。

08-24 22:40