Tôi đã đào vài giờ qua tấn chủ đề và không thể tìm thấy truy vấn nào, trả về các điểm trong bán kính, được xác định theo km. Tuy nhiên, ST_Distance_Sphere thực hiện, máy chủ là MariaDB 5.5, không hỗ trợ ST_Distance_Sphere().
Managed để có được một cái gì đó làm việc, vì vậy đây là giải pháp của tôi, tương thích với Học thuyết 2.5 và Giáo Lý CrEOF Thư viện không gian:
$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();
Giả sử lng và lat là XY của điểm cố định, Place là những thực thể có một trường "vị trí" loại POINT. Tôi không thể sử dụng DQL trực tiếp do các vấn đề với ràng buộc param của MySQL, đó là lý do tại sao truy vấn gốc cấp thấp. Rsm được yêu cầu để ánh xạ kết quả vào đối tượng thực thể. Có thể sống mà không có nó, mặc dù.
Hãy sử dụng nó. Tôi hy vọng nó sẽ giúp bạn tiết kiệm thời gian.
Nguồn
2016-04-19 12:48:25
có thể trùng lặp [Loại dữ liệu lý tưởng để sử dụng khi lưu trữ vĩ độ/kinh độ trong cơ sở dữ liệu MySQL là gì?] (Http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type -to-use-khi-lưu-latitude-longitudes-in-a-mysql) – Gajus