Всякий раз, когда я использую FreeMapTools для расчета расстояния между мной и почтовым индексом моих друзей, он дает мне следующее:
Когда я использую NetTopologySuite, я получаю возвращаемое значение 5.2174236612815.
Эти значения не слишком отличаются от расстояний, показанных в FreeMapTools, но все же далеки от них.
Мой код ниже:
using System;
using GeoAPI.Geometries;
using NetTopologySuite;
namespace TestingDistances
{
class Program
{
static void Main(string[] args)
{
var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326);
// BT2 8HB
var myPostcode = geometryFactory.CreatePoint(new Coordinate(-5.926223, 54.592395));
// DT11 0DB
var myMatesPostcode = geometryFactory.CreatePoint(new Coordinate(-2.314507, 50.827157));
var distance = myPostcode.Distance(myMatesPostcode);
Console.WriteLine(distance); // returns 5.2174236612815
Console.WriteLine(distance * 60); //similar to miles (313.04541967689)
Console.WriteLine(distance * 100); //similar to km (521.74236612815)
Console.ReadLine();
}
}
}
Как правильно преобразовать значение, возвращаемое NetTopologySuite, в мили/расстояния? Это какая-то форма устройства дистанционного управления GPS, о котором я не знаю?
Спасибо





Число кажется просто простой декартовой системой координат. Например:
var point1 = geometryFactory.CreatePoint(new Coordinate(0, 0));
var point2 = geometryFactory.CreatePoint(new Coordinate(0, 270));
var distance = point1.Distance(point2);
Здесь distance равно 270. Если мы используем 0, 0 и 30, 40, расстояние будет 50. Это простое вычисление Пифагора (т.е. 30^2 + 40^2 = 50^2)
Как правильно упоминает DavidG, NetTopologySuite предполагает декартовы координаты. Ваши координаты географические (широта/долгота). Таким образом, результат, который вы получаете, бесполезен и не может быть переведен в метры или мили.
Вы должны выполнить преобразование координат перед вызовом метода расстояния, например. с помощью ProjNet:
var csWgs84 = ProjNet.CoordinateSystems.GeographicCoordinateSystems.WGS84;
const string epsg27700 = "..."; // see http://epsg.io/27700
var cs27700 = ProjNet.Converters.WellKnownText.CoordinateSystemWktReader.Parse(epsg27700);
var ctFactory = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
var ct = ctFactory.CreateFromCoordinateSystems(csWgs84, cs27700);
var mt = ct.MathTransform;
var gf = new NetTopologySuite.Geometries.GeometryFactory(27700);
// BT2 8HB
var myPostcode = gf.CreatePoint(mt.Transform(new Coordinate(-5.926223, 54.592395)));
// DT11 0DB
var myMatesPostcode = gf.CreatePoint(mt.Transform(new Coordinate(-2.314507, 50.827157)));
double distance = myPostcode.Distance(myMatesPostcode);
какова единица вышеуказанного расстояния? А как перевести в метры?
Это единица целевой системы координат (EPSG:27700). По epsg.io/27700 это в метрах.
Почему «epsg27700»? Единственное условие - единица измерения должна быть в метрах?
Потому что это пространственная система отсчета, которая подходит для примера.
Это может быть полезно: docs.microsoft.com/en-us/ef/core/modeling/…