如何实现“查找最近”类型的功能?

时间:2010-02-09 17:13:22

标签: google-maps maps

HI, 我想知道是否有人有任何关于如何实现功能的想法,给定一个位置数组(例如分支)它会列出最近的一个或列表所有半径为5英里等?

1 个答案:

答案 0 :(得分:0)

当你说“位置”时,你的意思是什么?街道地址? GPS坐标?

如果你有GPS坐标(或者可以将地址转换为坐标),你可以随时计算两点之间的Euclidean distance或(更准确)great-circle distance。计算当前位置与每个潜在目的地之间的距离,然后按最短距离对列表进行排序。

您没有提及您是否使用了Google Maps API,但如果您有以下情况,请参阅此处的其他信息。您可以将两个点存储为GLatLng类型的对象,并使用object1.distanceFrom(object2)进行计算。您还可以在地图上创建表示矩形区域的GLatLngBounds对象,并使用GLatLngBounds.containsLatLng(latlng:GLatLng)查看某个地理点是否位于该区域内。

修改:您在下面提到的情况下通常会发生的情况是,当用户输入邮政编码时,“当前位置”将被视为该邮政编码的地理中心(您可能会必须从您所在地区分配邮政编码的主管部门获取此信息。如果您在英国,this site有一个免费的邮政编码列表及其坐标。在Google地图中搜索邮政编码会将您带到该邮政编码的中心;如果您需要建立自己的邮政编码和坐标列表,您可以创建一个脚本,该脚本将遍历所有有效的邮政编码并使用Google地图查找并将其转换为GPS坐标。

要将地址转换为坐标,您需要执行所谓的地理编码。 Google地图有一个API,还有其他资源可以为您提供此功能。对于某些示例,try this page。您使用的资源在很大程度上取决于您所处的位置,因为大部分信息都是本地化的。您没有多少提及您的项目(平台,语言等),但在该页面的底部是一个名为“Geocoding Helper Libraries”的部分,它可能将您需要的功能集成到预构建的包中。特别是GeoKit库(Ruby语言)在their website的首页上有一些示例,其中包括几个看起来就像你想做的那样。

编辑:我从代码生成器WebRPC获得了以下代码:

/**
 * Copyright WebRPC
 * available under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991
 * http://www.gnu.org/licenses/gpl.txt
 */
public class Client
{
    public static void Main(string[] args)
    {
        // make the call
        XPathDocument doc = new XPathDocument(@"http://maps.google.com/maps/geo?q=New+York&output=xml&key=ABQIAAAAuXdMTY5VIU1FvkgOOP1dNBTsILMTMKRV-aJhd94IQkaJhVJ0YBS2qNSZGm8TaefqbXBT6lUXeMZ6tA");

        // print the outputs
        XPathNavigator nav = doc.CreateNavigator();
        XPathNodeIterator coord = nav.Select( "/kml/Response/Placemark/Point/coordinates" );
        while ( coord.MoveNext() )
            System.Console.WriteLine( coord.Current );
        XPathNodeIterator accuracy = nav.Select( "/kml/Response/Placemark/AddressDetails/@Accuracy" );
        while ( accuracy.MoveNext() )
            System.Console.WriteLine( accuracy.Current );
    }
}

您应该能够修改此C#代码以满足您的需求。具体来说,在对new XPathDocument的调用中,将读取?q=New+York的字符串部分更改为您需要的任何地址或邮政编码(例如,使用?q=1060+West+Addison%2C+Chicago%2C+IL将检索Wrigley Field的信息。芝加哥或使用?q=LS11+0ES%2C+UK将获取利兹的邮政编码信息。要从常规文本字符串格式化地址,请将空格更改为“+”并将所有其他非字母数字字符转换为ASCII等效字符(例如逗号的“%2C”)。

接下来的几行从服务器检索信息并以各种方式解析它。这里感兴趣的是返回数据中的字段/kml/Response/Placemark/Point/coordinates。此字符串将包含您在上面指定的位置的纬度和经度坐标。

现在,这应该为您提供足够的信息来创建一个能够将地址或邮政编码转换为一对坐标的C#函数。艰难的部分已经完成,但仍然有两个步骤。首先,您将需要使用它来为数据库中的每个地址生成坐标(将这些地址存储在数据库中,以获得最佳结果)。现在,当用户输入地址时,再次调用C#函数为其位置生成一组坐标。现在您已经拥有了所有内容的坐标,您可以使用我在帖子顶部链接的两个距离计算函数之一找到两个坐标之间的距离。运行您的分支列表,计算从用户到每个分支的距离,并对该列表进行排序以找到具有最短距离值的分支。