首页 > 解决方案 > 在数据库中查找最近的经度和纬度?

问题描述

我正在尝试建立一个报价系统,该系统根据与交付中心的距离进行报价。

我有一张表(table1),其中包含该国的所有邮政编码及其对应的经纬度

我有另一个表(表 2),其中包含我所有的运输中心及其邮政编码和相应的经纬度。

因此,当用户输入他们的邮政编码时,我可以使用以下代码从我的数据库中获取他们的经纬度:

$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("SELECT name, lng, lat FROM posts WHERE code=:code");
$stmt->execute(['code' => $post1]); 

while ($row = $stmt->fetch()) {
    $lng1 = $row['lng'];
    $lat1 =  $row['lat'];
    $name1 =  $row['name'];
}

echo "name 1: ".$name1;
echo "<br>";
echo "post code 1: ".$lng1;
echo "<br>";
echo "post code 1: ".$lat1;

我如何使用那个 long 和 lat 来找到表 2 中最近的集线器?

标签: phpmysqlsqlsubqueryspatial

解决方案


MySQL 有空间支持;您可以使用points从坐标构建,然后用于st_distance_sphere()计算距离:

select *
from (
    select p.name post_name, p.lng post_lng, p.lat post_lat, 
        h.name, hub_name, h.lng hub_lng, h.lat hub_lat,
        row_number() over(
            order by st_distance_sphere(point(p.lng, p.lat), point(h.lng, h.lat))
        ) rn
    from posts p
    cross join hubs h 
    where code =: code
) t
where rn = 1

您也可以使用子查询来执行此操作:

select p.name post_name, p.lng post_lng, p.lat post_lat, 
    h.name, hub_name, h.lng hub_lng, h.lat hub_lat
from posts p
inner join hubs h on h.id = (
    select id
    from hubs h1
    order by st_distance_sphere(point(p.lng, p.lat), point(h1.lng, h1.lat))
    limit 1
)

推荐阅读