2015-08-31 2 views
2

У меня есть две таблицы t1 и t2 (t1 имеет 1/10 размера от t2). Каждая таблица имеет два столбца <Lat, Long>, которые содержат широту и долготу некоторых точек. Для каждой строки из t1 Я бы хотел (а) найти строку в нем: t2 которая наиболее близка к этому. Каким будет наиболее эффективный запрос для этого? Есть ли у ура какие-либо библиотеки для геопространственного поиска?Поиск ближайшего местоположения до широты и долготы

+0

Просто чтобы дать немного помогите следующему человеку, который это делает: я перевел свои данные в Solr и использовал его быстрый геопространственный поиск для запроса. Солр был очень быстрым в этом. – Mark

ответ

2

Вам нужно сделать немного триггера.

Пожалуйста, обратитесь к этой статье на Database Journal

Последняя рутина Я считаю, что вы ищете (вам нужно изменить его для использования):

CREATE DEFINER=`root`@`localhost` PROCEDURE closest_restaurants_optimized` 
(IN units varchar(5), IN lat Decimal(9,6), IN lon Decimal(9,6), 
IN max_distance SMALLINT, IN limit_rows MEDIUMINT) 
BEGIN 
    DECLARE ONE_DEGREE_CONSTANT TINYINT; 
    DECLARE EARTH_RADIUS_CONSTANT SMALLINT; 
    DECLARE lon1, lon2, lat1, lat2 float; 
    IF units = 'miles' THEN 
     SET ONE_DEGREE_CONSTANT = 69; 
     SET EARTH_RADIUS_CONSTANT = 3959; 
    ELSE -- default to kilometers 
     SET ONE_DEGREE_CONSTANT = 111; 
     SET EARTH_RADIUS_CONSTANT = 6371; 
    END IF; 
    SET lon1 = lon-max_distance/abs(cos(radians(lat))*ONE_DEGREE_CONSTANT); 
    SET lon2 = lon+max_distance/abs(cos(radians(lat))*ONE_DEGREE_CONSTANT); 
    SET lat1 = lat-(max_distance/ONE_DEGREE_CONSTANT); 
    SET lat2 = lat+(max_distance/ONE_DEGREE_CONSTANT); 
    SELECT pm1.post_id, p.post_title, 
     ROUND((EARTH_RADIUS_CONSTANT * acos(cos(radians(lat)) 
      * cos(radians(pm1.meta_value)) 
      * cos(radians(pm2.meta_value) - radians(lon)) + sin(radians(lat)) 
      * sin(radians(pm1.meta_value))) 
     ), 3) AS distance 
    FROM goodfood_wp_md20m_postmeta AS pm1, 
     goodfood_wp_md20m_postmeta AS pm2, 
     goodfood_wp_md20m_posts AS p 
    WHERE pm1.meta_key = 'latitude' AND pm2.meta_key = 'longitude' 
    AND pm1.post_id = pm2.post_id 
    AND pm1.post_id = p.id 
    AND p.post_status = 'publish' 
    AND pm2.meta_value between lon1 and lon2 
    AND pm1.meta_value between lat1 and lat2 
    ORDER BY distance ASC 
    LIMIT limit_rows; 
END 
Смежные вопросы