дорожная карта, чтобы выполнить близость serach - PullRequest
2 голосов
/ 25 февраля 2012

Я хочу найти людей около Х миль, позвольте мне объяснить это правильно.

У меня есть приложение, которое выполняет следующие действия:

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 - это радиус? </strong>

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

1 Ответ

1 голос
/ 25 февраля 2012

Формула harvesine описывает, когда сталкиваются 2 круга. Первый круг - это ваше текущее местоположение, а второй круг - любая другая достопримечательность. Вам нужно определить радиус первого круга и сравнить с ним любую другую точку интереса. Можно использовать и квадраты. Или вы можете использовать пространственный индекс, такой как quadkey или пространственное расширение mysql.

...