2011-10-27 126 views
0

我有一个大约400个城市的数据库。用户选择他居住的城市,并且输入他愿意去的距离(例如,40公里)。 city_id存储在搜索表中,还有其他一些不相关的信息。当用户提交表单时,他被重定向到结果页面,其中显示了搜索表格中的所有结果符合条件的结果页面,但我想按城市表格用户的城市与结果城市之间的距离排序,并对结果进行排序通过那个距离(最接近的第一个)。我如何计算城市之间的距离,然后订购它们?我需要为每个城市添加哪些表格,所以我实际上会计算距离,并且有什么方法可以运行一个循环来找到每个城市的坐标并存储它们?我当前的城市表只有id,namezip计算400个城市之间的距离并为其优化MySQL?

任何帮助,将不胜感激。

+0

我以前的答案可能会被证明是有趣的 - 它很简单并且很好。 http://stackoverflow.com/questions/3983325/calculate-distance-between-zip-codes-and-users/3989830#3989830 –

回答

4

我看到了两种可能的解决方案。

第一招:
每个城市的商店数据库中的纬度和经度;当用户获得查询时,您可以计算与其他城市的距离并返回结果。
Pro是你可以添加每个城市的分贝,无需添加其他信息。
Here你可以找到公式,样本和代码太的经纬度距离计算...

二:
创建一个表cities_dist有三个领域: city1_id, city2_id, distance ,并把每一个可能的内线组合中的城市。 有了这个功能,你可以编写一个查询选定的城市beeing city1_id或city2_id。
专业是你可以使用一个简单的查询没有任何钙,而缺点是你必须填写这张表,只要你在你的数据库中插入一个新的城市。

用户评论后编辑:
想象一下,你有三个城市

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 
+0

城市是静态的,以后都不会加,所以第二个选项会很好。但是,我仍然不确定PHP部分如何存储,因此我没有数以百万计的重复项。 – ItsGreg

+0

@GregaMenih:看看我编辑的帖子 – Marco

1

根据结果的准确度应该是最简单的方法是将纬度/经度(地理坐标)保存为每个城市的额外列。

为了获得距离只需使用毕达哥拉斯(或更精确地缘公式,把地球表面考虑):

distance = sqrt((city.x - my_x)^2 + (city.y - my_y)^2) 

将这个到您的WHERE条款,你会得到的空气线距。

有更复杂的方法来预先计算所有的距离,但对你来说这就足够了。

+0

距离应该精确到〜2km – ItsGreg

+0

请注意,纬度/经度是角度(以度为单位),因此您可以将它们插入毕达哥拉。你可以使用近似的x =(lon1-lon2)* cos(lat); y = lat1 - lat2;距离(km)= 6371 * sqrt(x * x + y * y); – TreyA

相关问题