Mysql 如何从一条GTFS路线获得所有连接?
我用的是那个页面的数据,还有 这是我的第一个查询,它列出了从该路线的第一次行程到该路线的站点:Mysql 如何从一条GTFS路线获得所有连接?,mysql,gtfs,Mysql,Gtfs,我用的是那个页面的数据,还有 这是我的第一个查询,它列出了从该路线的第一次行程到该路线的站点: select first_trip_of_route.trip_id, st.stop_id, s.stop_name from ( select t.trip_id, r.route_long_name from routes r left join trips t on t.r
select
first_trip_of_route.trip_id,
st.stop_id,
s.stop_name
from (
select
t.trip_id,
r.route_long_name
from routes r
left join trips t on t.route_id = r.route_id
where r.route_id = '0033'
limit 1
) as first_trip_of_route
left join stop_times st on st.trip_id = first_trip_of_route.trip_id
left join stops s on s.stop_id = st.stop_id
order by st.stop_sequence;
它可以工作,这里是雷恩33路公共汽车站:
+---------+---------+----------------------+
| trip_id | stop_id | stop_name |
+---------+---------+----------------------+
| 2420 | 2220 | Gautrais |
| 2420 | 2221 | Rossel |
| 2420 | 2234 | Pommerais |
| 2420 | 2223 | Abbé Grimault |
| 2420 | 2232 | Morinais |
| 2420 | 2202 | Collège Jean Moulin |
| 2420 | 2214 | Médiathèque |
| 2420 | 2204 | Jean Marin |
| 2420 | 2263 | Jean Jaurès |
| 2420 | 2205 | Blosne |
| 2420 | 2225 | Gaité |
| 2420 | 2230 | Rablais Allende |
| 2420 | 2227 | Croix Verte |
| 2420 | 2271 | 25 Fusillés |
| 2420 | 1454 | Bréquigny Piscine |
| 2420 | 1455 | Lycée Bréquigny |
| 2420 | 1456 | Coubertin |
| 2420 | 1457 | Norvège |
| 2420 | 1130 | Canada |
| 2420 | 1623 | Alma |
| 2420 | 1459 | Henri Fréville |
| 2420 | 1460 | Argonautes |
| 2420 | 1461 | Clemenceau |
| 2420 | 1462 | Combes |
| 2420 | 1464 | Binquenais |
| 2420 | 1463 | Binquenais Collège |
| 2420 | 1465 | Triangle |
| 2420 | 1353 | Torigné |
| 2420 | 1466 | Hôpital Sud |
| 2420 | 1467 | Le Blosne |
| 2420 | 1356 | Galicie |
| 2420 | 1468 | La Poterie |
| 2420 | 3020 | Val Blanc |
| 2420 | 3021 | Rocade Sud |
| 2420 | 3008 | Loges |
| 2420 | 3009 | Chantepie Mairie |
| 2420 | 3010 | Chantepie Eglise |
| 2420 | 3022 | Hallouvry |
| 2420 | 3017 | IDEFS |
| 2420 | 3016 | Cucé |
+---------+---------+----------------------+
现在我想为每个站点添加该站点的可用路线
首先,我连接了停车场ID,但不幸的是,雷恩决定,如果停车场不是同一栋建筑,就不是同一个停车场,即使它有10米宽。事实上,这是有道理的,但这并没有让我们的生活变得更轻松:
所以我试着用站点名称连接。以下是Alma的一个示例:
酷。在那一站找到可用的路线怎么样
mysql> select r2.route_id as route_id,
s2.stop_name as stop_name
from stops s2
left join stop_times st2 on st2.stop_id = s2.stop_id
left join trips t2 on t2.trip_id = st2.trip_id
left join routes r2 on r2.route_id = t2.route_id
where s2.stop_name = 'Alma'
group by r2.route_id;
+----------+-----------+
| route_id | stop_name |
+----------+-----------+
| 0003 | Alma |
| 0033 | Alma |
+----------+-----------+
2 rows in set (0.13 sec)
太好了。当我们在阿尔玛时,我们可以坐3路或33路公共汽车
现在,让我们将这两个查询混合在一起:
select
first_trip_of_route.trip_id,
st.stop_id,
s.stop_name,
connections.route_id
from (
select
t.trip_id,
r.route_long_name
from routes r
left join trips t on t.route_id = r.route_id
where r.route_id = '0033'
limit 1
) as first_trip_of_route
left join stop_times st on st.trip_id = first_trip_of_route.trip_id
left join stops s on s.stop_id = st.stop_id
left join (
select
r2.route_id as route_id, s2.stop_name as stop_name
from stops s2
left join stop_times st2 on st2.stop_id = s2.stop_id
left join trips t2 on t2.trip_id = st2.trip_id
left join routes r2 on r2.route_id = t2.route_id
group by r2.route_id
) connections
on connections.stop_name = s.stop_name
order by st.stop_sequence
它适用于大多数站点,但正如您所看到的,它表示Alma中没有连接:
+---------+---------+----------------------+----------+
| trip_id | stop_id | stop_name | route_id |
+---------+---------+----------------------+----------+
| 2420 | 2220 | Gautrais | NULL |
| 2420 | 2221 | Rossel | NULL |
| 2420 | 2234 | Pommerais | NULL |
| 2420 | 2223 | Abbé Grimault | NULL |
| 2420 | 2232 | Morinais | NULL |
| 2420 | 2202 | Collège Jean Moulin | NULL |
| 2420 | 2214 | Médiathèque | NULL |
| 2420 | 2204 | Jean Marin | NULL |
| 2420 | 2263 | Jean Jaurès | NULL |
| 2420 | 2205 | Blosne | NULL |
| 2420 | 2225 | Gaité | NULL |
| 2420 | 2230 | Rablais Allende | NULL |
| 2420 | 2227 | Croix Verte | NULL |
| 2420 | 2271 | 25 Fusillés | NULL |
| 2420 | 1454 | Bréquigny Piscine | NULL |
| 2420 | 1455 | Lycée Bréquigny | NULL |
| 2420 | 1456 | Coubertin | 0213 |
| 2420 | 1456 | Coubertin | 0212 |
| 2420 | 1457 | Norvège | NULL |
| 2420 | 1130 | Canada | 0033 |
| 2420 | 1623 | Alma | NULL | <<< WTF?
| 2420 | 1459 | Henri Fréville | 0037 |
| 2420 | 1459 | Henri Fréville | 0159 |
| 2420 | 1459 | Henri Fréville | 0074 |
| 2420 | 1459 | Henri Fréville | 0172 |
| 2420 | 1459 | Henri Fréville | 0079 |
| 2420 | 1460 | Argonautes | NULL |
| 2420 | 1461 | Clemenceau | NULL |
| 2420 | 1462 | Combes | NULL |
| 2420 | 1464 | Binquenais | NULL |
| 2420 | 1463 | Binquenais Collège | NULL |
| 2420 | 1465 | Triangle | 0061 |
| 2420 | 1465 | Triangle | 0161 |
| 2420 | 1353 | Torigné | NULL |
| 2420 | 1466 | Hôpital Sud | NULL |
| 2420 | 1467 | Le Blosne | NULL |
| 2420 | 1356 | Galicie | NULL |
| 2420 | 1468 | La Poterie | 0214 |
| 2420 | 1468 | La Poterie | 0075 |
| 2420 | 1468 | La Poterie | 0173 |
| 2420 | 1468 | La Poterie | 0073 |
| 2420 | 3020 | Val Blanc | NULL |
| 2420 | 3021 | Rocade Sud | NULL |
| 2420 | 3008 | Loges | NULL |
| 2420 | 3009 | Chantepie Mairie | NULL |
| 2420 | 3010 | Chantepie Eglise | NULL |
| 2420 | 3022 | Hallouvry | NULL |
| 2420 | 3017 | IDEFS | NULL |
| 2420 | 3016 | Cucé | NULL |
+---------+---------+----------------------+----------+
给你什么?好的,这不是个好问题。最后我没有按名字而是按距离把车站连接起来。这是我的最后一个问题,如果有人感兴趣
select
first_trip_of_route.trip_id, first_trip_of_route.route_long_name,
st.stop_id,
st.departure_time,
s.stop_name,
connected_stops.stop_id as connected_stop_id, connected_stops.stop_name as connected_stop_name,
(6371000*acos(cos(radians(s.stop_lat))*cos(radians(connected_stops.stop_lat))*cos(radians(s.stop_lon)-radians(connected_stops.stop_lon))+sin(radians(s.stop_lat))*sin(radians(connected_stops.stop_lat)))) as connected_stop_distance,
connected_routes.route_id as connected_route_id, connected_routes.route_long_name as connected_route_name
-- look for the 1st trip of that route
from (
select
t.trip_id,
r.route_long_name
from routes r
left join trips t on t.route_id = r.route_id
where r.route_id = '0033'
limit 1
) as first_trip_of_route
-- get the list of stops taken by that trip
left join stop_times st on st.trip_id = first_trip_of_route.trip_id
-- add info about the stops (stop name)
left join stops s on s.stop_id = st.stop_id
-- look for stops next to this one (200 meters)
left join (
select stop_id, stop_lat, stop_lon, stop_name
FROM stops connected_stops
) as connected_stops on
(6371000*acos(cos(radians(s.stop_lat))*cos(radians(connected_stops.stop_lat))*cos(radians(s.stop_lon)-radians(connected_stops.stop_lon))+sin(radians(s.stop_lat))*sin(radians(connected_stops.stop_lat))))
< 200
and connected_stops.stop_id <> s.stop_id
-- add all the vehicles that make those stops
left join stop_times connected_stop_times on connected_stop_times.stop_id = connected_stops.stop_id
-- get the trips of those vehicles
left join trips connected_trips on connected_trips.trip_id = connected_stop_times.trip_id
-- get the routes from which these trips belong
left join routes connected_routes on connected_routes.route_id = connected_trips.route_id
-- ensure we get only one connected route per stop 200 meters from the initial searched stop
group by s.stop_id, connected_stop_id, connected_route_id
order by st.stop_sequence;
我们可以看到1623“阿尔玛”站与1622“阿尔玛”站之间的连接跨越65米,路线为0003和0033
select
first_trip_of_route.trip_id, first_trip_of_route.route_long_name,
st.stop_id,
st.departure_time,
s.stop_name,
connected_stops.stop_id as connected_stop_id, connected_stops.stop_name as connected_stop_name,
(6371000*acos(cos(radians(s.stop_lat))*cos(radians(connected_stops.stop_lat))*cos(radians(s.stop_lon)-radians(connected_stops.stop_lon))+sin(radians(s.stop_lat))*sin(radians(connected_stops.stop_lat)))) as connected_stop_distance,
connected_routes.route_id as connected_route_id, connected_routes.route_long_name as connected_route_name
-- look for the 1st trip of that route
from (
select
t.trip_id,
r.route_long_name
from routes r
left join trips t on t.route_id = r.route_id
where r.route_id = '0033'
limit 1
) as first_trip_of_route
-- get the list of stops taken by that trip
left join stop_times st on st.trip_id = first_trip_of_route.trip_id
-- add info about the stops (stop name)
left join stops s on s.stop_id = st.stop_id
-- look for stops next to this one (200 meters)
left join (
select stop_id, stop_lat, stop_lon, stop_name
FROM stops connected_stops
) as connected_stops on
(6371000*acos(cos(radians(s.stop_lat))*cos(radians(connected_stops.stop_lat))*cos(radians(s.stop_lon)-radians(connected_stops.stop_lon))+sin(radians(s.stop_lat))*sin(radians(connected_stops.stop_lat))))
< 200
and connected_stops.stop_id <> s.stop_id
-- add all the vehicles that make those stops
left join stop_times connected_stop_times on connected_stop_times.stop_id = connected_stops.stop_id
-- get the trips of those vehicles
left join trips connected_trips on connected_trips.trip_id = connected_stop_times.trip_id
-- get the routes from which these trips belong
left join routes connected_routes on connected_routes.route_id = connected_trips.route_id
-- ensure we get only one connected route per stop 200 meters from the initial searched stop
group by s.stop_id, connected_stop_id, connected_route_id
order by st.stop_sequence;
+---------+----------------------+-------------------+----------------------+-------------------------+--------------------+
| stop_id | stop_name | connected_stop_id | connected_stop_name | connected_stop_distance | connected_route_id |
+---------+----------------------+-------------------+----------------------+-------------------------+--------------------+
... many rows here ...
| 1130 | Canada | 1449 | Norvège | 185.0837104437 | 0804 |
| 1130 | Canada | 1449 | Norvège | 185.0837104437 | 0059 |
| 1130 | Canada | 1449 | Norvège | 185.0837104437 | 0033 |
| 1623 | Alma | 1622 | Alma | 65.261785846695 | 0003 |
| 1623 | Alma | 1622 | Alma | 65.261785846695 | 0033 |
| 1459 | Henri Fréville | 1447 | Henri Fréville | 97.6477727244322 | 0037 |
| 1459 | Henri Fréville | 1447 | Henri Fréville | 97.6477727244322 | 0033 |
... many rows here....
+---------+----------------------+-------------------+----------------------+-------------------------+--------------------+
166 rows in set (0.53 sec)