3

SELECT postcode、lat、lng、truncate((degrees(acos(sin(radians(lat))* sin(radians('。$latitude。'))+ cos(radians(lat))* cos(radians('。$latitude。 '))* cos(radians(lng-('。$longitude。')))))* 69.172)、2)as distance FROMmyData
このクエリは、距離(マイル単位)を計算します。しかし、グーグルマップで同じ緯度と経度の距離をチェックすると、私の結果は一致しません。距離が約10マイルの場合、私の結果は少し正確ですが、それ以上に間違っています(たとえば、私の結果は13マイルを示し、googleは同じ郵便番号の値に対して22マイルを示しました)

このクエリはhttp://forums.mysql.com/read.php?23,3868,3868#msg-3868から取得しました

どうすれば正確にできますか。何か案は?手伝ってくれてありがとう。

アップデート

PHPで@Blixtコードを試しました。2つのサンプル郵便番号とその広背筋をピックアップしました

//B28 9ET
$lat1 = 52.418819;
$long1 = -1.8481053;

//CV5 8BX
$lat2 = 52.4125573;
$long2 = -1.5407743;

$dtr = M_PI / 180;
$latA = $lat1 * $dtr;
$lonA = $long1 * $dtr;
$latB = $lat2 * $dtr;
$lonB = $long2 * $dtr;
$EarthRadius = 3958.76; //miles
echo $distance = $EarthRadius * acos(cos($latA) * cos($latB) * cos($lonB - $lonA) + sin($latA) * sin($latB));

結果:

私のアプリ-12.95マイル

グーグル-17.8マイル

それを正しくする方法はありますか?

4

1 に答える 1

2

このソースコードを見てください。他のさまざまな測定サービスに対してテストしたところ、同じ結果が得られたようです。これは C# ですが、計算は簡単に変換できるはずです。

関連する部分は次のとおりです。

public const double EarthRadius = 6371.0072; // Kilometers
//public const double EarthRadius = 3958.76; // Miles

/* ... */

const double dtr = Math.PI / 180;
double latA = this.Latitude * dtr;
double lonA = this.Longitude * dtr;
double latB = other.Latitude * dtr;
double lonB = other.Longitude * dtr;

return GpsLocation.EarthRadius * Math.Acos(Math.Cos(latA) * Math.Cos(latB) * Math.Cos(lonB - lonA) + Math.Sin(latA) * Math.Sin(latB));

注:地球は完全な球形ではないため、使用される定数は異なる場合があります。正確な測定を行う簡単な方法はありません。ウィキペディアを参照してください。

于 2009-06-12T11:47:50.643 に答える