Ho scavato poche ore attraverso tonnellate di argomenti e non sono riuscito a trovare nessuna query, restituendo punti in un raggio, definito in km. ST_Distance_Sphere lo fa, tuttavia, il server è MariaDB 5.5, che non supporta ST_Distance_Sphere().
Siamo riusciti a trovare qualcosa di lavoro, ecco la mia soluzione, compatibile con la dottrina 2.5 e la Dottrina CrEOF spaziale libreria:
$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();
Supponendo GNL e lat è XY del punto fisso, Place è l'entità con un tipo di POINT di campo "posizione". Non ho potuto utilizzare direttamente DQL a causa di problemi con il collegamento param di MySQL, ecco perché la query nativa di basso livello. Il rsm è richiesto per mappare i risultati in oggetti entità. Può vivere senza di essa, però.
Sentitevi liberi di usarlo. Spero ti salverà un po 'di tempo.
fonte
2016-04-19 12:48:25
possibile duplicato di [Qual è il tipo di dati ideale da utilizzare quando si memorizzano latitudine/longitudini in un database MySQL?] (Http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type -uso-quando-memorizzazione-latitudine-longitudes-in-a-mysql) – Gajus