| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #!/usr/bin/python3
- #
- #
- # Copyright (c) 2021 Clementine Computing LLC.
- #
- # This file is part of RideLogic.
- #
- # RideLogic is free software: you can redistribute it and/or modify
- # it under the terms of the GNU Affero General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # RideLogic is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU Affero General Public License for more details.
- #
- # You should have received a copy of the GNU Affero General Public License
- # along with RideLogic. If not, see <https://www.gnu.org/licenses/>.
- #
- import os
- import sys
- import csv
- import json
- if len(sys.argv) < 6:
- print("provide routes.txt stops.txt shapes.txt trips.txt stop_times.txt")
- sys.exit(-1)
- routes_fn = sys.argv[1]
- stops_fn = sys.argv[2]
- shapes_fn = sys.argv[3]
- trips_fn = sys.argv[4]
- stop_times_fn = sys.argv[5]
- route_info = {}
- stop_info = {}
- shape_info = {}
- trip_info = {}
- stop_time_info = {}
- with open(routes_fn) as fp:
- fpcsv = csv.reader(fp, delimiter=',', quotechar='"')
- next(fpcsv)
- for row in fpcsv:
- route_info[row[0]] = {
- "route_id" : row[0],
- "agency_id" : row[1],
- "route_short_name": row[2],
- "route_long_name" : row[3],
- "route_desc" : row[4],
- "route_type": row[5],
- "route_url" : row[6],
- "route_color" : row[7],
- "route_text_color" : row[8],
- "route_sort_order" : row[9]
- }
- with open(stops_fn) as fp:
- fpcsv = csv.reader(fp, delimiter=',', quotechar='"')
- next(fpcsv)
- for row in fpcsv:
- stop_info[row[0]] = {
- "stop_id" : row[0],
- "stop_code" : row[1],
- "stop_name": row[2],
- "stop_desc" : row[3],
- "stop_lat" : row[4],
- "stop_lon": row[5],
- "zone_id" : row[6],
- "stop_url" : row[7],
- "location_type" : row[8],
- "parent_station" : row[9],
- "wheelchair_boarding" : row[10]
- }
- with open(shapes_fn) as fp:
- fpcsv = csv.reader(fp, delimiter=',', quotechar='"')
- next(fpcsv)
- for row in fpcsv:
- if not (row[0] in shape_info):
- shape_info[row[0]] = []
- shape_info[row[0]].append({
- "shape_id" : row[0],
- "shape_pt_lat" : row[1],
- "shape_pt_lon": row[2],
- "shape_pt_sequence" : row[3],
- "shape_dist_traveled" : row[4]
- })
- with open(trips_fn) as fp:
- fpcsv = csv.reader(fp, delimiter=',', quotechar='"')
- next(fpcsv)
- for row in fpcsv:
- trip_info[row[2]] = {
- "route_id" : row[0],
- "service_id": row[1],
- "trip_id" : row[2],
- "trip_headsign" : row[3],
- "direction_id" : row[4],
- "block_id": row[5],
- "shape_id" : row[6],
- "wheelchair_accessible" : row[7],
- "bikes_allowed" : row[8]
- }
- trip_stops_map = {}
- with open(stop_times_fn) as fp:
- fpcsv = csv.reader(fp, delimiter=',', quotechar='"')
- next(fpcsv)
- for row in fpcsv:
- trip_id = row[0]
- stop_id = row[3]
- if not (trip_id in stop_time_info):
- stop_time_info[trip_id] = []
- stop_time_info[trip_id].append({
- "trip_id" : row[0],
- "arrival_time" : row[1],
- "departure_time": row[2],
- "stop_id" : row[3],
- "stop_sequence" : row[4],
- "stop_headsign" : row[5],
- "pickup_type" : row[6],
- "srop_off_type" : row[7],
- "shape_dist_traveled" : row[8],
- "timepoint" : row[9]
- })
- if not (trip_id in trip_stops_map):
- trip_stops_map[trip_id] = {}
- if not (stop_id in trip_stops_map[trip_id]):
- trip_stops_map[trip_id][stop_id] = True
- geojson_info = {
- "type" : "FeatureCollection",
- "features" : []
- }
- for trip_id in trip_info:
- geojson_trip = {
- "type" : "trip",
- "geometry": {
- "type": "Polygon",
- "coordinates": []
- },
- "properties" : {}
- }
- trip = trip_info[trip_id]
- shape_id = trip["shape_id"]
- for shape_ele in shape_info[shape_id]:
- #geojson_trip["geometry"]["coordinates"].append( [ shape_ele["shape_pt_lat"], shape_ele["shape_pt_lon"] ] )
- geojson_trip["geometry"]["coordinates"].append( [ shape_ele["shape_pt_lon"], shape_ele["shape_pt_lat"] ] )
- #geojson_trip["properties"]["route_id"] = trip["route_id"]
- geojson_trip["properties"]["trip_id"] = trip["trip_id"]
- geojson_trip["properties"]["service_id"] = trip["service_id"]
- geojson_trip["properties"]["block_id"] = trip["block_id"]
- geojson_trip["properties"]["trip_headsign"] = trip["trip_headsign"]
- geojson_trip["properties"]["bikes_allowed"] = trip["bikes_allowed"]
- geojson_trip["properties"]["wheelchair_accessible"] = trip["wheelchair_accessible"]
- route_ele = route_info[ trip["route_id"] ]
- route_stops = []
- for stop_id in trip_stops_map[trip_id]:
- stop_ele = stop_info[stop_id]
- gj_stop_ele = {
- "stop" : {
- "geometry": {
- "coordinates" : [stop_ele["stop_lon"], stop_ele["stop_lat"] ]
- }
- }
- }
- route_stops.append( gj_stop_ele )
- geojson_trip["properties"]["route"] = {
- "route_id" : route_ele["route_id"],
- "agency_id" : route_ele["agency_id"],
- "route_short_name" : route_ele["route_short_name"],
- "route_long_name" : route_ele["route_long_name"],
- "route_desc" : route_ele["route_desc"],
- "route_type" : route_ele["route_type"],
- "route_url" : route_ele["route_url"],
- "route_color" : route_ele["route_color"],
- "route_text_color" : route_ele["route_text_color"],
- "route_sort_order" : route_ele["route_sort_order"],
- }
- geojson_trip["properties"]["route_stops"] = route_stops
- geojson_info["features"].append(geojson_trip)
- #print( json.dumps(geojson_trip, indent=2) )
- #print( json.dumps(trip_info[trip_id], indent=2) )
- #print(json.dumps(route_info, indent=2))
- #print(json.dumps(stop_info, indent=2))
- #print(json.dumps(shape_info, indent=2))
- #print(json.dumps(trip_info, indent=2))
- print(json.dumps(geojson_info, indent=2))
|