Я провел несколько часов в тоннах тем и нигде не мог найти запрос, возвращающий точки в радиусе, определяемом км. ST_Distance_Sphere делает это, однако сервер MariaDB 5.5 не поддерживает ST_Distance_Sphere ().
Мне удалось заставить что-то работать, поэтому вот мое решение, совместимое с Doctrine 2.5 и пространственной библиотекой Doctrine CrEOF:
$sqlPoint = sprintf('POINT(%f %f)', $lng, $lat);
$rsm = new ResultSetMappingBuilder($this->manager);
$rsm->addRootEntityFromClassMetadata('ApiBundle\\Entity\\Place', 'p');
$query = $this->manager->createNativeQuery(
'SELECT p.*, AsBinary(p.location) as location FROM place p ' .
'WHERE (6371 * acos( cos( radians(Y(ST_GeomFromText(?))) ) ' .
'* cos( radians( Y(p.location) ) ) * cos( radians( X(p.location) ) ' .
'- radians(X(ST_GeomFromText(?))) ) + sin( radians(Y(ST_GeomFromText(?))) ) * sin( radians( Y(p.location) ) ) )) <= ?',
$rsm
);
$query->setParameter(1, $sqlPoint, 'string');
$query->setParameter(2, $sqlPoint, 'string');
$query->setParameter(3, $sqlPoint, 'string');
$query->setParameter(4, $radius, 'float');
$result = $query->getResult();
Предполагая, что lng и lat - это XY фиксированной точки, Place - это сущность с полем «location» типа POINT.
Я не мог использовать DQL напрямую из-за проблем с привязкой параметров MySQL, поэтому низкоуровневый собственный запрос. RSM требуется для отображения результатов в объектах сущности. Можно и без этого жить.
Не стесняйтесь использовать его. Надеюсь, это сэкономит вам время.