Поиск на географическом расстоянии MYSQL

#php #mysql #geolocation #coordinates #spatial

#php #mysql #геолокация #координаты #пространственный

Вопрос:

Я выполняю поиск по географическому расстоянию с помощью mysql, используя пространственное расширение. Для этого я выполнил хранимую процедуру (которая действительно хорошо работает, когда я запускаю командную строку в mysql подобным образом

mysql> ВЫЗВАТЬ test2(GeomFromText(‘ТОЧКА(-0.93961472 43.52843475)’),0.6 );

 DROP PROCEDURE `test2`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `test2`(IN center2 point,IN dist int)
BEGIN
SET @center = center2;
SET @radius = dist;

SET @bbox = CONCAT('POLYGON((', 
 X(@center) - @radius, ' ', Y(@center) - @radius, ',', 
 X(@center)   @radius, ' ', Y(@center) - @radius, ',', 
 X(@center)   @radius, ' ', Y(@center)   @radius, ',', 
 X(@center) - @radius, ' ', Y(@center)   @radius, ',', 
 X(@center) - @radius, ' ', Y(@center) - @radius, '))' 
);

SELECT professionnels.*, AsText(coord) 
FROM professionnels 
WHERE Intersects( coord, GeomFromText(@bbox) ) 
AND SQRT(POW( ABS( X(coord) - X(@center)), 2)   POW( ABS(Y(coord) - Y(@center)), 2 )) < @radius limit 20;
end
  

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

ПРОЦЕДУРА test2 не может вернуть результирующий набор в данном контексте

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

Спасибо

Ответ №1:

Вы можете изменить последнюю часть на

 /*delete all rows from temp_table*/
DELETE FROM temp_table WHERE temp_table.somefield is not null;

INSERT INTO temp_table
  SELECT professionnels.*, AsText(coord) 
  FROM professionnels 
  WHERE Intersects( coord, GeomFromText(@bbox) ) 
  AND SQRT(POW( ABS( X(coord) - X(@center)), 2) 
        POW( ABS(Y(coord) - Y(@center)), 2 )) < @radius limit 20;
  

Затем вы можете выбрать из temp_table и найти там resultset.

Комментарии:

1. Да, но что, если поиск выполняет более одного пользователя?? этот поиск на самом деле является функцией, которая позволяет пользователю искать некоторые POI по городу, поэтому он будет вызван многими пользователями… я не могу использовать этот метод… это не сработает

2. Хорошо .. Я использовал драйвер MYSQLI вместо MYSQL, и это работает. Я могу восстановить набор данных, возвращаемый хранимой процедурой. Но хорошая ли это идея? Спасибо

3. @Fazoulete, это взлом, но если вы используете временную таблицу, у каждого сеанса будет своя таблица, поэтому пользователи не будут видеть результаты друг друга. Хотя, если вы получаете результирующий набор прямо из SP, это лучше.