В каких единицах NetTopologySuite возвращает расстояния и как преобразовать их в мили/км?

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

  • 300 788 миль
  • 484,072 км

В каких единицах NetTopologySuite возвращает расстояния и как преобразовать их в мили/км?В каких единицах NetTopologySuite возвращает расстояния и как преобразовать их в мили/км?

Когда я использую 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, о котором я не знаю?

Спасибо

Это может быть полезно: docs.microsoft.com/en-us/ef/core/modeling/…

Sudara 29.04.2021 10:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
1
5 928
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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);

какова единица вышеуказанного расстояния? А как перевести в метры?

user3740951 23.07.2019 13:13

Это единица целевой системы координат (EPSG:27700). По epsg.io/27700 это в метрах.

FObermaier 24.07.2019 10:53

Почему «epsg27700»? Единственное условие - единица измерения должна быть в метрах?

Jimi 25.08.2020 23:24

Потому что это пространственная система отсчета, которая подходит для примера.

FObermaier 28.08.2020 11:09

Другие вопросы по теме