获取与 Google Places/Geocoding API 的交集

Posted

技术标签:

【中文标题】获取与 Google Places/Geocoding API 的交集【英文标题】:Getting an intersection with Google Places/Geocoding API 【发布时间】:2012-05-27 10:53:57 【问题描述】:

我正在尝试使用 Google Places API 找到离某个点最近的两条街道(基本上是为了指示最近的十字路口)。但是,任何结果都只会返回一个“路线”,如果有的话。

我想我可以在 + 或 X 模式下进行 5 次查询,但那很笨拙、不可靠,而且当然会很快达到查询限制。

我很想说这是一个深思熟虑的举动,因为 API 不打算用于导航系统之类的东西(我不想这样做),但我仍然希望有一种符合 TOS 的方式来找到路口。

旁注 - 似乎指定“types=route”永远不会返回任何结果,这进一步让我怀疑 Places 仅用于实际 POI,而不是用于导航,尽管 terms of service 不提及这方面的任何明确限制。

编辑:正如 Chris 所指出的,有专门为地理编码设计的地理编码 API,但除了通过多个查询之外,我仍然没有看到获得最近十字路口的方法。

【问题讨论】:

反向地理编码器总是只返回一个结果:它找到的最近的东西,所以你不能做你描述的事情。你到底想达到什么目的? 我正在尝试找到离我所在的点最近的交叉点。当我在十字路口时,至少我想要两条街道名称,但理想情况下我也想要最近的十字路口。我希望提供一定的半径大小会给我多个“路线”结果,我可以使用第二好的“路线”作为十字路口。 在测试中,我可以确认反向地理编码永远不会返回一个以上的结果:GoogleMap 认为最接近的结果。我也尝试了 google.maps.places.PlaceSearchRequest,但即使您要求“street_address”,它也不会返回任何内容(除非碰巧有人在附近标记了一个感兴趣的地方)。 是的,这与我在测试时得出的结论相同,这促使我发布了这个问题。我想知道除了提交多个查询之外是否有其他方法可以获得交叉点,或者如果除了通过多个查询之外没有其他方法可以做到这一点,那么查询数量最少的最有效的是什么。 有趣的问题,但我没有看到解决方案,即使有多个查询。假设您对最近的地址 N/S/E/W 进行 4 次查询,例如 200 米。当你在一个十字路口 200 米范围内时它会起作用,但当最近的十字路口在一公里之外时它就会失败。这让我回到了最初的问题:“最近的十字路口”有什么用处,什么时候它可能在几英里之外? IOW,底层用例是什么?如果您能解释您真正想要实现的目标,我们或许可以提供帮助。 【参考方案1】:

GeoNames 为距离经纬度坐标最近的交叉点提供地理编码 API。

http://www.geonames.org/maps/us-reverse-geocoder.html#findNearestIntersection

JSON 响应如下所示:

"intersection":
 "adminName2":"San Mateo",
  "street2":"Curtis St",
  "postalcode":"94025",
  "street1":"Roble Ave",
  "adminCode1":"CA",
  "distance":"0.08",
  "countryCode":"US",
  "lng":"-122.180842",
  "placename":"Menlo Park",
  "lat":"37.450649",
  "adminName1":"California"
 ,
 "credits":"1.0"

street1street2 是十字路口。

【讨论】:

【参考方案2】:

一致认为,Google 的反向地理编码器不够复杂,无法在一次查询中报告交叉点。也就是说,没有一个参数可以用来告诉他们您只想要"types" : [ "intersection" ] 的结果。谷歌在这里吃自己的狗粮;如果您在 maps.google 搜索框中输入纬度/经度,您总会得到一条街道(用 Google 的说法,“路线”)。

正如您所指出的,您可以应用很多启发式方法来获得令人垂涎的["intersection"] 类型。

例如第一世界城市中的几个“主要”十字路口都有描述十字路口的公交站点。如果任何结果有"types" : [ "bus_station", "transit_station" ] 元素,您可以尝试将"long_name" 元素作为搜索词并希望您得到一个交集。 smirkingman 还提到了一个可行的解决方案。唉,这两个都需要 2 次以上的查询。

总之,Google Geocoding API 中没有 latelngToIntersection(lat,lng) 类型的函数。这方面的证据存在于 Google 自己的 maps.google 页面中。我会以不同的方式解决您的问题。如果您想在给定 GPS 位置的情况下获得最近的主要十字路口,那么让用户提供帮助可能会有所帮助。众所周知,地理编码充满了恶心的人性。

【讨论】:

