2016-06-02 2 views
-2

У меня есть две таблицыMySQL радиус выбрать широту и долготу расстояние

Первый из них является "tbl1"

ID fullName mobile 
1 Aaaa  1234567890 
2 Bbbb
3 Cccc  1237894560 

Во-вторых, "tbl2"

ID lalitude  longtitude  currentTime 
2 26.90884600  75.79238500  2016-06-02 13:32:25 
2 26.90884600  75.79238500  2016-06-02 13:32:25 
1 26.90884600  75.79238500  2016-06-02 13:32:25 

У меня вход ID = 2 и lalitude= 28.654490 и longtitude = 77.267117 и distance = 5 kilometer. Я хотел бы получить список пользователей, которые находятся внутри 5 kilometer distance от lalitude(28.654490) и longtitude(77.267117) от tbl2 with join tbl1 table. Я новичок в геоинформационной информации.

Я использую MySQL.

ответ

0

Либо вы используете MySQL spatial extensions и конвертируете свои колонки lat/long в POINT и используете st_distance() function, чтобы рассчитать расстояние между 2 точками.

Или вы сами вычисляете расстояния, используя значения lat/long, сохраненные как числа с плавающей запятой. Для решения см. mySQL longitude and latitude query for other rows within x mile radius тема здесь, на SO. Принятый ответ показывает, как рассчитать расстояние в км.

+0

, что является лучшим способом для достижения этой цели? – user3441151

+0

Я не могу сказать вам, что такое «лучший» способ с вашей точки зрения. Я изложил 2 возможных решения для вас. Это зависит от вас, чтобы решить, какой из них следует использовать на основе ваших бизнес-требований, а затем реализовать его. Вы можете попробовать оба решения и сравнить их скорость. Вам также необходимо оценить накладные расходы на использование пространственных типов данных над обычными типами данных. – Shadow

+0

Я отправляю свой ответ, это сработало для меня, но я хочу знать, это хорошее решение? – user3441151

0

здесь мое решение

DELIMITER ;; 
CREATE PROCEDURE proc_getUsersByDistance(in _ID int, in _lat decimal(10,7), in _long decimal(10,7), in _distance int) 
BEGIN 
    Declare _radius decimal(10,5); 
    Declare _lng_min decimal(10,7); 
    Declare _lng_max decimal(10,7); 
    Declare _lat_min decimal(10,7); 
    Declare _lat_max decimal(10,7); 

    set _radius=_distance*0.621371; 
    set _lng_min = _long - _radius/abs(cos(radians(_lat))*69); 
    set _lng_max = _long + _radius/abs(cos(radians(_lat))*69); 
    set _lat_min = _lat - (_radius/69); 
    set _lat_max = _lat + (_radius/69); 

    SELECT tbl1.*, tbl2.latitude, tbl2.longitude,tbl2.currentTime 
    from tbl1 INNER JOIN tbl2 on tbl1.ID=tbl2.ID 
    where tbl2.ID=_ID and ((tbl2.latitude between _lat_min and _lat_max) and (tbl2.longitude between _lng_min AND _lng_max)) 
    order by tbl2.currentTime; 
END 
Смежные вопросы