2012-01-31 8 views
1

私はPHPスクリプトとジオロケーションのデータベースを持っています。PHPとMySQLを使用して地理位置距離を計算する

ユーザーが郵便番号を入力できる瞬間、ヤハアを使用して私は地理的な場所を取得します。

私はジオロケーションを持っているので、私は地元のビジネスを距離順に読み込むスクリプトを作成したいと思います。私はこれを行うために推測している私は、データベースからユーザーに現在のジオロケーションに最も類似した座標を持つレコードをロードする必要があります。私はこのコードを試しました:

$sql = "SELECT * FROM dirlistings WHERE ABS(latitude - $lat) AND ABS(longitude - $long)"; 

しかし、それは正常な順序で結果を表示します。

私は何かを見逃しましたか?

+0

**警告**あなたのコードはSQLインジェクション攻撃の影響を受けやすいです。 –

+0

私はこれとまったく同じことをやっています。物事は自宅のコンピュータに保存されていますが、私は現時点ではありません。あなたが必要とするすべての情報を提供することができます。地球は球なので、単なる減算以上のものがあります。 – Grigor

答えて

2

注:その後、それは同じくらい簡単です

SQRT(
    POW(latitude - ' . $lat . ',2) 
    + 
    POW(longitude - ' . $lon . ',2) 
) AS distance 

地球の表面が平らでないため、距離(例えば、数千マイル)があります。正しい最大距離を指定することを確認してください - - ここ

$dlat = ((double)$lat)/57.29577951; 
$dlon = ((double)$lon)/57.29577951; 

$sql = "SELECT * 
     FROM dirlistings 
     WHERE 3963.0 * acos(sin(latitude/57.29577951) * sin($dlat) + cos(latitude/57.29577951) * cos($dlat) * cos($dlon - longitude/57.29577951)) < MAX_DIST 
     ORDER BY acos(sin(latitude/57.29577951) * sin($dlat) + cos(latitude/57.29577951) * cos($dlat) * cos($dlon - longitude/57.29577951)) 
     "; 

距離はマイルであり、この式は、のために非常に近い結果が得られます:あなたは地理距離計算のためのより良い式が必要な場合は、このようなものを使用することができます1万マイルもの距離。このような計算にはかなりの時間と電力が必要ですが、遠距離(すなわち、数百マイル以上)に対処していない場合は、より迅速な近似を使用する必要があります。

+0

私はその最大距離を指定しましたが、何も現れていませんか? –

+0

この場合、実際にデータをチェックすることをお勧めします。私たちはこの数式を(有効な)データとともに数年間使って、今大いに成功しています。 –

+0

申し訳ありませんが返信に時間がかかりました。いくつか乱れて私はそれを働かせました。私はmax_distを何に設定すべきか尋ねることはできますか?それは高い価値がある場合にのみ機能し、最大40マイルの場所を探しているときにはどうなりますか? –

1

最後にORDER BY latitude, longitudeを試してください。それはそれを行うか、またはそれを行う必要があります。

+0

これは役に立たないと思います。順序は、それぞれ別々にではなく、緯度と経度を使用する式の結果によって行われなければなりません。 –

+0

あなたはまったく正しいです。ワオ。私は数年後にこれをやっていないし、この式について忘れてしまった。 – Tim

3

どこかにORDER句があると思います。 MySQL Great Circle Distance (Haversine formula)

+1

短距離(〜50マイル未満)では、距離を計算するために地球を(少なくともこの領域では)平面として扱うことができます。 –

3

それはあなたが思うよりも複雑です:

は、しかし、あなたが本当にたいのは半正矢式です。

これは私を多く助けた素晴らしい記事です。 JavaScriptで書かれていますが、あなたは簡単にそれをPHPに変更します。

http://www.movable-type.co.uk/scripts/latlong.html

2

あなたはかなりの数のことを見逃しています。あなたがしようとしていることをするには、(ピタゴラス定理を使って)2点間の距離を計算し、その距離だけ順番に並べる必要があります。

あなたは、経由距離((lat - $lat)^2 + (lon - $lon)^2)^0.5を計算することができます:あなたは大きな話をしている場合は、円の距離は十分に正確であることを行っていないことを

ORDER BY distance ASC 
関連する問題