経度緯度の2点間の距離を求めるには

.NET Framework の GeoCoordinate クラス を使う

C# など、.NET Framework が使える場合は、GeoCoordinate クラス の GetDistanceTo メソッドが便利です。
GeoCoordinate が System.Device.Location のクラスなので NuGet で追加しましたが、複数見つかるんですね。
使ったのはこれなんですが、良かったのかどうか。。

using System;
using System.Device.Location;

namespace Haversine
{
    class Program
    {
        static void Main(string[] args)
        {
            var latTokyo = 35.6809591;
            var lonTokyo = 139.7673068;
            var latOsaka = 34.7055051;
            var lonOsaka = 135.4983028;

            var distance = new GeoCoordinate(latTokyo, lonTokyo).GetDistanceTo(new GeoCoordinate(latOsaka, lonOsaka));

            // 403110.29750609986m
            Console.WriteLine($"{distance}m");
        }
    }
}

MSDN の注釈には以下の記載がありました。違和感があるのは機械翻訳からでしょうか。

Haversine 式は、距離を計算するために使用されます。 Haversine 式は地球の惑星を表しますが、楕円体ではなく球面地球を想定しています。 距離が長い場合、Haversine 式では 0.1% 未満のエラーが発生します。

高度は距離の計算には使用されません。

https://docs.microsoft.com/ja-jp/dotnet/api/system.device.location.geocoordinate.getdistanceto?view=netframework-4.8#System_Device_Location_GeoCoordinate_GetDistanceTo_System_Device_Location_GeoCoordinate_


Haversine 式なるもので計算できるようですね。

haversine-distance パッケージを使う

Haversine で探すと JavaScript で使える haversine-distance パッケージがありました。

const haversine = require('haversine-distance');

const tokyo = { latitude: 35.6809591, longitude: 139.7673068 };
const osaka = { latitude: 34.7055051, longitude: 135.4983028 };

// 403213.7855570708
console.log(haversine(tokyo, osaka));

結果の差は計算途中の誤差でしょうか。

コメント

タイトルとURLをコピーしました