我有一个包含物理地址和地理编码的大约60家商店的列表。我想创建一个简单的界面,用户可以在其中输入邮政编码,城市和州,甚至是街道地址,并按照与输入地址的接近程度排序。据我所知,这是网站的一个非常常见的功能。
我的计划是使用Google Maps API查找输入位置的地理编码,并使用Pythagorean定理计算每个位置的距离,并按距离对列表进行排序并返回结果(或者可能是结果集的前5位......)。
这是正确的方法吗?是否有更优化的方法或内置Google Maps API的功能可以执行此操作?由于这是如此常见的事情,我想可以通过多种方式进行尝试和测试,并且可能有几个正确的答案。如果我以正确的方式解决这个问题,我只是在寻找一些建议。
谢谢。
答案 0 :(得分:3)
毕达哥拉斯定理是不够的。地球的曲线就是如此。它需要一点欧几里德几何。 formula和一个简单的实现,用于找到地球上两点之间的距离 - 如飞鸟而不是实际行程距离 - 是(在PHP中):
// pass the latitudes and longitudes in as degrees
function getDistance($lat1,$long1,$lat2,$long2)
{
$r = 3963.1; //3963.1 statute miles; 3443.9 nautical miles; 6378 km
$pi = pi();
// convert the degrees to radians
$lat1 = $lat1*($pi/180);
$lat2 = $lat2*($pi/180);
$long1 = $long1*($pi/180);
$long2 = $long2*($pi/180);
$ret = (acos(cos($lat1)*cos($long1)*cos($lat2)*cos($long2) + cos($lat1)*sin($long1)*cos($lat2)*sin($long2) + sin($lat1)*sin($lat2)) * $r) ;
return $ret;
}
您可以在代码中加入此版本。此外,这是一个可能的(未经测试的)函数,它是我用于MySQL的另一个函数的衍生物。
DELIMITER $$
DROP FUNCTION IF EXISTS `FindDist` $$
CREATE FUNCTION `FindDist` (lt1 DOUBLE,lg1 DOUBLE,lt2 DOUBLE,lg2 DOUBLE) RETURNS DOUBLE
DETERMINISTIC
BEGIN
DECLARE dist,eradius DOUBLE;
SET eradius=3963.1;
SET dist=Acos(Cos(lt1) * Cos(lg1) * Cos(lt2) * Cos(lg2) + Cos(lt1) * Sin(lg1) * Cos(lt2) * Sin(lg2) + Sin(lt1) * Sin(lt2)) * eradius;
RETURN dist;
END $$
DELIMITER ;
答案 1 :(得分:1)
当我研究类似的东西时,我发现了这个链接。它使用.NET,但原则适用于任何语言/框架。
解决方案的关键部分是使用Haversine Formul a来查找指定为经度和纬度的两点之间的距离。这个公式的C#实现链接到上面的文章:
Distance between locations using latitude and longitude (CodeProject)
更多的根源透露:
Calculate Distance Between Two Points on a Globe in 9 Different Languages