0

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

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

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

例如,在 Google 地图中,如果您搜索“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

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

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 作为位置边界。不幸的是,它并不一致,如果用户只搜索“教堂”,这不会给我们想要的结果。

任何帮助将不胜感激。

4

1 回答 1

0

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

两个第二层地址组件都是乔治亚州。但是,有一些不同的参数,您想要的是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 公式),另一个用于大距离(this)。有人为这些写了一个计算器:http ://williams.best.vwh.net/gccalc.htm 。您会很快看到 30319 的边界框跨越 10 公里,而乔治亚州的边界框跨越近 700 公里(这需要多个 Google 地方信息请求才能匹配)。

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

于 2013-04-17T14:45:10.813 回答