我正在开发一个使用谷歌地图的公交咨询服务项目。你将一个图标拖到你所在的地方和你想去的地方,应用程序会告诉你乘坐哪辆公共(public)汽车,这现在正在工作,但如果没有直达公共(public)汽车,我想进行公共(public)汽车组合以到达某个地方。
我将我所在城市的所有公交车路线都存入了带有经纬度的数据库中:
id | bus_id | lat | lng
-------------------------------------
1 | 12 | -23.232 | 23.328
2 | 12 | -23.233 | 23.327
3 | 12 | -23.234 | 23.326
4 | 12 | -23.235 | 23.325
我要查找到起点和终点最近的公交车的查询是这样的:
SELECT
id, number
FROM buses
WHERE id IN
(
SELECT bus_id
FROM coord
WHERE
POW((lat - '.$points["direction"]["lat"].'), 2) + POW((lng - '.$points["direction"]["lng"].'), 2) < POW(('.$distance.' / 111.12), 2)
)
AND id IN
(
SELECT bus_id
FROM coord
WHERE
POW((lat - '.$points["person"]["lat"].'), 2) + POW((lng - '.$points["person"]["lng"].'), 2) < POW(('.$distance.' / 111.12), 2)
)
如果没有直达起点/终点的公交车,我如何检查公交车组合?
谢谢!!
顺便说一下:http://www.mapabondi.com.ar/ 只有西类牙语,抱歉! (感谢反馈)
编辑:
我想出了一个查询来找出公交车组合
SELECT
o.bus_id,
d.bus_id,
o.lat,
o.lng,
d.lat,
d.lng,
ROUND(GeoDistKM(o.lat,o.lng,d.lat,d.lng)) AS distance
FROM coord o
JOIN coord d
WHERE o.bus_id IN (
SELECT bus_id
FROM coord
WHERE
POW((lat - -31.528361), 2) + POW((lng - -68.583527), 2) < POW((1 / 111.12), 2)
)
AND d.bus_id IN (
SELECT bus_id
FROM coord
WHERE
POW((lat - -31.571516), 2) + POW((lng - -68.521385), 2) < POW((1 / 111.12), 2)
)
GROUP BY d.bus_id,o.bus_id
HAVING distance < 1
ORDER BY distance ASC
我现在唯一的问题是性能,这个查询非常慢......是否有可能通过存储过程或函数变得更好?
最佳答案
不是真正的答案,但可能是让您入门的东西。
我认为你应该考虑添加一个新表 bus_stops
bus_id bus_stop_name lat lon
12 stadium -23.145 23.315
12 halembra -23.234 23.326
...
14 halembra -23.234 23.326
14 dali -23.242 23.345
然后,查找对应关系会更容易:
- 按欧几里得距离找到最近的公交车站的开始和停止
- 使用 bus_stops 表查找共享公交车站的路径
- 这个问题在图论中被形式化,称为图遍历,参见 this google query获取信息和示例代码。
虽然不容易!祝你好运。
关于mysql - google maps mysql查询查找公交车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7698462/