厳密には、Haversine式を使用する必要があります。
ただし、おそらく極北または極南の地点からわずかに外れている可能性がありますが、メルカトル図法が距離に対して正確であると偽って、地球の湾曲を無視することで、おそらくうまくいく可能性があります。これは、都市がたくさんある場合に特に当てはまります。エラーが大きいほど、ターゲットポイントから離れたポイントになります。したがって、ピタゴラスを使用するだけです。
relDist = √((xLat - yLat) × (xLat - yLat) + (xLng - yLng) × (xLng - yLng))
ただし、相対的な順序のみを気にする(そして取得するだけ)ので、最も重いステップである平方根ビットをスキップできます。
relDist = (xLat - yLat) × (xLat - yLat) + (xLng - yLng) × (xLng - yLng)
座標を実際の座標の倍数として保存する場合(たとえば、ニューヨーク(40.664167、-73.938611)をペア(406642、-739386)として保存する場合は、それ自体が高速であるだけでなく、整数で合理的に実行することもできます。 。特定のポイントに近い順に多数の場所をすばやく並べ替える場合、これは大きな後押しになる可能性があります。
ただし、地球が丸いという事実に直面して精度を本当に気にする場合は、次のようにHaversineを実装します。
private const double radiusE = 6378135; // Equatorial radius
private const double radiusP = 6356750; // Polar radius
private const double radianConv = 180 / Math.PI;
public static double GetDistanceBetweenPoints(double lat1, double long1, double lat2, double long2)
{
double dLat = (lat2 - lat1) / radianConv;
double dLong = (long2 - long1) / radianConv;
double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(lat2) * Math.Sin(dLong/2) * Math.Sin(dLong/2);
return Math.Sqrt((Math.Pow(radiusE * radiusP * Math.Cos(lat1 / radianConv), 2)) / (Math.Pow(radiusE * Math.Cos(lat1 / radianConv), 2) + Math.Pow(radiusP * Math.Sin(lat1 / radianConv), 2))) * (2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)));
}