一个纬度20公里/英里,长

时间:2012-04-25 14:39:25

标签: php mysql math map

我有不同的供应商在我的数据库中保存了自己的纬度和纵向位置。

然后我使用谷歌地图将它们固定在地图上,但是你也有一个搜索功能,你可以用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公里左右”那些纬度和长度中选择所有供应商。

谢谢

3 个答案:

答案 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