与Google地方信息/地理编码API建立交集

时间:2012-05-20 20:07:07

标签: google-places-api google-geocoding-api

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

我认为我可以用+或X模式进行5次查询,但这很麻烦,不可靠,当然会更快地达到查询限制。

我很想说这是一个刻意的举动,因为API并不是用于导航系统之类的东西(我不想做),但我仍然希望有一种符合TOS标准的方式得到十字路口。

旁注 - 看起来指定“types = route”似乎永远不会返回任何结果,这进一步加深了我的怀疑,即Where只是真正意味着用于实际的POI,而不是用于导航,尽管terms of service没有在这方面没有提到任何明确的限制。

编辑:克里斯指出,有专门为地理编码设计的Geocoding API,但除了通过多次查询之外,我仍然没有办法获得最近的十字路口。

7 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

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

正如您所指出的那样,您可以通过大量的启发式方法来获得令人垂涎的["intersection"]类型。

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

总之,Google Geocoding API中没有latelngToIntersection(lat,lng)类型的功能。 Google自己的maps.google页面中存在此证据。我会以不同方式攻击您的问题。如果您想获得GPS位置最近的主要交叉路口,可能有助于用户提供帮助。众所周知,地理编码充满了肮脏的人性。

答案 2 :(得分:4)

您可以使用OpenStreetMap中的数据。他们的.osm文件提供了一段相交的街道。

  1. 如何获取数据。

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

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

    3. 对于州/国家/地区等大量数据Planet.osm,找到所需的“摘录”。

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

  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>
    

    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"/>
    

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

如上所述,没有GoogleMap工具可以反转地理编码并获得一组关闭点。

我看到的唯一选择是

  • 使用Haversine计算200米的N / S / E / W.你需要根据经验选择'200'
  • 反向地理编码这4点
  • 从返回的地址中,选择最近的两条不同的街道(可能不成功)

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

答案 5 :(得分:1)

Google Maps API不支持此功能。它只是一个地址地址。使用Google Maps API可以做的最好的事情是用户的路线服务,以找到第一个回合的位置,但这是完全黑客攻击。您可能想尝试查看可以提供此功能的其他地图服务。

答案 6 :(得分:0)

这是一个古老的问题,但是我正在搜索相同的功能,而Google将我带到了这里。

显然,现在只需在两个街道名称之间放置一个&符号即可搜索十字路口,例如

street name 1 & street name 2

该技术对我和Geocoding API和Google Maps网站都有效。