Какая единица измерения расстояния MathNet?
Учитывая следующий код, я хотел бы рассчитать расстояние в милях или километрах:
Point2D point1 = new Point2D(47.6062, -122.3321); // Seattle
Point2D point2 = new Point2D(37.7749, -122.4194); // San Francisco
double distance = point1.DistanceTo(point2);
После просмотра документации не ясно, какой тип единицы возвращается. Я вижу, что есть раздел единиц в документации.
Однако не ясно, какой будет единица расстояния:
- Угол
- AngleUnit
- степени
- IAngleUnit
- Радиан
Кроме того, с учетом возвращенной единицы является одним из пунктов, перечисленных выше. Как бы вы справились с переводом в мили / километры?
1 ответ
Согласно документации double Point2D.DistanceTo(Point2D otherPoint)
Msgstr "Находит прямое расстояние до другой точки". Это означает, что вы должны быть на равнине. Результирующие единицы такие же, как те, которые использовались для создания 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
Чтобы изменить мили 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);
}