根据documentationdouble Point2D.DistanceTo(Point2D otherPoint)“求到另一点的直线距离”。这意味着您应该在平原上。结果单位与用于创建Point2D 对象的单位相同。但这与在地球表面寻找距离无关。你需要的是:
static void Main(string[] args)
{
var earthRadius = 6371; // km
var seattle = GetVector(47.6062, -122.3321);
var sanFrancisco = GetVector(37.7749, -122.4194);
var angle = seattle.AngleTo(sanFrancisco);
var distance = angle.Radians * earthRadius;
Console.WriteLine(distance);
}
private static UnitVector3D GetVector(double lat, double lon)
{
var tmp = UnitVector3D.ZAxis;
var latitude = Angle.FromDegrees(lat);
var longitude = Angle.FromDegrees(lon);
var vector = UnitVector3D.XAxis.Rotate(tmp, longitude);
tmp = UnitVector3D.ZAxis.CrossProduct(vector);
vector = vector.Rotate(tmp, latitude);
return vector;
}
结果是:
1093,21376382715
Check it is correct.
要获得里程,请将earthRadius 的值更改为一英里。
更新:
GetVector 可以用另一种方式实现:
private static UnitVector3D north = UnitVector3D.ZAxis;
private static UnitVector3D east = UnitVector3D.XAxis;
private static Point3D northPole = UnitVector3D.ZAxis.ToPoint3D();
private static Point3D southPole = (-1 * UnitVector3D.ZAxis).ToPoint3D();
private static UnitVector3D GetVector(double lat, double lon)
{
var longitude = Angle.FromDegrees(lon);
var direction = east.Rotate(north, longitude);
var meridian = Circle3D.FromPoints(northPole, southPole, direction.ToPoint3D());
var normal = meridian.Axis;
var latitude = Angle.FromDegrees(lat);
return direction.Rotate(normal, latitude);
}