【问题标题】:What is the unit for MathNet distance calcuations?MathNet 距离计算的单位是什么?
【发布时间】:2019-08-16 19:15:58
【问题描述】:

给定以下代码,我想以英里或公里为单位计算距离:

Point2D point1 = new Point2D(47.6062, -122.3321); // Seattle
Point2D point2 = new Point2D(37.7749, -122.4194); // San Francisco

double distance = point1.DistanceTo(point2);

查看documentation后,不清楚返回的是什么类型的单元。我看到documentation 中有一个单位部分。

但是,距离的单位是什么尚不清楚:

  • 角度
  • 角度单位
  • 度数
  • 角度单位
  • 弧度

此外,鉴于返回的单位是上面列出的项目之一。您将如何处理转换为英里/公里的问题?

【问题讨论】:

    标签: latitude-longitude math.net


    【解决方案1】:

    根据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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2012-02-24
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多