5

SQL ステートメントを介してユーザーに最も近い場所を返そうとすると問題が発生します。テストするために、まったく同じ座標を使用しています。これが私が持っているものです:

SQL:

SELECT  `companies`.`customerName` , 
    (3959 * 
        ACOS(
            COS(
                RADIANS(37.367485) * COS(RADIANS(`locations`.`gps_lat`)) * 
                COS(
                    RADIANS(`locations`.`gps_lng`) - RADIANS(-77.399994) + 
                    SIN(RADIANS(37.367485)) * SIN(RADIANS(`locations`.`gps_lat`))
                )
            )
        )
    )
AS  `distance` 
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  `distance` > 25
ORDER BY distance
LIMIT 0 , 10

結果:

| customerName  | distance           |
| SOME COMPANY  | 1914.41747964854   |


locations テーブルの値:

gps_lat   | gps_lng
37.367485 | -77.399994


Google の例を使用しました。式を数回確認しましたが、どこが間違っていたのかわかりません。どんな助けでも大歓迎です。


編集:
私が何をしているのかを知っていると、私には混乱があるようです:

>結果を得るために が代入されました。1914明らかに より大きくなり25ます。

このアプリケーションは、ユーザー座標を Android アプリから Web サーバーに渡します。緯度と経度は$_GET値から取得され、Web サーバーの MYSQL データベース内の企業から相互参照されます。

上記の構文は、Mysql Workbench で SQL ステートメントをチェックしているだけです。明らかに、ゼロ値の結果を探しています。

4

2 に答える 2

5

この問題は、Google の例から「採用された yooper の冒険」が提供する式に変更することで解決したと思います。自分のバージョンのHaversine Formulaを使用します。
注: 上記の Google の例では、Haversine も使用しています。

SQL:

SELECT  `companies`.`customerName` , 
(2 * (3959 * ATAN2(
          SQRT(
            POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(37.367485 )) *
            POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ),
          SQRT(1-(
            POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(37.367485)) *
            POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ))
        )
      ))
AS 'distance'
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  distance < 25
ORDER BY distance
LIMIT 0 , 10



私のアプリケーション、Final PHP に興味がある人のために:

値を取得:?lat=37.367485&lng=-77.399994

$earth_radius_miles = 3959; // Earth radius in miles
$earth_radius_kilometers = 6371; // Earth radius in kilometers
$result_radius = 10000; // Maximum distance in either miles or kilometers

$get_lat = $_GET["lat"];
$get_lng = $_GET["lng"];

$dbSelect = mysql_query("SELECT  `companies`.`customerName`,
(2 * (".$earth_radius_miles." * ATAN2(
          SQRT(
            POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(".$get_lat.")) *
            POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ),
          SQRT(1-(
            POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat` ) ) / 2 ), 2 ) +
            COS(RADIANS(`locations`.`gps_lat`)) *
            COS(RADIANS(".$get_lat.")) *
            POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng` ) ) / 2 ), 2 )
          ))
        )
      ))
AS 'distance'
FROM  `locations` 
JOIN  `companies` ON  `locations`.`co_id` 
HAVING  distance < ".$result_radius."
ORDER BY distance
LIMIT 0 , 10") 
or die(mysql_error());

結果:

[{"customerName":"SOME COMPANY","distance":"0"}]

これらの結果を他の座標でテストしたところ、完全に機能しているようです。2 点間の距離が離れているものは何もテストしていませんが、私のアプリケーションではそうする必要はありません。

于 2012-06-26T20:33:44.660 に答える
1

Ashok、次の式を使用して 2 つの座標間の距離を計算できます。

ここに画像の説明を入力

どこ

R  =  radius of the earth (6,371 km)
Δlat =  |lat2- lat1|
Δlong = |long2- long1|
于 2013-05-02T21:22:37.633 に答える