3

Xマイルあたりの人を探したいので、きちんと説明させてください。

私は次のことを行うアプリケーションを持っています

1) it shows user's current location on a google map with a radius circle of 3 miles. 

2) when ever user uses this application its current location will get stored into MySQL database
  as follows

   ID          Name       currLat       currLan     radius (in miles )
  --------------------------------------------------------------------
  34334        John       23.039574     72.56602      3

さらに、新しいユーザーが同じアプリケーションを使用するたびに、現在の場所も上記のテーブルに格納されます。

したがって、ユーザーがこのアプリケーションにアクセスすると、サーバー側のコードは現在の場所との近接性をチェックして、他のユーザーが彼の周りにいるかどうかを調べます。

私はそれをグーグルで調べましたがdon't know what's the approach to match and perform proximity search 、実際にはいくつかの式について読んだことがありますが、それを実行する手順については本当に知りません.

これまでのところ、次のコードを php に使用しました。これは max と min lat n lan を返しますが、近接検索にまったく慣れていないので、それをどうするかは本当にわかりません。the road map to do that

    $radius = 600;

    $longitude = (float) $lan;
    $latitude = (float) $lat;


    $lng_min = $longitude - $radius / abs(cos(deg2rad($latitude)) * 69);
    $lng_max = $longitude + $radius / abs(cos(deg2rad($latitude)) * 69);
    $lat_min = $latitude - ($radius / 69);
    $lat_max = $latitude + ($radius / 69);

    $data ["lat"] = $lng_min . '/' . $lng_max . PHP_EOL;
    $data ["lan"] = $lat_min . '/' . $lat_max;

今回が非現実的な質問ではないことを心から願っています。さらに情報が必要な場合は、お気軽に質問してください

これまで私はやった

タイプが POINT フィールドで、その上に SPATIAL インデックスを持つテーブルを作成する

CREATE TABLE userstatus (
  id varchar(100) NOT NULL,
  userid varchar(100) NOT NULL,
  username varchar(100) NOT NULL,
  currLoc  POINT NOT NULL,
  radius INT(10),
  SPATIAL INDEX(currLoc)

)ENGINE = MYISAM

その後、距離を計算する手順

DELIMITER $$
 CREATE FUNCTION distance (a POINT, b POINT) RETURNS double DETERMINISTIC
   BEGIN
     RETURN 6371 * 2 * ASIN(SQRT(POWER(SIN(RADIANS(ABS(X(a)) - ABS(X(b)))), 2) + COS(RADIANS(ABS(X(a)))) * COS(RADIANS(ABS(X(b)))) * POWER(SIN(RADIANS(Y(a) - Y(b))), 2)));
   END  $$
DELIMITER ;

今、私は誰になるかわかりませんcompare my user's lat , lat and radius with above function

を使用してデータを挿入しました

$userStatusInsert = "INSERT INTO userstatus (id,userid,username,currLoc,radius) 
                    VALUES('".$id."','".$uid."','".$uname."',GeomFromText('POINT(".$lat." ".$lan.")'),'".$radius."')";

cdist < 10 でクエリ を実行しました。値 10 は半径ですか?

SELECT userid, username, distance(userstatus.currLoc, GeomFromText('POINT(23.039574  72.56602)')) AS cdist FROM userstatus HAVING cdist < 10 ORDER BY cdist LIMIT 10

結果は次のとおりですが、cdist列に何が含まれているかは本当にわかりません。これは、人が範囲内にいることをどのように判断するかを意味します

id      username          cdist
-----------------------------------
1115    John    4.52726116114886
1111    Hunt    6.2734062677772
1112    Raul    7.55266860461263
1113    Nizam   7.55480140608532
1114    John    7.76912596719722
4

1 に答える 1

2

ハーベサインの式は、2 つの円が衝突するときを表します。最初の円は現在地で、2 番目の円はその他の関心のあるポイントです。最初の円の半径を定義し、他の対象の点と比較する必要があります。正方形も使用可能です。または、quadkey や mysql 空間拡張などの空間インデックスを使用できます。

于 2012-02-25T07:24:18.230 に答える