用于执行邻近搜索的路线图

时间:2012-02-25 07:08:03

标签: php mysql geolocation geospatial geo

我想找到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,但我真的不知道该怎么做,因为对于邻近搜索来说是全新的,所以任何人都可以告诉我{{ 1}}

the road map to do that

我真的希望这次不是一个不真实的问题,如果有人想要任何进一步的信息,那么随时可以问

到目前为止我已经完成了

创建一个表格,其中包含POINT字段类型和SPATIAL索引

    $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;

之后计算距离的程序

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

我在cdist<中解除了查询 10,值10是半径?

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

结果如下,但我真的不知道cdist列包含什么,我的意思是这个 确定一个人在范围内

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

1 个答案:

答案 0 :(得分:1)

harvesine公式描述了2个圆圈碰撞时的情况。第一个圆圈是您当前的位置,第二个圆圈是任何其他兴趣点。您需要定义第一个圆的半径,并将任何其他感兴趣的点与它进行比较。也可以使用正方形。或者您可以使用像quadkey或mysql空间扩展的空间索引。