1

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

然后我使用谷歌地图在地图上精确定位它们,但是您还有一个搜索功能,您可以在其中输入您想要的任何地址,“周围”为 5/10/20 公里/英里。

因此,例如,当我搜索伦敦和周围 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 公里”的纬度和经度中选择所有供应商。

谢谢

4

3 回答 3

1

看起来您正在搜索矩形,而不是半径。

为此,您可以使用MySQL Spatial Extension并在此处阅读有关实施的更多信息:Geo-Distance-Search-with-MySQL

但是为了您的信息,mongoDB可以通过一个简单的“SELECT”来做到这一点。给他一个位置和一个范围,它就完成了。更多信息:MongoDB地理空间索引

于 2012-04-25T14:54:03.920 回答
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));
}
于 2012-04-25T14:56:02.250 回答
-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 
于 2015-07-08T11:37:20.467 回答