Матрица расстояний для mysql, основанная на предыдущем решении для расчета расстояния по гаверсинусу

На этот вопрос можно ответить самостоятельно, чтобы помочь людям, которым необходимо создать матрицу расстояний в MySQL, которая поддерживает такие запросы, как «выбрать id2 из расстояний, где id1 = 10, тип 1 = 0, тип 2 = 1 и расстояние‹10», которые будут находить объекты тип 1 в окрестности 10 от объекта 10 типа 0.

Код предполагает структуру таблицы, аналогичную описанной в расстоянии Mysql Haversine. расчет

Если вам когда-нибудь понадобится матрица расстояний в mysql, вот определение View для нее:

select o1.object_id AS id1,o1.object_type AS type1,o2.object_id AS id2,o2.object_type AS type2,geodistance_km_by_obj(o1.object_id,o1.object_type,o2.object_id,o2.object_type) AS distance from (Coordinates o1 join Coordinates o2) where ((o1.object_id,o1.object_type) <> (o2.object_id,o2.object_type))

Где функция geodistance_km_by_obj представляет собой некоторую функцию расчета расстояния, например, на основе вычисления гаверсинуса, связанного в заголовке.

CREATE FUNCTION geodistance_km_by_obj(object_id1 INT, object_type1 TINYINT, object_id2 INT, object_type2 TINYINT)
RETURNS float
LANGUAGE SQL
DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
COMMENT 'returns distance in km'
BEGIN
declare sl1 float;
declare cc1 float;
declare cs1 float;
declare sl2 float;
declare cc2 float;
declare cs2 float;

select sin_lat,cos_cos,cos_sin into sl1, cc1, cs1 from Coordinates where object_id=object_id1 and object_type=object_type1;
select sin_lat,cos_cos,cos_sin into sl2, cc2, cs2 from Coordinates where object_id=object_id2 and object_type=object_type2;
return cast(round(acos(sl1*sl2 + cc1*cc2 + cs1*cs2)*6371,0) as decimal);
END

person silvio    schedule 03.04.2012    source источник
comment
Чтобы придерживаться формата вопросов и ответов, вы должны задать это как вопрос, а затем ответить на свой собственный вопрос с найденным решением.   -  person Michael Fredrickson    schedule 04.04.2012
comment
К сожалению, для низкоранговых пользователей между вопросом и ответом на него есть задержка в 8 часов. Хотя спасибо за внимание.   -  person silvio    schedule 04.04.2012
comment
Прошло более 8 часов. Если вы отредактируете этот вопрос и выберете свой ответ как правильный, вы можете заработать дополнительный значок (нет ничего плохого в том, чтобы делиться знаниями на этом сайте).   -  person Jason Sperske    schedule 24.07.2012