3

基本的にphp、ユーザーのlat値とlong値($userLat, $userLongそれぞれ)を含むファイルにGETリクエストを送信します。
私のデータベースには、次の列を持つテーブル'Locations'があります。

  • 場所の名前
  • ラット
  • Lng
  • 半径(メートル単位)

そこで、ユーザーの座標をすべての場所の座標と比較して、場所とユーザーの間の距離がその場所の半径<=であるかどうかを確認するクエリを作成します。その場合は、その場所の名前を返します。


クエリは次のようになります(擬似コード):

SELECT Location_Name FROM Locations WHERE distanceBetween(($ userLat、$ userLong)AND(Lat、Lng))<=半径

4

2 に答える 2

2

探しているクエリは次のとおりです。

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;

これは、Googleマップの記事から取られました。

于 2012-12-20T17:07:03.410 に答える
2

@ socca1157が答えたのと同じクエリを使用します3959が、クエリの開始時に定数の簡単な説明を提供できると思いました。

私の例では、ユーザーの住所の緯度と経度も取得します

$address = urlencode($_GET['user-address']);

$earth_radius = 3959;
$search_radius = 100;

$ch = curl_init('https://maps.google.com/maps/api/geocode/json?address='.$address.'&sensor=false');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$geocode = curl_exec($ch);
curl_close($ch);

$output = json_decode($geocode);

$lat = $output->results[0]->geometry->location->lat;
$lng = $output->results[0]->geometry->location->lng;


$sql = "SELECT *, ( $earth_radius * acos( cos( radians($lat) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( latitude ) ) ) ) AS distance FROM table WHERE isActive = 1 HAVING distance < $search_radius ORDER BY distance LIMIT 5";
$result = mysql_query($sql);

したがって、たとえば、マイルではなくkmで検索する場合は、地球の半径をkmで使用します。これは6,371kmです。

于 2012-12-20T17:12:21.640 に答える