2013-10-08 48 views
-1

我有一个充满纬度/经度的地方的MySQL表。另一方面,我有一个客户端的javascript/html5页面,它将坐标发送到服务器。根据空间坐标获取最近的位置

使用客户端的坐标,我希望能够找到最近的位置。实现这一目标的最简单方法是什么?

类似SELECT * FROM places AS p WHERE p.latitude NEAR '49.8330001' AND p.longitude NEAR '-119.45600';会很好。

我在这里遇到了几个问题,但他们没有给我一个正确的答案。我阅读了关于MySQL的空间扩展和其他一些SQL查询可能会实现的技巧,但没有一件看起来真的很“直截了当”,所以我认为可以通过一些更具标准化的方式来做到这一点,我可以查看一些例子。

任何人都有这些经验?

+0

如何准确应该“近”是产生的?准系统最简单的方法是从数据库位置中减去当前位置并按照最小的差异进行排序,例如, 'select abs(latitude - $ lat)AS lat,abs(longitude - $ lon)AS $ log ...按照lat desc,lon desc'类型的顺序排列。没有涉及花哨的数学,只是一些减法。 –

回答

1

以下PHP代码使用MySQL和PDO查找距离您最近的地点坐标。

它创建了一个JSON坐标数组。

// Prepare statements 
$stmt = $dbh->prepare("SELECT name, lat, lng, 
      (3959 * acos(cos(radians(?)) * cos(radians(lat)) 
      * cos(radians(lng) - radians(?)) + sin(radians(?)) 
      * sin(radians(lat)))) AS distance FROM table HAVING distance < ? 
      ORDER BY distance ASC LIMIT 0 , 20"); 
// Assign parameters 
$stmt->bindParam(1,$center_lat); 
$stmt->bindParam(2,$center_lng); 
$stmt->bindParam(3,$center_lat); 
$stmt->bindParam(4,$radius); 
//Execute query 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$stmt->execute(); 
$rows = array(); 
while($row = $stmt->fetch()) { 
$rows[] = $row; 
} 
echo json_encode($rows); 
exit; 

Maps标记使用此查询

-1

为什么不计算数据库中数据库中的点与每个坐标之间的距离?然后,你在这个数组中选择min。

-1

你为什么不干脆创建一个容忍像5%的坐标,然后做一个

$latplus5percent = $lat + .5*$lat; 
$latminus5percent = $lat - .5*$lat; 
WHERE p.latitude BETWEEN $latplus5percent AND $latminus5percent 

[编辑:格式]

0

可以使用quadkey。这是一个基于空间填充曲线的空间索引。你可以下载我的php类hilbert曲线@ phpclasses.org。