我想做的是将球坐标中的两个点转换为地理坐标,以便它们利用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);
答案 0 :(得分:1)
您似乎对spheres
和spheroids
感到困惑。
sphere
实际上是一个完美的圆形球。 spheroid
是sphere
沿轴被挤压(或延伸)的情况,请参见:https://en.wikipedia.org/wiki/Spheroid。
spheroid
的另一个名称是ellipsoid
。最著名的spheroid
是GPS系统使用的WGS-84 spheroid
。
sphere
上的点之间的距离可以使用haversine equation相对简单地计算,而spheroid
上的点之间的距离需要复杂的方程式,例如Vincenty或(更精确的)Karney's方程。
要计算单位球面上的距离,只需使用boost
haversine策略,然后乘以半径即可将弧度到所需单位的距离转换为半径。非笛卡尔距离示例here显示它是用度数表示的坐标执行的。