From 2bb8c0358c64ef31f169dbc217edb99c4e39a00d Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Sep 2016 02:42:28 +0200 Subject: [PATCH] Move basic configuration into separate json file Moved basic configuration into separate json file Closes #3 --- README.md | 5 ++++ fenix.json.example | 25 ++++++++++++++++ osm2gtfs.py | 70 ++++++++++++++++++++++++------------------- osmhelper/__init__.py | 8 ++--- 4 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 fenix.json.example diff --git a/README.md b/README.md index 783836ea..e1772e3e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,11 @@ This data is stored in python objects and cached on disk for efficient re-use. The osm2gtfs script then uses the OpenStreetMap data and local schedule information to create a GTFS file using Google's transitfeed library and validates it after creation. +Use +------------ + + python osm2gtfs.py -c fenix.json.example + Requirements ------------ diff --git a/fenix.json.example b/fenix.json.example new file mode 100644 index 00000000..87420427 --- /dev/null +++ b/fenix.json.example @@ -0,0 +1,25 @@ +{ + "query": { + "bbox": { + "n": "-27.2155", + "s": "-27.9410", + "e": "-48.2711", + "w": "-49.0155" + } + }, + "agency": { + "agency_id": "BR-Floripa", + "agency_name": "Consórcio Fênix", + "agency_url": "http://www.consorciofenix.com.br/", + "agency_timezone": "America/Sao_Paulo", + "agency_lang": "pt", + "agency_phone": "+55 (48) 3025-6868" + }, + "feed_info": { + "publisher_name": "Torsten Grote", + "publisher_url": "https://transportr.grobox.de", + "version": "0.1", + "start_date": "20160901", + "end_date": "20170831" + } +} diff --git a/osm2gtfs.py b/osm2gtfs.py index b1479825..d8ef99c7 100755 --- a/osm2gtfs.py +++ b/osm2gtfs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python # coding=utf-8 import transitfeed @@ -9,19 +9,15 @@ from datetime import datetime from osmhelper.osm_routes import Route, RouteMaster -FLORIANOPOLIS = {"e": "-48.2711", "n": "-27.2155", "s": "-27.9410", "w": "-49.0155"} - DEBUG_ROUTE = "104" -START_DATE = "20160901" -END_DATE = "20170831" - WEEKDAY = "Dias Úteis" SATURDAY = "Sábado" SUNDAY = "Domingo" +# Handle arguments parser = argparse.ArgumentParser(prog='osm2gtfs', description='Create GTFS from OpenStreetMap data.') - +parser.add_argument('--config', '-c', metavar='FILE', type=argparse.FileType('r'), help='Configuration json file', required=True) group = parser.add_mutually_exclusive_group() group.add_argument('--refresh-route', metavar='ROUTE', type=int, help='Refresh OSM data for ROUTE') group.add_argument('--refresh-all-routes', action="store_true", help='Refresh OSM data for all routes') @@ -31,18 +27,32 @@ def main(): + + # Load config json file + try: + config = json.load(args.config) + except ValueError, e: + print('Failed to load config json file:') + print(e) + sys.exit(0) + + # Initialize information from config file + bbox = config['query']['bbox'] + start_date = config['feed_info']['start_date'] + end_date = config['feed_info']['end_date'] + # --refresh-route if args.refresh_route is not None: - osmhelper.refresh_route(args.refresh_route, "bus", FLORIANOPOLIS) + osmhelper.refresh_route(args.refresh_route, "bus", bbox) sys.exit(0) elif args.refresh_all_routes: - osmhelper.get_routes("bus", FLORIANOPOLIS, refresh=True) + osmhelper.get_routes("bus", bbox, refresh=True) sys.exit(0) elif args.refresh_all_stops: - osmhelper.get_stops(osmhelper.get_routes("bus", FLORIANOPOLIS), refresh=True) + osmhelper.get_stops(osmhelper.get_routes("bus", bbox), refresh=True) sys.exit(0) elif args.refresh_all: - osmhelper.refresh_data("bus", FLORIANOPOLIS) + osmhelper.refresh_data("bus", bbox) sys.exit(0) # Get Fenix data from JSON file @@ -53,7 +63,7 @@ def main(): linhas = json_data[0]['data'] # Get OSM routes and check data - routes = osmhelper.get_routes("bus", FLORIANOPOLIS) + routes = osmhelper.get_routes("bus", bbox) blacklist = ['10200', '12400', '328', '466', '665'] # Try to find OSM routes in Fenix data @@ -82,28 +92,28 @@ def main(): schedule = transitfeed.Schedule() agency = schedule.AddAgency( - name="Consórcio Fênix", - url="http://www.consorciofenix.com.br/", - timezone="America/Sao_Paulo", - agency_id="BR-Floripa" + name=config['agency']['agency_name'], + url=config['agency']['agency_url'], + timezone=config['agency']['agency_timezone'], + agency_id=config['agency']['agency_id'] ) service_weekday = schedule.NewDefaultServicePeriod() - service_weekday.SetStartDate(START_DATE) - service_weekday.SetEndDate(END_DATE) + service_weekday.SetStartDate(start_date) + service_weekday.SetEndDate(end_date) service_weekday.SetWeekdayService(True) service_weekday.SetWeekendService(False) service_saturday = schedule.NewDefaultServicePeriod() - service_saturday.SetStartDate(START_DATE) - service_saturday.SetEndDate(END_DATE) + service_saturday.SetStartDate(start_date) + service_saturday.SetEndDate(end_date) service_saturday.SetWeekdayService(False) service_saturday.SetWeekendService(False) service_saturday.SetDayOfWeekHasService(5, True) service_sunday = schedule.NewDefaultServicePeriod() - service_sunday.SetStartDate(START_DATE) - service_sunday.SetEndDate(END_DATE) + service_sunday.SetStartDate(start_date) + service_sunday.SetEndDate(end_date) service_sunday.SetWeekdayService(False) service_sunday.SetWeekendService(False) service_sunday.SetDayOfWeekHasService(6, True) @@ -148,14 +158,14 @@ def main(): add_trips(schedule, line, service_weekday, route, weekday, WEEKDAY) add_trips(schedule, line, service_saturday, route, saturday, SATURDAY) add_trips(schedule, line, service_sunday, route, sunday, SUNDAY) - + feed_info = transitfeed.FeedInfo() - feed_info.feed_publisher_name = "Torsten Grote" - feed_info.feed_publisher_url = "https://transportr.grobox.de" - feed_info.feed_lang = "pt" - feed_info.feed_start_date = START_DATE - feed_info.feed_end_date = END_DATE - feed_info.feed_version = "0.1" + feed_info.feed_publisher_name = config['feed_info']['publisher_name'] + feed_info.feed_publisher_url = config['feed_info']['publisher_url'] + feed_info.feed_lang = config['agency']['agency_lang'] + feed_info.feed_start_date = start_date + feed_info.feed_end_date = end_date + feed_info.feed_version = config['feed_info']['version'] schedule.AddFeedInfoObject(feed_info) schedule.Validate(transitfeed.ProblemReporter()) @@ -207,7 +217,7 @@ def add_trips(schedule, line, service, route, horarios, day): for time_group in horarios[key]: for time_point in time_group: # parse first departure time - start_time = datetime.strptime(time_point[0], "%H:%M") + start_time = datetime.strptime(time_point[0], "%H:%M") start_time = str(start_time.time()) # calculate last arrival time for GTFS diff --git a/osmhelper/__init__.py b/osmhelper/__init__.py index c887f28b..1a63cc5e 100644 --- a/osmhelper/__init__.py +++ b/osmhelper/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python # coding=utf-8 import overpy @@ -66,7 +66,7 @@ def get_routes(route_type, bbox, refresh=False): - """ % (route_type, bbox["e"], bbox["n"], bbox["s"], bbox["w"])) + """ % (route_type, str(bbox["e"]), str(bbox["n"]), str(bbox["s"]), str(bbox["w"]))) route_masters = get_route_masters(route_type, bbox, refresh) @@ -105,7 +105,7 @@ def get_route_masters(route_type, bbox, refresh=False): - """ % (route_type, bbox["e"], bbox["n"], bbox["s"], bbox["w"])) + """ % (route_type, str(bbox["e"]), str(bbox["n"]), str(bbox["s"]), str(bbox["w"]))) for rel in result.get_relations(): @@ -286,7 +286,7 @@ def refresh_route(route_ref, route_type, bbox): - """ % (route_type, str(route_ref), bbox["e"], bbox["n"], bbox["s"], bbox["w"])) + """ % (route_type, str(route_ref), str(bbox["e"]), str(bbox["n"]), str(bbox["s"]), str(bbox["w"]))) if route_ref in route_masters: # TODO also refresh route master