2011-10-27 18 views
0

私は約400の都市のデータベースを持っています。ユーザは、彼が住んでいる都市を選択し、彼が旅行したい距離(例えば、40キロメートル)を入力する。 city_idは検索テーブルに格納されますが、他の関連性のない情報が含まれています。ユーザーがフォームを送信すると、検索テーブルのすべての結果が表示され、条件を満たす結果ページにリダイレクトされますが、都市フォームユーザーの都市と結果都市の距離で注文し、結果を注文したいとしますその距離(最も近い最初のもの)。どうやって都市間の距離を計算し、それを注文するのですか?どのようなテーブルを各都市に追加しなければならないので、私は実際に距離を計算するでしょうし、各都市の座標を見つけ出して格納する方法はありますか?私の現在の都市テーブルはidnameおよびzip400都市間の距離を計算し、MySQLを最適化しますか?

しかありません。

+0

私の以前の回答は興味深いかもしれません - それは簡単で実用的です。 http://stackoverflow.com/questions/3983325/calculate-distance-between-zip-codes-and-users/3989830#3989830 –

答えて

4

2つの解決策がありました。

最初のもの:
データベースの各都市店舗について、その緯度と経度。ユーザーがクエリを取得すると、他のすべての都市との距離を計算し、結果を返します。
Proでは、他の情報を追加することなく、すべての都市をdbに追加できます。
Hereあなたはあまりにも緯度・経度の距離のCALCについて式、サンプルとコードを見つけることができます...

第二:
は、次の3つのフィールドを持つテーブルcities_distを作成します。 city1_id, city2_id, distance との間で、すべての可能な組み合わせの内側に入れて、あなたの都市。 これで、選択した都市city1_idまたはcity2_idのクエリを書くことができます。
Proは、計算なしで簡単なクエリを使用できますが、データベースに新しい都市を挿入するときはいつでもこのテーブルを埋める必要があります。ユーザーのコメント後に編集


ユーザーはベルリンから飛びたい場合は、そのテーブルが

CITY1 CITY2 DIST 
1  2  1500 
1  3  1200 
2  3  400 

のようになります。あなたは

を使用することができますが、3つの都市

ID NAME 
1 New York 
2 Rome 
3 Berlin 

を持っている想像してみて

SELECT c1.name, c2.name, cd.dist 
FROM cities_dist cd 
    INNER JOIN cities c1 ON cd.city1 = c1.id 
    INNER JOIN cities c2 ON cd.city2 = c2.id 
WHERE cd.city1 = your_id 
    OR cd.city2 = your_id 
ORDER BY cd.dist ASC 
+0

都市は静的で、後で追加されることはないので、2番目のオプションは素晴らしいでしょう。しかし、私はまだこれを保存するPHPの部分がどのように見えるかわからないので、何百万もの重複はありません。 – ItsGreg

+0

@GregaMenih:私の編集した投稿を見てください – Marco

1

結果の正確さに応じて、各都市の余分な列として緯度/経度(地理座標)を保存するのが最も簡単です。

distance = sqrt((city.x - my_x)^2 + (city.y - my_y)^2) 

はあなたWHERE句にこれを入れて、あなたは空気を取得します:距離がちょうどピタゴラス(または考慮に地球の表面を取り、いくつかのより正確な地理式)を使用して取得するために

ライン間距離。

すべての距離をあらかじめ計算する方法はさらに複雑ですが、これで十分です。

+0

距離は〜2kmまで正確でなければなりません – ItsGreg

+0

緯度/経度は角度(度)であるため、それらをPythagoraに接続することができます。おおよそのx =(lon1-lon2)* cos(lat)を使うことができます。 y = lat1-lat2;距離(km)= 6371 * sqrt(x * x + y * y)。 – TreyA

関連する問題