按位置查找商店

时间:2010-02-16 17:30:16

标签: google-maps geometry

我有一个包含物理地址和地理编码的大约60家商店的列表。我想创建一个简单的界面,用户可以在其中输入邮政编码,城市和州,甚至是街道地址,并按照与输入地址的接近程度排序。据我所知,这是网站的一个非常常见的功能。

我的计划是使用Google Maps API查找输入位置的地理编码,并使用Pythagorean定理计算每个位置的距离,并按距离对列表进行排序并返回结果(或者可能是结果集的前5位......)。

这是正确的方法吗?是否有更优化的方法或内置Google Maps API的功能可以执行此操作?由于这是如此常见的事情,我想可以通过多种方式进行尝试和测试,并且可能有几个正确的答案。如果我以正确的方式解决这个问题,我只是在寻找一些建议。

谢谢。

2 个答案:

答案 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,但原则适用于任何语言/框架。

  

Store Locator: Help customers find you with Google Maps

解决方案的关键部分是使用Haversine Formul a来查找指定为经度和纬度的两点之间的距离。这个公式的C#实现链接到上面的文章:

  

Distance between locations using latitude and longitude (CodeProject)

更多的根源透露:

  

Calculate Distance Between Two Points on a Globe in 9 Different Languages