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

我认为我可以以 + 或 X 模式执行 5 个查询,但这很糟糕,不可靠,而且当然会更快达到查询限制。

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

旁注 - 似乎指定“types=route”永远不会返回任何结果,这进一步加深了我的怀疑,即 Places 仅真正用于实际 POI,而不是用于导航,尽管 服务条款 不要提及这方面的任何明确限制。

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

有帮助吗?

解决方案

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

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

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

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

其他提示

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

您可以使用 OpenStreetMap 。它们的世代古代替代文件提供了LAT / LOVE的交叉街道。

  1. 如何获取数据。

    1. 转到 OpenStreetMap 并找到您感兴趣的地方,放大第4个刻度标记。

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

    3. 对于州或国家,生成的数据,生成的数据,并找到所需的“提取物”。 要获取交叉点,您希望查找与此格式匹配的数据,可能会搜索高速公路。

      示例:

      <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>
      
      .

      方式.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并不意味着用于地理编码。街道和城镇等政治结果仅限于2个结果,因为它们只为退回地点提供了区域标识。

如果您想搜索街道等。尝试使用GeoCoding API: https://developers.google.com/maps/documentation/geocoding/

所讨论的,没有转向地理码的GoogleMap设施并获得一组接近点。

我看到的唯一替代方案是

  • 计算与Haversine的点200米N / S / E / W.您需要选择“200”凭经验
  • 反向地理码这4点
  • 从返回的地址,拿出不同的街道,不同(可能不会成功)

    如果您完成此客户端,您的用户将很少遇到每日2'500限制。

Google地图API不支持此功能。它只是一个地址地理位置器。您可以使用Google地图API的最佳用户是用户他们的方向服务,以查找第一个转弯的位置,但这是完全的黑客攻击。您可能需要尝试查看可以提供此功能的其他地图服务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top