48

次のデータベーステーブルから最寄りの場所を見つけたい

Address                            Latitude                longitude 

Kathmandu 44600, Nepal              27.7                   85.33333330000005
Los, Antoniterstraße                37.09024               -95.71289100000001
Sydney NSW, Australia               49.7480755             8.111794700000019
goa india                           15.2993265             74.12399600000003

私はこれをすべてGoogleマップから取得しました。ここで私は場所から最も近い場所を見つけなければなりません。私がスルケートの場所にいるとすると、その緯度は28.6、経度は81.6ですが、スルケートの場所から最も近い場所を見つけるにはどうすればよいですか。

4

7 に答える 7

97

MySQLで近くの場所を見つける

これは、37、-122座標から半径25マイル以内にある最も近い20の場所を見つけるSQLステートメントです。その行の緯度/経度とターゲットの緯度/経度に基づいて距離を計算し、距離の値が25未満の行のみを要求し、クエリ全体を距離順に並べ替えて、結果を20に制限します。マイルではなくキロメートルで検索するには、3959を6371に置き換えます。

テーブル構造:

id,name,address,lat,lng

注-ここでは、緯度=37および経度=-122です。だからあなたは自分自身を渡すだけです。

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * 
sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING
distance < 25 ORDER BY distance LIMIT 0 , 20;

詳細はこちらをご覧ください。

于 2012-06-20T04:52:48.190 に答える
28
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
于 2012-07-25T05:27:26.973 に答える
3

近くの場所を見つけるには、ジオコーダークラスを使用できます。ジオポイント(緯度と経度)があるため、逆ジオコーディングを使用できます。 逆ジオコーディングは、(緯度、経度)座標を(部分的な)住所に変換するプロセスです。詳細については、これをチェックしてください。

于 2012-06-20T06:42:39.493 に答える
1
SELECT latitude, longitude, SQRT(
    POW(69.1 * (latitude - [startlat]), 2) +
    POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;

ここで、[starlat][startlng]は距離の測定を開始する位置であり、25はkm単位の距離です。

結果を見つけるために多くの行をチェックするため、クエリを使用するストアドプロシージャを作成することをお勧めします。

于 2017-07-14T11:17:59.377 に答える
0

SQLに問題があります。次のようなテーブルで:

`ubicacion` (
  `id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
  `latitud` DOUBLE NOT NULL ,
  `longitud` DOUBLE NOT NULL ,
  PRIMARY KEY (`id_ubicacion`) )

id_ubicacionは、使用時に変更されます。

SELECT  `id_ubicacion` , ( 3959 * ACOS( COS( RADIANS( 9.053933 ) ) * COS( RADIANS( latitud ) ) * COS( RADIANS( longitud ) - RADIANS( - 79.421215 ) ) + SIN( RADIANS( 9.053933 ) ) * SIN( RADIANS( latitud ) ) ) ) AS distance
FROM ubicacion
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20
于 2013-03-07T15:02:28.207 に答える
0
sesach : ( 3959 * acos( cos( radians('.$_REQUEST['latitude'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$_REQUEST['longitude'].') ) + sin( radians('.$_REQUEST['latitude'].') ) * sin( radians( latitude ) ) ) ) <='.$_REQUEST['mile'];
于 2013-09-05T10:04:12.070 に答える
0

メソッドを実行する必要がある場合は、最初に緯度と経度でフィルタリングしてから、近似距離の2乗を計算する方が適切です。北欧諸国の場合、1000 km以内で約0.3%オフになります。

したがって、距離を計算する代わりに、次のようになります。

dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)

近似値を計算できます(lat = lat1がlat2に近いと仮定します)。

const cLat2 = cos lat ^ 2
const r_earth2 = r_earth ^ 2
dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2)

Dist_App 2で注文し、結果から平方根を取ります。

于 2014-10-07T08:20:09.813 に答える