代码之家  ›  专栏  ›  技术社区  ›  chaimp

按位置查找商店

  •  1
  • chaimp  · 技术社区  · 15 年前

    我有一个大约60家商店的清单,上面有物理地址和地理代码。我想做一个简单的界面,用户可以输入一个邮政编码,或城市和州,甚至一个街道地址,并有列表排序,以接近输入的地址。据我所知,这是网站的一个非常常见的特性。

    我的计划是使用google maps api查找输入位置的地理代码,并使用毕达哥拉斯定理计算到每个位置的距离,并根据距离对列表进行排序,然后返回结果(或者可能是结果集的前5个…)。

    这是正确的方法吗?有没有一个更优化的方法或内置在google maps api中的函数可以做到这一点?因为这是很常见的事情,我想已经有很多方面的尝试和测试,可能有几个正确的答案。我只是在寻找一些建议,如果我要用正确的方式来做这件事。

    谢谢您。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Buggabill    15 年前

    毕达哥拉斯定理是不够的。地球的曲线使这一切成为现实。它需要一点欧几里得几何学。这个 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 ;
    
        2
  •  1
  •   erlando    15 年前

    我在研究类似的东西时发现了这个链接。它使用.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