从给定位置检测最近的公共交通站点。

46

我需要获取某个位置周围一定距离范围内的公共交通信息,包括公交车、火车等类型。

这是我的意思:

如果我使用Google Map查询"位于某地点(例如新加坡武吉士街)附近的交通站点", 那么它将返回我想要的所有附近的交通站点。就像图片中显示的那样。但是我需要使用它的API来获取这些详细信息(例如公交车服务号、公交车站点ID等,如图片所示),但我找不到任何相关的API。

Bus Stop

这是我尝试过的方法

  1. 我尝试使用Google地图附近地点API来搜索类型为transit_station、bus_station、train_station等的地点,但都返回零结果。我只能使用此API搜索附近的景点,而不能搜索附近的交通站点。

  2. 我还查看了Google Transit API,但我只发现可以将交通数据插入到Google中,而无法将其提取出来的API。我认为Google尚未公开交通API。


额外信息

我查看了网站Gothere.sg。我感到困惑,因为它们能够检测附近的公共交通。这是因为他们只指定了方向“从-到”吗。

我在Detecting nearby transit上读到了一个非常相似的问题。也许如果我们使用Google API,现在还不可能。

但对我来说没有什么不可能

最后手段

作为最后手段,我还与publictransport.sg的提供商进行了检查。我对API进行了破解,并发现它可以提供一些坐标的公共交通站点。但它缺少在Google Map上找到的附近API。

目前我能想到的一个解决方法是使用提供者 publictransport.sg,它会给我停靠点ID和其坐标。为了做到这一点,首先我必须使用 Google GeoCoding API 将位置名称转换为坐标,然后我必须创建自己的附近计算来通过比较搜索坐标与提供程序拥有的所有站点坐标来找到附近的站点。

现在,这对我来说是可能的,但非常痛苦 :-)


回到问题:

有没有一种方法可以从给定位置检索所有公交车站的数据(可以使用Google Maps API或任何其他API)?你是如何做到这一点的?


谢谢

感谢您阅读我的冗长问题。我非常感激您的任何帮助。


我刚偶然发现了这个页面:http://gothere.sg/api 联系他们询问一下他们的API或者他们从哪里获取运输数据可能是值得的。 - Chris Green
本页面提供访问gothere.sg API http://gothere.sg/api/maps/overview.html 的途径。 - Chris Green
@Yeo,你最终找到了停止ID吗? - Rizon
@Rizon,我已经使用publictransport.sg API成功获取到它。 - Yeo
4个回答

28

好的,您可以使用地点-API 来查找最近的公共交通站点,对于给定位置,我觉得这个方法很有效。

只需使用以下参数进行请求:

  • location(给定位置的latlng-对象)
  • radius(要搜索的半径距离,单位为米)
  • types(有效类型数组,例如['bus_station','subway_station']

查看演示:http://jsfiddle.net/doktormolle/aZrvs/

关于获取更多详细信息(如公交服务编号、公交站点ID),我现在没有什么好主意。

虽然地图上的数据在maps.google.com上是通过AJAX获取的,但由于没有公共API可用来获取这些结果,因此使用此资源将不合法。


我已经尝试过关于地点API的内容。感谢您在fiddle上为我创建了一个API。是的,您知道我想要什么,合法地提取详细信息。不使用Google Map API进行黑客攻击。谁知道还有其他方法...谢谢Molle博士 :) - Yeo
它确实可以工作,但它并没有显示在给定范围内所有的公交车站。有什么解决方法吗? - richardaum
返回结果的数量有一个限制,最多只能返回20个。 - Dr.Molle
注意:Places API(附近和文本搜索)中的“types”参数已过时,但您仍然可以使用“type:“transit_station”” ─ 请参阅https://developers.google.com/places/web-service/search#PlaceSearchRequests - miguev

0

在获取了Google Places API的详细信息后,您仍然可以枚举所有公交服务编号、公交站点ID(站名),就像@Dr.Molle所说的那样。

打开detail['result']['url']的网页,然后XPath公交ID列表的字符串。

以下是一个示例,以获取位于某个位置(纬度、经度)附近的台北公交信息。更详细的实现请参见https://github.com/MikimotoH/gisTools/blob/master/google_place.py

places = get_web_json(
    'https://maps.googleapis.com/maps/api/place/nearbysearch/json?' +
    'key=%s&location=%f,%f' % (apikey, lat, lng) +
    '&rankby=distance&language=zh-TW&types=bus_station')
if places['status'] == 'OK':
    for result in places['results']:
        placeid = result['place_id']
        detail = get_web_json(
            'https://maps.googleapis.com/maps/api/place/details/' +
            'json?key=%s&placeid=%s' % (apikey, placeid) +
            '&language=zh-TW')
        station = detail['result']['name']
        loc = detail['result']['geometry']['location']
        buspage = get_webpage(detail['result']['url'])
        tree = lxml.html.document_fromstring(buspage)
        bus_elm = tree.xpath("/html/body/div[1]/div/div[4]/div[4]/div/div/div[2]/div/div[2]/div[1]/div[2]/div/div/div[2]/div/table/tr/td")[0]
        buses = list(filter(lambda s: len(s.strip()) > 0,
                            bus_elm.text_content().strip().split()))
        yield (station, float(loc['lat']), float(loc['lat']), buses)

0
将“&output=json”添加到您的初始查询(http://maps.google.com/maps?q=transit%20stop%20near%20New%20Bugis%20Street%20Singapore&output=json)中,这不是一种合法的获取此信息的方式吗?

您可能想指向(旧的,已经不存在的)Geocoding API v2(/maps/geo?q=...),但无论如何,“附近的公交站”这种形式的查询都不能可靠地工作。它可能曾经有效过,但如果某种行为不作为API的一部分被记录下来,那么它就不是API的一部分。 - miguev

0
Transitland API可以回答你的问题。例如,尝试使用Transitland v2 REST API停靠点端点,像这样:
https://transit.land/api/v2/rest/stops?lat=xxx&lon=xxx&radius=1000&apikey=xxx

有关端点参数和响应的更多信息,请参见https://www.transit.land/documentation/rest-api/stops


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接