嘿 Rooke,这实际上是一种有趣的方法。我什至可以尝试使用地标作为参考(最好是公共汽车站,例如“Dork Station 附近的 Schmuck 街”,但如果没有其他内容,甚至可能是“Applebee's 附近的美食街”。这将需要比 X 模式更少的查询. 我还是更喜欢交叉点的名称,但让我们实际点。这是赏金!【参考方案3】:

您可以使用来自OpenStreetMap 的数据。他们的.osm 文件提供了交叉街道的纬度/经度。

    如何获取数据。

      转到OpenStreetMap,找到您感兴趣的地方,像第4个刻度一样放大。

      点击顶部导航栏上的导出,在下拉菜单中,按“OpenStreetMap XML 数据”并点击“导出”。

      对于大量数据,例如州或国家/地区,Planet.osm 并找到您想要的“摘录”。

    要获取交叉路口,您要查找与此格式匹配的数据,可能搜索高速公路。

例子:

<way id="6419265" user="eric22" uid="160949" visible="true" version="2" changeset="10632563" timestamp="2012-02-09T10:49:21Z">
  <nd ref="53167978"/>
  <nd ref="53163978"/>
  <nd ref="53163979"/>
  <nd ref="53173508"/>
  <nd ref="53164158"/>
  <nd ref="53173510"/>
  <tag <b>k="highway"</b> v="residential"/>
  <tag k="name" v="Alberta St"/>
  <tag k="tiger:cfcc" v="A41"/>
  <tag k="tiger:county" v="St. Louis-City, MO"/>
  ...
</way>

way.id 是街道 id,nd refs 是街道 id,您应该可以在同一个文件中找到。它们看起来像这样

‹node id="53167978" lat="38.5852785" lon="-90.2450074" user="eric22" uid="160949" visible="true" version="3" changeset="10632563" timestamp="2012-02-09T10:48:49Z"/>

【讨论】:

不错的数据库。是否有可以使用简单查询访问数据库的 API?很明显,我不想下载planet.osm,而且这是一个自动化的后台操作,我不能使用web界面。我检查了网站,但没有立即找到任何东西。 阅读wiki,可以连接到数据库。美国的planet.osm 只有25 gigs。我会保存您需要的地图部分,而不是每次都访问他们的数据库或网站,因为这是一项免费服务。【参考方案4】:

您是对的,Places API 不适合用于地理编码。街道和城镇等政治结果仅限于 2 个结果,因为它们仅用于为返回的地点提供区域标识。

如果您想搜索街道等,请尝试使用地理编码 API:https://developers.google.com/maps/documentation/geocoding/

【讨论】:

谢谢克里斯!我是个彻头彻尾的笨蛋——我怎么没有注意到地理编码 API?但是,Geocoding API 仍然存在同样的问题 - 我只能对特定点进行反向地理编码,它返回最近的街道,但绝不会返回十字路口。如何找到最近的十字路口?【参考方案5】:

如前所述,没有 GoogleMap 工具可以反向地理编码并获得一组接近点。

我看到的唯一选择是

使用Haversine 计算点的N/S/E/W 200 米。您需要根据经验选择“200” 对这 4 个点进行反向地理编码 从返回的地址中,选择最近的 2 条不同的街道(可能不会成功)

如果您在客户端执行此操作,您的用户很少会遇到每日 2,500 的限制。

【讨论】:

叹息,我也不确定该给谁赏金——我可能会尝试你和 Rooke 的方法。 Rooke 启发了我尝试其他方法,即通过名称和主要地标识别街道。能够分配赏金会很高兴。【参考方案6】:

Google Maps API 不支持此功能。它只是一个地址地理编码器。您可以使用 Google Maps API 做的最好的事情是使用他们的路线服务来查找第一个转弯的位置,但这完全是 hack。您可能想尝试研究可以提供此功能的其他地图服务。

【讨论】:

【参考方案7】:

这是一个老问题,但我正在寻找相同的功能,谷歌把我带到了这里。

现在显然可以通过在两条街道名称之间添加一个 & 号来搜索十字路口,例如

street name 1 & street name 2

此技术适用于地理编码 API 和 Google 地图网站。

【讨论】:

以上是关于获取与 Google Places/Geocoding API 的交集的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google 表格获取与上一年的星期数和星期几相同的日期?

iOS Swift Facebook 身份验证与 Google Firebase - 如何获取额外权限?

获取与 Google Places/Geocoding API 的交集

标准 sql 查询以获取与另一个表匹配的记录字段(Google BigQuery)

使用Sheets API v4获取与Google帐户关联的所有电子表格列表

google adwords api + 获取所有关键字