最近的纬度和经度位置

时间:2011-12-22 13:02:48

标签: php mysql

我只有一家商店的纬度和经度,现在我想在1小时车程或10公里距离处找到附近的所有商店。

我有桌子,

Id, storeName, store_lat, store_lng

假设我选择了商店1的lat和lng,我想知道附近的所有商店。如何使用php / mysql。

我在SO上检查过很多帖子,但是当我运行查询时,它总是返回0结果。

请帮助,谢谢!

4 个答案:

答案 0 :(得分:3)

假设你得到$ lat和$ long作为你起点的latitidue /经度:

$sql = 'SELECT *, (6371 * acos(cos(radians(' . $lat . ')) * cos(radians(latitude)) * cos(radians(longitude) - radians(' . $lng . ')) + sin(radians(' . $lat . ')) * sin(radians(latitude)))) AS distance from table_name WHERE distance < 10';

答案 1 :(得分:1)

一种方法是获取输入纬度/经度对,创建范围,然后查询属于该范围的所有记录:

Distance = 0.1; // Range in degrees (0.1 degrees is close to 11km)
LatN = lat + Distance;
LatS = lat - Distance;
LonE = lon + Distance;
LonW = lon - Distance;

...Query DB with something like the following:
SELECT *
FROM table_name
WHERE 
(store_lat BETWEEN LatN AND LatS) AND
(store_lon BETWEEN LonE AND LonW)

查询应该找到存储的lat小于LatN且大于LatS的所有内容,以及存储的lon小于LonE且大于LonW的位置。

然后你可以对返回的结果进行真正的距离计算,因为上面的搜索给你一个方框,角落里的位置将大于0.1度,就像乌鸦一样。

使用带有路线的地图API来获取行车距离,如果“因为乌鸦飞行”不够好。

答案 2 :(得分:1)

SELECT * FROM `table` WHERE acos(sin(LATITUDE) * sin(`store_lat`) + cos(LATITUDE) * cos(`store_lat`) * cos(`store_lng` - (LONGITUDE))) * 6371 <= 1000;

只需替换LONGITUDE和LATITUDE。

这里的距离是km - 它目前设置为1000.这也可以根据需要进行更改。

到目前为止,我已经在一些脚本上使用了这个,似乎工作得很好,虽然有时会很慢。我认为这个问题是它无法使用索引,因为WHERE子句太复杂了。

答案 3 :(得分:0)

function inRange ( $lat1, $lng1, $lat2, $lng2, $range = 100 )
{
        return ( 6371 * acos( cos( deg2rad( $lat1 ) ) * 
               cos( deg2rad( $lat2 ) ) * 
               cos( deg2rad( $lng2 ) - 
               deg2rad( $lng1 ) ) + 
               sin( deg2rad( $lat1 ) ) * 
               sin( deg2rad( $lat2 ) ) ) ) <= $range;
}

这会产生距离。您可以将其转换为MySQL查询。