php - 在数据库中查找最近的经度和纬度?
问题描述
我正在尝试建立一个报价系统,该系统根据与交付中心的距离进行报价。
我有一张表(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 中最近的集线器?
解决方案
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
)
推荐阅读
- java - 请求访问令牌时出错。没有收到 accessTokenResponse 对象,可能收到了非 HTTP 200?
- android - 在饼图android中显示名称和值(所有同名值的总和)
- dart - 颤动对齐按钮到抽屉底部
- c# - 删除多个 DbContext 之一?
- c# - 如何检查特定父标签计数的所有子标签?
- dart - 如何从颤动的缓存图像网络中获取路径?
- algorithm - 减少回溯算法的时间
- java - 如何在 JdbcTemplate 中执行多批删除?
- cookies - 在赛普拉斯的测试中保留 cookie / localStorage 会话
- docker - 检查我的私有 Docker 注册表中是否存在特定层