根据搜索条件动态设置附近搜索的边界

时间:2013-04-16 18:04:08

标签: google-maps-api-3 google-places-api

我们在页面上实施了一个搜索框和谷歌地图,允许客户根据地点查询执行搜索,到目前为止它运行良好。但是,使用TextSearch我们几乎总能获得20个结果(除非它是特定点)。我们更喜欢的是返回一组结果,这些结果对用户的搜索更有意义(即如果他们在邮政编码中搜索教堂,我们不应该在邮政编码之外显示教堂)。

我知道我们可以根据位置和半径来偏置我们的结果,甚至可以使用NearbySearch根据位置/半径限制结果。

但是,我们的客户是可能在世界任何地区搜索的国内用户,因此在用户搜索之前,我们不确定将设置为限制的位置和半径。我想根据他们的查询动态确定。

例如,在谷歌地图中,​​如果您搜索“30319附近的教堂”,您将获得比“格鲁吉亚附近的教堂”更加本地化的结果集

30319附近的教堂: https://maps.google.com/maps?q=churches+near+30319&hl=en&sll=33.772251,-84.296934&sspn=0.049158,0.082312&hq=churches&hnear=Atlanta,+Georgia+30319&t=m&z=14

格鲁吉亚附近的教堂: https://maps.google.com/maps?q=churches+near+Georgia&hl=en&sll=33.870438,-84.332304&sspn=0.049102,0.082312&hq=churches&hnear=Georgia&t=m&z=8

我已经测试过使用地理编码进行单独查询以获取查询的单点位置。即。

getGeneralVicinity = ->
  address = $('#address').val()
  window.oneq.geocode.geocoder.geocode
    address: address,
    (results, status) ->
      if status is google.maps.GeocoderStatus.OK
        console.log(results[0].types)

似乎可能找到地理编码结果的类型(即地点性),我们可以确定半径并使用geometry.location作为位置边界。不幸的是,它并不一致,如果用户只搜索“教堂”,这并不能给我们带来理想的结果。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你几乎拥有它。我将Geocoding API称为其JSON提要而不是Google的实现,因此详细信息将直接来自源代码。在对地形进行地理编码时会返回一些非常有趣的参数。试试吧:

两个第二层地址组件都是Georgia。但是,有一些不同的参数,您想要的参数是geometry。这表示该区域的形状。

以30319请求为例。你会得到界限:

"bounds" : {
           "northeast" : {
              "lat" : 33.9203610,
              "lng" : -84.30943599999999
           },
           "southwest" : {
              "lat" : 33.83286890,
              "lng" : -84.35826589999999
           }
        },
        "location" : {
           "lat" : 33.87309460,
           "lng" : -84.33842899999999
        },

这告诉你三件事:

  • 边界框的角落
  • 框的中心(将是顶点线的交点)

这允许您计算距离中心的最大距离,然后您可以将其作为半径反馈到Google地方API搜索中。从纬度/长度到距离的转换是微不足道的:它被称为顺向路径。存在两个公式 - 一个用于小距离(Haversine's formula),另一个用于大距离(this)。有人为这些写了一个计算器:http://williams.best.vwh.net/gccalc.htm。您很快就会看到30319的边界框跨度为10km,而格鲁吉亚的边界框跨度接近700(这需要多个Google Places要求匹配)。

如果不清楚,请告诉我,我会进一步详细说明。