1

重複の可能性:
ロケーションベースの検索を行う方法
データベースから同様の経度と緯度を取得する

ユーザーが自分の場所を入力し、それに基づいて他のプロファイルが表示されるMySQLデータベースと連携するデートPHPアプリケーションがあります。

テーブルの構造cities:

int id PK
int country_id FK
varchar(50) name
float longitude
float latitude

表のエントリの例:

1 | 1 | New York | 23.20323 | 12.32356

そして、経度と緯度がそれぞれ 23.20323 + 50 km 未満、23.20323 - 50 km を超えるすべての都市を選択したいと考えています。

ここでの問題は SQL 構文ではなく、実際の半径の計算です。

4

3 に答える 3

4

これは、大円アルゴリズムを使用して行うことができます。http://en.wikipedia.org/wiki/Great-circle_distance

距離の求め方はこちら。lat2 の方程式を解く必要があります。

距離 = ((係数 * (lat2-lat1)) ^ 2 + (係数 * (lng2 - lng1) * cos(lat2 / 57.3)) ^ 2) ^ .5

注: 係数 ~ マイルの場合は 69.1 ~ km の場合は 115.1666667

于 2012-12-19T15:57:33.710 に答える
2

Haversine 関数を見てみましょう。これは、2 つの緯度経度ポイントの球面距離の計算です。

于 2012-12-19T15:57:45.160 に答える
1

これはあなたが求めているものです。

//Get your base city location e.g. New York
$base_lat = 12.32356;
$base_lng = 23.20323;

//Get target distance in miles
$target_distance = 31; //50km is approx 31 miles

//Select all cities that are closer than 50km (31 miles)
SELECT id, ( 3959 * acos( cos( radians('.$base_lat.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$base_lng.') ) + sin( radians('.$base_lat.') ) * sin( radians( latitude ) ) ) ) AS distance
FROM cities
WHERE latitude IS NOT NULL
AND longitude IS NOT NULL
HAVING distance < $target_distance
ORDER BY distance ASC

//Select all cities that are further than 50km (31 miles)
SELECT id, ( 3959 * acos( cos( radians('.$base_lat.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$base_lng.') ) + sin( radians('.$base_lat.') ) * sin( radians( latitude ) ) ) ) AS distance
FROM cities
WHERE latitude IS NOT NULL
AND longitude IS NOT NULL
HAVING distance > $target_distance
ORDER BY distance ASC
于 2012-12-19T16:05:44.060 に答える