diff options
author | Marcus Lundblad <ml@update.uu.se> | 2020-02-19 23:10:55 +0100 |
---|---|---|
committer | Marcus Lundblad <ml@update.uu.se> | 2020-05-23 12:26:02 +0200 |
commit | 5ae51ab4c097422a76a3cdf99f24c06db5fb7b6d (patch) | |
tree | 306c5ca1bba7b537f790899d2656398351d72207 | |
parent | d712a97b27d894e9421a129dddda7d5a946528c8 (diff) | |
download | gnome-maps-wip/mlundblad/transit-plugin-gtfs-local.tar.gz |
WIP: Add transit plugin doing local routing on dowloaded GTFSwip/mlundblad/transit-plugin-gtfs-local
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rw-r--r-- | src/org.gnome.Maps.src.gresource.xml | 1 | ||||
-rw-r--r-- | src/transitplugins/gtfs.js | 158 |
3 files changed, 160 insertions, 0 deletions
diff --git a/po/POTFILES.in b/po/POTFILES.in index 676a7a6f..6dfac517 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -62,4 +62,5 @@ src/translations.js src/userLocationBubble.js src/utils.js src/transitplugins/goMetro.js +src/transitplugins/gtfs.js src/transitplugins/openTripPlanner.js diff --git a/src/org.gnome.Maps.src.gresource.xml b/src/org.gnome.Maps.src.gresource.xml index ab2e12f0..6c87c7d0 100644 --- a/src/org.gnome.Maps.src.gresource.xml +++ b/src/org.gnome.Maps.src.gresource.xml @@ -115,6 +115,7 @@ <file alias="geojsonvt/transform.js">transform.js</file> <file alias="geojsonvt/wrap.js">wrap.js</file> <file>transitplugins/goMetro.js</file> + <file>transitplugins/gtfs.js</file> <file>transitplugins/opendataCH.js</file> <file>transitplugins/openTripPlanner.js</file> <file>transitplugins/resrobot.js</file> diff --git a/src/transitplugins/gtfs.js b/src/transitplugins/gtfs.js new file mode 100644 index 00000000..df662a80 --- /dev/null +++ b/src/transitplugins/gtfs.js @@ -0,0 +1,158 @@ +/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */ +/* vim: set et ts=4 sw=4: */ +/* + * Copyright (c) 2020 Marcus Lundblad + * + * GNOME Maps is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * GNOME Maps 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 General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with GNOME Maps; if not, see <http://www.gnu.org/licenses/>. + * + * Author: Marcus Lundblad <ml@update.uu.se> + */ + +const _ = imports.gettext.gettext; + +const Maps = imports.gi.GnomeMaps; + +const Application = imports.application; +const GraphHopperTransit = imports.graphHopperTransit; +const HVT = imports.hvt; +const TransitPlan = imports.transitPlan; +const Utils = imports.utils; + +const NUM_CONSIDERED_STOPS = 10; + +var GTFS = class GTFS { + constructor(params) { + // TODO: for now just read files from an unzipped GTFS file at path… + this._gtfs = Maps.GTFS.new(params.name); + this._query = Application.routeQuery; + this._plan = Application.routingDelegator.transitRouter.plan; + Utils.debug('end constructor'); + } + + fetchFirstResults() { + let filledPoints = this._query.filledPoints; + let startLat = filledPoints[0].place.location.latitude; + let startLon = filledPoints[0].place.location.longitude; + let endLat = filledPoints.last().place.location.latitude; + let endLon = filledPoints.last().place.location.longitude; + + this._plan.progress(_("Creating database…")); + this._gtfs.parse((success, error) => { + this._plan.progress(null); + if (success) { + let types = this._getRouteTypesFromQuery(); + Utils.debug('parse done'); + let startStops = + types ? + this._gtfs.get_nearby_stops_with_route_types(startLat, + startLon, + 2000, types) : + this._gtfs.get_nearby_stops(startLat, startLon, 2000); + Utils.debug('got nearby start'); + let endStops = + types ? + this._gtfs.get_nearby_stops_with_route_types(endLat, endLon, + 2000, types) : + this._gtfs.get_nearby_stops(endLat, endLon, 2000); + Utils.debug('got nearny end'); + + this._refineStops(startStops, true, (result) => { + result.forEach((stop) => { + Utils.debug('stop: ' + stop.name + ", walking: " + + stop.walkRoute.distance); + }); + }); + } else { + this._plan.requestFailed(); + } + }); + } + + fetchMoreResults() { + + } + + _getRouteTypesFromQuery() { + if (this._query.transitOptions.showAllTransitTypes) { + return null; + } else { + let types = []; + + this._query.transitOptions.transitTypes.forEach(type => { + switch (type) { + case TransitPlan.RouteType.BUS: + types.push(TransitPlan.RouteType.BUS); + types.push(TransitPlan.RouteType.TROLLEYBUS); + types.push(HVT.COACH_SERVICE); + types.push(HVT.BUS_SERVICE); + types.push(HVT.TROLLEYBUS_SERVICE); + types.push(HVT.TAXI_SERVICE); + break; + case TransitPlan.RouteType.TRAM: + types.push(TransitPlan.RouteType.TRAM); + types.push(HVT.TRAM_SERVICE); + break; + case TransitPlan.RouteType.SUBWAY: + types.push(TransitPlan.RouteType.SUBWAY); + types.push(HVT.URBAN_RAILWAY_SERVICE); + types.push(HVT.SUBURBAN_RAILWAY_SERVICE); + types.push(HVT.METRO_SERVICE); + break; + case TransitPlan.RouteType.TRAIN: + types.push(TransitPlan.RouteType.TRAIN); + types.push(HVT.RAILWAY_SERVICE); + break; + case TransitPlan.RouteType.FERRY: + types.push(TransitPlan.RouteType.FERRY); + types.push(HVT.WATER_TRANSPORT_SERVICE); + break; + case HVT.AIR_SERVICE: + types.push(HVT.AIR_SERVICE); + break; + } + }); + + return types; + } + + } + + _refineStops(stops, isStart, callback) { + this._refineStopsRecursive(stops, [], 0, isStart, callback); + } + + _refineStopsRecursive(stops, result, index, isStart, callback) { + if (index >= stops.length || index == NUM_CONSIDERED_STOPS) { + callback(result); + } else { + let filledPoints = this._query.filledPoints; + let stop = stops[index]; + let startPoint = + isStart ? + filledPoints[0] : + GraphHopperTransit.createQueryPointForCoord([stop.lat, stop.lon]); + let endPoint = + isStart ? + GraphHopperTransit.createQueryPointForCoord([stop.lat, stop.lon]) : + filledPoints.last(); + + GraphHopperTransit.fetchWalkingRoute([startPoint, endPoint], + (route) => { + stop.walkRoute = route; + result.push(stop); + this._refineStopsRecursive(stops, result, index + 1, isStart, callback); + }); + } + } +} |