我有一个MySQL表,里面装满了纬度/经度的地方。另一方面,我有一个客户端javascript/html5页面,它将坐标发送到服务器。
使用客户的坐标,我希望能够找到最近的位置。实现这一目标的最简单方法是什么?
像SELECT * FROM places AS p WHERE p.latitude NEAR '49.8330001' AND p.longitude NEAR '-119.45600';
这样的东西会非常好。
我在这里遇到了几个问题,但他们没有给我一个正确的答案。我读到了MySQL的空间扩展和其他一些SQL查询,这些查询可能会解决问题,但似乎没有什么真正"简单"的,所以我认为可以通过一些我可以查看的示例来提供更标准化的方法。
有人有这方面的经验吗?
以下 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;
此地图标记是使用此查询生成的
您可以使用四键。它是基于空间填充曲线的空间索引。你可以下载我的php类希尔伯特曲线@phpclasses.org。
为什么不计算数组中数据库中每个坐标之间的距离。然后,选择此数组中的最小值。
为什么不简单地创建一个公差,比如坐标的 5%,然后做一个
$latplus5percent = $lat + .5*$lat;
$latminus5percent = $lat - .5*$lat;
WHERE p.latitude BETWEEN $latplus5percent AND $latminus5percent
[编辑:格式]