我在我的数据库中有汽车事故的记录。这些事件都有纬度和经度。在使用GPS的移动设备上,我可以获取用户的位置及其坐标。用户可以选择一个半径,以了解周围是否有事故发生。假设他想知道距离他2英里范围内的事故。
因此,我从手机向Web服务发送用户的纬度、经度和他选择的半径。我需要进行SQL查询以获取距离用户2英里范围内的事故。
您有任何想法如何实现吗?
因此,我从手机向Web服务发送用户的纬度、经度和他选择的半径。我需要进行SQL查询以获取距离用户2英里范围内的事故。
您有任何想法如何实现吗?
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
来源:http://www.meridianworlddata.com/Distance-Calculation.asp
编辑2:我使用随机生成的数据集进行了一系列测试。
绝对不值得。只需使用近似值即可。
function distance($lat1,$lon1,$lat2,$lon2,$unit)
{
$theta=$lon1-$lon2;
$dist=sin(deg2rad($lat1))*sin(deg2rad($lat2))+cos(deg2rad($lat1))*cos(deg2rad($lat2))*cos(deg2rad($theta));
$dist=acos($dist);
$dist=rad2deg($dist);
$miles=$dist*60*1.1515;
$unit=strtoupper($unit);
if ($unit=="K")
{
return ($miles*1.609344);
}
else if ($unit=="N")
{
return ($miles*0.8684);
}
else
{
return $miles;
}
} // end function
$x_lat=center_of_serach;
$x_lon=center_of_serach;
$_distance=some_distance_in_miles;
$query1 = "SELECT * FROM `location_table` WHERE somefield=somefilter";
$result=mysql_db_query($db_conn, $query1);
$max_rows=mysql_num_rows($result);
if ($max_rows>0)
{
while ( $data1=mysql_fetch_assoc($result) )
{
if ( distance($x_lat,$x_lon,$data1['lat'],$data1['lng'],'m')<$_distance )
{
//do stuff
}
}
如果你的数据库不太大,通过函数获取所有数据并运行要比使用查询更快。
这对于公斤和海里也适用。 ;)
SELECT 3963 * ACOS(
SIN(RADIANS($pointAlat)) * SIN(RADIANS($pointAlat)) + COS(RADIANS($pointAlat)) * COS(RADIANS($pointBlat)) * COS(RADIANS($pointAlong) - RADIANS($pointBlong)))
AS
distance;
另外,如果你想找一些关于这个主题的好文章/教程...可以看看这里 http://www.phpfreaks.com/forums/index.php/topic,208965.0.html
WHERE lat<='".$_distance."' AND lng<='".$_distance."'";
- Talvi Watia$distance/69.1
大约可以转换为度数。 - Talvi Watia我进行了快速搜索,找到了这篇博客文章,其中提供了一个很好的解释和SQL语句来选择给定半径内的记录。
在评论中,他建议“对于大型数据集的速度,您可能需要先抓取原点周围的正方形块,方法是将原点的纬度/经度各加上一英里左右,然后使用上述内容作为子查询从中间开始处理”,这听起来像是正确的方法。