Я выкопал несколько часов через тонны тем и не мог найти запрос, возвращая точки в радиусе, определяемом километром. ST_Distance_Sphere делает это, однако, сервер MariaDB 5.5, не поддерживает ST_Distance_Sphere().
Управляемый, чтобы получить что-то работает, так вот мое решение, совместимое с доктриной 2.5 и доктрина CrEOF Spatial библиотека:
$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 и лату является XY неподвижной точки, место является объектом с поле «местоположение» POINT. Я не мог использовать DQL напрямую из-за проблем с привязкой param MySQL, поэтому для низкоуровневого исходного запроса. Rms требуется для сопоставления результатов с объектами сущности. Можно жить без него.
Не стесняйтесь использовать его. Надеюсь, это сэкономит вам время.
Возможный дубликат [Какой идеальный тип данных используется при хранении широты/долготы в базе данных MySQL?] (Http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type -to-use-when-storing-latitude-longitudes-in-mysql) – Gajus