-1

我有一个 MySQL 表,里面有纬度/经度的地方。另一方面,我有一个客户端 javascript/html5 页面,可将坐标发送到服务器。

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

SELECT * FROM places AS p WHERE p.latitude NEAR '49.8330001' AND p.longitude NEAR '-119.45600';这样的东西真的很好。

我在这里遇到了一些问题,但他们没有给我正确的答案。我阅读了有关 MySQL 的空间扩展和其他一些 SQL 查询的信息,这些查询可能会起到作用,但似乎没有什么是真正“直截了当”的,所以我认为可以通过一些我可以查看的示例来使用更标准化的方式来做这件事。

有人对这些有经验吗?

4

4 回答 4

2

以下 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;

地图标记是使用此查询生成的

于 2013-10-09T11:40:47.487 回答
0

您可以使用四键。它是基于空间填充曲线的空间索引。你可以在@phpclasses.org 下载我的php 类希尔伯特曲线。

于 2013-10-08T21:10:23.540 回答
-1

为什么不计算您拥有的点与数组中数据库中每个坐标之间的距离。然后,您选择此数组中的最小值。

于 2013-10-08T20:52:03.330 回答
-1

你为什么不简单地创建一个像坐标的 5% 这样的公差,然后做一个

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

[编辑:格式]

于 2013-10-08T20:53:04.213 回答