Как определить область радиального поиска вокруг широты / долготы? - PullRequest
0 голосов
/ 16 января 2012

Я работаю над проектом, где у каждого пользователя есть свои координаты широта / долгота, извлеченные из сервиса геокодера Google ...

Теперь я хочу реализовать функцию поиска -> вы можете ввести радиус(км), и если кто-то находится в радиусе, появится всплывающий профиль ...

не сложно было заставить это работать, когда область поиска на самом деле квадратная, но как мне это получить?работать, с кругом в качестве области поиска?

вот код, чтобы построить «поисковую» часть запроса mysql:

// This is the location of the user who submitted the search function.
mysql_select_db("$db_profile");
$sql = "SELECT location_lat,
            location_lng
    FROM location
    WHERE id = '$global_id'";
$sql = mysql_query($sql);   
$row = mysql_fetch_array($sql);

// The coordinates of the user.
$lat = $row['location_lat'];
$lng = $row['location_lng'];

// the entered radius in kilometers - here it is converted to degree (1° = 111km).
$x_degree = $global_search_radius_value / 111;

// define the search grid (it is a squere! but I want a circle!).
$lat_neg = $lat - $x_degree;
$lat_pos = $lat + $x_degree;

$lng_neg = $lng - $x_degree;
$lng_pos = $lng + $x_degree;

// build the search part of the mysql query
$heredoc_search_radius = <<<EOD
AND ($db_profile.location.location_lat > '$lat_neg' 
    AND $db_profile.location.location_lat < '$lat_pos'
    AND $db_profile.location.location_lng > '$lng_neg'
    AND $db_profile.location.location_lng < '$lng_pos')
EOD;

как я могу использовать круг вместоSquere!?

Ответы [ 2 ]

0 голосов
/ 16 января 2012

http://en.wikipedia.org/wiki/Pythagorean_theorem

В mysql это выглядело бы так, а не suer, если необходима АБС, теоретически так быть не должно.

WHERE SQRT(POW(ABS($db_profile.location.location_lat - $lat), 2) + POW(ABS($db_profile.location.location_lng - $lng), 2)) < $radius

Если вам потребуется более быстрый поиск, сохраните рассчитанные расстояния в другой таблице. Однако для хранения будет использовано n ^ 2 строки.

0 голосов
/ 16 января 2012

Чтобы сохранить эту производительность, лучше всего было бы поместить ваши данные в такую ​​систему, как Apache Solr http://lucene.apache.org/solr/features.html, которая позволит вам выполнять геопространственный поиск "из коробки".

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...