根据空间坐标获取最近的位置

Posted

技术标签:

【中文标题】根据空间坐标获取最近的位置【英文标题】:Get nearest location based on spatial coordinates 【发布时间】:2013-10-08 20:46:26 【问题描述】:

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

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

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

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

有人有这方面的经验吗?

【问题讨论】:

“接近”应该有多准确?准系统最简单的方法是从数据库位置中减去当前位置并按最小差异排序,例如select abs(latitude - $lat) AS lat, abs(longitude - $lon) AS $log ... order by 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 标记是使用这个查询生成的

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

[编辑:格式]

【讨论】:

以上是关于根据空间坐标获取最近的位置的主要内容,如果未能解决你的问题,请参考以下文章

Android根据已知的经纬度坐标获取当前位置

如何用JS 获取DIV的坐标位置

获取鼠标坐标并且根据鼠标位置不同弹出不同内容

如何用JS 获取DIV的坐标位置?

使用 MySQL 空间数据在 Google 地图上获取最近的地点

在给定一组地理坐标的情况下获取友好的位置名称?