.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));
結果の差は計算途中の誤差でしょうか。
コメント