我有大约400个城市的数据库。用户选择他所居住的城市,并输入他愿意旅行的距离(例如,40公里)。 city_id存储在搜索表中,以及其他一些不相关的信息。当用户提交表单时,他被重定向到结果页面,在该结果页面上显示符合条件的搜索表的所有结果,但我想按城市表单用户的城市和结果城市之间的距离对它们进行排序,并对结果进行排序到那个距离(最近的)。我如何计算城市之间的距离,然后订购?我必须添加到每个城市的桌子,所以我实际上会计算距离,有没有办法我可以运行一个循环来找到每个城市的坐标并存储它们?我当前的城市表只有id
,name
和zip
任何帮助都将不胜感激。
答案 0 :(得分:4)
我看到了两种可能的解决方案。
第一个:
对于数据库中的每个城市商店的纬度和经度;当用户获得查询时,您计算与其他所有城市的距离并返回结果
Pro是你可以添加db中的每个城市,而无需添加其他信息
Here你可以找到纬度 - 经度距离计算公式,样本和代码...
<强>第二强>
创建一个包含三个字段的表cities_dist
:
city1_id, city2_id, distance
并在你的城市之间加入所有可能的组合。
有了这个,你可以写一个查询whit选择城市beeing city1_id或city2_id
Pro是你可以使用一个没有任何计算的简单查询,而缺点是你必须在数据库中插入新城市时填写这个表。
用户评论后编辑:
想象一下,你有三个城市
ID NAME
1 New York
2 Rome
3 Berlin
该表应该看起来像
CITY1 CITY2 DIST
1 2 1500
1 3 1200
2 3 400
当用户想要从柏林飞行时,您可以使用
SELECT c1.name, c2.name, cd.dist
FROM cities_dist cd
INNER JOIN cities c1 ON cd.city1 = c1.id
INNER JOIN cities c2 ON cd.city2 = c2.id
WHERE cd.city1 = your_id
OR cd.city2 = your_id
ORDER BY cd.dist ASC
答案 1 :(得分:1)
根据结果的准确程度,最简单的方法是将纬度/经度(地理坐标)保存为每个城市的额外列。
要获得距离,只需使用毕达哥拉斯(或考虑到地球表面的一些更准确的地理公式):
distance = sqrt((city.x - my_x)^2 + (city.y - my_y)^2)
将此放入您的WHERE
条款中,您将获得航线距离。
有更复杂的方法来预先计算所有距离,但对你来说这就足够了。