我有不同的供应商在我的数据库中保存了自己的纬度和纵向位置。
然后我使用谷歌地图将它们固定在地图上,但是你也有一个搜索功能,你可以用5/10/20 km /英里左右的距离输入你想要的任何地址。
因此,例如当我搜索伦敦和10公里左右的时候,我希望得到所有来自伦敦的所有供应商返回纬度并且在此点附近长+ 10公里。
现在我的功能略有不同(显然没有半径选项)
private function findServicesNearLocation($filter = array(), $lat, $lng) {
// set radius
$difference = 0.07;
// build filter
$latitude_from = floatval($lat) - $difference;
$latitude_to = floatval($lat) + $difference;
$longitude_from = floatval($lng) - $difference;
$longitude_to = floatval($lng) + $difference;
$filter[] = "a.gps_latitude >= {$latitude_from}";
$filter[] = "a.gps_latitude <= {$latitude_to}";
$filter[] = "a.gps_longitude >= {$longitude_from}";
$filter[] = "a.gps_longitude <= {$longitude_to}";
// return services
return $this->vendors->getVendors(implode(' AND ', $filter));
}
我如何更改上述功能以进行适当的估算,并从特定的“10公里左右”那些纬度和长度中选择所有供应商。
谢谢
答案 0 :(得分:1)
看起来你正在搜索一个矩形,而不是半径。
为此您可以使用 MySQL Spatial Extension ,并在此处阅读有关实施的更多信息:Geo-Distance-Search-with-MySQL
但是对于您的信息, mongoDB 可以通过简单的“SELECT”来实现。给他一个位置和一个范围就完成了。更多信息:MongoDB Geospatial Indexing
答案 1 :(得分:1)
我认为这是对你要问的答案。纬度和经度相距约111公里,因此您可以将其计算在数学中。我希望这就是你所要求的。
private function findServicesNearLocation($filter = array(), $lat, $lng, $distanceKilometers=0) {
// set radius
$difference = 0.07;
$distance=$distanceKilometers!=0?ceil($distanceKilometers/111):0;
// build filter
$latitude_from = floatval($lat) - $difference - $distance;
$latitude_to = floatval($lat) + $difference + $distance;
$longitude_from = floatval($lng) - $difference - $distance;
$longitude_to = floatval($lng) + $difference + $distance;
$filter[] = "a.gps_latitude >= {$latitude_from}";
$filter[] = "a.gps_latitude <= {$latitude_to}";
$filter[] = "a.gps_longitude >= {$longitude_from}";
$filter[] = "a.gps_longitude <= {$longitude_to}";
// return services
return $this->vendors->getVendors(implode(' AND ', $filter));
}
答案 2 :(得分:-2)
SELECT Latitude, Longitude, 111.045* DEGREES(ACOS(COS(RADIANS(latpoint)) * COS(RADIANS(Latitude)) * COS(RADIANS(longpoint) - RADIANS(Longitude)) + SIN(RADIANS(latpoint)) * SIN(RADIANS(Latitude)))) AS distance_in_km FROM table JOIN ( SELECT 42.81 AS latpoint, -70.81 AS longpoint ) AS p ON 1=1 ORDER BY distance_in_km LIMIT 15