2012-02-25 2 views
2

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

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

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 

Кроме того, когда-либо новый пользователь будет использовать то же приложение, его текущее местоположение будет также получить магазин в таблице выше.

поэтому, когда любой пользователь обращается к этому приложению, код на стороне сервера проверяет близость к его текущему местоположению, чтобы узнать, находится ли вокруг него какой-либо другой пользователь.

i google it, но я действительно don't know what's the approach to match and perform proximity search Я читал о некоторых формулах, но на самом деле не знаю о процедурах его выполнения.

До сих пор я использовал следующий код в php, который возвращает max и min lat n lan, но я действительно не знаю, что делать с ним, так как m абсолютно новый для поиска близости, так что любой может сказать мне 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."')"; 

Я уволил запросin 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 
+1

вы должны сделать это с помощью mysql, а не с php-кодом. эта проблема была решена много раз раньше. вот пример учебника: http://vinsol.com/blog/2011/08/30/geoproximity-search-with-mysql/ вы также можете найти «поисковый запрос геометрии mysql», чтобы найти много других –

+0

Я согласен. Используйте пространственные расширения для mysql или postgresql.Я действительно предпочитаю использовать postgresql, потому что он не использует mbr (минимальные ограничивающие прямоугольники) с геопространственными функциями, такими как mysql (по крайней мере, до версии v5.6). Подобно тому, как точка находится в нечетном полигоне. –

+0

@Ben Lee, как в вашем примере они используют Polygon, есть ли способ определить круг? – Hunt

ответ

1

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

+0

Как я могу использовать круг (так как я не хочу многоугольник) – Hunt

+0

@Hunt: В примере закрытый полигон используется только как пространственный индекс. Если вы не хотите использовать пространственный индекс, вы можете удалить его из предложения WHERE. Пользователь Ray Perea использует пространственный индекс и формулу харвезина. – Bytemain

+0

, вы имеете в виду, что я должен удалить предложение WHERE и передать первый параметр в качестве хранилища всех пользователей в БД со вторым параметром в качестве текущего пользователя, который запрашивает этот запрос – Hunt

Смежные вопросы