В каких единицах NetTopologySuite возвращает расстояния, и как я могу преобразовать их в мили / км? - PullRequest
0 голосов
/ 04 марта 2019

Всякий раз, когда я использую FreeMapTools для вычисления расстояния между мной и моим почтовым индексом друзей, это дает мне следующее:

  • 300,788 миль
  • 484.072 КМ

Screenshot from FreeMapTools showing 300.788 Miles Screenshot from FreeMapTools showing 484.072 KM

При использовании NetTopologySuite возвращается значение 5.2174236612815 .

  • 5.2174236612815 раз в 60 313.04541967689
  • 5.2174236612815 раз в 100 521.74236612815

Эти значения не слишком далеки от расстояний, показанных в 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-дистанцирующего устройства, которое я не знаю?

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Как правильно отмечает 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);
0 голосов
/ 05 марта 2019

Число представляется просто декартовой системой координат.Например:

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)

...