12

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

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

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

旁注 - 似乎指定“types=route”从不返回任何结果,这进一步让我怀疑 Places 仅用于实际 POI,而不是用于导航,尽管服务条款没有提及任何明确的这方面的限制。

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

4

7 回答 7

12

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是十字路口。

于 2013-06-06T17:37:10.320 回答
7

共识是谷歌的反向地理编码器不够复杂,无法在一次查询中报告交叉点。也就是说,没有一个参数可以用来告诉他们你只想要结果"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 位置的情况下获得最近的主要十字路口,那么让用户提供帮助可能会有所帮助。众所周知,地理编码充满了恶心的人性。

于 2012-06-01T15:29:08.413 回答
4

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

  1. 如何获取数据。

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

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

    3. 对于像州或国家这样的大量数据,Planet.osm并找到您想要的“提取物”。

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

例子:

<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"/>
于 2012-11-30T01:42:18.320 回答
2

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

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

于 2012-05-21T01:28:57.837 回答
2

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

我看到的唯一选择是

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

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

于 2012-05-31T08:36:08.533 回答
1

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

于 2012-05-30T04:15:17.420 回答
1

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

显然现在可以通过简单地在两个街道名称之间放置一个&符号来搜索十字路口,比如

street name 1 & street name 2

这种技术适用于地理编码 API 和谷歌地图网站。

于 2020-08-26T15:19:46.317 回答