Boost转换产生Inf返回值

时间:2019-05-21 02:18:15

标签: c++ boost boost-geometry

我想做的是将球坐标中的两个点转换为地理坐标,以便它们利用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);

1 个答案:

答案 0 :(得分:1)

您似乎对spheresspheroids感到困惑。

sphere实际上是一个完美的圆形球。 spheroidsphere沿轴被挤压(或延伸)的情况,请参见:https://en.wikipedia.org/wiki/Spheroid
spheroid的另一个名称是ellipsoid。最著名的spheroid是GPS系统使用的WGS-84 spheroid

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

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