获取与 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"
street1
和 street2
是十字路口。
【讨论】:
【参考方案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)