检测距给定位置最近的公交站点
Posted
技术标签:
【中文标题】检测距给定位置最近的公交站点【英文标题】:Detect the nearest transit stop from the given location 【发布时间】:2012-03-09 14:14:48 【问题描述】:我需要获取距给定位置一定距离内的所有附近公共交通信息。公共交通的类型可以是公共汽车、火车等。
这就是我的意思:
如果我使用谷歌地图查询"Transit Stop near a Location (e.g. Bugis Street Singapore)",那么它将返回我们所有我想要的附近的中转站。就像图片中显示的那样。但我需要它的 API 来获取这些细节。 (如公交服务号、公交站牌号等如图)。但我找不到。
这是我尝试过的
我尝试使用 Google Map Nearby Place API 来搜索transit_station, bus_station, train_station,etc.. 类型的地点。但他们都返回零结果。我只能使用这个 API 来搜索 Nearby Place of Interest,而不是附近的公交。
我也检查了 Google Transit API,但我只找到了将交通数据插入 Google 的 API,但没有将其提取出来。我认为 Google 还没有公布过境 API。
其他信息
我已经检查了网站Gothere.sg。和困惑如何?因为他们能够检测到附近的过境。仅仅是因为他们指定了“From-To”方向吗?
I have read a pretty similar question on 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 和/或他们从哪里获取传输数据的地方联系他们。 此页面提供对 gothere.sg API http://gothere.sg/api/maps/overview.html的访问权限 @Yeo,你最终到达了 Stop ID 吗? @Rizon,我设法通过 publictransport.sg API 得到它。 【参考方案1】:好吧,您可以使用 places-API 来查找最近的公交站点,对于给定的位置,它对我来说很好。
只需使用参数进行请求:
位置(latlng
-给定位置的对象)
radius(以米为单位搜索的半径)
types(有效类型数组,例如['bus_station','subway_station']
)
查看小提琴:http://jsfiddle.net/doktormolle/aZrvs/
为了检索更多详细信息(巴士服务编号,巴士站 ID),我现在没有任何好主意。
应该有办法,maps.google.com上的那些数据会使用AJAX检索,所以有资源。但只要没有公共 API 来获取这些结果,使用此资源就是不合法的。
【讨论】:
我已经尝试过place API。感谢您在小提琴上为我制作了一个。是的,你知道我想要什么,合法地拉出那个细节。无需破解 Google Map API。谁知道有办法...谢谢Dr.Molle :) 它确实有效,但它没有显示给定范围内的所有巴士站。有什么解决方法吗? 返回结果的数量限制为20,就是这样。 注意:Places API (Nearby and Text) Search 中的types
参数已弃用,但您仍然可以使用type: "transit_station"
─ 请参阅developers.google.com/places/web-service/…【参考方案2】:
将 &output=json 添加到您的初始查询 (http://maps.google.com/maps?q=transit%20stop%20near%20New%20Bugis%20Street%20Singapore&output=json) 不是合法的获取方式这些信息?
【讨论】:
您可能是指(旧的,早已不复存在的)Geocoding API v2 (/maps/geo?q=...),但无论如何查询“X 附近的中转站”形式的查询" 不能可靠地工作。它可能在某一天奏效了,但如果某个行为没有记录为 API 的一部分,那么它就不是 API 的一部分。【参考方案3】:在获取 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)
【讨论】:
以上是关于检测距给定位置最近的公交站点的主要内容,如果未能解决你的问题,请参考以下文章