diff --git a/doc-templates/StopConsolidation.md b/doc-templates/StopConsolidation.md new file mode 100644 index 00000000000..690fe0b98e6 --- /dev/null +++ b/doc-templates/StopConsolidation.md @@ -0,0 +1,56 @@ + +# Stop consolidation + +## Contact Info + +- [Jon Campbell](mailto:jon.campbell@arcadis.com), Arcadis, USA + +## Feature explanation + +This sandbox feature allows you to "combine" equivalent stops from across several feeds into a single, +consolidated one. + +It is achieved by defining a "primary" stop and one or more "secondary" stops. During the graph +build all trip patterns are modified so that the secondary ones are swapped out for their +primary equivalent. + +## Effects + +This has the following consequences + +- When you query the departures for a primary stop you see a consolidated view of all the equivalent departures. +- When transferring at a consolidated stop you no longer get instructions like "walk 5 meters to stop X" + +!!! warning "Downsides" + + However, this feature has also severe downsides: + + - It makes realtime trip updates referencing a stop id much more complicated and in many cases + impossible to resolve. + You can only reference a stop by its sequence, which only works in GTFS-RT, not Siri. + - Fare calculation and transfers are unlikely to work as expected. + + +## Configuration + +To enable this feature you need to add a file to OTP's working directory and configure +its name like this: + + + +The additional config file must look like the following: + + + +The column names mean the following: + +- `stop_group_id`: id to group several rows in the file together +- `feed_id`: feed id of the stop +- `stop_id`: id of the stop +- `is_primary`: whether the row represents a primary stop, `1` means yes and `0` means no + diff --git a/docs/BuildConfiguration.md b/docs/BuildConfiguration.md index 7ead0d6cc2d..b32f782aa32 100644 --- a/docs/BuildConfiguration.md +++ b/docs/BuildConfiguration.md @@ -41,6 +41,7 @@ Sections follow that describe particular settings in more depth. | [readCachedElevations](#readCachedElevations) | `boolean` | Whether to read cached elevation data. | *Optional* | `true` | 2.0 | | staticBikeParkAndRide | `boolean` | Whether we should create bike P+R stations from OSM data. | *Optional* | `false` | 1.5 | | staticParkAndRide | `boolean` | Whether we should create car P+R stations from OSM data. | *Optional* | `true` | 1.5 | +| stopConsolidationFile | `string` | Name of the CSV-formatted file in the build directory which contains the configuration for stop consolidation. | *Optional* | | 2.5 | | [streetGraph](#streetGraph) | `uri` | URI to the street graph object file for reading and writing. | *Optional* | | 2.0 | | [subwayAccessTime](#subwayAccessTime) | `double` | Minutes necessary to reach stops served by trips on routes of route_type=1 (subway) from the street. | *Optional* | `2.0` | 1.5 | | [transitModelTimeZone](#transitModelTimeZone) | `time-zone` | Time zone for the graph. | *Optional* | | 2.2 | @@ -1165,6 +1166,7 @@ case where this is not the case. } } ], + "stopConsolidationFile" : "consolidated-stops.csv", "emissions" : { "carAvgCo2PerKm" : 170, "carAvgOccupancy" : 1.3 diff --git a/docs/Changelog.md b/docs/Changelog.md index 1c9e4e819ee..a2eece5d664 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -44,6 +44,11 @@ based on merged pull requests. Search GitHub issues and pull requests for smalle - Fix serialization of `AtomicInteger` [#5508](https://github.com/opentripplanner/OpenTripPlanner/pull/5508) - Improve linking of fixed stops used by flex trips [#5503](https://github.com/opentripplanner/OpenTripPlanner/pull/5503) - Keep min transfer filter is not local to group-by-filters [#5436](https://github.com/opentripplanner/OpenTripPlanner/pull/5436) +- Add paging deduplication when cropping. [#5458](https://github.com/opentripplanner/OpenTripPlanner/pull/5458) +- Consolidate equivalent stops from several feeds [#5429](https://github.com/opentripplanner/OpenTripPlanner/pull/5429) +- Check transport mode when mapping GroupStops [#5518](https://github.com/opentripplanner/OpenTripPlanner/pull/5518) +- Cleanup trip times - Part A [#5437](https://github.com/opentripplanner/OpenTripPlanner/pull/5437) +- Transfer cost limit [#5516](https://github.com/opentripplanner/OpenTripPlanner/pull/5516) [](AUTOMATIC_CHANGELOG_PLACEHOLDER_DO_NOT_REMOVE) ## 2.4.0 (2023-09-13) diff --git a/docs/examples/ibi/seattle/build-config.json b/docs/examples/ibi/seattle/build-config.json new file mode 100644 index 00000000000..3876037ba3e --- /dev/null +++ b/docs/examples/ibi/seattle/build-config.json @@ -0,0 +1,5 @@ +{ + "transitModelTimeZone": "America/Los_Angeles", + "fares": "orca", + "stopConsolidationFile": "consolidated-stops.csv" +} \ No newline at end of file diff --git a/docs/sandbox/StopConsolidation.md b/docs/sandbox/StopConsolidation.md new file mode 100644 index 00000000000..fa3ff822e88 --- /dev/null +++ b/docs/sandbox/StopConsolidation.md @@ -0,0 +1,78 @@ + +# Stop consolidation + +## Contact Info + +- [Jon Campbell](mailto:jon.campbell@arcadis.com), Arcadis, USA + +## Feature explanation + +This sandbox feature allows you to "combine" equivalent stops from across several feeds into a single, +consolidated one. + +It is achieved by defining a "primary" stop and one or more "secondary" stops. During the graph +build all trip patterns are modified so that the secondary ones are swapped out for their +primary equivalent. + +## Effects + +This has the following consequences + +- When you query the departures for a primary stop you see a consolidated view of all the equivalent departures. +- When transferring at a consolidated stop you no longer get instructions like "walk 5 meters to stop X" + +!!! warning "Downsides" + + However, this feature has also severe downsides: + + - It makes realtime trip updates referencing a stop id much more complicated and in many cases + impossible to resolve. + You can only reference a stop by its sequence, which only works in GTFS-RT, not Siri. + - Fare calculation and transfers are unlikely to work as expected. + + +## Configuration + +To enable this feature you need to add a file to OTP's working directory and configure +its name like this: + + + + +```JSON +// build-config.json +{ + "stopConsolidationFile" : "consolidated-stops.csv" +} +``` + + + +The additional config file must look like the following: + + + + +``` +stop_group_id,feed_id,stop_id,is_primary +1,pierce,1705867009,0 +1,kcm,10225,1 +2,pierce,1569,0 +2,commtrans,473,0 +2,kcm,1040,1 +``` + + + +The column names mean the following: + +- `stop_group_id`: id to group several rows in the file together +- `feed_id`: feed id of the stop +- `stop_id`: id of the stop +- `is_primary`: whether the row represents a primary stop, `1` means yes and `0` means no + diff --git a/mkdocs.yml b/mkdocs.yml index 52124247c20..81d3e1c2052 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -37,6 +37,7 @@ markdown_extensions: - pymdownx.inlinehilite - pymdownx.snippets - pymdownx.superfences + - admonition # MkDocs will automatically discover pages if you don't list them here. # In that case subdirectories can be used to organize pages. @@ -112,3 +113,4 @@ nav: - Fares: 'sandbox/Fares.md' - Ride Hailing: 'sandbox/RideHailing.md' - Emissions: 'sandbox/Emissions.md' + - Stop Consolidation: 'sandbox/StopConsolidation.md' diff --git a/pom.xml b/pom.xml index 229a053ddc4..4f0fe973da3 100644 --- a/pom.xml +++ b/pom.xml @@ -56,11 +56,11 @@ - 128 + 130 30.0 2.48.1 - 2.15.3 + 2.16.0 3.1.3 5.10.1 1.11.5 diff --git a/src/ext-test/java/org/opentripplanner/ext/emissions/EmissionsTest.java b/src/ext-test/java/org/opentripplanner/ext/emissions/EmissionsTest.java index 043a91038d0..82058567c38 100644 --- a/src/ext-test/java/org/opentripplanner/ext/emissions/EmissionsTest.java +++ b/src/ext-test/java/org/opentripplanner/ext/emissions/EmissionsTest.java @@ -26,7 +26,7 @@ import org.opentripplanner.transit.model.framework.FeedScopedId; import org.opentripplanner.transit.model.network.Route; import org.opentripplanner.transit.model.timetable.Trip; -import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; class EmissionsTest { @@ -130,7 +130,7 @@ private ScheduledTransitLeg createTransitLeg(Route route) { .withRoute(route) .build(); return new ScheduledTransitLegBuilder<>() - .withTripTimes(new TripTimes(trip, stopTimes, new Deduplicator())) + .withTripTimes(TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator())) .withTripPattern(pattern) .withBoardStopIndexInPattern(0) .withAlightStopIndexInPattern(2) diff --git a/src/ext-test/java/org/opentripplanner/ext/flex/trip/UnscheduledTripTest.java b/src/ext-test/java/org/opentripplanner/ext/flex/trip/UnscheduledTripTest.java index fc7006bb8a6..fabe534ff23 100644 --- a/src/ext-test/java/org/opentripplanner/ext/flex/trip/UnscheduledTripTest.java +++ b/src/ext-test/java/org/opentripplanner/ext/flex/trip/UnscheduledTripTest.java @@ -37,7 +37,7 @@ import org.opentripplanner.transit.model.site.RegularStop; import org.opentripplanner.transit.model.site.StopLocation; -public class UnscheduledTripTest { +class UnscheduledTripTest { private static final int STOP_A = 0; private static final int STOP_B = 1; @@ -620,8 +620,8 @@ void accessTemplatesNoAlighting() { .of(0, 1) .forEach(index -> { var template = templates.get(index); - assertEquals(template.fromStopIndex, 0); - assertEquals(template.toStopIndex, index + 2); + assertEquals(0, template.fromStopIndex); + assertEquals(index + 2, template.toStopIndex); }); } @@ -633,8 +633,8 @@ void egressTemplates() { assertEquals(4, templates.size()); var template = templates.get(0); - assertEquals(template.fromStopIndex, 3); - assertEquals(template.toStopIndex, 0); + assertEquals(0, template.fromStopIndex); + assertEquals(3, template.toStopIndex); } @Nonnull diff --git a/src/ext-test/java/org/opentripplanner/ext/realtimeresolver/RealtimeResolverTest.java b/src/ext-test/java/org/opentripplanner/ext/realtimeresolver/RealtimeResolverTest.java index 38e60335fc8..43be9c6d735 100644 --- a/src/ext-test/java/org/opentripplanner/ext/realtimeresolver/RealtimeResolverTest.java +++ b/src/ext-test/java/org/opentripplanner/ext/realtimeresolver/RealtimeResolverTest.java @@ -137,7 +137,7 @@ private static TripPattern delay(TripPattern pattern1, int seconds) { } private static TripTimes delay(TripTimes tt, int seconds) { - var delayed = new TripTimes(tt); + var delayed = tt.copyOfScheduledTimes(); IntStream .range(0, delayed.getNumStops()) .forEach(i -> { diff --git a/src/ext-test/java/org/opentripplanner/ext/siri/ModifiedTripBuilderTest.java b/src/ext-test/java/org/opentripplanner/ext/siri/ModifiedTripBuilderTest.java index a9e9ad73c53..2bba22b3283 100644 --- a/src/ext-test/java/org/opentripplanner/ext/siri/ModifiedTripBuilderTest.java +++ b/src/ext-test/java/org/opentripplanner/ext/siri/ModifiedTripBuilderTest.java @@ -29,6 +29,7 @@ import org.opentripplanner.transit.model.timetable.RealTimeState; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.opentripplanner.transit.service.DefaultTransitService; import org.opentripplanner.transit.service.StopModel; import org.opentripplanner.transit.service.TransitModel; @@ -111,7 +112,7 @@ class ModifiedTripBuilderTest { STOP_TIME_C_1.setStopSequence(1); } - private static final TripTimes TRIP_TIMES = new TripTimes( + private static final TripTimes TRIP_TIMES = TripTimesFactory.tripTimes( TRIP, List.of(STOP_TIME_A_1, STOP_TIME_B_1, STOP_TIME_C_1), DEDUPLICATOR diff --git a/src/ext-test/java/org/opentripplanner/ext/siri/TimetableHelperTest.java b/src/ext-test/java/org/opentripplanner/ext/siri/TimetableHelperTest.java index 2c8e25e7308..97bd3be2398 100644 --- a/src/ext-test/java/org/opentripplanner/ext/siri/TimetableHelperTest.java +++ b/src/ext-test/java/org/opentripplanner/ext/siri/TimetableHelperTest.java @@ -21,6 +21,7 @@ import org.opentripplanner.transit.model.timetable.OccupancyStatus; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.opentripplanner.transit.service.StopModel; import uk.org.siri.siri20.OccupancyEnumeration; @@ -74,7 +75,7 @@ public void setUp() { .build(); Trip trip = Trip.of(new FeedScopedId(FEED_ID, "TRIP_ID")).withRoute(route).build(); - tripTimes = new TripTimes(trip, List.of(stopTime), new Deduplicator()); + tripTimes = TripTimesFactory.tripTimes(trip, List.of(stopTime), new Deduplicator()); } @Test diff --git a/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/ConsolidatedStopNameFilterTest.java b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/ConsolidatedStopNameFilterTest.java new file mode 100644 index 00000000000..d88e8a5879e --- /dev/null +++ b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/ConsolidatedStopNameFilterTest.java @@ -0,0 +1,46 @@ +package org.opentripplanner.ext.stopconsolidation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.opentripplanner.ext.stopconsolidation.TestStopConsolidationModel.STOP_C; +import static org.opentripplanner.ext.stopconsolidation.TestStopConsolidationModel.STOP_D; +import static org.opentripplanner.model.plan.PlanTestConstants.T11_05; +import static org.opentripplanner.model.plan.PlanTestConstants.T11_12; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationService; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; +import org.opentripplanner.model.plan.Place; +import org.opentripplanner.model.plan.PlanTestConstants; +import org.opentripplanner.model.plan.TestItineraryBuilder; + +class ConsolidatedStopNameFilterTest { + + @Test + void changeNames() { + var transitModel = TestStopConsolidationModel.buildTransitModel(); + + var groups = List.of(new ConsolidatedStopGroup(STOP_C.getId(), List.of(STOP_D.getId()))); + var repo = new DefaultStopConsolidationRepository(); + repo.addGroups(groups); + + var service = new DefaultStopConsolidationService(repo, transitModel); + var filter = new ConsolidatedStopNameFilter(service); + + var itinerary = TestItineraryBuilder + .newItinerary(Place.forStop(STOP_C)) + .bus(TestStopConsolidationModel.ROUTE, 1, T11_05, T11_12, Place.forStop(STOP_C)) + .bus(1, T11_05, T11_12, PlanTestConstants.E) + .bus(1, T11_05, T11_12, PlanTestConstants.F) + .build(); + + var filtered = filter.filter(List.of(itinerary)); + assertFalse(filtered.isEmpty()); + + var updatedLeg = filtered.get(0).getLegs().get(0); + assertEquals(STOP_D.getName(), updatedLeg.getFrom().name); + assertEquals(STOP_D.getName(), updatedLeg.getTo().name); + } +} diff --git a/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationModuleTest.java b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationModuleTest.java new file mode 100644 index 00000000000..0df495d63d0 --- /dev/null +++ b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationModuleTest.java @@ -0,0 +1,45 @@ +package org.opentripplanner.ext.stopconsolidation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.opentripplanner.ext.stopconsolidation.TestStopConsolidationModel.PATTERN; +import static org.opentripplanner.ext.stopconsolidation.TestStopConsolidationModel.STOP_A; +import static org.opentripplanner.ext.stopconsolidation.TestStopConsolidationModel.STOP_B; +import static org.opentripplanner.ext.stopconsolidation.TestStopConsolidationModel.STOP_C; +import static org.opentripplanner.ext.stopconsolidation.TestStopConsolidationModel.STOP_D; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; +import org.opentripplanner.transit.model.network.TripPattern; + +class StopConsolidationModuleTest { + + @Test + void replacePatterns() { + var groups = List.of(new ConsolidatedStopGroup(STOP_D.getId(), List.of(STOP_B.getId()))); + + var transitModel = TestStopConsolidationModel.buildTransitModel(); + transitModel.addTripPattern(PATTERN.getId(), PATTERN); + var repo = new DefaultStopConsolidationRepository(); + var module = new StopConsolidationModule(transitModel, repo, groups); + module.buildGraph(); + + var modifiedPattern = transitModel.getTripPatternForId(PATTERN.getId()); + assertFalse(modifiedPattern.getRoutingTripPattern().getPattern().sameAs(PATTERN)); + assertFalse(modifiedPattern.sameAs(PATTERN)); + + var modifiedStop = modifiedPattern + .getRoutingTripPattern() + .getPattern() + .getStopPattern() + .getStop(1); + assertEquals(modifiedStop, STOP_D); + + var patterns = List.copyOf(transitModel.getAllTripPatterns()); + + var stops = patterns.stream().map(TripPattern::getStops).toList(); + assertEquals(List.of(List.of(STOP_A, STOP_D, STOP_C)), stops); + } +} diff --git a/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationParserTest.java b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationParserTest.java new file mode 100644 index 00000000000..9e3e0bc0370 --- /dev/null +++ b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationParserTest.java @@ -0,0 +1,29 @@ +package org.opentripplanner.ext.stopconsolidation; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.opentripplanner.test.support.ResourceLoader; +import org.opentripplanner.transit.model.framework.FeedScopedId; + +class StopConsolidationParserTest { + + @Test + void parse() { + try (var file = ResourceLoader.of(this).inputStream("consolidated-stops.csv")) { + var groups = StopConsolidationParser.parseGroups(file); + assertEquals(20, groups.size()); + + var first = groups.get(0); + assertEquals("kcm:10225", first.primary().toString()); + assertEquals( + List.of("pierce:1705867009"), + first.secondaries().stream().map(FeedScopedId::toString).toList() + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/TestStopConsolidationModel.java b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/TestStopConsolidationModel.java new file mode 100644 index 00000000000..da0c1d6f61d --- /dev/null +++ b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/TestStopConsolidationModel.java @@ -0,0 +1,53 @@ +package org.opentripplanner.ext.stopconsolidation; + +import static org.opentripplanner.transit.model._data.TransitModelForTest.id; + +import java.util.List; +import org.opentripplanner.transit.model._data.TransitModelForTest; +import org.opentripplanner.transit.model.framework.Deduplicator; +import org.opentripplanner.transit.model.framework.FeedScopedId; +import org.opentripplanner.transit.model.network.Route; +import org.opentripplanner.transit.model.network.StopPattern; +import org.opentripplanner.transit.model.network.TripPattern; +import org.opentripplanner.transit.model.organization.Agency; +import org.opentripplanner.transit.model.site.RegularStop; +import org.opentripplanner.transit.service.TransitModel; + +class TestStopConsolidationModel { + + private static final TransitModelForTest testModel = TransitModelForTest.of(); + public static final RegularStop STOP_A = testModel.stop("A").withCoordinate(1, 1).build(); + public static final RegularStop STOP_B = testModel.stop("B").withCoordinate(1.1, 1.1).build(); + public static final RegularStop STOP_C = testModel.stop("C").withCoordinate(1.2, 1.2).build(); + public static final StopPattern STOP_PATTERN = TransitModelForTest.stopPattern( + STOP_A, + STOP_B, + STOP_C + ); + static final String SECONDARY_FEED_ID = "secondary"; + static final Agency AGENCY = TransitModelForTest + .agency("agency") + .copy() + .withId(new FeedScopedId(SECONDARY_FEED_ID, "agency")) + .build(); + static final Route ROUTE = TransitModelForTest + .route(new FeedScopedId(SECONDARY_FEED_ID, "route-33")) + .withAgency(AGENCY) + .build(); + static final RegularStop STOP_D = testModel + .stop("D") + .withId(new FeedScopedId(SECONDARY_FEED_ID, "secondary-stop-D")) + .build(); + + static final TripPattern PATTERN = TripPattern + .of(id("123")) + .withRoute(ROUTE) + .withStopPattern(STOP_PATTERN) + .build(); + + static TransitModel buildTransitModel() { + var stopModelBuilder = testModel.stopModelBuilder(); + List.of(STOP_A, STOP_B, STOP_C, STOP_D).forEach(stopModelBuilder::withRegularStop); + return new TransitModel(stopModelBuilder.build(), new Deduplicator()); + } +} diff --git a/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationRepositoryTest.java b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationRepositoryTest.java new file mode 100644 index 00000000000..ac5eb6d66e4 --- /dev/null +++ b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationRepositoryTest.java @@ -0,0 +1,32 @@ +package org.opentripplanner.ext.stopconsolidation.internal; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.opentripplanner.transit.model._data.TransitModelForTest.id; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; + +class DefaultStopConsolidationRepositoryTest { + + private static final ConsolidatedStopGroup GROUP = new ConsolidatedStopGroup( + id("123"), + List.of(id("456")) + ); + + @Test + void add() { + var subject = new DefaultStopConsolidationRepository(); + assertEquals(List.of(), subject.groups()); + subject.addGroups(List.of(GROUP)); + + assertEquals(List.of(GROUP), subject.groups()); + } + + @Test + void groupsAreImmutable() { + var subject = new DefaultStopConsolidationRepository(); + assertThrows(Exception.class, () -> subject.groups().add(GROUP)); + } +} diff --git a/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationServiceTest.java b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationServiceTest.java new file mode 100644 index 00000000000..b2fc356d111 --- /dev/null +++ b/src/ext-test/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationServiceTest.java @@ -0,0 +1,18 @@ +package org.opentripplanner.ext.stopconsolidation.internal; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.Test; +import org.opentripplanner.transit.service.TransitModel; + +class DefaultStopConsolidationServiceTest { + + @Test + void isActive() { + var service = new DefaultStopConsolidationService( + new DefaultStopConsolidationRepository(), + new TransitModel() + ); + assertFalse(service.isActive()); + } +} diff --git a/src/ext-test/java/org/opentripplanner/ext/transmodelapi/mapping/TripRequestMapperTest.java b/src/ext-test/java/org/opentripplanner/ext/transmodelapi/mapping/TripRequestMapperTest.java index 35b66de7bf0..e429d59c92c 100644 --- a/src/ext-test/java/org/opentripplanner/ext/transmodelapi/mapping/TripRequestMapperTest.java +++ b/src/ext-test/java/org/opentripplanner/ext/transmodelapi/mapping/TripRequestMapperTest.java @@ -131,6 +131,7 @@ public class TripRequestMapperTest implements PlanTestConstants { new DefaultEmissionsService(new EmissionsDataModel()), RouterConfig.DEFAULT.flexConfig(), List.of(), + null, null ), null, diff --git a/src/ext-test/resources/org/opentripplanner/ext/stopconsolidation/consolidated-stops.csv b/src/ext-test/resources/org/opentripplanner/ext/stopconsolidation/consolidated-stops.csv new file mode 100644 index 00000000000..233bcf94e7f --- /dev/null +++ b/src/ext-test/resources/org/opentripplanner/ext/stopconsolidation/consolidated-stops.csv @@ -0,0 +1,45 @@ +stop_group_id,feed_id,stop_id,is_primary +1,pierce,1705867009,0 +1,kcm,10225,1 +2,pierce,1569,0 +2,commtrans,473,0 +2,kcm,1040,1 +3,pierce,7157,0 +3,kcm,10911,1 +4,pierce,8783,0 +4,kcm,10914,1 +5,commtrans,40,0 +5,kcm,16140,1 +6,commtrans,41,0 +6,kcm,16770,1 +7,commtrans,546,0 +7,kcm,1710,1 +8,kcm,1907,0 +8,kcm,1889,1 +9,pierce,27940,0 +9,kcm,21280,1 +10,pierce,28354,0 +10,kcm,22256,1 +11,pierce,15742,0 +11,commtrans,1079,0 +11,kcm,280,1 +12,pierce,4705,0 +12,kcm,29240,1 +13,pierce,19473,0 +13,kcm,29247,1 +14,pierce,23561,0 +14,kcm,29865,1 +15,pierce,52843,0 +15,kcm,300,1 +16,pierce,33993,0 +16,kcm,31731,1 +17,pierce,3886,0 +17,commtrans,2909,0 +17,kcm,320,1 +18,pierce,20510,0 +18,kcm,340,1 +19,pierce,223,0 +19,commtrans,2631,0 +19,kcm,360,1 +20,pierce,12914,0 +20,kcm,361,1 diff --git a/src/ext/java/org/opentripplanner/ext/fares/FaresToItineraryMapper.java b/src/ext/java/org/opentripplanner/ext/fares/FaresToItineraryMapper.java index c253b730611..a2b0984e4a3 100644 --- a/src/ext/java/org/opentripplanner/ext/fares/FaresToItineraryMapper.java +++ b/src/ext/java/org/opentripplanner/ext/fares/FaresToItineraryMapper.java @@ -6,7 +6,6 @@ import org.opentripplanner.model.fare.ItineraryFares; import org.opentripplanner.model.plan.Itinerary; import org.opentripplanner.model.plan.Leg; -import org.opentripplanner.model.plan.ScheduledTransitLeg; /** * Takes fares and applies them to the legs of an itinerary. @@ -14,7 +13,7 @@ public class FaresToItineraryMapper { public static void addFaresToLegs(ItineraryFares fares, Itinerary i) { - var itineraryInstances = fares + var itineraryFareUses = fares .getItineraryProducts() .stream() .map(fp -> { @@ -25,15 +24,12 @@ public static void addFaresToLegs(ItineraryFares fares, Itinerary i) { final Multimap legProductsFromComponents = fares.legProductsFromComponents(); - i - .getLegs() - .stream() - .filter(ScheduledTransitLeg.class::isInstance) - .forEach(l -> { - var legInstances = fares.getLegProducts().get(l); - l.setFareProducts( - ListUtils.combine(itineraryInstances, legProductsFromComponents.get(l), legInstances) - ); - }); + i.transformTransitLegs(leg -> { + var legInstances = fares.getLegProducts().get(leg); + leg.setFareProducts( + ListUtils.combine(itineraryFareUses, legProductsFromComponents.get(leg), legInstances) + ); + return leg; + }); } } diff --git a/src/ext/java/org/opentripplanner/ext/flex/template/FlexEgressTemplate.java b/src/ext/java/org/opentripplanner/ext/flex/template/FlexEgressTemplate.java index 0f95a18c543..27e9cd2f009 100644 --- a/src/ext/java/org/opentripplanner/ext/flex/template/FlexEgressTemplate.java +++ b/src/ext/java/org/opentripplanner/ext/flex/template/FlexEgressTemplate.java @@ -23,14 +23,14 @@ public class FlexEgressTemplate extends FlexAccessEgressTemplate { public FlexEgressTemplate( NearbyStop accessEgress, FlexTrip trip, - int fromStopTime, - int toStopTime, + int fromStopIndex, + int toStopIndex, StopLocation transferStop, FlexServiceDate date, FlexPathCalculator calculator, FlexConfig config ) { - super(accessEgress, trip, fromStopTime, toStopTime, transferStop, date, calculator, config); + super(accessEgress, trip, fromStopIndex, toStopIndex, transferStop, date, calculator, config); } protected List getTransferEdges(PathTransfer transfer) { @@ -38,7 +38,7 @@ protected List getTransferEdges(PathTransfer transfer) { } protected RegularStop getFinalStop(PathTransfer transfer) { - return transfer.from instanceof RegularStop ? (RegularStop) transfer.from : null; + return transfer.from instanceof RegularStop regularStop ? regularStop : null; } protected Collection getTransfersFromTransferStop(TransitService transitService) { diff --git a/src/ext/java/org/opentripplanner/ext/flex/trip/UnscheduledTrip.java b/src/ext/java/org/opentripplanner/ext/flex/trip/UnscheduledTrip.java index 6b32917e83e..71a77eee5e7 100644 --- a/src/ext/java/org/opentripplanner/ext/flex/trip/UnscheduledTrip.java +++ b/src/ext/java/org/opentripplanner/ext/flex/trip/UnscheduledTrip.java @@ -180,8 +180,8 @@ public Stream getFlexEgressTemplates( new FlexEgressTemplate( egress, this, - toIndex, boardStop.index, + toIndex, boardStop.stop, date, calculator, diff --git a/src/ext/java/org/opentripplanner/ext/siri/AddedTripBuilder.java b/src/ext/java/org/opentripplanner/ext/siri/AddedTripBuilder.java index 23d7cbb1705..2d7789422ea 100644 --- a/src/ext/java/org/opentripplanner/ext/siri/AddedTripBuilder.java +++ b/src/ext/java/org/opentripplanner/ext/siri/AddedTripBuilder.java @@ -29,6 +29,7 @@ import org.opentripplanner.transit.model.timetable.RealTimeState; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.opentripplanner.transit.service.TransitModel; import org.opentripplanner.updater.spi.TripTimesValidationMapper; import org.opentripplanner.updater.spi.UpdateError; @@ -201,10 +202,14 @@ Result build() { .withStopPattern(stopPattern) .build(); - TripTimes tripTimes = new TripTimes(trip, aimedStopTimes, transitModel.getDeduplicator()); + TripTimes tripTimes = TripTimesFactory.tripTimes( + trip, + aimedStopTimes, + transitModel.getDeduplicator() + ); tripTimes.setServiceCode(transitModel.getServiceCodes().get(trip.getServiceId())); pattern.add(tripTimes); - TripTimes updatedTripTimes = new TripTimes(tripTimes); + TripTimes updatedTripTimes = tripTimes.copyOfScheduledTimes(); // Loop through calls again and apply updates for (int stopSequence = 0; stopSequence < calls.size(); stopSequence++) { diff --git a/src/ext/java/org/opentripplanner/ext/siri/ModifiedTripBuilder.java b/src/ext/java/org/opentripplanner/ext/siri/ModifiedTripBuilder.java index c7d6d9b3373..f56d3c6a75f 100644 --- a/src/ext/java/org/opentripplanner/ext/siri/ModifiedTripBuilder.java +++ b/src/ext/java/org/opentripplanner/ext/siri/ModifiedTripBuilder.java @@ -94,7 +94,7 @@ public ModifiedTripBuilder( * in form the SIRI-ET update. */ public Result build() { - TripTimes newTimes = new TripTimes(existingTripTimes); + TripTimes newTimes = existingTripTimes.copyOfScheduledTimes(); StopPattern stopPattern = createStopPattern(pattern, calls, entityResolver); diff --git a/src/ext/java/org/opentripplanner/ext/siri/SiriTimetableSnapshotSource.java b/src/ext/java/org/opentripplanner/ext/siri/SiriTimetableSnapshotSource.java index 3e6b4a62fd4..0cedc491f79 100644 --- a/src/ext/java/org/opentripplanner/ext/siri/SiriTimetableSnapshotSource.java +++ b/src/ext/java/org/opentripplanner/ext/siri/SiriTimetableSnapshotSource.java @@ -395,7 +395,7 @@ private boolean markScheduledTripAsDeleted(Trip trip, final LocalDate serviceDat if (tripTimes == null) { LOG.warn("Could not mark scheduled trip as deleted {}", trip.getId()); } else { - final TripTimes newTripTimes = new TripTimes(tripTimes); + final TripTimes newTripTimes = tripTimes.copyOfScheduledTimes(); newTripTimes.deleteTrip(); buffer.update(pattern, newTripTimes, serviceDate); success = true; diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/ConsolidatedStopNameFilter.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/ConsolidatedStopNameFilter.java new file mode 100644 index 00000000000..c28d1de91b6 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/ConsolidatedStopNameFilter.java @@ -0,0 +1,52 @@ +package org.opentripplanner.ext.stopconsolidation; + +import java.util.List; +import java.util.Objects; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopLeg; +import org.opentripplanner.model.plan.Itinerary; +import org.opentripplanner.model.plan.ScheduledTransitLeg; +import org.opentripplanner.routing.algorithm.filterchain.ItineraryListFilter; + +/** + * A decorating filter that checks if a transit leg contains any primary stops and if it does, + * then replaces it with the secondary, agency-specific stop name. This is so that the in-vehicle + * display matches what OTP returns as a board/alight stop name. + */ +public class ConsolidatedStopNameFilter implements ItineraryListFilter { + + private final StopConsolidationService service; + + public ConsolidatedStopNameFilter(StopConsolidationService service) { + this.service = Objects.requireNonNull(service); + } + + @Override + public List filter(List itineraries) { + return itineraries.stream().map(this::replacePrimaryNamesWithSecondary).toList(); + } + + /** + * If the itinerary has a from/to that is the primary stop of a {@link org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup} + * then we replace its name with the secondary name of the agency that is + * operating the route, so that the name in the result matches the name in the in-vehicle + * display. + */ + private Itinerary replacePrimaryNamesWithSecondary(Itinerary i) { + return i.transformTransitLegs(leg -> { + if (leg instanceof ScheduledTransitLeg stl && needsToRenameStops(stl)) { + var agency = leg.getAgency(); + return new ConsolidatedStopLeg( + stl, + service.agencySpecificName(stl.getFrom().stop, agency), + service.agencySpecificName(stl.getTo().stop, agency) + ); + } else { + return leg; + } + }); + } + + private boolean needsToRenameStops(ScheduledTransitLeg stl) { + return (service.isPrimaryStop(stl.getFrom().stop) || service.isPrimaryStop(stl.getTo().stop)); + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationModule.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationModule.java new file mode 100644 index 00000000000..c70e91fca52 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationModule.java @@ -0,0 +1,88 @@ +package org.opentripplanner.ext.stopconsolidation; + +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import javax.annotation.Nonnull; +import org.opentripplanner.datastore.api.DataSource; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationService; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; +import org.opentripplanner.ext.stopconsolidation.model.StopReplacement; +import org.opentripplanner.graph_builder.model.GraphBuilderModule; +import org.opentripplanner.transit.model.network.TripPattern; +import org.opentripplanner.transit.service.TransitModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A graph build module that takes a list of "consolidated" stops (stops from several feeds + * that represent the same stop place) and swaps the "secondary" stops in patterns with their + * "primary" equivalent. + *

+ * NOTE: This will make realtime trip updates for a modified pattern a lot harder. For Arcadis' + * initial implementation this is acceptable and will serve as encouragement for the data producers to + * produce a consolidated transit feed rather than relying on this feature. + */ +public class StopConsolidationModule implements GraphBuilderModule { + + private static final Logger LOG = LoggerFactory.getLogger(TripPattern.class); + + private final StopConsolidationRepository repository; + private final TransitModel transitModel; + private final Collection groups; + + public StopConsolidationModule( + TransitModel transitModel, + StopConsolidationRepository repository, + Collection groups + ) { + this.transitModel = Objects.requireNonNull(transitModel); + this.repository = Objects.requireNonNull(repository); + this.groups = Objects.requireNonNull(groups); + } + + @Override + public void buildGraph() { + repository.addGroups(groups); + + var service = new DefaultStopConsolidationService(repository, transitModel); + + var stopsToReplace = service.secondaryStops(); + var replacements = service.replacements(); + + transitModel + .getAllTripPatterns() + .stream() + .filter(pattern -> pattern.containsAnyStopId(stopsToReplace)) + .forEach(pattern -> { + LOG.info("Replacing stop(s) in pattern {}", pattern); + var modifiedPattern = modifyStopsInPattern(pattern, replacements); + transitModel.addTripPattern(modifiedPattern.getId(), modifiedPattern); + }); + } + + @Nonnull + private TripPattern modifyStopsInPattern( + TripPattern pattern, + List replacements + ) { + var updatedStopPattern = pattern.getStopPattern().mutate(); + replacements.forEach(r -> updatedStopPattern.replaceStop(r.secondary(), r.primary())); + return pattern.copy().withStopPattern(updatedStopPattern.build()).build(); + } + + public static StopConsolidationModule of( + TransitModel transitModel, + StopConsolidationRepository repo, + DataSource ds + ) { + LOG.info("Reading stop consolidation information from '{}'", ds); + try (var inputStream = ds.asInputStream()) { + var groups = StopConsolidationParser.parseGroups(inputStream); + return new StopConsolidationModule(transitModel, repo, groups); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationParser.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationParser.java new file mode 100644 index 00000000000..b55a84db040 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationParser.java @@ -0,0 +1,71 @@ +package org.opentripplanner.ext.stopconsolidation; + +import com.csvreader.CsvReader; +import com.google.common.collect.ImmutableListMultimap; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.commons.lang3.BooleanUtils; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; +import org.opentripplanner.transit.model.framework.FeedScopedId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class StopConsolidationParser { + + private record StopGroupEntry(String groupId, FeedScopedId stopId, boolean isPrimary) {} + + public static List parseGroups(InputStream is) { + try { + var reader = new CsvReader(is, StandardCharsets.UTF_8); + reader.setDelimiter(','); + + reader.readHeaders(); + + var entries = new ArrayList(); + while (reader.readRecord()) { + var id = reader.get("stop_group_id"); + var feedId = reader.get("feed_id"); + var stopId = reader.get("stop_id"); + var isPrimary = BooleanUtils.toBoolean(Integer.parseInt(reader.get("is_primary"))); + var entry = new StopGroupEntry(id, new FeedScopedId(feedId, stopId), isPrimary); + entries.add(entry); + } + + var groups = entries + .stream() + .collect( + ImmutableListMultimap.flatteningToImmutableListMultimap( + x -> x.groupId, + Stream::of + ) + ); + + return groups + .keys() + .stream() + .map(key -> { + var group = groups.get(key); + + var primaryId = group.stream().filter(e -> e.isPrimary).findAny().orElseThrow().stopId; + var secondaries = group + .stream() + .filter(e -> !e.isPrimary) + .map(e -> e.stopId) + .collect(Collectors.toSet()); + + return new ConsolidatedStopGroup(primaryId, secondaries); + }) + .distinct() + .toList(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationRepository.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationRepository.java new file mode 100644 index 00000000000..750e8c519e4 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationRepository.java @@ -0,0 +1,22 @@ +package org.opentripplanner.ext.stopconsolidation; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; + +/** + * A writeable repository which contains the source data for the consolidation of stops. + * This repository is built during graph build and then serialized into the graph. + */ +public interface StopConsolidationRepository extends Serializable { + /** + * Add groups to this repository. + */ + void addGroups(Collection group); + + /** + * Returns the list of consolidated stop groups. + */ + List groups(); +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationService.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationService.java new file mode 100644 index 00000000000..2418d8f5625 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/StopConsolidationService.java @@ -0,0 +1,36 @@ +package org.opentripplanner.ext.stopconsolidation; + +import java.util.List; +import org.opentripplanner.ext.stopconsolidation.model.StopReplacement; +import org.opentripplanner.framework.i18n.I18NString; +import org.opentripplanner.transit.model.framework.FeedScopedId; +import org.opentripplanner.transit.model.organization.Agency; +import org.opentripplanner.transit.model.site.StopLocation; + +public interface StopConsolidationService { + /** + * A flat list of pairs of stops that should be replaced. + */ + List replacements(); + + /** + * Returns the list of secondary stops that need to be replaced in TripPatterns with their + * primary equivalent. + */ + List secondaryStops(); + + /** + * Is the given stop a primary stop as defined by the stop consolidation configuration? + */ + boolean isPrimaryStop(StopLocation stop); + + /** + * Are any stop consolidations defined? + */ + boolean isActive(); + + /** + * For a given primary stop look up the name as it was originally defined in the agency's feed. + */ + I18NString agencySpecificName(StopLocation stop, Agency agency); +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/configure/StopConsolidationRepositoryModule.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/configure/StopConsolidationRepositoryModule.java new file mode 100644 index 00000000000..75cd6cb868f --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/configure/StopConsolidationRepositoryModule.java @@ -0,0 +1,18 @@ +package org.opentripplanner.ext.stopconsolidation.configure; + +import dagger.Binds; +import dagger.Module; +import javax.annotation.Nullable; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationRepository; + +/** + * The repository is used during application loading phase, so we need to provide + * a module for the repository. + */ +@Module +public interface StopConsolidationRepositoryModule { + @Binds + @Nullable + StopConsolidationRepository bindRepository(@Nullable DefaultStopConsolidationRepository repo); +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/configure/StopConsolidationServiceModule.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/configure/StopConsolidationServiceModule.java new file mode 100644 index 00000000000..3851435641c --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/configure/StopConsolidationServiceModule.java @@ -0,0 +1,25 @@ +package org.opentripplanner.ext.stopconsolidation.configure; + +import dagger.Module; +import dagger.Provides; +import jakarta.inject.Singleton; +import javax.annotation.Nullable; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationService; +import org.opentripplanner.transit.service.TransitModel; + +@Module +public class StopConsolidationServiceModule { + + @Provides + @Singleton + @Nullable + StopConsolidationService service(@Nullable StopConsolidationRepository repo, TransitModel tm) { + if (repo == null) { + return null; + } else { + return new DefaultStopConsolidationService(repo, tm); + } + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationRepository.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationRepository.java new file mode 100644 index 00000000000..4c9552b9a1e --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationRepository.java @@ -0,0 +1,28 @@ +package org.opentripplanner.ext.stopconsolidation.internal; + +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.model.ConsolidatedStopGroup; + +@Singleton +public class DefaultStopConsolidationRepository + implements Serializable, StopConsolidationRepository { + + private final List groups = new ArrayList<>(); + + @Inject + public DefaultStopConsolidationRepository() {} + + public void addGroups(Collection group) { + groups.addAll(group); + } + + public List groups() { + return List.copyOf(groups); + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationService.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationService.java new file mode 100644 index 00000000000..54bd960d078 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/internal/DefaultStopConsolidationService.java @@ -0,0 +1,86 @@ +package org.opentripplanner.ext.stopconsolidation.internal; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; +import org.opentripplanner.ext.stopconsolidation.model.StopReplacement; +import org.opentripplanner.framework.i18n.I18NString; +import org.opentripplanner.transit.model.framework.FeedScopedId; +import org.opentripplanner.transit.model.organization.Agency; +import org.opentripplanner.transit.model.site.RegularStop; +import org.opentripplanner.transit.model.site.StopLocation; +import org.opentripplanner.transit.service.TransitModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DefaultStopConsolidationService implements StopConsolidationService { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultStopConsolidationService.class); + + private final StopConsolidationRepository repo; + private final TransitModel transitModel; + + public DefaultStopConsolidationService( + StopConsolidationRepository repo, + TransitModel transitModel + ) { + this.repo = Objects.requireNonNull(repo); + this.transitModel = Objects.requireNonNull(transitModel); + } + + @Override + public List replacements() { + return repo + .groups() + .stream() + .flatMap(group -> { + var primaryStop = transitModel.getStopModel().getRegularStop(group.primary()); + if (primaryStop == null) { + LOG.error( + "Could not find primary stop with id {}. Ignoring stop group {}.", + group.primary(), + group + ); + return Stream.empty(); + } else { + return group.secondaries().stream().map(r -> new StopReplacement(primaryStop, r)); + } + }) + .toList(); + } + + @Override + public List secondaryStops() { + return replacements().stream().map(StopReplacement::secondary).toList(); + } + + @Override + public boolean isPrimaryStop(StopLocation stop) { + return repo.groups().stream().anyMatch(r -> r.primary().equals(stop.getId())); + } + + @Override + public boolean isActive() { + return !repo.groups().isEmpty(); + } + + @Override + public I18NString agencySpecificName(StopLocation stop, Agency agency) { + if (agency.getId().getFeedId().equals(stop.getId().getFeedId())) { + return stop.getName(); + } else { + return repo + .groups() + .stream() + .filter(r -> r.primary().equals(stop.getId())) + .flatMap(g -> g.secondaries().stream()) + .filter(secondary -> secondary.getFeedId().equals(agency.getId().getFeedId())) + .findAny() + .map(id -> transitModel.getStopModel().getRegularStop(id)) + .map(RegularStop::getName) + .orElseGet(stop::getName); + } + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/ConsolidatedStopGroup.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/ConsolidatedStopGroup.java new file mode 100644 index 00000000000..71a98342f39 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/ConsolidatedStopGroup.java @@ -0,0 +1,6 @@ +package org.opentripplanner.ext.stopconsolidation.model; + +import java.util.Collection; +import org.opentripplanner.transit.model.framework.FeedScopedId; + +public record ConsolidatedStopGroup(FeedScopedId primary, Collection secondaries) {} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/ConsolidatedStopLeg.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/ConsolidatedStopLeg.java new file mode 100644 index 00000000000..e201c7ed805 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/ConsolidatedStopLeg.java @@ -0,0 +1,28 @@ +package org.opentripplanner.ext.stopconsolidation.model; + +import org.opentripplanner.framework.i18n.I18NString; +import org.opentripplanner.model.plan.Place; +import org.opentripplanner.model.plan.ScheduledTransitLeg; +import org.opentripplanner.model.plan.ScheduledTransitLegBuilder; + +public class ConsolidatedStopLeg extends ScheduledTransitLeg { + + private final I18NString fromName; + private final I18NString toName; + + public ConsolidatedStopLeg(ScheduledTransitLeg original, I18NString fromName, I18NString toName) { + super(new ScheduledTransitLegBuilder<>(original)); + this.fromName = fromName; + this.toName = toName; + } + + @Override + public Place getFrom() { + return Place.forStop(super.getFrom().stop, fromName); + } + + @Override + public Place getTo() { + return Place.forStop(super.getTo().stop, toName); + } +} diff --git a/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/StopReplacement.java b/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/StopReplacement.java new file mode 100644 index 00000000000..2a781f3e866 --- /dev/null +++ b/src/ext/java/org/opentripplanner/ext/stopconsolidation/model/StopReplacement.java @@ -0,0 +1,6 @@ +package org.opentripplanner.ext.stopconsolidation.model; + +import org.opentripplanner.transit.model.framework.FeedScopedId; +import org.opentripplanner.transit.model.site.StopLocation; + +public record StopReplacement(StopLocation primary, FeedScopedId secondary) {} diff --git a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/PatternImpl.java b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/PatternImpl.java index 35777dc9836..18ab5c5d5e9 100644 --- a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/PatternImpl.java +++ b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/PatternImpl.java @@ -241,11 +241,7 @@ private Route getRoute(DataFetchingEnvironment environment) { } private List getStops(DataFetchingEnvironment environment) { - return getSource(environment) - .getStops() - .stream() - .map(Object.class::cast) - .collect(Collectors.toList()); + return getSource(environment).getStops().stream().map(Object.class::cast).toList(); } private List getTrips(DataFetchingEnvironment environment) { diff --git a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java index 750cb0a4929..1c2a7b7c72a 100644 --- a/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java +++ b/src/main/java/org/opentripplanner/apis/gtfs/datafetchers/QueryTypeImpl.java @@ -126,7 +126,7 @@ public DataFetcher> bikeParks() { .getContext() .vehicleParkingService(); - return vehicleParkingService.getBikeParks().collect(Collectors.toList()); + return vehicleParkingService.getBikeParks().toList(); }; } @@ -176,7 +176,7 @@ public DataFetcher> bikeRentalStations() { .getGraphQLIds() .stream() .flatMap(id -> vehicleRentalStations.get(id).stream()) - .collect(Collectors.toList()); + .toList(); } return vehicleRentalStationService.getVehicleRentalPlaces(); @@ -223,11 +223,11 @@ public DataFetcher> carParks() { .getCarParks() .collect(Collectors.toMap(station -> station.getId().getId(), station -> station)); - return idList.stream().map(carParkMap::get).collect(Collectors.toList()); + return idList.stream().map(carParkMap::get).toList(); } } - return vehicleParkingService.getCarParks().collect(Collectors.toList()); + return vehicleParkingService.getCarParks().toList(); }; } @@ -291,19 +291,11 @@ public DataFetcher> nearest() { if (filterByIds != null) { filterByStops = filterByIds.getGraphQLStops() != null - ? filterByIds - .getGraphQLStops() - .stream() - .map(FeedScopedId::parse) - .collect(Collectors.toList()) + ? filterByIds.getGraphQLStops().stream().map(FeedScopedId::parse).toList() : null; filterByRoutes = filterByIds.getGraphQLRoutes() != null - ? filterByIds - .getGraphQLRoutes() - .stream() - .map(FeedScopedId::parse) - .collect(Collectors.toList()) + ? filterByIds.getGraphQLRoutes().stream().map(FeedScopedId::parse).toList() : null; filterByBikeRentalStations = filterByIds.getGraphQLBikeRentalStations(); filterByBikeParks = filterByIds.getGraphQLBikeParks(); @@ -322,7 +314,7 @@ public DataFetcher> nearest() { } }) .filter(Objects::nonNull) - .collect(Collectors.toList()) + .toList() : null; List filterByPlaceTypes = args.getGraphQLFilterByPlaceTypes() != null ? args.getGraphQLFilterByPlaceTypes().stream().map(GraphQLUtils::toModel).toList() @@ -360,7 +352,7 @@ public DataFetcher node() { var args = new GraphQLTypes.GraphQLQueryTypeNodeArgs(environment.getArguments()); String type = args.getGraphQLId().getType(); String id = args.getGraphQLId().getId(); - final GraphQLRequestContext context = environment.getContext(); + final GraphQLRequestContext context = environment.getContext(); TransitService transitService = context.transitService(); VehicleParkingService vehicleParkingService = context.vehicleParkingService(); VehicleRentalService vehicleRentalStationService = context.vehicleRentalService(); @@ -531,7 +523,7 @@ public DataFetcher> rentalVehicles() { .getGraphQLIds() .stream() .flatMap(id -> vehicleRentalVehicles.get(id).stream()) - .collect(Collectors.toList()); + .toList(); } var formFactorArgs = args.getGraphQLFormFactors(); @@ -574,7 +566,7 @@ public DataFetcher> routes() { .stream() .map(FeedScopedId::parse) .map(transitService::getRouteForId) - .collect(Collectors.toList()); + .toList(); } Stream routeStream = transitService.getAllRoutes().stream(); @@ -589,7 +581,7 @@ public DataFetcher> routes() { .getGraphQLTransportModes() .stream() .map(mode -> TransitMode.valueOf(mode.name())) - .collect(Collectors.toList()); + .toList(); routeStream = routeStream.filter(route -> modes.contains(route.getMode())); } @@ -601,7 +593,7 @@ public DataFetcher> routes() { GraphQLUtils.startsWith(route.getLongName(), name, environment.getLocale()) ); } - return routeStream.collect(Collectors.toList()); + return routeStream.toList(); }; } @@ -784,7 +776,7 @@ public DataFetcher> trips() { tripStream = tripStream.filter(trip -> feeds.contains(trip.getId().getFeedId())); } - return tripStream.collect(Collectors.toList()); + return tripStream.toList(); }; } @@ -823,11 +815,11 @@ public DataFetcher> vehicleParkings() { .getVehicleParkings() .collect(Collectors.toMap(station -> station.getId().toString(), station -> station)); - return idList.stream().map(vehicleParkingMap::get).collect(Collectors.toList()); + return idList.stream().map(vehicleParkingMap::get).toList(); } } - return vehicleParkingService.getVehicleParkings().collect(Collectors.toList()); + return vehicleParkingService.getVehicleParkings().toList(); }; } @@ -884,7 +876,7 @@ public DataFetcher> vehicleRentalStations() { .getGraphQLIds() .stream() .flatMap(id -> vehicleRentalStations.get(id).stream()) - .collect(Collectors.toList()); + .toList(); } return vehicleRentalStationService.getVehicleRentalStations(); @@ -965,6 +957,6 @@ protected static List filterAlerts( .map(EntitySelector.Stop.class::cast) .anyMatch(stop -> args.getGraphQLStop().contains(stop.stopId().toString())) ) - .collect(Collectors.toList()); + .toList(); } } diff --git a/src/main/java/org/opentripplanner/framework/geometry/GeometryUtils.java b/src/main/java/org/opentripplanner/framework/geometry/GeometryUtils.java index 7e9335b1ad8..cf634ad0e23 100644 --- a/src/main/java/org/opentripplanner/framework/geometry/GeometryUtils.java +++ b/src/main/java/org/opentripplanner/framework/geometry/GeometryUtils.java @@ -81,11 +81,15 @@ public static LineString makeLineString(List coordinates) { return factory.createLineString(coordinates.toArray(new Coordinate[] {})); } - public static LineString makeLineString(Coordinate[] coordinates) { + public static LineString makeLineString(Coordinate... coordinates) { GeometryFactory factory = getGeometryFactory(); return factory.createLineString(coordinates); } + public static LineString makeLineString(WgsCoordinate... coordinates) { + return makeLineString(Arrays.stream(coordinates).map(WgsCoordinate::asJtsCoordinate).toList()); + } + public static LineString concatenateLineStrings( List inputObjects, Function mapper diff --git a/src/main/java/org/opentripplanner/framework/lang/IntUtils.java b/src/main/java/org/opentripplanner/framework/lang/IntUtils.java index 01040bf0f93..04eeff4695e 100644 --- a/src/main/java/org/opentripplanner/framework/lang/IntUtils.java +++ b/src/main/java/org/opentripplanner/framework/lang/IntUtils.java @@ -59,9 +59,9 @@ public static int[] intArray(int size, int initialValue) { * Copy int array and shift all values by the given {@code offset}. */ public static int[] shiftArray(int offset, int[] array) { - int[] a = new int[array.length]; - for (int i = 0; i < array.length; i++) { - a[i] = array[i] + offset; + int[] a = Arrays.copyOf(array, array.length); + for (int i = 0; i < array.length; ++i) { + a[i] += offset; } return a; } diff --git a/src/main/java/org/opentripplanner/framework/tostring/MultiLineToStringBuilder.java b/src/main/java/org/opentripplanner/framework/tostring/MultiLineToStringBuilder.java new file mode 100644 index 00000000000..32f5762843a --- /dev/null +++ b/src/main/java/org/opentripplanner/framework/tostring/MultiLineToStringBuilder.java @@ -0,0 +1,106 @@ +package org.opentripplanner.framework.tostring; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import org.opentripplanner.framework.time.DurationUtils; + +/** + * When debug logging it is much more readable if the logging is nicely formatted with line-breaks. + * This builder can be used to create a nice list of key/values. It also allows breaking a + * collection of values into lines. It only allows for two nested levels, see {@code PageCursor} + * below. + *

+ * Example output: + *

+ * Response {
+ * 	SearchWindowUsed : 50m
+ * 	NextPage........ : PageCursor{type: NEXT_PAGE, ...}
+ * 	PreviousPage.... : PageCursor{type: PREVIOUS_PAGE, ...}
+ * 	Itineraries..... : [
+ * 		Origin ~ Walk 2h20m49s ~ Destination [$20186]
+ * 		Origin ~ Walk 1m47s ~ Malmö C ~ RAIL Pågatåg 5:55 6:03 ~ ... ~ Destination [$1587]
+ * 		Origin ~ Walk 2m31s ~ Malmö C ~ RAIL Ö-tåg 5:08 5:28 ~ ... ~ Destination [$4142]
+ * 	]
+ * }
+ * 
+ * The {@code '...'} is just to shorten the doc, this class does not truncate lines. + */ +public class MultiLineToStringBuilder { + + private static final String NL_INDENT_1 = "\n "; + private static final String NL_INDENT_2 = "\n "; + + private final String name; + private final List items = new ArrayList<>(); + + private MultiLineToStringBuilder(String name) { + this.name = name; + } + + public static MultiLineToStringBuilder of(String name) { + return new MultiLineToStringBuilder(name); + } + + public MultiLineToStringBuilder add(String label, Object value) { + return addIf(label, value, Objects::nonNull, Object::toString); + } + + public MultiLineToStringBuilder addDuration(String label, Duration value) { + return addIf(label, value, Objects::nonNull, DurationUtils::durationToStr); + } + + public MultiLineToStringBuilder addColNl(String label, Collection value) { + return addIf(label, value, this::colExist, this::colToString); + } + + private MultiLineToStringBuilder addIf( + String label, + T value, + Predicate ignoreValue, + Function toString + ) { + if (ignoreValue.test(value)) { + items.add(new Item(label, toString.apply(value))); + } + return this; + } + + private boolean colExist(Collection c) { + return !(c == null || c.isEmpty()); + } + + private String colToString(Collection c) { + return c + .stream() + .map(Object::toString) + .collect(Collectors.joining(NL_INDENT_2, "[" + NL_INDENT_2, NL_INDENT_1 + "]")); + } + + public String toString() { + var buf = new StringBuilder(name).append(" {"); + int labelSize = items.stream().mapToInt(it -> it.key.length()).max().orElse(0); + + for (Item item : items) { + var labelTxt = padRight(item.key(), labelSize); + buf.append(NL_INDENT_1).append(labelTxt).append(" : ").append(item.value()); + } + + return buf.append("\n}").toString(); + } + + private String padRight(String value, int size) { + var buf = new StringBuilder(value); + while (buf.length() < size) { + buf.append('.'); + } + return buf.toString(); + } + + private record Item(String key, Object value) {} +} diff --git a/src/main/java/org/opentripplanner/framework/tostring/ToStringBuilder.java b/src/main/java/org/opentripplanner/framework/tostring/ToStringBuilder.java index f6c17b19af1..d2cec512420 100644 --- a/src/main/java/org/opentripplanner/framework/tostring/ToStringBuilder.java +++ b/src/main/java/org/opentripplanner/framework/tostring/ToStringBuilder.java @@ -186,21 +186,27 @@ public ToStringBuilder addCol(String name, Collection c, Function c, int maxLimit) { + public ToStringBuilder addCollection( + String name, + Collection c, + int maxLimit, + Function toString + ) { if (c == null) { return this; } if (c.size() > maxLimit + 1) { - String value = c - .stream() - .limit(maxLimit) - .map(Object::toString) - .collect(Collectors.joining(", ")); + String value = c.stream().limit(maxLimit).map(toString).collect(Collectors.joining(", ")); return addIt(name + "(" + maxLimit + "/" + c.size() + ")", "[" + value + ", ..]"); } return addIfNotNull(name, c); } + /** Add the collection, truncate the number of elements at given maxLimit. */ + public ToStringBuilder addCollection(String name, Collection c, int maxLimit) { + return addCollection(name, c, maxLimit, Object::toString); + } + public ToStringBuilder addColSize(String name, Collection c) { return addIfNotNull(name, c, x -> String.format("%d items", x.size())); } @@ -372,7 +378,7 @@ private void addValue(@Nonnull String value) { * Map the given object to a String. If the input object is {@code null} the string * {@code "null"} is returned if not the {@link Object#toString()} method is called. */ - public static String nullSafeToString(@Nullable Object object) { + static String nullSafeToString(@Nullable Object object) { if (object == null) { return NULL_VALUE; } diff --git a/src/main/java/org/opentripplanner/graph_builder/GraphBuilder.java b/src/main/java/org/opentripplanner/graph_builder/GraphBuilder.java index 662846b3952..e6aba29278b 100644 --- a/src/main/java/org/opentripplanner/graph_builder/GraphBuilder.java +++ b/src/main/java/org/opentripplanner/graph_builder/GraphBuilder.java @@ -11,6 +11,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opentripplanner.ext.emissions.EmissionsDataModel; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; import org.opentripplanner.framework.application.OTPFeature; import org.opentripplanner.framework.application.OtpAppException; import org.opentripplanner.framework.lang.OtpNumberFormat; @@ -63,10 +64,10 @@ public static GraphBuilder create( TransitModel transitModel, WorldEnvelopeRepository worldEnvelopeRepository, @Nullable EmissionsDataModel emissionsDataModel, + @Nullable StopConsolidationRepository stopConsolidationRepository, boolean loadStreetGraph, boolean saveStreetGraph ) { - //DaggerGraphBuilderFactory appFactory = GraphBuilderFactoryDa boolean hasOsm = dataSources.has(OSM); boolean hasGtfs = dataSources.has(GTFS); boolean hasNetex = dataSources.has(NETEX); @@ -80,6 +81,7 @@ public static GraphBuilder create( .graph(graph) .transitModel(transitModel) .worldEnvelopeRepository(worldEnvelopeRepository) + .stopConsolidationRepository(stopConsolidationRepository) .dataSources(dataSources) .timeZoneId(transitModel.getTimeZone()); @@ -105,6 +107,11 @@ public static GraphBuilder create( graphBuilder.addModule(factory.netexModule()); } + // Consolidate stops only if a stop consolidation repo has been provided + if (hasTransitData && factory.stopConsolidationModule() != null) { + graphBuilder.addModule(factory.stopConsolidationModule()); + } + if (hasTransitData) { graphBuilder.addModule(factory.tripPatternNamer()); } diff --git a/src/main/java/org/opentripplanner/graph_builder/GraphBuilderDataSources.java b/src/main/java/org/opentripplanner/graph_builder/GraphBuilderDataSources.java index 310b3303aaf..eaa61fea139 100644 --- a/src/main/java/org/opentripplanner/graph_builder/GraphBuilderDataSources.java +++ b/src/main/java/org/opentripplanner/graph_builder/GraphBuilderDataSources.java @@ -12,12 +12,14 @@ import java.io.File; import java.net.URI; import java.util.EnumSet; +import java.util.Optional; import java.util.Set; import org.opentripplanner.datastore.OtpDataStore; import org.opentripplanner.datastore.api.CompositeDataSource; import org.opentripplanner.datastore.api.DataSource; import org.opentripplanner.datastore.api.FileType; import org.opentripplanner.datastore.api.OtpBaseDirectory; +import org.opentripplanner.datastore.file.FileDataSource; import org.opentripplanner.framework.application.OtpAppException; import org.opentripplanner.graph_builder.module.ned.parameter.DemExtractParameters; import org.opentripplanner.graph_builder.module.ned.parameter.DemExtractParametersBuilder; @@ -181,6 +183,18 @@ public NetexFeedParameters getNetexConfig(DataSource dataSource) { .orElse(buildConfig.netexDefaults.copyOf().withSource(dataSource.uri()).build()); } + /** + * Returns the optional data source for the stop consolidation configuration. + */ + public Optional stopConsolidationDataSource() { + return Optional + .ofNullable(buildConfig.stopConsolidationFile) + .map(fileName -> { + var f = baseDirectory.toPath().resolve(fileName).toFile(); + return new FileDataSource(f, FileType.CONFIG); + }); + } + /** * Match the URI provided in the configuration with the URI of a datasource, * either by comparing directly the two URIs or by first prepending the OTP base directory diff --git a/src/main/java/org/opentripplanner/graph_builder/issue/api/DataImportIssueSummary.java b/src/main/java/org/opentripplanner/graph_builder/issue/api/DataImportIssueSummary.java index cf5c3a51822..ba1e6610a30 100644 --- a/src/main/java/org/opentripplanner/graph_builder/issue/api/DataImportIssueSummary.java +++ b/src/main/java/org/opentripplanner/graph_builder/issue/api/DataImportIssueSummary.java @@ -19,7 +19,7 @@ public class DataImportIssueSummary implements Serializable { private static final Logger ISSUE_LOG = LoggerFactory.getLogger(ISSUES_LOG_NAME); - private Map summary; + private final Map summary; public DataImportIssueSummary(List issues) { this( diff --git a/src/main/java/org/opentripplanner/graph_builder/module/TimeZoneAdjusterModule.java b/src/main/java/org/opentripplanner/graph_builder/module/TimeZoneAdjusterModule.java index 59766ac092b..eb3674bf76a 100644 --- a/src/main/java/org/opentripplanner/graph_builder/module/TimeZoneAdjusterModule.java +++ b/src/main/java/org/opentripplanner/graph_builder/module/TimeZoneAdjusterModule.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.Map; import org.opentripplanner.graph_builder.model.GraphBuilderModule; -import org.opentripplanner.model.Timetable; import org.opentripplanner.transit.service.TransitModel; /** @@ -46,13 +45,9 @@ public void buildGraph() { return; } - final Timetable scheduledTimetable = pattern.getScheduledTimetable(); - - scheduledTimetable.getTripTimes().forEach(tripTimes -> tripTimes.timeShift(timeShift)); - - scheduledTimetable - .getFrequencyEntries() - .forEach(frequencyEntry -> frequencyEntry.tripTimes.timeShift(timeShift)); + pattern + .getScheduledTimetable() + .updateAllTripTimes(it -> it.adjustTimesToGraphTimeZone(timeShift)); }); } } diff --git a/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderFactory.java b/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderFactory.java index 0b2a46e165e..1f50c7a6327 100644 --- a/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderFactory.java +++ b/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderFactory.java @@ -10,6 +10,8 @@ import org.opentripplanner.ext.emissions.EmissionsDataModel; import org.opentripplanner.ext.emissions.EmissionsModule; import org.opentripplanner.ext.flex.AreaStopsToVerticesMapper; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationModule; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; import org.opentripplanner.ext.transferanalyzer.DirectTransferAnalyzer; import org.opentripplanner.graph_builder.GraphBuilder; import org.opentripplanner.graph_builder.GraphBuilderDataSources; @@ -56,6 +58,12 @@ public interface GraphBuilderFactory { DataImportIssueReporter dataImportIssueReporter(); CalculateWorldEnvelopeModule calculateWorldEnvelopeModule(); + @Nullable + StopConsolidationModule stopConsolidationModule(); + + @Nullable + StopConsolidationRepository stopConsolidationRepository(); + @Component.Builder interface Builder { @BindsInstance @@ -70,6 +78,11 @@ interface Builder { @BindsInstance Builder worldEnvelopeRepository(WorldEnvelopeRepository worldEnvelopeRepository); + @BindsInstance + Builder stopConsolidationRepository( + @Nullable StopConsolidationRepository stopConsolidationRepository + ); + @BindsInstance Builder dataSources(GraphBuilderDataSources graphBuilderDataSources); diff --git a/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderModules.java b/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderModules.java index 73bf7aad310..82f183a0bc4 100644 --- a/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderModules.java +++ b/src/main/java/org/opentripplanner/graph_builder/module/configure/GraphBuilderModules.java @@ -14,6 +14,8 @@ import org.opentripplanner.ext.dataoverlay.configure.DataOverlayFactory; import org.opentripplanner.ext.emissions.EmissionsDataModel; import org.opentripplanner.ext.emissions.EmissionsModule; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationModule; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; import org.opentripplanner.ext.transferanalyzer.DirectTransferAnalyzer; import org.opentripplanner.graph_builder.ConfiguredDataSource; import org.opentripplanner.graph_builder.GraphBuilderDataSources; @@ -277,10 +279,25 @@ static DataImportIssueReporter provideDataImportIssuesToHTML( } @Provides + @Singleton static DataImportIssueSummary providesDataImportIssueSummary(DataImportIssueStore issueStore) { return new DataImportIssueSummary(issueStore.listIssues()); } + @Provides + @Singleton + @Nullable + static StopConsolidationModule providesStopConsolidationModule( + TransitModel transitModel, + @Nullable StopConsolidationRepository repo, + GraphBuilderDataSources dataSources + ) { + return dataSources + .stopConsolidationDataSource() + .map(ds -> StopConsolidationModule.of(transitModel, repo, ds)) + .orElse(null); + } + /* private methods */ private static ElevationGridCoverageFactory createNedElevationFactory( diff --git a/src/main/java/org/opentripplanner/graph_builder/module/osm/OsmDatabase.java b/src/main/java/org/opentripplanner/graph_builder/module/osm/OsmDatabase.java index 6c52e780211..df40e2cb647 100644 --- a/src/main/java/org/opentripplanner/graph_builder/module/osm/OsmDatabase.java +++ b/src/main/java/org/opentripplanner/graph_builder/module/osm/OsmDatabase.java @@ -748,7 +748,7 @@ private void processMultipolygonRelations() { } else if (member.hasRoleOuter()) { outerWays.add(way); } else { - LOG.warn("Unexpected role {} in multipolygon", member.getRole()); + LOG.warn("Unexpected role '{}' in multipolygon", member.getRole()); } } processedAreas.add(relation); @@ -1044,8 +1044,8 @@ private void processRoute(OSMRelation relation) { *

* This goes through all public_transport=stop_area relations and adds the parent (either an area * or multipolygon relation) as the key and a Set of transit stop nodes that should be included in - * the parent area as the value into stopsInAreas. This improves TransitToTaggedStopsGraphBuilder - * by enabling us to have unconnected stop nodes within the areas by creating relations . + * the parent area as the value into stopsInAreas. This improves {@link org.opentripplanner.graph_builder.module.OsmBoardingLocationsModule} + * by enabling us to have unconnected stop nodes within the areas by creating relations. * * @author hannesj * @see "http://wiki.openstreetmap.org/wiki/Tag:public_transport%3Dstop_area" diff --git a/src/main/java/org/opentripplanner/gtfs/GenerateTripPatternsOperation.java b/src/main/java/org/opentripplanner/gtfs/GenerateTripPatternsOperation.java index 979876cf523..1cb3c4c0186 100644 --- a/src/main/java/org/opentripplanner/gtfs/GenerateTripPatternsOperation.java +++ b/src/main/java/org/opentripplanner/gtfs/GenerateTripPatternsOperation.java @@ -25,6 +25,7 @@ import org.opentripplanner.transit.model.timetable.FrequencyEntry; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,7 +42,7 @@ public class GenerateTripPatternsOperation { private final DataImportIssueStore issueStore; private final Deduplicator deduplicator; private final Set calendarServiceIds; - private GeometryProcessor geometryProcessor; + private final GeometryProcessor geometryProcessor; private final Multimap tripPatterns; private final ListMultimap frequenciesForTrip = ArrayListMultimap.create(); @@ -132,7 +133,7 @@ private void buildTripPatternForTrip(Trip trip) { TripPattern tripPattern = findOrCreateTripPattern(stopPattern, trip, direction); // Create a TripTimes object for this list of stoptimes, which form one trip. - TripTimes tripTimes = new TripTimes(trip, stopTimes, deduplicator); + TripTimes tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, deduplicator); // If this trip is referenced by one or more lines in frequencies.txt, wrap it in a FrequencyEntry. List frequencies = frequenciesForTrip.get(trip); diff --git a/src/main/java/org/opentripplanner/gtfs/graphbuilder/GtfsModule.java b/src/main/java/org/opentripplanner/gtfs/graphbuilder/GtfsModule.java index 59cb4fc3b09..a66b3f659bb 100644 --- a/src/main/java/org/opentripplanner/gtfs/graphbuilder/GtfsModule.java +++ b/src/main/java/org/opentripplanner/gtfs/graphbuilder/GtfsModule.java @@ -39,8 +39,8 @@ import org.opentripplanner.graph_builder.module.GtfsFeedId; import org.opentripplanner.graph_builder.module.ValidateAndInterpolateStopTimesForEachTrip; import org.opentripplanner.graph_builder.module.geometry.GeometryProcessor; -import org.opentripplanner.graph_builder.module.interlining.InterlineProcessor; import org.opentripplanner.gtfs.GenerateTripPatternsOperation; +import org.opentripplanner.gtfs.interlining.InterlineProcessor; import org.opentripplanner.gtfs.mapping.GTFSToOtpTransitServiceMapper; import org.opentripplanner.model.OtpTransitService; import org.opentripplanner.model.TripStopTimes; diff --git a/src/main/java/org/opentripplanner/graph_builder/module/interlining/InterlineProcessor.java b/src/main/java/org/opentripplanner/gtfs/interlining/InterlineProcessor.java similarity index 99% rename from src/main/java/org/opentripplanner/graph_builder/module/interlining/InterlineProcessor.java rename to src/main/java/org/opentripplanner/gtfs/interlining/InterlineProcessor.java index 25aaa8413b6..4247af4117e 100644 --- a/src/main/java/org/opentripplanner/graph_builder/module/interlining/InterlineProcessor.java +++ b/src/main/java/org/opentripplanner/gtfs/interlining/InterlineProcessor.java @@ -1,4 +1,4 @@ -package org.opentripplanner.graph_builder.module.interlining; +package org.opentripplanner.gtfs.interlining; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; diff --git a/src/main/java/org/opentripplanner/model/Timetable.java b/src/main/java/org/opentripplanner/model/Timetable.java index 2496fa11a41..170ed49092d 100644 --- a/src/main/java/org/opentripplanner/model/Timetable.java +++ b/src/main/java/org/opentripplanner/model/Timetable.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.function.UnaryOperator; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opentripplanner.framework.time.ServiceDateUtils; @@ -202,7 +203,7 @@ public Result createUpdatedTripTimesFromGTFSRT( LOG.trace("tripId {} found at index {} in timetable.", tripId, tripIndex); } - TripTimes newTimes = new TripTimes(getTripTimes(tripIndex)); + TripTimes newTimes = getTripTimes(tripIndex).copyOfScheduledTimes(); List skippedStopIndices = new ArrayList<>(); // The GTFS-RT reference specifies that StopTimeUpdates are sorted by stop_sequence. @@ -396,6 +397,25 @@ public void addTripTimes(TripTimes tt) { tripTimes.add(tt); } + /** + * Apply the same update to all trip-times inculuding scheduled and frequency based + * trip times. + *

+ * THIS IS NOT THREAD-SAFE - ONLY USE THIS METHOD DURING GRAPH-BUILD! + */ + public void updateAllTripTimes(UnaryOperator update) { + tripTimes.replaceAll(update); + frequencyEntries.replaceAll(it -> + new FrequencyEntry( + it.startTime, + it.endTime, + it.headway, + it.exactTimes, + update.apply(it.tripTimes) + ) + ); + } + /** * Add a frequency entry to this Timetable. See addTripTimes method. Maybe Frequency Entries * should just be TripTimes for simplicity. diff --git a/src/main/java/org/opentripplanner/model/plan/Itinerary.java b/src/main/java/org/opentripplanner/model/plan/Itinerary.java index 15cc9ea4baf..0c111999912 100644 --- a/src/main/java/org/opentripplanner/model/plan/Itinerary.java +++ b/src/main/java/org/opentripplanner/model/plan/Itinerary.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nullable; @@ -373,6 +374,27 @@ public List getLegs() { return legs; } + /** + * Applies the transformation in {@code mapper} to all instances of {@link TransitLeg} in the + * legs of this Itinerary. + *

+ * NOTE: The itinerary is mutable so the transformation is done in-place! + */ + public Itinerary transformTransitLegs(Function mapper) { + legs = + legs + .stream() + .map(l -> { + if (l instanceof TransitLeg tl) { + return mapper.apply(tl); + } else { + return l; + } + }) + .toList(); + return this; + } + public Stream getStreetLegs() { return legs.stream().filter(StreetLeg.class::isInstance).map(StreetLeg.class::cast); } diff --git a/src/main/java/org/opentripplanner/model/plan/Place.java b/src/main/java/org/opentripplanner/model/plan/Place.java index f20bb2a0cb9..6f39dcad3d1 100644 --- a/src/main/java/org/opentripplanner/model/plan/Place.java +++ b/src/main/java/org/opentripplanner/model/plan/Place.java @@ -90,7 +90,11 @@ public static Place normal(Vertex vertex, I18NString name) { } public static Place forStop(StopLocation stop) { - return new Place(stop.getName(), stop.getCoordinate(), VertexType.TRANSIT, stop, null, null); + return forStop(stop, stop.getName()); + } + + public static Place forStop(StopLocation stop, I18NString nameOverride) { + return new Place(nameOverride, stop.getCoordinate(), VertexType.TRANSIT, stop, null, null); } public static Place forFlexStop(StopLocation stop, Vertex vertex) { diff --git a/src/main/java/org/opentripplanner/model/plan/ScheduledTransitLeg.java b/src/main/java/org/opentripplanner/model/plan/ScheduledTransitLeg.java index b912c646ed3..876567035dd 100644 --- a/src/main/java/org/opentripplanner/model/plan/ScheduledTransitLeg.java +++ b/src/main/java/org/opentripplanner/model/plan/ScheduledTransitLeg.java @@ -65,7 +65,7 @@ public class ScheduledTransitLeg implements TransitLeg { private final Float accessibilityScore; private List fareProducts = List.of(); - ScheduledTransitLeg(ScheduledTransitLegBuilder builder) { + protected ScheduledTransitLeg(ScheduledTransitLegBuilder builder) { this.tripTimes = builder.tripTimes(); this.tripPattern = builder.tripPattern(); @@ -389,6 +389,9 @@ public ScheduledTransitLeg withAccessibilityScore(Float score) { /** * Should be used for debug logging only + *

+ * The {@code legGeometry} and {@code transitAlerts} are skipped to avoid + * spamming logs. Explicit access should be used if needed. */ @Override public String toString() { @@ -407,8 +410,7 @@ public String toString() { .addObjOp("tripId", getTrip(), AbstractTransitEntity::getId) .addObj("headsign", getHeadsign()) .addObj("serviceDate", serviceDate) - .addObj("legGeometry", legGeometry) - .addCol("transitAlerts", transitAlerts) + .addColSize("transitAlerts", transitAlerts) .addEnum("boardRule", getBoardRule()) .addEnum("alightRule", getAlightRule()) .addObj("transferFromPrevLeg", transferFromPrevLeg) diff --git a/src/main/java/org/opentripplanner/model/plan/StreetLeg.java b/src/main/java/org/opentripplanner/model/plan/StreetLeg.java index ea9283b7c05..319c9e01f69 100644 --- a/src/main/java/org/opentripplanner/model/plan/StreetLeg.java +++ b/src/main/java/org/opentripplanner/model/plan/StreetLeg.java @@ -180,7 +180,10 @@ public StreetLeg withAccessibilityScore(float accessibilityScore) { } /** - * Should be used for debug logging only + * Should be used for debug logging only. + *

+ * The {@code legGeometry}, {@code elevationProfile}, and {@code walkSteps} are skipped to avoid + * spamming logs. Explicit access should be used if needed. */ @Override public String toString() { @@ -193,9 +196,6 @@ public String toString() { .addEnum("mode", mode) .addNum("distance", distanceMeters, "m") .addNum("cost", generalizedCost) - .addObj("legGeometry", legGeometry) - .addObj("legElevation", elevationProfile) - .addCol("walkSteps", walkSteps) .addCol("streetNotes", streetNotes) .addBool("walkingBike", walkingBike) .addBool("rentedVehicle", rentedVehicle) diff --git a/src/main/java/org/opentripplanner/model/plan/pagecursor/ItineraryPageCut.java b/src/main/java/org/opentripplanner/model/plan/pagecursor/ItineraryPageCut.java new file mode 100644 index 00000000000..53958837dd8 --- /dev/null +++ b/src/main/java/org/opentripplanner/model/plan/pagecursor/ItineraryPageCut.java @@ -0,0 +1,108 @@ +package org.opentripplanner.model.plan.pagecursor; + +import java.time.Instant; +import org.opentripplanner.framework.tostring.ToStringBuilder; +import org.opentripplanner.model.plan.ItinerarySortKey; +import org.opentripplanner.model.plan.SortOrder; +import org.opentripplanner.routing.algorithm.raptoradapter.transit.cost.DefaultCostCalculator; + +/** + * This class contains all the information needed to dedupe itineraries when + * paging. + *

+ * It implements the ItinerarySortKey interface so that it can be sorted with itineraries which + * potentially contain duplicates. + */ +public record ItineraryPageCut( + Instant windowStart, + Instant windowEnd, + SortOrder sortOrder, + PagingDeduplicationSection deduplicationSection, + Instant arrivalTimeThreshold, + Instant departureTimeThreshold, + int generalizedCostThreshold, + int numOfTransfersThreshold, + boolean onStreetAllTheWayThreshold +) + implements ItinerarySortKey { + @Override + public String toString() { + return ToStringBuilder + .of(ItineraryPageCut.class) + .addDateTime("windowStart", windowStart) + .addDateTime("windowEnd", windowEnd) + .addEnum("sortOrder", sortOrder) + .addEnum("deduplicationSection", deduplicationSection) + .addBool("isOnStreetAllTheWayThreshold", onStreetAllTheWayThreshold) + .addDateTime("arrivalTimeThreshold", arrivalTimeThreshold) + .addCost( + "generalizedCostThreshold", + generalizedCostThreshold, + DefaultCostCalculator.ZERO_COST + ) + .addNum("numOfTransfersThreshold", numOfTransfersThreshold) + .addDateTime("departureTimeThreshold", departureTimeThreshold) + .toString(); + } + + @Override + public Instant startTimeAsInstant() { + return departureTimeThreshold(); + } + + @Override + public Instant endTimeAsInstant() { + return arrivalTimeThreshold(); + } + + @Override + public int getGeneralizedCost() { + return generalizedCostThreshold(); + } + + @Override + public int getNumberOfTransfers() { + return numOfTransfersThreshold(); + } + + @Override + public boolean isOnStreetAllTheWay() { + return isOnStreetAllTheWayThreshold(); + } + + public Instant windowStart() { + return windowStart; + } + + public Instant windowEnd() { + return windowEnd; + } + + public PagingDeduplicationSection deduplicationSection() { + return deduplicationSection; + } + + public SortOrder sortOrder() { + return sortOrder; + } + + public boolean isOnStreetAllTheWayThreshold() { + return onStreetAllTheWayThreshold; + } + + public Instant arrivalTimeThreshold() { + return arrivalTimeThreshold; + } + + public int generalizedCostThreshold() { + return generalizedCostThreshold; + } + + public int numOfTransfersThreshold() { + return numOfTransfersThreshold; + } + + public Instant departureTimeThreshold() { + return departureTimeThreshold; + } +} diff --git a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursor.java b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursor.java index 2a716880ea7..e0c1e30c64d 100644 --- a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursor.java +++ b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursor.java @@ -24,6 +24,8 @@ public class PageCursor { public final Instant latestArrivalTime; public final Duration searchWindow; + public ItineraryPageCut itineraryPageCut; + PageCursor( PageType type, SortOrder originalSortOrder, @@ -38,6 +40,20 @@ public class PageCursor { this.originalSortOrder = originalSortOrder; } + public PageCursor withItineraryPageCut(ItineraryPageCut itineraryPageCut) { + this.itineraryPageCut = itineraryPageCut; + return this; + } + + public boolean containsItineraryPageCut() { + return itineraryPageCut != null; + } + + @Nullable + public String encode() { + return PageCursorSerializer.encode(this); + } + @Nullable public static PageCursor decode(String cursor) { return PageCursorSerializer.decode(cursor); @@ -52,11 +68,7 @@ public String toString() { .addDateTime("edt", earliestDepartureTime) .addDateTime("lat", latestArrivalTime) .addDuration("searchWindow", searchWindow) + .addObj("itineraryPageCut", itineraryPageCut) .toString(); } - - @Nullable - public String encode() { - return PageCursorSerializer.encode(this); - } } diff --git a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactory.java b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactory.java index bc336ee34d6..a6073a540b5 100644 --- a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactory.java +++ b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactory.java @@ -18,7 +18,8 @@ public class PageCursorFactory { private SearchTime current = null; private Duration currentSearchWindow = null; private boolean wholeSwUsed = true; - private PageCursorFactoryParameters pageCursorFactoryParams = null; + private ItineraryPageCut itineraryPageCut = null; + private PageCursorInput pageCursorInput = null; private PageCursor nextCursor = null; private PageCursor prevCursor = null; @@ -50,15 +51,26 @@ public PageCursorFactory withOriginalSearch( * If there were itineraries removed in the current search because the numItineraries parameter * was used, then we want to allow the caller to move within some of the itineraries that were * removed in the next and previous pages. This means we will use information from when we cropped - * the list of itineraries to create the new search encoded in the page cursors. + * the list of itineraries to create the new search encoded in the page cursors. We will also add + * information necessary for removing potential duplicates when paging. * - * @param pageCursorFactoryParams the result from the {@code NumItinerariesFilter} + * @param pageCursorFactoryParams contains the result from the {@code PagingDuplicateFilter} */ - public PageCursorFactory withRemovedItineraries( - PageCursorFactoryParameters pageCursorFactoryParams - ) { + public PageCursorFactory withRemovedItineraries(PageCursorInput pageCursorFactoryParams) { this.wholeSwUsed = false; - this.pageCursorFactoryParams = pageCursorFactoryParams; + this.pageCursorInput = pageCursorFactoryParams; + this.itineraryPageCut = + new ItineraryPageCut( + pageCursorFactoryParams.earliestRemovedDeparture().truncatedTo(ChronoUnit.SECONDS), + current.edt.plus(currentSearchWindow), + sortOrder, + pageCursorFactoryParams.deduplicationSection(), + pageCursorFactoryParams.firstRemovedArrivalTime(), + pageCursorFactoryParams.firstRemovedDepartureTime(), + pageCursorFactoryParams.firstRemovedGeneralizedCost(), + pageCursorFactoryParams.firstRemovedNumOfTransfers(), + pageCursorFactoryParams.firstRemovedIsOnStreetAllTheWay() + ); return this; } @@ -84,7 +96,7 @@ public String toString() { .addDuration("currentSearchWindow", currentSearchWindow) .addDuration("newSearchWindow", newSearchWindow) .addBoolIfTrue("searchWindowCropped", !wholeSwUsed) - .addObj("pageCursorFactoryParams", pageCursorFactoryParams) + .addObj("pageCursorFactoryParams", pageCursorInput) .addObj("nextCursor", nextCursor) .addObj("prevCursor", prevCursor) .toString(); @@ -117,9 +129,9 @@ private void createPageCursors() { } else { // If the whole search window was not used (i.e. if there were removed itineraries) if (currentPageType == NEXT_PAGE) { prev.edt = edtBeforeNewSw(); - next.edt = pageCursorFactoryParams.earliestRemovedDeparture(); + next.edt = pageCursorInput.earliestRemovedDeparture(); if (sortOrder.isSortedByArrivalTimeAscending()) { - prev.lat = pageCursorFactoryParams.earliestKeptArrival().truncatedTo(ChronoUnit.MINUTES); + prev.lat = pageCursorInput.earliestKeptArrival().truncatedTo(ChronoUnit.MINUTES); } else { prev.lat = current.lat; } @@ -127,14 +139,18 @@ private void createPageCursors() { // The search-window start and end is [inclusive, exclusive], so to calculate the start of the // search-window from the last time included in the search window we need to include one extra // minute at the end. - prev.edt = - pageCursorFactoryParams.latestRemovedDeparture().minus(newSearchWindow).plusSeconds(60); + prev.edt = pageCursorInput.latestRemovedDeparture().minus(newSearchWindow).plusSeconds(60); next.edt = edtAfterUsedSw(); - prev.lat = pageCursorFactoryParams.latestRemovedArrival(); + prev.lat = pageCursorInput.latestRemovedArrival(); } } prevCursor = new PageCursor(PREVIOUS_PAGE, sortOrder, prev.edt, prev.lat, newSearchWindow); nextCursor = new PageCursor(NEXT_PAGE, sortOrder, next.edt, next.lat, newSearchWindow); + + if (itineraryPageCut != null) { + nextCursor = nextCursor.withItineraryPageCut(itineraryPageCut); + prevCursor = prevCursor.withItineraryPageCut(itineraryPageCut); + } } private Instant edtBeforeNewSw() { diff --git a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactoryParameters.java b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorInput.java similarity index 67% rename from src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactoryParameters.java rename to src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorInput.java index f8e01ce5ce9..58cd6c7e24b 100644 --- a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactoryParameters.java +++ b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorInput.java @@ -9,12 +9,15 @@ * The Instant fields come from the sets of itineraries that were removed and the ones that were * kept as a result of using the numItineraries parameter. */ -public interface PageCursorFactoryParameters { +public interface PageCursorInput { Instant earliestRemovedDeparture(); - Instant earliestKeptArrival(); - Instant latestRemovedDeparture(); - Instant latestRemovedArrival(); + Instant firstRemovedArrivalTime(); + boolean firstRemovedIsOnStreetAllTheWay(); + int firstRemovedGeneralizedCost(); + int firstRemovedNumOfTransfers(); + Instant firstRemovedDepartureTime(); + PagingDeduplicationSection deduplicationSection(); } diff --git a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorSerializer.java b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorSerializer.java index b3a25182678..b01f07892ac 100644 --- a/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorSerializer.java +++ b/src/main/java/org/opentripplanner/model/plan/pagecursor/PageCursorSerializer.java @@ -41,6 +41,17 @@ public static String encode(PageCursor cursor) { writeTime(cursor.latestArrivalTime, out); writeDuration(cursor.searchWindow, out); writeEnum(cursor.originalSortOrder, out); + + if (cursor.containsItineraryPageCut()) { + writeTime(cursor.itineraryPageCut.windowStart(), out); + writeTime(cursor.itineraryPageCut.windowEnd(), out); + writeEnum(cursor.itineraryPageCut.deduplicationSection(), out); + writeBoolean(cursor.itineraryPageCut.isOnStreetAllTheWayThreshold(), out); + writeTime(cursor.itineraryPageCut.arrivalTimeThreshold(), out); + writeInt(cursor.itineraryPageCut.generalizedCostThreshold(), out); + writeInt(cursor.itineraryPageCut.numOfTransfersThreshold(), out); + writeTime(cursor.itineraryPageCut.departureTimeThreshold(), out); + } out.flush(); return Base64.getUrlEncoder().encodeToString(buf.toByteArray()); } catch (IOException e) { @@ -70,6 +81,31 @@ public static PageCursor decode(String cursor) { var searchWindow = readDuration(in); var originalSortOrder = readEnum(in, SortOrder.class); + if (in.available() > 0) { + var dedupeWindowStart = readTime(in); + var dedupeWindowEnd = readTime(in); + var cropSection = readEnum(in, PagingDeduplicationSection.class); + var isOnStreetAllTheWayThreshold = readBoolean(in); + var arrivalTimeDeletionThreshold = readTime(in); + var generalizedCostDeletionThreshold = readInt(in); + var numOfTransfersDeletionThreshold = readInt(in); + var departureTimeDeletionThreshold = readTime(in); + + ItineraryPageCut itineraryPageCut = new ItineraryPageCut( + dedupeWindowStart, + dedupeWindowEnd, + originalSortOrder, + cropSection, + arrivalTimeDeletionThreshold, + departureTimeDeletionThreshold, + generalizedCostDeletionThreshold, + numOfTransfersDeletionThreshold, + isOnStreetAllTheWayThreshold + ); + return new PageCursor(type, originalSortOrder, edt, lat, searchWindow) + .withItineraryPageCut(itineraryPageCut); + } + return new PageCursor(type, originalSortOrder, edt, lat, searchWindow); } catch (Exception e) { String details = e.getMessage(); @@ -90,6 +126,22 @@ private static byte readByte(ObjectInputStream in) throws IOException { return in.readByte(); } + private static void writeInt(int value, ObjectOutputStream out) throws IOException { + out.writeInt(value); + } + + private static int readInt(ObjectInputStream in) throws IOException { + return in.readInt(); + } + + private static void writeBoolean(boolean value, ObjectOutputStream out) throws IOException { + out.writeBoolean(value); + } + + private static boolean readBoolean(ObjectInputStream in) throws IOException { + return in.readBoolean(); + } + private static void writeTime(Instant time, ObjectOutputStream out) throws IOException { out.writeInt(time == null ? NOT_SET : (int) (time.getEpochSecond() - TIME_ZERO)); } diff --git a/src/main/java/org/opentripplanner/model/plan/pagecursor/PagingDeduplicationSection.java b/src/main/java/org/opentripplanner/model/plan/pagecursor/PagingDeduplicationSection.java new file mode 100644 index 00000000000..0a469fdc6be --- /dev/null +++ b/src/main/java/org/opentripplanner/model/plan/pagecursor/PagingDeduplicationSection.java @@ -0,0 +1,12 @@ +package org.opentripplanner.model.plan.pagecursor; + +/** + * The PagingDeduplicationSection enum is used to signal which part of an itinerary list may contain + * duplicates. When paging it is the opposite of the CropSection defined in ListSection. That is, if + * the list of itineraries was cropped at the bottom, then any duplicates will appear at the top of + * the list and vice versa. + */ +public enum PagingDeduplicationSection { + HEAD, + TAIL, +} diff --git a/src/main/java/org/opentripplanner/netex/mapping/FlexStopsMapper.java b/src/main/java/org/opentripplanner/netex/mapping/FlexStopsMapper.java index c764083bdb8..1e6eb1979bb 100644 --- a/src/main/java/org/opentripplanner/netex/mapping/FlexStopsMapper.java +++ b/src/main/java/org/opentripplanner/netex/mapping/FlexStopsMapper.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; +import javax.annotation.Nullable; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; import org.opentripplanner.framework.geometry.HashGridSpatialIndex; @@ -11,6 +11,7 @@ import org.opentripplanner.graph_builder.issue.api.DataImportIssueStore; import org.opentripplanner.graph_builder.issue.api.Issue; import org.opentripplanner.netex.mapping.support.FeedScopedIdFactory; +import org.opentripplanner.transit.model.basic.TransitMode; import org.opentripplanner.transit.model.site.AreaStop; import org.opentripplanner.transit.model.site.RegularStop; import org.opentripplanner.transit.model.site.StopLocation; @@ -35,6 +36,7 @@ class FlexStopsMapper { private final HashGridSpatialIndex stopsSpatialIndex; private final StopModelBuilder stopModelBuilder; private final DataImportIssueStore issueStore; + private final TransportModeMapper transportModeMapper = new TransportModeMapper(); FlexStopsMapper( FeedScopedIdFactory idFactory, @@ -58,7 +60,7 @@ class FlexStopsMapper { */ StopLocation map(FlexibleStopPlace flexibleStopPlace) { List stops = new ArrayList<>(); - + TransitMode flexibleStopTransitMode = mapTransitMode(flexibleStopPlace); var areas = flexibleStopPlace.getAreas().getFlexibleAreaOrFlexibleAreaRefOrHailAndRideArea(); for (var area : areas) { if (!(area instanceof FlexibleArea flexibleArea)) { @@ -76,7 +78,9 @@ StopLocation map(FlexibleStopPlace flexibleStopPlace) { Geometry flexibleAreaGeometry = mapGeometry(flexibleArea); if (shouldAddStopsFromArea(flexibleArea, flexibleStopPlace)) { - stops.addAll(findStopsInFlexArea(flexibleArea, flexibleAreaGeometry)); + stops.addAll( + findStopsInFlexArea(flexibleArea, flexibleAreaGeometry, flexibleStopTransitMode) + ); } else { AreaStop areaStop = mapFlexArea( flexibleArea, @@ -119,17 +123,23 @@ AreaStop mapFlexArea(FlexibleArea area, Geometry geometry, String backupName) { } /** - * Allows pickup / drop off at any regular Stop inside the area + * Allows pickup / drop off at all regular stops inside the area that match the transit mode of the + * flexible stop place. */ - List findStopsInFlexArea(FlexibleArea area, Geometry geometry) { - if (geometry == null) { + List findStopsInFlexArea( + FlexibleArea area, + @Nullable Geometry geometry, + @Nullable TransitMode flexibleStopTransitMode + ) { + if (geometry == null || flexibleStopTransitMode == null) { return List.of(); } List stops = stopsSpatialIndex .query(geometry.getEnvelopeInternal()) .stream() + .filter(stop -> flexibleStopTransitMode == stop.getGtfsVehicleType()) .filter(stop -> geometry.contains(stop.getGeometry())) - .collect(Collectors.toList()); + .toList(); if (stops.isEmpty()) { issueStore.add( @@ -160,6 +170,17 @@ private Geometry mapGeometry(FlexibleArea area) { } } + @Nullable + private TransitMode mapTransitMode(FlexibleStopPlace flexibleStopPlace) { + try { + return transportModeMapper.mapAllVehicleModesOfTransport( + flexibleStopPlace.getTransportMode() + ); + } catch (TransportModeMapper.UnsupportedModeException e) { + return null; + } + } + private boolean shouldAddStopsFromArea(FlexibleArea flexibleArea, FlexibleStopPlace parentStop) { var flexibleAreaType = getFlexibleStopAreaType(flexibleArea.getKeyList()); var parentStopType = getFlexibleStopAreaType(parentStop.getKeyList()); diff --git a/src/main/java/org/opentripplanner/netex/mapping/TransportModeMapper.java b/src/main/java/org/opentripplanner/netex/mapping/TransportModeMapper.java index 7bf7ea85b98..82a5f99c9c7 100644 --- a/src/main/java/org/opentripplanner/netex/mapping/TransportModeMapper.java +++ b/src/main/java/org/opentripplanner/netex/mapping/TransportModeMapper.java @@ -24,7 +24,7 @@ public NetexMainAndSubMode map( } } - private TransitMode mapAllVehicleModesOfTransport(AllVehicleModesOfTransportEnumeration mode) + public TransitMode mapAllVehicleModesOfTransport(AllVehicleModesOfTransportEnumeration mode) throws UnsupportedModeException { if (mode == null) { throw new UnsupportedModeException(null); diff --git a/src/main/java/org/opentripplanner/netex/mapping/TripPatternMapper.java b/src/main/java/org/opentripplanner/netex/mapping/TripPatternMapper.java index 0133e0fdda2..675b9eab5c9 100644 --- a/src/main/java/org/opentripplanner/netex/mapping/TripPatternMapper.java +++ b/src/main/java/org/opentripplanner/netex/mapping/TripPatternMapper.java @@ -30,6 +30,7 @@ import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripOnServiceDate; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.rutebanken.netex.model.DatedServiceJourney; import org.rutebanken.netex.model.DatedServiceJourneyRefStructure; import org.rutebanken.netex.model.DestinationDisplay; @@ -366,7 +367,11 @@ private void createTripTimes(List trips, TripPattern tripPattern) { trip.getId() ); } else { - TripTimes tripTimes = new TripTimes(trip, result.tripStopTimes.get(trip), deduplicator); + TripTimes tripTimes = TripTimesFactory.tripTimes( + trip, + result.tripStopTimes.get(trip), + deduplicator + ); tripPattern.add(tripTimes); } } diff --git a/src/main/java/org/opentripplanner/openstreetmap/model/OSMWithTags.java b/src/main/java/org/opentripplanner/openstreetmap/model/OSMWithTags.java index 04815d8820b..6e596e52076 100644 --- a/src/main/java/org/opentripplanner/openstreetmap/model/OSMWithTags.java +++ b/src/main/java/org/opentripplanner/openstreetmap/model/OSMWithTags.java @@ -444,7 +444,7 @@ public boolean isParkAndRide() { * This intentionally excludes railway=stop and public_transport=stop because these are supposed * to be placed on the tracks not on the platform. * - * @return whether the node is a transit stop + * @return whether the node is a place used to board a public transport vehicle */ public boolean isBoardingLocation() { return ( @@ -588,6 +588,7 @@ private boolean isTagDeniedAccess(String tagName) { * Returns level tag (i.e. building floor) or layer tag values, defaults to "0" * Some entities can have a semicolon separated list of levels (e.g. elevators) */ + @Nonnull public Set getLevels() { var levels = getMultiTagValues(LEVEL_TAGS); if (levels.isEmpty()) { diff --git a/src/main/java/org/opentripplanner/raptor/RaptorService.java b/src/main/java/org/opentripplanner/raptor/RaptorService.java index 837ea3667df..450f993de1c 100644 --- a/src/main/java/org/opentripplanner/raptor/RaptorService.java +++ b/src/main/java/org/opentripplanner/raptor/RaptorService.java @@ -31,7 +31,7 @@ public RaptorResponse route( RaptorRequest request, RaptorTransitDataProvider transitData ) { - LOG.debug("Original request: {}", request); + logRequest(request); RaptorResponse response; if (request.isDynamicSearch()) { @@ -39,14 +39,7 @@ public RaptorResponse route( } else { response = routeUsingStdWorker(transitData, request); } - if (LOG.isDebugEnabled()) { - var pathsAsText = response - .paths() - .stream() - .map(p -> "\t\n" + p.toString(transitData.stopNameResolver())) - .collect(Collectors.joining()); - LOG.debug("Result: {}", pathsAsText); - } + logResponse(transitData, response); return response; } @@ -80,4 +73,22 @@ private RaptorResponse routeUsingStdWorker( var arrivals = new DefaultStopArrivals(result); return new RaptorResponse<>(result.extractPaths(), arrivals, request, request); } + + private static void logRequest(RaptorRequest request) { + LOG.debug("Original request: {}", request); + } + + private static void logResponse( + RaptorTransitDataProvider transitData, + RaptorResponse response + ) { + if (LOG.isDebugEnabled()) { + var pathsAsText = response + .paths() + .stream() + .map(p -> "\t\n" + p.toString(transitData.stopNameResolver())) + .collect(Collectors.joining()); + LOG.debug("Result: {}", pathsAsText); + } + } } diff --git a/src/main/java/org/opentripplanner/raptor/api/model/RaptorAccessEgress.java b/src/main/java/org/opentripplanner/raptor/api/model/RaptorAccessEgress.java index 59033de3d7e..1953c60d5d6 100644 --- a/src/main/java/org/opentripplanner/raptor/api/model/RaptorAccessEgress.java +++ b/src/main/java/org/opentripplanner/raptor/api/model/RaptorAccessEgress.java @@ -183,7 +183,12 @@ default boolean isFree() { return durationInSeconds() == 0; } - /** Call this from toString */ + /** Call this from toString or {@link #asString(boolean, boolean, String)}*/ + default String defaultToString() { + return asString(true, true, null); + } + + /** Call this from toString or {@link #defaultToString()} */ default String asString(boolean includeStop, boolean includeCost, @Nullable String summary) { StringBuilder buf = new StringBuilder(); if (isFree()) { diff --git a/src/main/java/org/opentripplanner/raptor/api/request/SearchParams.java b/src/main/java/org/opentripplanner/raptor/api/request/SearchParams.java index e009897557c..28651104f9d 100644 --- a/src/main/java/org/opentripplanner/raptor/api/request/SearchParams.java +++ b/src/main/java/org/opentripplanner/raptor/api/request/SearchParams.java @@ -285,11 +285,11 @@ public String toString() { .of(SearchParams.class) .addServiceTime("earliestDepartureTime", earliestDepartureTime, RaptorConstants.TIME_NOT_SET) .addServiceTime("latestArrivalTime", latestArrivalTime, RaptorConstants.TIME_NOT_SET) - .addDurationSec("searchWindow", searchWindowInSeconds) + .addDurationSec("searchWindow", searchWindowInSeconds, RaptorConstants.NOT_SET) .addBoolIfTrue("departAsLateAsPossible", preferLateArrival) - .addNum("numberOfAdditionalTransfers", numberOfAdditionalTransfers) - .addCollection("accessPaths", accessPaths, 5) - .addCollection("egressPaths", egressPaths, 5) + .addNum("numberOfAdditionalTransfers", numberOfAdditionalTransfers, RaptorConstants.NOT_SET) + .addCollection("accessPaths", accessPaths, 5, RaptorAccessEgress::defaultToString) + .addCollection("egressPaths", egressPaths, 5, RaptorAccessEgress::defaultToString) .toString(); } diff --git a/src/main/java/org/opentripplanner/raptor/rangeraptor/standard/MinTravelDurationRoutingStrategy.java b/src/main/java/org/opentripplanner/raptor/rangeraptor/standard/MinTravelDurationRoutingStrategy.java index 26a7708506f..0e18729b97e 100644 --- a/src/main/java/org/opentripplanner/raptor/rangeraptor/standard/MinTravelDurationRoutingStrategy.java +++ b/src/main/java/org/opentripplanner/raptor/rangeraptor/standard/MinTravelDurationRoutingStrategy.java @@ -2,6 +2,7 @@ import static org.opentripplanner.raptor.spi.RaptorTripScheduleSearch.UNBOUNDED_TRIP_INDEX; +import org.opentripplanner.framework.time.TimeUtils; import org.opentripplanner.raptor.api.model.RaptorAccessEgress; import org.opentripplanner.raptor.api.model.RaptorTripSchedule; import org.opentripplanner.raptor.rangeraptor.internalapi.RoutingStrategy; @@ -182,10 +183,10 @@ private void logInvalidAlightTime(int stopPos, int stopArrivalTime) { if (logCount < 3) { ++logCount; LOG.error( - "Traveling back in time is not allowed. Board stop pos: {}, alight stop pos: {}, stop arrival time: {}, trip: {}.", - onTrip.findDepartureStopPosition(onTripBoardTime, onTripBoardStop), + "Traveling back in time is not allowed. Board time: {}, alight stop pos: {}, stop arrival time: {}, trip: {}.", + TimeUtils.timeToStrLong(onTripBoardTime), stopPos, - stopArrivalTime, + TimeUtils.timeToStrLong(stopArrivalTime), onTrip ); } diff --git a/src/main/java/org/opentripplanner/routing/algorithm/filterchain/ItineraryListFilterChainBuilder.java b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/ItineraryListFilterChainBuilder.java index a4b2ecfe20c..1c5583ce0bd 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/filterchain/ItineraryListFilterChainBuilder.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/ItineraryListFilterChainBuilder.java @@ -12,10 +12,10 @@ import java.util.function.Function; import javax.annotation.Nullable; import org.opentripplanner.ext.accessibilityscore.AccessibilityScoreFilter; -import org.opentripplanner.ext.fares.FaresFilter; import org.opentripplanner.framework.lang.Sandbox; import org.opentripplanner.model.plan.Itinerary; import org.opentripplanner.model.plan.SortOrder; +import org.opentripplanner.model.plan.pagecursor.ItineraryPageCut; import org.opentripplanner.routing.algorithm.filterchain.api.TransitGeneralizedCostFilterParams; import org.opentripplanner.routing.algorithm.filterchain.comparator.SortOrderComparator; import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.MaxLimitFilter; @@ -24,6 +24,7 @@ import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.NumItinerariesFilterResults; import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.OtherThanSameLegsMaxGeneralizedCostFilter; import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.OutsideSearchWindowFilter; +import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.PagingFilter; import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.RemoveBikerentalWithMostlyWalkingFilter; import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.RemoveItinerariesWithShortStreetLeg; import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.RemoveParkAndRideWithMostlyWalkingFilter; @@ -42,7 +43,6 @@ import org.opentripplanner.routing.algorithm.filterchain.groupids.GroupBySameRoutesAndStops; import org.opentripplanner.routing.api.request.framework.CostLinearFunction; import org.opentripplanner.routing.api.request.preference.ItineraryFilterDebugProfile; -import org.opentripplanner.routing.fares.FareService; import org.opentripplanner.routing.services.TransitAlertService; import org.opentripplanner.street.search.TraverseMode; import org.opentripplanner.transit.model.site.MultiModalStation; @@ -54,8 +54,6 @@ public class ItineraryListFilterChainBuilder { private static final int NOT_SET = -1; - public static final String MAX_NUMBER_OF_ITINERARIES_TAG = "number-of-itineraries-filter"; - private final SortOrder sortOrder; private final List groupBySimilarity = new ArrayList<>(); @@ -74,19 +72,29 @@ public class ItineraryListFilterChainBuilder { private Duration searchWindow = null; private boolean accessibilityScore; private double wheelchairMaxSlope; - private FareService faresService; private TransitAlertService transitAlertService; private Function getMultiModalStation; private boolean removeItinerariesWithSameRoutesAndStops; private double minBikeParkingDistance; private boolean removeTransitIfWalkingIsBetter = true; + private ItineraryPageCut itineraryPageCut; + + /** + * Sandbox filters which decorate the itineraries with extra information. + */ @Sandbox private ItineraryListFilter emissionsFilter; + @Sandbox + private ItineraryListFilter faresFilter; + @Sandbox private ItineraryListFilter rideHailingFilter; + @Sandbox + private ItineraryListFilter stopConsolidationFilter; + public ItineraryListFilterChainBuilder(SortOrder sortOrder) { this.sortOrder = sortOrder; } @@ -264,6 +272,19 @@ public ItineraryListFilterChainBuilder withNumItinerariesFilterResultsConsumer( return this; } + /** + * If the search is done with a page cursor that contains encoded deduplication parameters, then + * this function adds the filter that removes duplicates. + * + * @param itineraryPageCut contains the parameters to use for deduplication. + */ + public ItineraryListFilterChainBuilder withPagingDeduplicationFilter( + ItineraryPageCut itineraryPageCut + ) { + this.itineraryPageCut = itineraryPageCut; + return this; + } + /** * If set, walk-all-the-way itineraries are removed. This happens AFTER e.g. the group-by and * remove-transit-with-higher-cost-than-best-on-street-only filter. This make sure that poor @@ -292,8 +313,8 @@ public ItineraryListFilterChainBuilder withAccessibilityScore( return this; } - public ItineraryListFilterChainBuilder withFares(FareService fareService) { - this.faresService = fareService; + public ItineraryListFilterChainBuilder withFaresFilter(ItineraryListFilter filter) { + this.faresFilter = filter; return this; } @@ -319,10 +340,20 @@ public ItineraryListFilterChainBuilder withRideHailingFilter(ItineraryListFilter return this; } - @SuppressWarnings("CollectionAddAllCanBeReplacedWithConstructor") + public ItineraryListFilterChainBuilder withStopConsolidationFilter( + @Nullable ItineraryListFilter filter + ) { + this.stopConsolidationFilter = filter; + return this; + } + public ItineraryListFilterChain build() { List filters = new ArrayList<>(); + if (itineraryPageCut != null) { + filters.add(new DeletionFlaggingFilter(new PagingFilter(itineraryPageCut))); + } + filters.addAll(buildGroupByTripIdAndDistanceFilters()); if (removeItinerariesWithSameRoutesAndStops) { @@ -344,12 +375,12 @@ public ItineraryListFilterChain build() { filters.add(new AccessibilityScoreFilter(wheelchairMaxSlope)); } - if (faresService != null) { - filters.add(new FaresFilter(faresService)); + if (faresFilter != null) { + filters.add(faresFilter); } - if (this.emissionsFilter != null) { - filters.add(this.emissionsFilter); + if (emissionsFilter != null) { + filters.add(emissionsFilter); } if (transitAlertService != null) { @@ -448,10 +479,20 @@ public ItineraryListFilterChain build() { // Do the final itineraries sort filters.add(new SortingFilter(SortOrderComparator.comparator(sortOrder))); + // Sandbox filters to decorate itineraries + + if (faresFilter != null) { + filters.add(faresFilter); + } + if (rideHailingFilter != null) { filters.add(rideHailingFilter); } + if (stopConsolidationFilter != null) { + filters.add(stopConsolidationFilter); + } + var debugHandler = new DeleteResultHandler(debug, maxNumberOfItineraries); return new ItineraryListFilterChain(filters, debugHandler); diff --git a/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilter.java b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilter.java index 374dd9f4d93..eb9874ad8ce 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilter.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilter.java @@ -13,6 +13,8 @@ */ public class NumItinerariesFilter implements ItineraryDeletionFlagger { + public static final String TAG = "number-of-itineraries-filter"; + private static final Consumer IGNORE_SUBSCRIBER = i -> {}; private final int maxLimit; @@ -34,7 +36,7 @@ public NumItinerariesFilter( @Override public String name() { - return "number-of-itineraries-filter"; + return TAG; } @Override diff --git a/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilterResults.java b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilterResults.java index 36bbfff7d69..e41ca954fe3 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilterResults.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/NumItinerariesFilterResults.java @@ -4,10 +4,11 @@ import java.util.List; import org.opentripplanner.framework.tostring.ToStringBuilder; import org.opentripplanner.model.plan.Itinerary; -import org.opentripplanner.model.plan.pagecursor.PageCursorFactoryParameters; +import org.opentripplanner.model.plan.pagecursor.PageCursorInput; +import org.opentripplanner.model.plan.pagecursor.PagingDeduplicationSection; import org.opentripplanner.routing.algorithm.filterchain.ListSection; -public class NumItinerariesFilterResults implements PageCursorFactoryParameters { +public class NumItinerariesFilterResults implements PageCursorInput { public final Instant earliestRemovedDeparture; public final Instant latestRemovedDeparture; @@ -15,6 +16,7 @@ public class NumItinerariesFilterResults implements PageCursorFactoryParameters public final Instant latestRemovedArrival; public final Instant earliestKeptArrival; public final Instant firstRemovedArrivalTime; + public final boolean firstRemovedIsOnStreetAllTheWay; public final int firstRemovedGeneralizedCost; public final int firstRemovedNumOfTransfers; public final Instant firstRemovedDepartureTime; @@ -59,6 +61,7 @@ public NumItinerariesFilterResults( firstRemovedItinerary = removedItineraries.get(0); } + this.firstRemovedIsOnStreetAllTheWay = firstRemovedItinerary.isOnStreetAllTheWay(); this.firstRemovedArrivalTime = firstRemovedItinerary.endTime().toInstant(); this.firstRemovedGeneralizedCost = firstRemovedItinerary.getGeneralizedCost(); this.firstRemovedNumOfTransfers = firstRemovedItinerary.getNumberOfTransfers(); @@ -103,4 +106,37 @@ public Instant latestRemovedDeparture() { public Instant latestRemovedArrival() { return latestRemovedArrival; } + + @Override + public Instant firstRemovedArrivalTime() { + return firstRemovedArrivalTime; + } + + @Override + public boolean firstRemovedIsOnStreetAllTheWay() { + return firstRemovedIsOnStreetAllTheWay; + } + + @Override + public int firstRemovedGeneralizedCost() { + return firstRemovedGeneralizedCost; + } + + @Override + public int firstRemovedNumOfTransfers() { + return firstRemovedNumOfTransfers; + } + + @Override + public Instant firstRemovedDepartureTime() { + return firstRemovedDepartureTime; + } + + @Override + public PagingDeduplicationSection deduplicationSection() { + return switch (cropSection) { + case HEAD -> PagingDeduplicationSection.TAIL; + case TAIL -> PagingDeduplicationSection.HEAD; + }; + } } diff --git a/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/PagingFilter.java b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/PagingFilter.java new file mode 100644 index 00000000000..f15e683d4f7 --- /dev/null +++ b/src/main/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/PagingFilter.java @@ -0,0 +1,58 @@ +package org.opentripplanner.routing.algorithm.filterchain.deletionflagger; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import org.opentripplanner.model.plan.Itinerary; +import org.opentripplanner.model.plan.ItinerarySortKey; +import org.opentripplanner.model.plan.pagecursor.ItineraryPageCut; +import org.opentripplanner.routing.algorithm.filterchain.comparator.SortOrderComparator; + +/** + * This class is used to enforce the cut/limit between two pages. It removes potential duplicates + * and keep missed itineraries. It uses information from the page cursor to determine which + * itineraries are potential duplicates and missed ones. + *

+ * Based on where the previous results were cropped the potential duplicates will appear either at + * the top of the list, or the bottom. If the previous results were cropped at the top, then the + * potential duplicates will appear at the bottom of the list. If the previous results were cropped + * at the bottom, then the potential duplicates will appear at the top of the list. + */ +public class PagingFilter implements ItineraryDeletionFlagger { + + public static final String TAG = "paging-filter"; + + private final ItineraryPageCut itineraryPageCut; + private final Comparator sortOrderComparator; + + public PagingFilter(ItineraryPageCut itineraryPageCut) { + this.itineraryPageCut = itineraryPageCut; + this.sortOrderComparator = SortOrderComparator.comparator(itineraryPageCut.sortOrder()); + } + + @Override + public String name() { + return TAG; + } + + private boolean sortsIntoDeduplicationAreaRelativeToRemovedItinerary(Itinerary itinerary) { + return switch (itineraryPageCut.deduplicationSection()) { + case HEAD -> sortOrderComparator.compare(itinerary, itineraryPageCut) < 0; + case TAIL -> sortOrderComparator.compare(itinerary, itineraryPageCut) > 0; + }; + } + + @Override + public List flagForRemoval(List itineraries) { + return itineraries + .stream() + .filter(it -> + ( + it.startTime().toInstant().isAfter(itineraryPageCut.windowStart()) && + it.startTime().toInstant().isBefore(itineraryPageCut.windowEnd()) && + sortsIntoDeduplicationAreaRelativeToRemovedItinerary(it) + ) + ) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/opentripplanner/routing/algorithm/mapping/RouteRequestToFilterChainMapper.java b/src/main/java/org/opentripplanner/routing/algorithm/mapping/RouteRequestToFilterChainMapper.java index cc24652f6f2..5c105f4804a 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/mapping/RouteRequestToFilterChainMapper.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/mapping/RouteRequestToFilterChainMapper.java @@ -4,9 +4,9 @@ import java.time.Instant; import java.util.List; import java.util.function.Consumer; -import org.opentripplanner.ext.emissions.EmissionsFilter; +import org.opentripplanner.ext.fares.FaresFilter; import org.opentripplanner.ext.ridehailing.RideHailingFilter; -import org.opentripplanner.framework.application.OTPFeature; +import org.opentripplanner.ext.stopconsolidation.ConsolidatedStopNameFilter; import org.opentripplanner.routing.algorithm.filterchain.GroupBySimilarity; import org.opentripplanner.routing.algorithm.filterchain.ItineraryListFilterChain; import org.opentripplanner.routing.algorithm.filterchain.ItineraryListFilterChainBuilder; @@ -40,6 +40,11 @@ public static ItineraryListFilterChain createFilterChain( return builder.build(); } + // The page cursor has deduplication information only in certain cases. + if (request.pageCursor() != null && request.pageCursor().containsItineraryPageCut()) { + builder = builder.withPagingDeduplicationFilter(request.pageCursor().itineraryPageCut); + } + ItineraryFilterPreferences params = request.preferences().itineraryFilter(); // Group by similar legs filter if (params.groupSimilarityKeepOne() >= 0.5) { @@ -77,7 +82,6 @@ public static ItineraryListFilterChain createFilterChain( params.useAccessibilityScore() && request.wheelchair(), request.preferences().wheelchair().maxSlope() ) - .withFares(context.graph().getFareService()) .withMinBikeParkingDistance(minBikeParkingDistance(request)) .withRemoveTimeshiftedItinerariesWithSameRoutesAndStops( params.removeItinerariesWithSameRoutesAndStops() @@ -92,14 +96,21 @@ public static ItineraryListFilterChain createFilterChain( .withRemoveTransitIfWalkingIsBetter(true) .withDebugEnabled(params.debug()); + var fareService = context.graph().getFareService(); + if (fareService != null) { + builder.withFaresFilter(new FaresFilter(fareService)); + } + if (!context.rideHailingServices().isEmpty()) { builder.withRideHailingFilter( new RideHailingFilter(context.rideHailingServices(), request.wheelchair()) ); } - if (OTPFeature.Co2Emissions.isOn() && context.emissionsService() != null) { - builder.withEmissions(new EmissionsFilter(context.emissionsService())); + if (context.stopConsolidationService() != null) { + builder.withStopConsolidationFilter( + new ConsolidatedStopNameFilter(context.stopConsolidationService()) + ); } return builder.build(); diff --git a/src/main/java/org/opentripplanner/routing/algorithm/mapping/RoutingResponseMapper.java b/src/main/java/org/opentripplanner/routing/algorithm/mapping/RoutingResponseMapper.java index 864aa56dd39..89263b1b7a4 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/mapping/RoutingResponseMapper.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/mapping/RoutingResponseMapper.java @@ -6,6 +6,7 @@ import java.time.Instant; import java.time.ZonedDateTime; import java.util.List; +import java.util.Objects; import java.util.Set; import javax.annotation.Nullable; import org.opentripplanner.framework.application.OTPFeature; @@ -32,7 +33,7 @@ public class RoutingResponseMapper { public static RoutingResponse map( RouteRequest request, ZonedDateTime transitSearchTimeZero, - SearchParams searchParams, + SearchParams raptorSearchParamsUsed, Duration searchWindowForNextSearch, NumItinerariesFilterResults numItinerariesFilterResults, List itineraries, @@ -54,7 +55,7 @@ public static RoutingResponse map( var factory = mapIntoPageCursorFactory( request.itinerariesSortOrder(), transitSearchTimeZero, - searchParams, + raptorSearchParamsUsed, searchWindowForNextSearch, numItinerariesFilterResults, request.pageCursor() == null ? null : request.pageCursor().type @@ -69,7 +70,7 @@ public static RoutingResponse map( var metadata = createTripSearchMetadata( request, - searchParams, + raptorSearchParamsUsed, numItinerariesFilterResults == null ? null : numItinerariesFilterResults.firstRemovedDepartureTime, @@ -91,40 +92,54 @@ public static RoutingResponse map( public static PageCursorFactory mapIntoPageCursorFactory( SortOrder sortOrder, ZonedDateTime transitSearchTimeZero, - SearchParams searchParams, + SearchParams raptorSearchParamsUsed, Duration searchWindowNextSearch, NumItinerariesFilterResults numItinerariesFilterResults, @Nullable PageType currentPageType ) { + Objects.requireNonNull(sortOrder); + Objects.requireNonNull(transitSearchTimeZero); + var factory = new PageCursorFactory(sortOrder, searchWindowNextSearch); - if (searchParams == null) { - LOG.debug("SearchParams are null"); + // No transit search performed + if (raptorSearchParamsUsed == null) { return factory; } - if (!searchParams.isSearchWindowSet()) { - LOG.debug("SearchWindow not set"); - return factory; - } - if (!searchParams.isEarliestDepartureTimeSet()) { - LOG.debug("Earliest departure time not set"); - return factory; + + assertRequestPrerequisites(raptorSearchParamsUsed); + + factory = + mapSearchParametersIntoFactory( + factory, + transitSearchTimeZero, + raptorSearchParamsUsed, + currentPageType + ); + + if (numItinerariesFilterResults != null) { + factory = factory.withRemovedItineraries(numItinerariesFilterResults); } + return factory; + } + private static PageCursorFactory mapSearchParametersIntoFactory( + PageCursorFactory factory, + ZonedDateTime transitSearchTimeZero, + SearchParams raptorSearchParamsUsed, + PageType currentPageType + ) { Instant edt = transitSearchTimeZero - .plusSeconds(searchParams.earliestDepartureTime()) + .plusSeconds(raptorSearchParamsUsed.earliestDepartureTime()) .toInstant(); - Instant lat = searchParams.isLatestArrivalTimeSet() - ? transitSearchTimeZero.plusSeconds(searchParams.latestArrivalTime()).toInstant() + + Instant lat = raptorSearchParamsUsed.isLatestArrivalTimeSet() + ? transitSearchTimeZero.plusSeconds(raptorSearchParamsUsed.latestArrivalTime()).toInstant() : null; - Duration searchWindow = Duration.ofSeconds(searchParams.searchWindowInSeconds()); - factory = factory.withOriginalSearch(currentPageType, edt, lat, searchWindow); - if (numItinerariesFilterResults != null) { - factory = factory.withRemovedItineraries(numItinerariesFilterResults); - } + var searchWindowUsed = Duration.ofSeconds(raptorSearchParamsUsed.routerSearchWindowInSeconds()); - return factory; + return factory.withOriginalSearch(currentPageType, edt, lat, searchWindowUsed); } @Nullable @@ -155,6 +170,15 @@ private static TripSearchMetadata createTripSearchMetadata( } } + private static void assertRequestPrerequisites(SearchParams raptorSearchParamsUsed) { + if (!raptorSearchParamsUsed.isSearchWindowSet()) { + throw new IllegalStateException("SearchWindow not set"); + } + if (!raptorSearchParamsUsed.isEarliestDepartureTimeSet()) { + throw new IllegalStateException("Earliest departure time not set"); + } + } + private static void logPagingInformation( PageCursor currentPageCursor, PageCursor prevPageCursor, diff --git a/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/Transfer.java b/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/Transfer.java index 169a44cb730..c6086100f5d 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/Transfer.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/Transfer.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; import org.locationtech.jts.geom.Coordinate; +import org.opentripplanner.framework.logging.Throttle; import org.opentripplanner.framework.tostring.ToStringBuilder; import org.opentripplanner.raptor.api.model.RaptorTransfer; import org.opentripplanner.routing.algorithm.raptoradapter.transit.cost.RaptorCostConverter; @@ -13,9 +14,16 @@ import org.opentripplanner.street.search.request.StreetSearchRequest; import org.opentripplanner.street.search.state.EdgeTraverser; import org.opentripplanner.street.search.state.StateEditor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Transfer { + private static final Logger LOG = LoggerFactory.getLogger(Transfer.class); + private static final Throttle THROTTLE_COST_EXCEEDED = Throttle.ofOneSecond(); + + protected static final int MAX_TRANSFER_COST = 2_000_000; + private final int toStop; private final int distanceMeters; @@ -63,11 +71,14 @@ public Optional asRaptorTransfer(StreetSearchRequest request) { WalkPreferences walkPreferences = request.preferences().walk(); if (edges == null || edges.isEmpty()) { double durationSeconds = distanceMeters / walkPreferences.speed(); + final double domainCost = costLimitSanityCheck( + durationSeconds * walkPreferences.reluctance() + ); return Optional.of( new DefaultRaptorTransfer( this.toStop, (int) Math.ceil(durationSeconds), - RaptorCostConverter.toRaptorCost(durationSeconds * walkPreferences.reluctance()), + RaptorCostConverter.toRaptorCost(domainCost), this ) ); @@ -82,12 +93,41 @@ public Optional asRaptorTransfer(StreetSearchRequest request) { new DefaultRaptorTransfer( this.toStop, (int) s.getElapsedTimeSeconds(), - RaptorCostConverter.toRaptorCost(s.getWeight()), + RaptorCostConverter.toRaptorCost(costLimitSanityCheck(s.getWeight())), this ) ); } + /** + * Since transfer costs are not computed through a full A* with pruning they can incur an + * absurdly high cost that overflows the integer cost inside RAPTOR + * (https://github.com/opentripplanner/OpenTripPlanner/issues/5509). + *

+ * An example would be a transfer using lots of stairs being used on a wheelchair when no + * wheelchair-specific one has been generated. + * (see https://docs.opentripplanner.org/en/dev-2.x/Accessibility/). + *

+ * For this reason there is this sanity limit that makes sure that the transfer cost stays below a + * limit that is still very high (several days of transit-equivalent cost) but far away from the + * integer overflow. + * + * @see EdgeTraverser + * @see RaptorCostConverter + */ + private int costLimitSanityCheck(double cost) { + if (cost >= 0 && cost <= MAX_TRANSFER_COST) { + return (int) cost; + } else { + THROTTLE_COST_EXCEEDED.throttle(() -> + LOG.warn( + "Transfer exceeded maximum cost. Please consider changing the transfer cost calculation. More information: https://github.com/opentripplanner/OpenTripPlanner/pull/5516#issuecomment-1819138078" + ) + ); + return MAX_TRANSFER_COST; + } + } + @Override public String toString() { return ToStringBuilder diff --git a/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java b/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java index 07e4d07237f..586b106bc66 100644 --- a/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java +++ b/src/main/java/org/opentripplanner/routing/api/request/RouteRequest.java @@ -14,6 +14,7 @@ import java.util.function.Consumer; import javax.annotation.Nullable; import org.opentripplanner.framework.time.DateUtils; +import org.opentripplanner.framework.tostring.ToStringBuilder; import org.opentripplanner.model.GenericLocation; import org.opentripplanner.model.plan.SortOrder; import org.opentripplanner.model.plan.pagecursor.PageCursor; @@ -239,21 +240,6 @@ public void validateOriginAndDestination() { } } - public String toString(String sep) { - return ( - from + - sep + - to + - sep + - dateTime + - sep + - arriveBy + - sep + - journey.modes() + - journey.transit().filters() - ); - } - /* INSTANCE METHODS */ /** @@ -280,10 +266,6 @@ public RouteRequest clone() { } } - public String toString() { - return toString(" "); - } - /** The start location */ public GenericLocation from() { return from; @@ -444,4 +426,16 @@ public int numItineraries() { public void setNumItineraries(int numItineraries) { this.numItineraries = numItineraries; } + + public String toString() { + return ToStringBuilder + .of(RouteRequest.class) + .addObj("from", from) + .addObj("to", to) + .addDateTime("dateTime", dateTime) + .addBoolIfTrue("arriveBy", arriveBy) + .addObj("modes", journey.modes()) + .addCol("filters", journey.transit().filters()) + .toString(); + } } diff --git a/src/main/java/org/opentripplanner/routing/graph/SerializedGraphObject.java b/src/main/java/org/opentripplanner/routing/graph/SerializedGraphObject.java index fbcc77f3a5b..690c4c7e821 100644 --- a/src/main/java/org/opentripplanner/routing/graph/SerializedGraphObject.java +++ b/src/main/java/org/opentripplanner/routing/graph/SerializedGraphObject.java @@ -18,6 +18,7 @@ import javax.annotation.Nullable; import org.opentripplanner.datastore.api.DataSource; import org.opentripplanner.ext.emissions.EmissionsDataModel; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; import org.opentripplanner.framework.application.OtpAppException; import org.opentripplanner.framework.geometry.CompactElevationProfile; import org.opentripplanner.framework.lang.OtpNumberFormat; @@ -73,6 +74,7 @@ public class SerializedGraphObject implements Serializable { private final List allTransitSubModes; public final DataImportIssueSummary issueSummary; + public final StopConsolidationRepository stopConsolidationRepository; private final int routingTripPatternCounter; public final EmissionsDataModel emissionsDataModel; @@ -83,7 +85,8 @@ public SerializedGraphObject( BuildConfig buildConfig, RouterConfig routerConfig, DataImportIssueSummary issueSummary, - EmissionsDataModel emissionsDataModel + EmissionsDataModel emissionsDataModel, + StopConsolidationRepository stopConsolidationRepository ) { this.graph = graph; this.edges = graph.getEdges(); @@ -95,6 +98,7 @@ public SerializedGraphObject( this.emissionsDataModel = emissionsDataModel; this.allTransitSubModes = SubMode.listAllCachedSubModes(); this.routingTripPatternCounter = RoutingTripPattern.indexCounter(); + this.stopConsolidationRepository = stopConsolidationRepository; } public static void verifyTheOutputGraphIsWritableIfDataSourceExist(DataSource graphOutput) { diff --git a/src/main/java/org/opentripplanner/routing/service/DefaultRoutingService.java b/src/main/java/org/opentripplanner/routing/service/DefaultRoutingService.java index 70b6ca98fad..91398e13c73 100644 --- a/src/main/java/org/opentripplanner/routing/service/DefaultRoutingService.java +++ b/src/main/java/org/opentripplanner/routing/service/DefaultRoutingService.java @@ -2,6 +2,8 @@ import java.time.ZoneId; import org.opentripplanner.framework.application.OTPRequestTimeoutException; +import org.opentripplanner.framework.tostring.MultiLineToStringBuilder; +import org.opentripplanner.model.plan.Itinerary; import org.opentripplanner.routing.algorithm.RoutingWorker; import org.opentripplanner.routing.algorithm.via.ViaRoutingWorker; import org.opentripplanner.routing.api.RoutingService; @@ -10,6 +12,8 @@ import org.opentripplanner.routing.api.response.RoutingResponse; import org.opentripplanner.routing.api.response.ViaRoutingResponse; import org.opentripplanner.standalone.api.OtpServerRequestContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; // TODO VIA: 2022-08-29 javadocs @@ -18,6 +22,8 @@ */ public class DefaultRoutingService implements RoutingService { + private static final Logger LOG = LoggerFactory.getLogger(DefaultRoutingService.class); + private final OtpServerRequestContext serverContext; private final ZoneId timeZone; @@ -29,20 +35,42 @@ public DefaultRoutingService(OtpServerRequestContext serverContext) { @Override public RoutingResponse route(RouteRequest request) { + LOG.debug("Request: {}", request); OTPRequestTimeoutException.checkForTimeout(); request.validateOriginAndDestination(); - RoutingWorker worker = new RoutingWorker(serverContext, request, timeZone); - return worker.route(); + var worker = new RoutingWorker(serverContext, request, timeZone); + var response = worker.route(); + logResponse(response); + return response; } @Override public ViaRoutingResponse route(RouteViaRequest request) { + LOG.debug("Request: {}", request); OTPRequestTimeoutException.checkForTimeout(); var viaRoutingWorker = new ViaRoutingWorker( request, req -> new RoutingWorker(serverContext, req, serverContext.transitService().getTimeZone()).route() ); + // TODO: Add output logging here, see route(..) method return viaRoutingWorker.route(); } + + private void logResponse(RoutingResponse response) { + if (LOG.isDebugEnabled()) { + var text = MultiLineToStringBuilder + .of("Response") + .addDuration("SearchWindowUsed", response.getMetadata().searchWindowUsed) + .add("NextPage", response.getNextPageCursor()) + .add("PreviousPage", response.getPreviousPageCursor()) + .addColNl( + "Itineraries", + response.getTripPlan().itineraries.stream().map(Itinerary::toStr).toList() + ) + .addColNl("Errors", response.getRoutingErrors()) + .toString(); + LOG.debug(text); + } + } } diff --git a/src/main/java/org/opentripplanner/standalone/OTPMain.java b/src/main/java/org/opentripplanner/standalone/OTPMain.java index 65b40dc3630..f5871dde995 100644 --- a/src/main/java/org/opentripplanner/standalone/OTPMain.java +++ b/src/main/java/org/opentripplanner/standalone/OTPMain.java @@ -152,7 +152,8 @@ private static void startOTPServer(CommandLineParameters cli) { config.buildConfig(), config.routerConfig(), DataImportIssueSummary.combine(graphBuilder.issueSummary(), app.dataImportIssueSummary()), - app.emissionsDataModel() + app.emissionsDataModel(), + app.stopConsolidationRepository() ) .save(app.graphOutputDataSource()); // Log size info for the deduplicator diff --git a/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java b/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java index db105338736..8fa8069ba70 100644 --- a/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java +++ b/src/main/java/org/opentripplanner/standalone/api/OtpServerRequestContext.java @@ -8,6 +8,7 @@ import org.opentripplanner.ext.dataoverlay.routing.DataOverlayContext; import org.opentripplanner.ext.emissions.EmissionsService; import org.opentripplanner.ext.ridehailing.RideHailingService; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; import org.opentripplanner.ext.vectortiles.VectorTilesResource; import org.opentripplanner.framework.application.OTPFeature; import org.opentripplanner.inspector.raster.TileRendererManager; @@ -94,6 +95,9 @@ public interface OtpServerRequestContext { List rideHailingServices(); + @Nullable + StopConsolidationService stopConsolidationService(); + MeterRegistry meterRegistry(); @Nullable diff --git a/src/main/java/org/opentripplanner/standalone/config/BuildConfig.java b/src/main/java/org/opentripplanner/standalone/config/BuildConfig.java index 060d224b487..4a56a0722e4 100644 --- a/src/main/java/org/opentripplanner/standalone/config/BuildConfig.java +++ b/src/main/java/org/opentripplanner/standalone/config/BuildConfig.java @@ -5,6 +5,7 @@ import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_0; import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_1; import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_2; +import static org.opentripplanner.standalone.config.framework.json.OtpVersion.V2_5; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.MissingNode; @@ -167,21 +168,23 @@ public class BuildConfig implements OtpDataStoreConfig { public final OsmExtractParametersList osm; public final EmissionsConfig emissions; public final TransitFeeds transitFeeds; - public boolean staticParkAndRide; - public boolean staticBikeParkAndRide; - public double distanceBetweenElevationSamples; - public double maxElevationPropagationMeters; - public boolean readCachedElevations; - public boolean writeCachedElevations; + public final boolean staticParkAndRide; + public final boolean staticBikeParkAndRide; + public final double distanceBetweenElevationSamples; + public final double maxElevationPropagationMeters; + public final boolean readCachedElevations; + public final boolean writeCachedElevations; - public boolean includeEllipsoidToGeoidDifference; + public final boolean includeEllipsoidToGeoidDifference; - public boolean multiThreadElevationCalculations; + public final boolean multiThreadElevationCalculations; - public LocalDate transitServiceStart; + public final LocalDate transitServiceStart; - public LocalDate transitServiceEnd; - public ZoneId transitModelTimeZone; + public final LocalDate transitServiceEnd; + public final ZoneId transitModelTimeZone; + + public final String stopConsolidationFile; /** * Set all parameters from the given Jackson JSON tree, applying defaults. Supplying @@ -609,6 +612,15 @@ that we support remote input files (cloud storage or arbitrary URLs) not all dat ) .asUri(null); + stopConsolidationFile = + root + .of("stopConsolidationFile") + .since(V2_5) + .summary( + "Name of the CSV-formatted file in the build directory which contains the configuration for stop consolidation." + ) + .asString(null); + osmDefaults = OsmConfig.mapOsmDefaults(root, "osmDefaults"); osm = OsmConfig.mapOsmConfig(root, "osm", osmDefaults); demDefaults = DemConfig.mapDemDefaultsConfig(root, "demDefaults"); diff --git a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java index faf1952c10d..3191a67aacd 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java +++ b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplication.java @@ -5,6 +5,7 @@ import org.opentripplanner.datastore.api.DataSource; import org.opentripplanner.ext.emissions.EmissionsDataModel; import org.opentripplanner.ext.geocoder.LuceneIndex; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; import org.opentripplanner.ext.transmodelapi.TransmodelAPI; import org.opentripplanner.framework.application.LogMDCSupport; import org.opentripplanner.framework.application.OTPFeature; @@ -72,7 +73,8 @@ public class ConstructApplication { ConfigModel config, GraphBuilderDataSources graphBuilderDataSources, DataImportIssueSummary issueSummary, - EmissionsDataModel emissionsDataModel + EmissionsDataModel emissionsDataModel, + @Nullable StopConsolidationRepository stopConsolidationRepository ) { this.cli = cli; this.graphBuilderDataSources = graphBuilderDataSources; @@ -91,6 +93,7 @@ public class ConstructApplication { .worldEnvelopeRepository(worldEnvelopeRepository) .emissionsDataModel(emissionsDataModel) .dataImportIssueSummary(issueSummary) + .stopConsolidationRepository(stopConsolidationRepository) .build(); } @@ -122,6 +125,7 @@ public GraphBuilder createGraphBuilder() { transitModel(), factory.worldEnvelopeRepository(), factory.emissionsDataModel(), + factory.stopConsolidationRepository(), cli.doLoadStreetGraph(), cli.doSaveStreetGraph() ); @@ -243,6 +247,10 @@ public DataImportIssueSummary dataImportIssueSummary() { return factory.dataImportIssueSummary(); } + public StopConsolidationRepository stopConsolidationRepository() { + return factory.stopConsolidationRepository(); + } + public RealtimeVehicleRepository realtimeVehicleRepository() { return factory.realtimeVehicleRepository(); } diff --git a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java index eb286ea5843..097fcfb4f7a 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java +++ b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationFactory.java @@ -7,6 +7,8 @@ import org.opentripplanner.ext.emissions.EmissionsDataModel; import org.opentripplanner.ext.emissions.EmissionsServiceModule; import org.opentripplanner.ext.ridehailing.configure.RideHailingServicesModule; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.configure.StopConsolidationServiceModule; import org.opentripplanner.graph_builder.issue.api.DataImportIssueSummary; import org.opentripplanner.raptor.configure.RaptorConfig; import org.opentripplanner.routing.algorithm.raptoradapter.transit.TripSchedule; @@ -47,6 +49,7 @@ ConstructApplicationModule.class, RideHailingServicesModule.class, EmissionsServiceModule.class, + StopConsolidationServiceModule.class, } ) public interface ConstructApplicationFactory { @@ -73,6 +76,9 @@ public interface ConstructApplicationFactory { MetricsLogging metricsLogging(); + @Nullable + StopConsolidationRepository stopConsolidationRepository(); + @Component.Builder interface Builder { @BindsInstance @@ -90,6 +96,11 @@ interface Builder { @BindsInstance Builder worldEnvelopeRepository(WorldEnvelopeRepository worldEnvelopeRepository); + @BindsInstance + Builder stopConsolidationRepository( + @Nullable StopConsolidationRepository stopConsolidationRepository + ); + @BindsInstance Builder dataImportIssueSummary(DataImportIssueSummary issueSummary); diff --git a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java index 8f936d48522..2ff6de29b3d 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java +++ b/src/main/java/org/opentripplanner/standalone/configure/ConstructApplicationModule.java @@ -8,6 +8,7 @@ import org.opentripplanner.astar.spi.TraverseVisitor; import org.opentripplanner.ext.emissions.EmissionsService; import org.opentripplanner.ext.ridehailing.RideHailingService; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; import org.opentripplanner.raptor.configure.RaptorConfig; import org.opentripplanner.routing.algorithm.raptoradapter.transit.TripSchedule; import org.opentripplanner.routing.graph.Graph; @@ -33,6 +34,7 @@ OtpServerRequestContext providesServerContext( RealtimeVehicleService realtimeVehicleService, VehicleRentalService vehicleRentalService, List rideHailingServices, + @Nullable StopConsolidationService stopConsolidationService, @Nullable TraverseVisitor traverseVisitor, EmissionsService emissionsService ) { @@ -50,6 +52,7 @@ OtpServerRequestContext providesServerContext( emissionsService, routerConfig.flexConfig(), rideHailingServices, + stopConsolidationService, traverseVisitor ); } diff --git a/src/main/java/org/opentripplanner/standalone/configure/LoadApplication.java b/src/main/java/org/opentripplanner/standalone/configure/LoadApplication.java index c8936ab3054..f22c5ab80ec 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/LoadApplication.java +++ b/src/main/java/org/opentripplanner/standalone/configure/LoadApplication.java @@ -1,7 +1,9 @@ package org.opentripplanner.standalone.configure; +import javax.annotation.Nullable; import org.opentripplanner.datastore.api.DataSource; import org.opentripplanner.ext.emissions.EmissionsDataModel; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; import org.opentripplanner.graph_builder.GraphBuilderDataSources; import org.opentripplanner.graph_builder.issue.api.DataImportIssueSummary; import org.opentripplanner.routing.graph.Graph; @@ -54,7 +56,8 @@ public ConstructApplication appConstruction(SerializedGraphObject obj) { obj.transitModel, obj.worldEnvelopeRepository, obj.issueSummary, - obj.emissionsDataModel + obj.emissionsDataModel, + obj.stopConsolidationRepository ); } @@ -65,7 +68,8 @@ public ConstructApplication appConstruction() { factory.emptyTransitModel(), factory.emptyWorldEnvelopeRepository(), DataImportIssueSummary.empty(), - factory.emptyEmissionsDataModel() + factory.emptyEmissionsDataModel(), + factory.emptyStopConsolidationRepository() ); } @@ -85,7 +89,8 @@ private ConstructApplication createAppConstruction( TransitModel transitModel, WorldEnvelopeRepository worldEnvelopeRepository, DataImportIssueSummary issueSummary, - EmissionsDataModel emissionsDataModel + @Nullable EmissionsDataModel emissionsDataModel, + @Nullable StopConsolidationRepository stopConsolidationRepository ) { return new ConstructApplication( cli, @@ -95,7 +100,8 @@ private ConstructApplication createAppConstruction( config(), graphBuilderDataSources(), issueSummary, - emissionsDataModel + emissionsDataModel, + stopConsolidationRepository ); } } diff --git a/src/main/java/org/opentripplanner/standalone/configure/LoadApplicationFactory.java b/src/main/java/org/opentripplanner/standalone/configure/LoadApplicationFactory.java index fbd5ad2de51..ca90c613db5 100644 --- a/src/main/java/org/opentripplanner/standalone/configure/LoadApplicationFactory.java +++ b/src/main/java/org/opentripplanner/standalone/configure/LoadApplicationFactory.java @@ -7,6 +7,8 @@ import org.opentripplanner.datastore.configure.DataStoreModule; import org.opentripplanner.ext.datastore.gs.GsDataSourceModule; import org.opentripplanner.ext.emissions.EmissionsDataModel; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.configure.StopConsolidationRepositoryModule; import org.opentripplanner.graph_builder.GraphBuilderDataSources; import org.opentripplanner.routing.graph.Graph; import org.opentripplanner.service.worldenvelope.WorldEnvelopeRepository; @@ -26,6 +28,7 @@ DataStoreModule.class, GsDataSourceModule.class, WorldEnvelopeRepositoryModule.class, + StopConsolidationRepositoryModule.class, } ) public interface LoadApplicationFactory { @@ -48,6 +51,9 @@ public interface LoadApplicationFactory { @Singleton EmissionsDataModel emptyEmissionsDataModel(); + @Singleton + StopConsolidationRepository emptyStopConsolidationRepository(); + @Component.Builder interface Builder { @BindsInstance diff --git a/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java b/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java index 66bb4f5cbc3..f14fea66693 100644 --- a/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java +++ b/src/main/java/org/opentripplanner/standalone/server/DefaultServerRequestContext.java @@ -7,6 +7,7 @@ import org.opentripplanner.astar.spi.TraverseVisitor; import org.opentripplanner.ext.emissions.EmissionsService; import org.opentripplanner.ext.ridehailing.RideHailingService; +import org.opentripplanner.ext.stopconsolidation.StopConsolidationService; import org.opentripplanner.ext.vectortiles.VectorTilesResource; import org.opentripplanner.inspector.raster.TileRendererManager; import org.opentripplanner.raptor.api.request.RaptorTuningParameters; @@ -45,6 +46,7 @@ public class DefaultServerRequestContext implements OtpServerRequestContext { private final RealtimeVehicleService realtimeVehicleService; private final VehicleRentalService vehicleRentalService; private final EmissionsService emissionsService; + private final StopConsolidationService stopConsolidationService; /** * Make sure all mutable components are copied/cloned before calling this constructor. @@ -63,8 +65,9 @@ private DefaultServerRequestContext( VehicleRentalService vehicleRentalService, EmissionsService emissionsService, List rideHailingServices, - TraverseVisitor traverseVisitor, - FlexConfig flexConfig + StopConsolidationService stopConsolidationService, + FlexConfig flexConfig, + TraverseVisitor traverseVisitor ) { this.graph = graph; this.transitService = transitService; @@ -81,6 +84,7 @@ private DefaultServerRequestContext( this.realtimeVehicleService = realtimeVehicleService; this.rideHailingServices = rideHailingServices; this.emissionsService = emissionsService; + this.stopConsolidationService = stopConsolidationService; } /** @@ -100,6 +104,7 @@ public static DefaultServerRequestContext create( @Nullable EmissionsService emissionsService, FlexConfig flexConfig, List rideHailingServices, + @Nullable StopConsolidationService stopConsolidationService, @Nullable TraverseVisitor traverseVisitor ) { return new DefaultServerRequestContext( @@ -116,8 +121,9 @@ public static DefaultServerRequestContext create( vehicleRentalService, emissionsService, rideHailingServices, - traverseVisitor, - flexConfig + stopConsolidationService, + flexConfig, + traverseVisitor ); } @@ -188,6 +194,11 @@ public List rideHailingServices() { return rideHailingServices; } + @Override + public StopConsolidationService stopConsolidationService() { + return stopConsolidationService; + } + @Override public MeterRegistry meterRegistry() { return meterRegistry; diff --git a/src/main/java/org/opentripplanner/transit/model/framework/Deduplicator.java b/src/main/java/org/opentripplanner/transit/model/framework/Deduplicator.java index b223ac7412f..587ad2871cd 100644 --- a/src/main/java/org/opentripplanner/transit/model/framework/Deduplicator.java +++ b/src/main/java/org/opentripplanner/transit/model/framework/Deduplicator.java @@ -20,7 +20,7 @@ * Does the same thing as String.intern, but for several different types. Java's String.intern uses * perm gen space and is broken anyway. */ -public class Deduplicator implements Serializable { +public class Deduplicator implements DeduplicatorService, Serializable { private static final String ZERO_COUNT = sizeAndCount(0, 0); @@ -50,6 +50,7 @@ public void reset() { canonicalLists.clear(); } + @Override @Nullable public BitSet deduplicateBitSet(BitSet original) { if (original == null) { @@ -64,7 +65,7 @@ public BitSet deduplicateBitSet(BitSet original) { return canonical; } - /** Used to deduplicate time and stop sequence arrays. The same times may occur in many trips. */ + @Override @Nullable public int[] deduplicateIntArray(int[] original) { if (original == null) { @@ -80,6 +81,7 @@ public int[] deduplicateIntArray(int[] original) { return canonical.array; } + @Override @Nullable public String deduplicateString(String original) { if (original == null) { @@ -90,6 +92,7 @@ public String deduplicateString(String original) { return canonical == null ? original : canonical; } + @Override @Nullable public String[] deduplicateStringArray(String[] original) { if (original == null) { @@ -104,10 +107,7 @@ public String[] deduplicateStringArray(String[] original) { return canonical.array; } - /** - * Used to deduplicate list of via places for stop destinationDisplay. Stops may have the same via - * arrays. - */ + @Override @Nullable public String[][] deduplicateString2DArray(String[][] original) { if (original == null) { @@ -122,6 +122,7 @@ public String[][] deduplicateString2DArray(String[][] original) { return canonical.array; } + @Override @SuppressWarnings("unchecked") @Nullable public T deduplicateObject(Class cl, T original) { @@ -137,6 +138,7 @@ public T deduplicateObject(Class cl, T original) { return canonical == null ? original : canonical; } + @Override @Nullable public T[] deduplicateObjectArray(Class type, T[] original) { if (original == null) { @@ -160,6 +162,7 @@ public T[] deduplicateObjectArray(Class type, T[] original) { return canonical.array(); } + @Override @Nullable public List deduplicateImmutableList(Class clazz, List original) { if (original == null) { diff --git a/src/main/java/org/opentripplanner/transit/model/framework/DeduplicatorNoop.java b/src/main/java/org/opentripplanner/transit/model/framework/DeduplicatorNoop.java new file mode 100644 index 00000000000..568772c29fc --- /dev/null +++ b/src/main/java/org/opentripplanner/transit/model/framework/DeduplicatorNoop.java @@ -0,0 +1,56 @@ +package org.opentripplanner.transit.model.framework; + +import java.util.BitSet; +import java.util.List; +import javax.annotation.Nullable; + +class DeduplicatorNoop implements DeduplicatorService { + + @Nullable + @Override + public BitSet deduplicateBitSet(BitSet original) { + return original; + } + + @Nullable + @Override + public int[] deduplicateIntArray(int[] original) { + return original; + } + + @Nullable + @Override + public String deduplicateString(String original) { + return original; + } + + @Nullable + @Override + public String[] deduplicateStringArray(String[] original) { + return original; + } + + @Nullable + @Override + public String[][] deduplicateString2DArray(String[][] original) { + return original; + } + + @Nullable + @Override + public T deduplicateObject(Class cl, T original) { + return original; + } + + @Nullable + @Override + public T[] deduplicateObjectArray(Class type, T[] original) { + return original; + } + + @Nullable + @Override + public List deduplicateImmutableList(Class clazz, List original) { + return original; + } +} diff --git a/src/main/java/org/opentripplanner/transit/model/framework/DeduplicatorService.java b/src/main/java/org/opentripplanner/transit/model/framework/DeduplicatorService.java new file mode 100644 index 00000000000..d8c4a9ceb82 --- /dev/null +++ b/src/main/java/org/opentripplanner/transit/model/framework/DeduplicatorService.java @@ -0,0 +1,44 @@ +package org.opentripplanner.transit.model.framework; + +import java.util.BitSet; +import java.util.List; +import javax.annotation.Nullable; + +/** + * The deduplication service is used to reduce memory consumption by returning the + * same instance if to value-objects are the same. The value-objects must implement + * hashCode and equals. + *

+ * This is also used with arrays of primitive types. Arrays are mutable, so be sure they are + * well protected and do not change if you deduplicate them. + *

+ * Note! The deduplicator should ONLY be used with immutable types and well protected + * fields - guaranteed not to be changed. + */ +public interface DeduplicatorService { + DeduplicatorService NOOP = new DeduplicatorNoop(); + + @Nullable + BitSet deduplicateBitSet(BitSet original); + + @Nullable + int[] deduplicateIntArray(int[] original); + + @Nullable + String deduplicateString(String original); + + @Nullable + String[] deduplicateStringArray(String[] original); + + @Nullable + String[][] deduplicateString2DArray(String[][] original); + + @Nullable + T deduplicateObject(Class cl, T original); + + @Nullable + T[] deduplicateObjectArray(Class type, T[] original); + + @Nullable + List deduplicateImmutableList(Class clazz, List original); +} diff --git a/src/main/java/org/opentripplanner/transit/model/network/RoutingTripPattern.java b/src/main/java/org/opentripplanner/transit/model/network/RoutingTripPattern.java index 95c76ad18e4..0d319af0529 100644 --- a/src/main/java/org/opentripplanner/transit/model/network/RoutingTripPattern.java +++ b/src/main/java/org/opentripplanner/transit/model/network/RoutingTripPattern.java @@ -12,7 +12,7 @@ * - The RTP is accessed frequently during the Raptor search, and we want it to be as small as * possible to load/access it in the cache and CPU for performance reasons. * - Also, we deduplicate these so a RTP can be reused by more than one TP. - * - This also provide explicit documentation on witch fields are used during a search and witch + * - This also provide explicit documentation on witch fields are used during a search and which * are not. */ public class RoutingTripPattern implements DefaultTripPattern, Serializable { diff --git a/src/main/java/org/opentripplanner/transit/model/network/StopPattern.java b/src/main/java/org/opentripplanner/transit/model/network/StopPattern.java index 934910bc414..fe1bb84cf3f 100644 --- a/src/main/java/org/opentripplanner/transit/model/network/StopPattern.java +++ b/src/main/java/org/opentripplanner/transit/model/network/StopPattern.java @@ -5,11 +5,13 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; import javax.annotation.Nonnull; import org.opentripplanner.model.PickDrop; import org.opentripplanner.model.StopTime; +import org.opentripplanner.transit.model.framework.FeedScopedId; import org.opentripplanner.transit.model.site.RegularStop; import org.opentripplanner.transit.model.site.Station; import org.opentripplanner.transit.model.site.StopLocation; @@ -323,6 +325,20 @@ public StopPatternBuilder cancelStops(List cancelledStopIndices) { return this; } + /** + * Replace the stop {@code old} in the stop pattern with ${code newStop}. + */ + public StopPatternBuilder replaceStop(FeedScopedId old, StopLocation newStop) { + Objects.requireNonNull(old); + Objects.requireNonNull(newStop); + for (int i = 0; i < stops.length; i++) { + if (stops[i].getId().equals(old)) { + stops[i] = newStop; + } + } + return this; + } + public StopPattern build() { boolean sameStops = Arrays.equals(stops, original.stops); boolean sameDropoffs = Arrays.equals(dropoffs, original.dropoffs); diff --git a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java index 05d4375c7ba..e89ea1940f6 100644 --- a/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java +++ b/src/main/java/org/opentripplanner/transit/model/network/TripPattern.java @@ -5,9 +5,11 @@ import static org.opentripplanner.framework.lang.ObjectUtils.requireNotInitialized; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.function.Predicate; +import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nonnull; import org.locationtech.jts.geom.Coordinate; @@ -415,14 +417,6 @@ public I18NString getTripHeadsign() { : getTripHeadSignFromTripTimes(tripTimes); } - public I18NString getStopHeadsign(int stopIndex) { - var tripTimes = scheduledTimetable.getRepresentativeTripTimes(); - if (tripTimes == null) { - return null; - } - return tripTimes.getHeadsign(stopIndex); - } - public TripPattern clone() { try { return (TripPattern) super.clone(); @@ -451,8 +445,25 @@ public String logName() { return route.logName(); } + /** + * Does the pattern contain any stops passed in as argument? + * This method is not optimized for performance so don't use it where that is critical. + */ + public boolean containsAnyStopId(Collection ids) { + return ids + .stream() + .anyMatch(id -> + stopPattern + .getStops() + .stream() + .map(StopLocation::getId) + .collect(Collectors.toUnmodifiableSet()) + .contains(id) + ); + } + private static Coordinate coordinate(StopLocation s) { - return new Coordinate(s.getLon(), s.getLat()); + return s.getCoordinate().asJtsCoordinate(); } @Override diff --git a/src/main/java/org/opentripplanner/transit/model/network/TripPatternBuilder.java b/src/main/java/org/opentripplanner/transit/model/network/TripPatternBuilder.java index e359952f5f9..f34d206922b 100644 --- a/src/main/java/org/opentripplanner/transit/model/network/TripPatternBuilder.java +++ b/src/main/java/org/opentripplanner/transit/model/network/TripPatternBuilder.java @@ -49,7 +49,10 @@ public final class TripPatternBuilder this.hopGeometries = original.getGeometry() == null ? null - : IntStream.range(0, original.numberOfStops()).mapToObj(original::getHopGeometry).toList(); + : IntStream + .range(0, original.numberOfStops() - 1) + .mapToObj(original::getHopGeometry) + .toList(); } public TripPatternBuilder withName(String name) { diff --git a/src/main/java/org/opentripplanner/transit/model/timetable/ScheduledTripTimes.java b/src/main/java/org/opentripplanner/transit/model/timetable/ScheduledTripTimes.java new file mode 100644 index 00000000000..c5a5d8f097c --- /dev/null +++ b/src/main/java/org/opentripplanner/transit/model/timetable/ScheduledTripTimes.java @@ -0,0 +1,346 @@ +package org.opentripplanner.transit.model.timetable; + +import static org.opentripplanner.transit.model.timetable.ValidationError.ErrorCode.NEGATIVE_DWELL_TIME; +import static org.opentripplanner.transit.model.timetable.ValidationError.ErrorCode.NEGATIVE_HOP_TIME; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.BitSet; +import java.util.List; +import java.util.Optional; +import java.util.OptionalInt; +import java.util.function.Supplier; +import javax.annotation.Nullable; +import org.opentripplanner.framework.i18n.I18NString; +import org.opentripplanner.framework.lang.IntUtils; +import org.opentripplanner.model.BookingInfo; +import org.opentripplanner.transit.model.basic.Accessibility; +import org.opentripplanner.transit.model.framework.Deduplicator; + +final class ScheduledTripTimes implements Serializable, Comparable { + + /** + * Implementation notes: This allows re-using the same scheduled arrival and departure time + * arrays for many ScheduledTripTimes. It is also used in materializing frequency-based + * ScheduledTripTimes. + */ + private final int timeShift; + private final int serviceCode; + private final int[] arrivalTimes; + private final int[] departureTimes; + private final BitSet timepoints; + private final Trip trip; + private final List dropOffBookingInfos; + private final List pickupBookingInfos; + + @Nullable + private final I18NString[] headsigns; + + /** + * Implementation notes: This is 2D array since there can be more than one via name/stop per each + * record in stop sequence). Outer array may be null if there are no vias in stop sequence. Inner + * array may be null if there are no vias for particular stop. This is done in order to save + * space. + */ + @Nullable + private final String[][] headsignVias; + + private final int[] originalGtfsStopSequence; + + ScheduledTripTimes(ScheduledTripTimesBuilder builder) { + this.timeShift = builder.timeShift; + this.serviceCode = builder.serviceCode; + this.arrivalTimes = builder.arrivalTimes; + this.departureTimes = builder.departureTimes; + this.timepoints = builder.timepoints; + this.trip = builder.trip; + this.pickupBookingInfos = builder.pickupBookingInfos; + this.dropOffBookingInfos = builder.dropOffBookingInfos; + this.headsigns = builder.headsigns; + this.headsignVias = builder.headsignVias; + this.originalGtfsStopSequence = builder.originalGtfsStopSequence; + } + + public static ScheduledTripTimesBuilder of(@Nullable Deduplicator deduplicator) { + return new ScheduledTripTimesBuilder(deduplicator); + } + + /** + * Create a builder with or without deduplication. + *

+ * Always provide a deduplicator when building the graph. No deduplication is ok when changing + * simple fields like {@code timeShift} and {@code serviceCode} or even the prefered way in a + * unittest. + */ + public ScheduledTripTimesBuilder copyOf(@Nullable Deduplicator deduplicator) { + return new ScheduledTripTimesBuilder( + timeShift, + serviceCode, + arrivalTimes, + departureTimes, + timepoints, + trip, + dropOffBookingInfos, + pickupBookingInfos, + headsigns, + headsignVias, + originalGtfsStopSequence, + deduplicator + ); + } + + /** + * @see #copyOf(Deduplicator) copyOf(null) + */ + public ScheduledTripTimesBuilder copyOfNoDuplication() { + return copyOf(null); + } + + /** The code for the service on which this trip runs. For departure search optimizations. */ + public int getServiceCode() { + return serviceCode; + } + + /** + * The time in seconds after midnight at which the vehicle should arrive at the given stop + * according to the original schedule. + */ + public int getScheduledArrivalTime(final int stop) { + return arrivalTimes[stop] + timeShift; + } + + /** + * The time in seconds after midnight at which the vehicle arrives at each stop, accounting for + * any real-time updates. + */ + public int getArrivalTime(final int stop) { + return getScheduledArrivalTime(stop); + } + + /** @return the difference between the scheduled and actual arrival times at this stop. */ + public int getArrivalDelay(final int stop) { + return getArrivalTime(stop) - (arrivalTimes[stop] + timeShift); + } + + /** + * The time in seconds after midnight at which the vehicle should leave the given stop according + * to the original schedule. + */ + public int getScheduledDepartureTime(final int stop) { + return departureTimes[stop] + timeShift; + } + + /** + * The time in seconds after midnight at which the vehicle leaves each stop, accounting for any + * real-time updates. + */ + public int getDepartureTime(final int stop) { + return getScheduledDepartureTime(stop); + } + + /** @return the difference between the scheduled and actual departure times at this stop. */ + public int getDepartureDelay(final int stop) { + return getDepartureTime(stop) - (departureTimes[stop] + timeShift); + } + + /** + * Whether or not stopIndex is considered a GTFS timepoint. + */ + public boolean isTimepoint(final int stopIndex) { + return timepoints.get(stopIndex); + } + + /** The trips whose arrivals and departures are represented by this class */ + public Trip getTrip() { + return trip; + } + + /** + * Return an integer which can be used to sort TripTimes in order of departure/arrivals. + *

+ * This sorted trip times is used to search for trips. OTP assume one trip do NOT pass another + * trip down the line. + */ + public int sortIndex() { + return getDepartureTime(0); + } + + public BookingInfo getDropOffBookingInfo(int stop) { + return dropOffBookingInfos.get(stop); + } + + public BookingInfo getPickupBookingInfo(int stop) { + return pickupBookingInfos.get(stop); + } + + /** + * Return {@code true} if the trip is unmodified, a scheduled trip from a published timetable. + * Return {@code false} if the trip is an updated, cancelled, or otherwise modified one. This + * method differs from {@link #getRealTimeState()} in that it checks whether real-time + * information is actually available. + */ + public boolean isScheduled() { + return true; + } + + /** + * Return {@code true} if canceled or soft-deleted + */ + public boolean isCanceledOrDeleted() { + return false; + } + + /** + * Return {@code true} if canceled + */ + public boolean isCanceled() { + return false; + } + + /** + * Return true if trip is soft-deleted, and should not be visible to the user + */ + public boolean isDeleted() { + return false; + } + + public RealTimeState getRealTimeState() { + return RealTimeState.SCHEDULED; + } + + /** + * @return the whole trip's headsign. Individual stops can have different headsigns. + */ + public I18NString getTripHeadsign() { + return trip.getHeadsign(); + } + + /** + * Both trip_headsign and stop_headsign (per stop on a particular trip) are optional GTFS fields. + * A trip may not have a headsign, in which case we should fall back on a Timetable or + * Pattern-level headsign. Such a string will be available when we give TripPatterns or + * StopPatterns unique human-readable route variant names, but a ScheduledTripTimes currently + * does not have a pointer to its enclosing timetable or pattern. + */ + @Nullable + public I18NString getHeadsign(final int stop) { + return (headsigns != null && headsigns[stop] != null) + ? headsigns[stop] + : getTrip().getHeadsign(); + } + + /** + * Return list of via names per particular stop. This field provides info about intermediate stops + * between current stop and final trip destination. Mapped from NeTEx DestinationDisplay.vias. No + * GTFS mapping at the moment. + * + * @return Empty list if there are no vias registered for a stop. + */ + public List getHeadsignVias(final int stop) { + if (headsignVias == null || headsignVias[stop] == null) { + return List.of(); + } + return List.of(headsignVias[stop]); + } + + public int getNumStops() { + return arrivalTimes.length; + } + + public Accessibility getWheelchairAccessibility() { + return trip.getWheelchairBoarding(); + } + + /** + * This is only for API-purposes (does not affect routing). + */ + public OccupancyStatus getOccupancyStatus(int stop) { + return OccupancyStatus.NO_DATA_AVAILABLE; + } + + /** + * When creating ScheduledTripTimes or wrapping it in updates, we could potentially imply + * negative running or dwell times. We really don't want those being used in routing. This method + * checks that all times are increasing. + * + * @return empty if times were found to be increasing, the first validation error otherwise + */ + public Optional validateNonIncreasingTimes() { + final int nStops = arrivalTimes.length; + int prevDep = -9_999_999; + for (int s = 0; s < nStops; s++) { + final int arr = getArrivalTime(s); + final int dep = getDepartureTime(s); + + if (dep < arr) { + return Optional.of(new ValidationError(NEGATIVE_DWELL_TIME, s)); + } + if (prevDep > arr) { + return Optional.of(new ValidationError(NEGATIVE_HOP_TIME, s)); + } + prevDep = dep; + } + return Optional.empty(); + } + + /** Sort trips based on first departure time. */ + @Override + public int compareTo(final ScheduledTripTimes other) { + return this.getDepartureTime(0) - other.getDepartureTime(0); + } + + /** + * Returns the GTFS sequence number of the given 0-based stop position. + * + * These are the GTFS stop sequence numbers, which show the order in which the vehicle visits the + * stops. Despite the fact that the StopPattern or TripPattern enclosing this class provides + * an ordered list of Stops, the original stop sequence numbers may still be needed for matching + * with GTFS-RT update messages. Unfortunately, each individual trip can have totally different + * sequence numbers for the same stops, so we need to store them at the individual trip level. An + * effort is made to re-use the sequence number arrays when they are the same across different + * trips in the same pattern. + */ + public int gtfsSequenceOfStopIndex(final int stop) { + return originalGtfsStopSequence[stop]; + } + + /** + * Returns the 0-based stop index of the given GTFS sequence number. + */ + public OptionalInt stopIndexOfGtfsSequence(int stopSequence) { + if (originalGtfsStopSequence == null) { + return OptionalInt.empty(); + } + for (int i = 0; i < originalGtfsStopSequence.length; i++) { + var sequence = originalGtfsStopSequence[i]; + if (sequence == stopSequence) { + return OptionalInt.of(i); + } + } + return OptionalInt.empty(); + } + + @Override + public boolean equals(Object o) { + throw new UnsupportedOperationException("Not implemented, implement if needed!"); + } + + @Override + public int hashCode() { + throw new UnsupportedOperationException("Not implemented, implement if needed!"); + } + + /* package local - only visible to timetable classes */ + + int[] copyArrivalTimes() { + return IntUtils.shiftArray(timeShift, arrivalTimes); + } + + int[] copyDepartureTimes() { + return IntUtils.shiftArray(timeShift, departureTimes); + } + + I18NString[] copyHeadsigns(Supplier defaultValue) { + return headsigns == null ? defaultValue.get() : Arrays.copyOf(headsigns, headsigns.length); + } +} diff --git a/src/main/java/org/opentripplanner/transit/model/timetable/ScheduledTripTimesBuilder.java b/src/main/java/org/opentripplanner/transit/model/timetable/ScheduledTripTimesBuilder.java new file mode 100644 index 00000000000..d6515321f74 --- /dev/null +++ b/src/main/java/org/opentripplanner/transit/model/timetable/ScheduledTripTimesBuilder.java @@ -0,0 +1,129 @@ +package org.opentripplanner.transit.model.timetable; + +import java.util.BitSet; +import java.util.List; +import javax.annotation.Nullable; +import org.opentripplanner.framework.i18n.I18NString; +import org.opentripplanner.model.BookingInfo; +import org.opentripplanner.transit.model.framework.Deduplicator; +import org.opentripplanner.transit.model.framework.DeduplicatorService; + +public class ScheduledTripTimesBuilder { + + private final int NOT_SET = -1; + + int timeShift; + int serviceCode = NOT_SET; + int[] arrivalTimes; + int[] departureTimes; + BitSet timepoints; + Trip trip; + List dropOffBookingInfos; + List pickupBookingInfos; + I18NString[] headsigns; + String[][] headsignVias; + int[] originalGtfsStopSequence; + private final DeduplicatorService deduplicator; + + ScheduledTripTimesBuilder(@Nullable DeduplicatorService deduplicator) { + this.deduplicator = deduplicator == null ? DeduplicatorService.NOOP : deduplicator; + } + + ScheduledTripTimesBuilder( + int timeShift, + int serviceCode, + int[] arrivalTimes, + int[] departureTimes, + BitSet timepoints, + Trip trip, + List dropOffBookingInfos, + List pickupBookingInfos, + I18NString[] headsigns, + String[][] headsignVias, + int[] originalGtfsStopSequence, + Deduplicator deduplicator + ) { + this(deduplicator); + this.timeShift = timeShift; + this.serviceCode = serviceCode; + this.arrivalTimes = arrivalTimes; + this.departureTimes = departureTimes; + this.timepoints = timepoints; + this.trip = trip; + this.dropOffBookingInfos = dropOffBookingInfos; + this.pickupBookingInfos = pickupBookingInfos; + this.headsigns = headsigns; + this.headsignVias = headsignVias; + this.originalGtfsStopSequence = originalGtfsStopSequence; + } + + public ScheduledTripTimesBuilder withTimeShift(int timeShift) { + this.timeShift = timeShift; + return this; + } + + /** + * Add the {@code delta} to the existing timeShift. This is useful when moving a trip + * from one time-zone to another. + */ + public ScheduledTripTimesBuilder plusTimeShift(int delta) { + this.timeShift += delta; + return this; + } + + public ScheduledTripTimesBuilder withServiceCode(int serviceCode) { + this.serviceCode = serviceCode; + return this; + } + + public ScheduledTripTimesBuilder withArrivalTimes(int[] arrivalTimes) { + this.arrivalTimes = deduplicator.deduplicateIntArray(arrivalTimes); + return this; + } + + public ScheduledTripTimesBuilder withDepartureTimes(int[] departureTimes) { + this.departureTimes = deduplicator.deduplicateIntArray(departureTimes); + return this; + } + + public ScheduledTripTimesBuilder withTimepoints(BitSet timepoints) { + this.timepoints = deduplicator.deduplicateBitSet(timepoints); + return this; + } + + public ScheduledTripTimesBuilder withTrip(Trip trip) { + this.trip = trip; + return this; + } + + public ScheduledTripTimesBuilder withDropOffBookingInfos(List dropOffBookingInfos) { + this.dropOffBookingInfos = + deduplicator.deduplicateImmutableList(BookingInfo.class, dropOffBookingInfos); + return this; + } + + public ScheduledTripTimesBuilder withPickupBookingInfos(List pickupBookingInfos) { + this.pickupBookingInfos = + deduplicator.deduplicateImmutableList(BookingInfo.class, pickupBookingInfos); + return this; + } + + public ScheduledTripTimesBuilder withHeadsigns(I18NString[] headsigns) { + this.headsigns = deduplicator.deduplicateObjectArray(I18NString.class, headsigns); + return this; + } + + public ScheduledTripTimesBuilder withHeadsignVias(String[][] headsignVias) { + this.headsignVias = deduplicator.deduplicateString2DArray(headsignVias); + return this; + } + + public ScheduledTripTimesBuilder withOriginalGtfsStopSequence(int[] originalGtfsStopSequence) { + this.originalGtfsStopSequence = deduplicator.deduplicateIntArray(originalGtfsStopSequence); + return this; + } + + public ScheduledTripTimes build() { + return new ScheduledTripTimes(this); + } +} diff --git a/src/main/java/org/opentripplanner/transit/model/timetable/StopTimeToScheduledTripTimesMapper.java b/src/main/java/org/opentripplanner/transit/model/timetable/StopTimeToScheduledTripTimesMapper.java new file mode 100644 index 00000000000..bf98c6e77b8 --- /dev/null +++ b/src/main/java/org/opentripplanner/transit/model/timetable/StopTimeToScheduledTripTimesMapper.java @@ -0,0 +1,138 @@ +package org.opentripplanner.transit.model.timetable; + +import java.util.ArrayList; +import java.util.BitSet; +import java.util.Collection; +import java.util.List; +import org.opentripplanner.framework.i18n.I18NString; +import org.opentripplanner.model.BookingInfo; +import org.opentripplanner.model.StopTime; +import org.opentripplanner.transit.model.framework.Deduplicator; + +class StopTimeToScheduledTripTimesMapper { + + private final Trip trip; + private final ScheduledTripTimesBuilder builder; + + private static final String[] EMPTY_STRING_ARRAY = new String[0]; + + private StopTimeToScheduledTripTimesMapper(Trip trip, Deduplicator deduplicator) { + this.trip = trip; + this.builder = ScheduledTripTimes.of(deduplicator).withTrip(trip); + } + + /** + * The provided stopTimes are assumed to be pre-filtered, valid, and monotonically increasing. + * The non-interpolated stoptimes should already be marked at timepoints by a previous filtering + * step. + */ + public static ScheduledTripTimes map( + Trip trip, + Collection stopTimes, + Deduplicator deduplicator + ) { + return new StopTimeToScheduledTripTimesMapper(trip, deduplicator).doMap(stopTimes); + } + + private ScheduledTripTimes doMap(Collection stopTimes) { + final int nStops = stopTimes.size(); + final int[] departures = new int[nStops]; + final int[] arrivals = new int[nStops]; + final int[] sequences = new int[nStops]; + final BitSet timepoints = new BitSet(nStops); + // Times are always shifted to zero. This is essential for frequencies and deduplication. + int timeShift = stopTimes.iterator().next().getArrivalTime(); + builder.withTimeShift(timeShift); + + final List dropOffBookingInfos = new ArrayList<>(); + final List pickupBookingInfos = new ArrayList<>(); + int s = 0; + for (final StopTime st : stopTimes) { + departures[s] = st.getDepartureTime() - timeShift; + arrivals[s] = st.getArrivalTime() - timeShift; + sequences[s] = st.getStopSequence(); + timepoints.set(s, st.getTimepoint() == 1); + + dropOffBookingInfos.add(st.getDropOffBookingInfo()); + pickupBookingInfos.add(st.getPickupBookingInfo()); + s++; + } + builder + .withDepartureTimes(departures) + .withArrivalTimes(arrivals) + .withOriginalGtfsStopSequence(sequences) + .withHeadsigns(makeHeadsignsArray(stopTimes)) + .withHeadsignVias(makeHeadsignViasArray(stopTimes)) + .withDropOffBookingInfos(dropOffBookingInfos) + .withPickupBookingInfos(pickupBookingInfos) + .withTimepoints(timepoints); + + return builder.build(); + } + + /** + * @return either an array of headsigns (one for each stop on this trip) or null if the headsign + * is the same at all stops (including null) and can be found in the Trip object. + */ + private I18NString[] makeHeadsignsArray(final Collection stopTimes) { + final I18NString tripHeadsign = trip.getHeadsign(); + boolean useStopHeadsigns = false; + if (tripHeadsign == null) { + useStopHeadsigns = true; + } else { + for (final StopTime st : stopTimes) { + if (!(tripHeadsign.equals(st.getStopHeadsign()))) { + useStopHeadsigns = true; + break; + } + } + } + if (!useStopHeadsigns) { + return null; //defer to trip_headsign + } + boolean allNull = true; + int i = 0; + final I18NString[] hs = new I18NString[stopTimes.size()]; + for (final StopTime st : stopTimes) { + final I18NString headsign = st.getStopHeadsign(); + hs[i++] = headsign; + if (headsign != null) allNull = false; + } + if (allNull) { + return null; + } else { + return hs; + } + } + + /** + * Create 2D String array for via names for each stop in sequence. + * + * @return May be null if no vias are present in stop sequence. + */ + private String[][] makeHeadsignViasArray(final Collection stopTimes) { + if ( + stopTimes + .stream() + .allMatch(st -> st.getHeadsignVias() == null || st.getHeadsignVias().isEmpty()) + ) { + return null; + } + + String[][] vias = new String[stopTimes.size()][]; + + int i = 0; + for (final StopTime st : stopTimes) { + if (st.getHeadsignVias() == null) { + vias[i] = EMPTY_STRING_ARRAY; + i++; + continue; + } + + vias[i] = st.getHeadsignVias().toArray(EMPTY_STRING_ARRAY); + i++; + } + + return vias; + } +} diff --git a/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java b/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java index e280300787a..b4ca4850a18 100644 --- a/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java +++ b/src/main/java/org/opentripplanner/transit/model/timetable/TripTimes.java @@ -3,23 +3,17 @@ import static org.opentripplanner.transit.model.timetable.ValidationError.ErrorCode.NEGATIVE_DWELL_TIME; import static org.opentripplanner.transit.model.timetable.ValidationError.ErrorCode.NEGATIVE_HOP_TIME; -import jakarta.annotation.Nullable; import java.io.Serializable; import java.time.Duration; -import java.util.ArrayList; import java.util.Arrays; -import java.util.BitSet; -import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.OptionalInt; +import java.util.function.IntUnaryOperator; +import javax.annotation.Nullable; import org.opentripplanner.framework.i18n.I18NString; import org.opentripplanner.model.BookingInfo; -import org.opentripplanner.model.StopTime; import org.opentripplanner.transit.model.basic.Accessibility; -import org.opentripplanner.transit.model.framework.Deduplicator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A TripTimes represents the arrival and departure times for a single trip in an Timetable. It is @@ -27,180 +21,91 @@ * when realtime updates have been applied. All times are expressed as seconds since midnight (as in * GTFS). */ -public class TripTimes implements Serializable, Comparable { +public final class TripTimes implements Serializable, Comparable { + + private ScheduledTripTimes scheduledTripTimes; - private static final Logger LOG = LoggerFactory.getLogger(TripTimes.class); - private static final String[] EMPTY_STRING_ARRAY = new String[0]; - /** The trips whose arrivals and departures are represented by this TripTimes */ - private final Trip trip; - /** - * Both trip_headsign and stop_headsign (per stop on a particular trip) are optional GTFS fields. - * If the headsigns array is null, we will report the trip_headsign (which may also be null) at - * every stop on the trip. If all the stop_headsigns are the same as the trip_headsign we may also - * set the headsigns array to null to save space. Field is private to force use of the getter - * method which does the necessary fallbacks. - */ - private I18NString[] headsigns; - /** - * Contains a list of via names for each stop. This field provides info about intermediate stops - * between current stop and final trip destination. This is 2D array since there can be more than - * one via name/stop per each record in stop sequence). This is mapped from NeTEx - * DestinationDisplay.vias. No GTFS mapping at the moment. Outer array may be null if there are no - * vias in stop sequence. Inner array may be null if there are no vias for particular stop. This - * is done in order to save space. Field is private to force use of the getter method which does - * the necessary fallbacks. - */ - private final String[][] headsignVias; - /** - * The time in seconds after midnight at which the vehicle should arrive at each stop according to - * the original schedule. - */ - private final int[] scheduledArrivalTimes; - /** - * The time in seconds after midnight at which the vehicle should leave each stop according to the - * original schedule. - */ - private final int[] scheduledDepartureTimes; - private final List dropOffBookingInfos; - private final List pickupBookingInfos; - /** - * These are the GTFS stop sequence numbers, which show the order in which the vehicle visits the - * stops. Despite the face that the StopPattern or TripPattern enclosing this TripTimes provides - * an ordered list of Stops, the original stop sequence numbers may still be needed for matching - * with GTFS-RT update messages. Unfortunately, each individual trip can have totally different - * sequence numbers for the same stops, so we need to store them at the individual trip level. An - * effort is made to re-use the sequence number arrays when they are the same across different - * trips in the same pattern. - */ - private final int[] originalGtfsStopSequence; - /** A Set of stop indexes that are marked as timepoints in the GTFS input. */ - private final BitSet timepoints; - /** - * This allows re-using the same scheduled arrival and departure time arrays for many different - * TripTimes. It is also used in materializing frequency-based TripTimes. - */ - private int timeShift; - // not final because these are set later, after TripTimes construction. - private int serviceCode = -1; - /** - * The time in seconds after midnight at which the vehicle arrives at each stop, accounting for - * any real-time updates. Non-final to allow updates. - */ private int[] arrivalTimes; - /** - * The time in seconds after midnight at which the vehicle leaves each stop, accounting for any - * real-time updates. Non-final to allow updates. - */ private int[] departureTimes; - - /** - * States of the stops in the trip. If the state is DEFAULT for a stop, {@link #realTimeState} - * should determine the realtime state of the stop. - *

- * This is only for API-purposes (does not affect routing). Non-final to allow updates. - */ + private RealTimeState realTimeState; private StopRealTimeState[] stopRealTimeStates; - - /** - * This is only for API-purposes (does not affect routing). Non-final to allow updates. - */ + private I18NString[] headsigns; private OccupancyStatus[] occupancyStatus; - - /** - * The real-time state of this TripTimes. - */ - private RealTimeState realTimeState = RealTimeState.SCHEDULED; - private Accessibility wheelchairAccessibility; - /** - * The provided stopTimes are assumed to be pre-filtered, valid, and monotonically increasing. The - * non-interpolated stoptimes should already be marked at timepoints by a previous filtering - * step. - */ - public TripTimes( - final Trip trip, - final Collection stopTimes, - final Deduplicator deduplicator + private TripTimes(final TripTimes original, int timeShiftDelta) { + this( + original, + original.scheduledTripTimes.copyOfNoDuplication().plusTimeShift(timeShiftDelta).build() + ); + } + + TripTimes(ScheduledTripTimes scheduledTripTimes) { + this( + scheduledTripTimes, + scheduledTripTimes.getRealTimeState(), + null, + null, + null, + scheduledTripTimes.getWheelchairAccessibility() + ); + } + + private TripTimes(TripTimes original, ScheduledTripTimes scheduledTripTimes) { + this( + scheduledTripTimes, + original.realTimeState, + original.stopRealTimeStates, + original.headsigns, + original.occupancyStatus, + original.wheelchairAccessibility + ); + } + + private TripTimes( + ScheduledTripTimes scheduledTripTimes, + RealTimeState realTimeState, + StopRealTimeState[] stopRealTimeStates, + I18NString[] headsigns, + OccupancyStatus[] occupancyStatus, + Accessibility wheelchairAccessibility ) { - this.trip = trip; - final int nStops = stopTimes.size(); - final int[] departures = new int[nStops]; - final int[] arrivals = new int[nStops]; - final int[] sequences = new int[nStops]; - final BitSet timepoints = new BitSet(nStops); - // Times are always shifted to zero. This is essential for frequencies and deduplication. - this.timeShift = stopTimes.iterator().next().getArrivalTime(); - final List dropOffBookingInfos = new ArrayList<>(); - final List pickupBookingInfos = new ArrayList<>(); - int s = 0; - for (final StopTime st : stopTimes) { - departures[s] = st.getDepartureTime() - timeShift; - arrivals[s] = st.getArrivalTime() - timeShift; - sequences[s] = st.getStopSequence(); - timepoints.set(s, st.getTimepoint() == 1); - - dropOffBookingInfos.add(st.getDropOffBookingInfo()); - pickupBookingInfos.add(st.getPickupBookingInfo()); - s++; - } - this.scheduledDepartureTimes = deduplicator.deduplicateIntArray(departures); - this.scheduledArrivalTimes = deduplicator.deduplicateIntArray(arrivals); - this.originalGtfsStopSequence = deduplicator.deduplicateIntArray(sequences); - this.headsigns = - deduplicator.deduplicateObjectArray(I18NString.class, makeHeadsignsArray(stopTimes)); - this.headsignVias = deduplicator.deduplicateString2DArray(makeHeadsignViasArray(stopTimes)); - - this.dropOffBookingInfos = - deduplicator.deduplicateImmutableList(BookingInfo.class, dropOffBookingInfos); - this.pickupBookingInfos = - deduplicator.deduplicateImmutableList(BookingInfo.class, pickupBookingInfos); + this.scheduledTripTimes = scheduledTripTimes; + this.realTimeState = realTimeState; + this.stopRealTimeStates = stopRealTimeStates; + this.headsigns = headsigns; + this.occupancyStatus = occupancyStatus; + this.wheelchairAccessibility = wheelchairAccessibility; + // We set these to null to indicate that this is a non-updated/scheduled TripTimes. - // We cannot point to the scheduled times because they are shifted, and updated times are not. + // We cannot point to the scheduled times because we do not want to make an unnecessary copy. this.arrivalTimes = null; this.departureTimes = null; - this.stopRealTimeStates = null; - this.timepoints = deduplicator.deduplicateBitSet(timepoints); - this.wheelchairAccessibility = trip.getWheelchairBoarding(); - LOG.trace("trip {} has timepoint at indexes {}", trip, timepoints); - } - - /** This copy constructor does not copy the actual times, only the scheduled times. */ - public TripTimes(final TripTimes object) { - this.timeShift = object.timeShift; - this.trip = object.trip; - this.serviceCode = object.serviceCode; - this.headsigns = object.headsigns; - this.headsignVias = object.headsignVias; - this.scheduledArrivalTimes = object.scheduledArrivalTimes; - this.scheduledDepartureTimes = object.scheduledDepartureTimes; - this.arrivalTimes = null; - this.departureTimes = null; - this.stopRealTimeStates = object.stopRealTimeStates; - this.pickupBookingInfos = object.pickupBookingInfos; - this.dropOffBookingInfos = object.dropOffBookingInfos; - this.originalGtfsStopSequence = object.originalGtfsStopSequence; - this.realTimeState = object.realTimeState; - this.timepoints = object.timepoints; - this.wheelchairAccessibility = object.wheelchairAccessibility; - this.occupancyStatus = object.occupancyStatus; + } + + public static TripTimes of(ScheduledTripTimes scheduledTripTimes) { + return new TripTimes(scheduledTripTimes); } /** - * Trips may also have null headsigns, in which case we should fall back on a Timetable or + * Copy scheduled times, but not the actual times. + */ + public TripTimes copyOfScheduledTimes() { + return new TripTimes(this, scheduledTripTimes); + } + + /** + * Both trip_headsign and stop_headsign (per stop on a particular trip) are optional GTFS fields. + * A trip may not have a headsign, in which case we should fall back on a Timetable or * Pattern-level headsign. Such a string will be available when we give TripPatterns or * StopPatterns unique human readable route variant names, but a TripTimes currently does not have * a pointer to its enclosing timetable or pattern. */ @Nullable public I18NString getHeadsign(final int stop) { - I18NString tripHeadsign = getTrip().getHeadsign(); - if (headsigns == null) { - return tripHeadsign; - } else { - I18NString stopHeadsign = headsigns[stop]; - return stopHeadsign != null ? stopHeadsign : tripHeadsign; - } + return (headsigns != null && headsigns[stop] != null) + ? headsigns[stop] + : scheduledTripTimes.getHeadsign(stop); } /** @@ -211,27 +116,30 @@ public I18NString getHeadsign(final int stop) { * @return Empty list if there are no vias registered for a stop. */ public List getHeadsignVias(final int stop) { - if (headsignVias == null || headsignVias[stop] == null) { - return List.of(); - } - return List.of(headsignVias[stop]); + return scheduledTripTimes.getHeadsignVias(stop); } /** * @return the whole trip's headsign. Individual stops can have different headsigns. */ public I18NString getTripHeadsign() { - return trip.getHeadsign(); + return scheduledTripTimes.getTripHeadsign(); } - /** @return the time in seconds after midnight that the vehicle arrives at the stop. */ + /** + * The time in seconds after midnight at which the vehicle should arrive at the given stop + * according to the original schedule. + */ public int getScheduledArrivalTime(final int stop) { - return scheduledArrivalTimes[stop] + timeShift; + return scheduledTripTimes.getScheduledArrivalTime(stop); } - /** @return the amount of time in seconds that the vehicle waits at the stop. */ + /** + * The time in seconds after midnight at which the vehicle should leave the given stop according + * to the original schedule. + */ public int getScheduledDepartureTime(final int stop) { - return scheduledDepartureTimes[stop] + timeShift; + return scheduledTripTimes.getScheduledDepartureTime(stop); } /** @@ -244,77 +152,62 @@ public int sortIndex() { return getDepartureTime(0); } - /** @return the time in seconds after midnight that the vehicle arrives at the stop. */ + /** + * The time in seconds after midnight at which the vehicle arrives at each stop, accounting for + * any real-time updates. + */ public int getArrivalTime(final int stop) { - if (arrivalTimes == null) { - return getScheduledArrivalTime(stop); - } else return arrivalTimes[stop]; // updated times are not time shifted. + return getOrElse(stop, arrivalTimes, scheduledTripTimes::getScheduledArrivalTime); } - /** @return the amount of time in seconds that the vehicle waits at the stop. */ + /** + * The time in seconds after midnight at which the vehicle leaves each stop, accounting for any + * real-time updates. + */ public int getDepartureTime(final int stop) { - if (departureTimes == null) { - return getScheduledDepartureTime(stop); - } else return departureTimes[stop]; // updated times are not time shifted. + return getOrElse(stop, departureTimes, scheduledTripTimes::getScheduledDepartureTime); } /** @return the difference between the scheduled and actual arrival times at this stop. */ public int getArrivalDelay(final int stop) { - return getArrivalTime(stop) - (scheduledArrivalTimes[stop] + timeShift); + return getArrivalTime(stop) - scheduledTripTimes.getScheduledArrivalTime(stop); } /** @return the difference between the scheduled and actual departure times at this stop. */ public int getDepartureDelay(final int stop) { - return getDepartureTime(stop) - (scheduledDepartureTimes[stop] + timeShift); + return getDepartureTime(stop) - scheduledTripTimes.getScheduledDepartureTime(stop); } public void setRecorded(int stop) { - prepareForRealTimeUpdates(); - stopRealTimeStates[stop] = StopRealTimeState.RECORDED; + setStopRealTimeStates(stop, StopRealTimeState.RECORDED); } public void setCancelled(int stop) { - prepareForRealTimeUpdates(); - stopRealTimeStates[stop] = StopRealTimeState.CANCELLED; + setStopRealTimeStates(stop, StopRealTimeState.CANCELLED); } public void setNoData(int stop) { - prepareForRealTimeUpdates(); - stopRealTimeStates[stop] = StopRealTimeState.NO_DATA; + setStopRealTimeStates(stop, StopRealTimeState.NO_DATA); } public void setPredictionInaccurate(int stop) { - prepareForRealTimeUpdates(); - stopRealTimeStates[stop] = StopRealTimeState.INACCURATE_PREDICTIONS; + setStopRealTimeStates(stop, StopRealTimeState.INACCURATE_PREDICTIONS); } public boolean isCancelledStop(int stop) { - if (stopRealTimeStates == null) { - return false; - } - return stopRealTimeStates[stop] == StopRealTimeState.CANCELLED; + return isStopRealTimeStates(stop, StopRealTimeState.CANCELLED); } - // TODO OTP2 - Unused, but will be used by Transmodel API public boolean isRecordedStop(int stop) { - if (stopRealTimeStates == null) { - return false; - } - return stopRealTimeStates[stop] == StopRealTimeState.RECORDED; + return isStopRealTimeStates(stop, StopRealTimeState.RECORDED); } public boolean isNoDataStop(int stop) { - if (stopRealTimeStates == null) { - return false; - } - return stopRealTimeStates[stop] == StopRealTimeState.NO_DATA; + return isStopRealTimeStates(stop, StopRealTimeState.NO_DATA); } public boolean isPredictionInaccurate(int stop) { - if (stopRealTimeStates == null) { - return false; - } - return stopRealTimeStates[stop] == StopRealTimeState.INACCURATE_PREDICTIONS; + return isStopRealTimeStates(stop, StopRealTimeState.INACCURATE_PREDICTIONS); } public void setOccupancyStatus(int stop, OccupancyStatus occupancyStatus) { @@ -322,6 +215,9 @@ public void setOccupancyStatus(int stop, OccupancyStatus occupancyStatus) { this.occupancyStatus[stop] = occupancyStatus; } + /** + * This is only for API-purposes (does not affect routing). + */ public OccupancyStatus getOccupancyStatus(int stop) { if (this.occupancyStatus == null) { return OccupancyStatus.NO_DATA_AVAILABLE; @@ -330,47 +226,44 @@ public OccupancyStatus getOccupancyStatus(int stop) { } public BookingInfo getDropOffBookingInfo(int stop) { - return dropOffBookingInfos.get(stop); + return scheduledTripTimes.getDropOffBookingInfo(stop); } public BookingInfo getPickupBookingInfo(int stop) { - return pickupBookingInfos.get(stop); + return scheduledTripTimes.getPickupBookingInfo(stop); } /** - * @return true if this TripTimes represents an unmodified, scheduled trip from a published - * timetable or false if it is a updated, cancelled, or otherwise modified one. This method - * differs from {@link #getRealTimeState()} in that it checks whether real-time information is - * actually available in this TripTimes. + * Return {@code true} if the trip is unmodified, a scheduled trip from a published timetable. + * Return {@code false} if the trip is an updated, cancelled, or otherwise modified one. This + * method differs from {@link #getRealTimeState()} in that it checks whether real-time + * information is actually available. */ public boolean isScheduled() { return realTimeState == RealTimeState.SCHEDULED; } /** - * @return true if this TripTimes is canceled or soft-deleted + * Return {@code true} if canceled or soft-deleted */ public boolean isCanceledOrDeleted() { return isCanceled() || isDeleted(); } /** - * @return true if this TripTimes is canceled + * Return {@code true} if canceled */ public boolean isCanceled() { return realTimeState == RealTimeState.CANCELED; } /** - * @return true if this TripTimes is soft-deleted, and should not be visible to the user + * Return true if trip is soft-deleted, and should not be visible to the user */ public boolean isDeleted() { return realTimeState == RealTimeState.DELETED; } - /** - * @return the real-time state of this TripTimes - */ public RealTimeState getRealTimeState() { return realTimeState; } @@ -385,10 +278,10 @@ public void setRealTimeState(final RealTimeState realTimeState) { * checks that all internal times are increasing. Thus, this check should be used at the end of * updating trip times, after any propagating or interpolating delay operations. * - * @return empty if times were found to be increasing, stop index of the first error otherwise + * @return empty if times were found to be increasing, the first validation error otherwise */ public Optional validateNonIncreasingTimes() { - final int nStops = scheduledArrivalTimes.length; + final int nStops = arrivalTimes.length; int prevDep = -9_999_999; for (int s = 0; s < nStops; s++) { final int arr = getArrivalTime(s); @@ -499,7 +392,7 @@ public void updateDepartureTime(final int stop, final int time) { public void updateDepartureDelay(final int stop, final int delay) { prepareForRealTimeUpdates(); - departureTimes[stop] = scheduledDepartureTimes[stop] + timeShift + delay; + departureTimes[stop] = scheduledTripTimes.getScheduledDepartureTime(stop) + delay; } public void updateArrivalTime(final int stop, final int time) { @@ -509,10 +402,12 @@ public void updateArrivalTime(final int stop, final int time) { public void updateArrivalDelay(final int stop, final int delay) { prepareForRealTimeUpdates(); - arrivalTimes[stop] = scheduledArrivalTimes[stop] + timeShift + delay; + arrivalTimes[stop] = scheduledTripTimes.getScheduledArrivalTime(stop) + delay; } + @Nullable public Accessibility getWheelchairAccessibility() { + // No need to fall back to scheduled state, since it is copied over in the constructor return wheelchairAccessibility; } @@ -521,10 +416,10 @@ public void updateWheelchairAccessibility(Accessibility wheelchairAccessibility) } public int getNumStops() { - return scheduledArrivalTimes.length; + return scheduledTripTimes.getNumStops(); } - /** Sort TripTimes based on first departure time. */ + /** Sort trips based on first departure time. */ @Override public int compareTo(final TripTimes other) { return this.getDepartureTime(0) - other.getDepartureTime(0); @@ -540,59 +435,67 @@ public TripTimes timeShift(final int stop, final int time, final boolean depart) if (arrivalTimes != null || departureTimes != null) { return null; } - final TripTimes shifted = new TripTimes(this); // Adjust 0-based times to match desired stoptime. final int shift = time - (depart ? getDepartureTime(stop) : getArrivalTime(stop)); - // existing shift should usually (always?) be 0 on freqs - shifted.timeShift = shifted.timeShift + shift; - return shifted; + + return new TripTimes( + this, + scheduledTripTimes.copyOfNoDuplication().plusTimeShift(shift).build() + ); } - // Time-shift all times on this trip. This is used when updating the time zone for the trip. - public void timeShift(Duration duration) { - timeShift += duration.toSeconds(); + /** + * Time-shift all times on this trip. This is used when updating the time zone for the trip. + */ + public TripTimes adjustTimesToGraphTimeZone(Duration shiftDelta) { + return new TripTimes( + this, + scheduledTripTimes.copyOfNoDuplication().plusTimeShift((int) shiftDelta.toSeconds()).build() + ); } /** - * Returns the GTFS sequence number of the given 0-based stop index. + * Returns the GTFS sequence number of the given 0-based stop position. + * + * These are the GTFS stop sequence numbers, which show the order in which the vehicle visits the + * stops. Despite the fact that the StopPattern or TripPattern enclosing this TripTimes provides + * an ordered list of Stops, the original stop sequence numbers may still be needed for matching + * with GTFS-RT update messages. Unfortunately, each individual trip can have totally different + * sequence numbers for the same stops, so we need to store them at the individual trip level. An + * effort is made to re-use the sequence number arrays when they are the same across different + * trips in the same pattern. */ public int gtfsSequenceOfStopIndex(final int stop) { - return originalGtfsStopSequence[stop]; + return scheduledTripTimes.gtfsSequenceOfStopIndex(stop); } /** * Returns the 0-based stop index of the given GTFS sequence number. */ public OptionalInt stopIndexOfGtfsSequence(int stopSequence) { - if (originalGtfsStopSequence == null) { - return OptionalInt.empty(); - } - for (int i = 0; i < originalGtfsStopSequence.length; i++) { - var sequence = originalGtfsStopSequence[i]; - if (sequence == stopSequence) { - return OptionalInt.of(i); - } - } - return OptionalInt.empty(); + return scheduledTripTimes.stopIndexOfGtfsSequence(stopSequence); } - /** @return whether or not stopIndex is considered a timepoint in this TripTimes. */ + /** + * Whether or not stopIndex is considered a GTFS timepoint. + */ public boolean isTimepoint(final int stopIndex) { - return timepoints.get(stopIndex); + return scheduledTripTimes.isTimepoint(stopIndex); } /** The code for the service on which this trip runs. For departure search optimizations. */ public int getServiceCode() { - return serviceCode; + return scheduledTripTimes.getServiceCode(); } public void setServiceCode(int serviceCode) { - this.serviceCode = serviceCode; + this.scheduledTripTimes = + scheduledTripTimes.copyOfNoDuplication().withServiceCode(serviceCode).build(); } - /** The trips whose arrivals and departures are represented by this TripTimes */ + /** The trips whose arrivals and departures are represented by this class */ public Trip getTrip() { - return trip; + return scheduledTripTimes.getTrip(); } /** @@ -657,48 +560,29 @@ public boolean adjustTimesBeforeWhenRequired(int firstUpdatedIndex, boolean setN return hasAdjustedTimes; } + /* private member methods */ + + private void setStopRealTimeStates(int stop, StopRealTimeState state) { + prepareForRealTimeUpdates(); + this.stopRealTimeStates[stop] = state; + } + /** - * @return either an array of headsigns (one for each stop on this trip) or null if the headsign - * is the same at all stops (including null) and can be found in the Trip object. + * The real-time states for a given stops. If the state is DEFAULT for a stop, + * the {@link #getRealTimeState()} should determine the realtime state of the stop. + *

+ * This is only for API-purposes (does not affect routing). */ - private I18NString[] makeHeadsignsArray(final Collection stopTimes) { - final I18NString tripHeadsign = trip.getHeadsign(); - boolean useStopHeadsigns = false; - if (tripHeadsign == null) { - useStopHeadsigns = true; - } else { - for (final StopTime st : stopTimes) { - if (!(tripHeadsign.equals(st.getStopHeadsign()))) { - useStopHeadsigns = true; - break; - } - } - } - if (!useStopHeadsigns) { - return null; //defer to trip_headsign - } - boolean allNull = true; - int i = 0; - final I18NString[] hs = new I18NString[stopTimes.size()]; - for (final StopTime st : stopTimes) { - final I18NString headsign = st.getStopHeadsign(); - hs[i++] = headsign; - if (headsign != null) allNull = false; - } - if (allNull) { - return null; - } else { - return hs; - } + private boolean isStopRealTimeStates(int stop, StopRealTimeState state) { + return stopRealTimeStates != null && stopRealTimeStates[stop] == state; } public void setHeadsign(int index, I18NString headsign) { if (headsigns == null) { - if (headsign.equals(trip.getHeadsign())) { + if (headsign.equals(getTrip().getHeadsign())) { return; } - - this.headsigns = new I18NString[scheduledArrivalTimes.length]; + this.headsigns = scheduledTripTimes.copyHeadsigns(() -> new I18NString[getNumStops()]); this.headsigns[index] = headsign; return; } @@ -707,35 +591,8 @@ public void setHeadsign(int index, I18NString headsign) { headsigns[index] = headsign; } - /** - * Create 2D String array for via names for each stop in sequence. - * - * @return May be null if no vias are present in stop sequence. - */ - private String[][] makeHeadsignViasArray(final Collection stopTimes) { - if ( - stopTimes - .stream() - .allMatch(st -> st.getHeadsignVias() == null || st.getHeadsignVias().isEmpty()) - ) { - return null; - } - - String[][] vias = new String[stopTimes.size()][]; - - int i = 0; - for (final StopTime st : stopTimes) { - if (st.getHeadsignVias() == null) { - vias[i] = EMPTY_STRING_ARRAY; - i++; - continue; - } - - vias[i] = st.getHeadsignVias().toArray(EMPTY_STRING_ARRAY); - i++; - } - - return vias; + private static int getOrElse(int index, int[] array, IntUnaryOperator defaultValue) { + return array != null ? array[index] : defaultValue.applyAsInt(index); } /** @@ -746,23 +603,16 @@ private String[][] makeHeadsignViasArray(final Collection stopTimes) { */ private void prepareForRealTimeUpdates() { if (arrivalTimes == null) { - this.arrivalTimes = Arrays.copyOf(scheduledArrivalTimes, scheduledArrivalTimes.length); - this.departureTimes = Arrays.copyOf(scheduledDepartureTimes, scheduledDepartureTimes.length); + this.arrivalTimes = scheduledTripTimes.copyArrivalTimes(); + this.departureTimes = scheduledTripTimes.copyDepartureTimes(); + // Update the real-time state + this.realTimeState = RealTimeState.UPDATED; this.stopRealTimeStates = new StopRealTimeState[arrivalTimes.length]; + Arrays.fill(stopRealTimeStates, StopRealTimeState.DEFAULT); + this.headsigns = scheduledTripTimes.copyHeadsigns(() -> null); this.occupancyStatus = new OccupancyStatus[arrivalTimes.length]; - if (headsigns != null) { - headsigns = Arrays.copyOf(headsigns, headsigns.length); - } - - for (int i = 0; i < arrivalTimes.length; i++) { - arrivalTimes[i] += timeShift; - departureTimes[i] += timeShift; - stopRealTimeStates[i] = StopRealTimeState.DEFAULT; - occupancyStatus[i] = OccupancyStatus.NO_DATA_AVAILABLE; - } - - // Update the real-time state - realTimeState = RealTimeState.UPDATED; + Arrays.fill(occupancyStatus, OccupancyStatus.NO_DATA_AVAILABLE); + // skip immutable types: scheduledTripTimes & wheelchairAccessibility } } } diff --git a/src/main/java/org/opentripplanner/transit/model/timetable/TripTimesFactory.java b/src/main/java/org/opentripplanner/transit/model/timetable/TripTimesFactory.java new file mode 100644 index 00000000000..1bb953b81c5 --- /dev/null +++ b/src/main/java/org/opentripplanner/transit/model/timetable/TripTimesFactory.java @@ -0,0 +1,28 @@ +package org.opentripplanner.transit.model.timetable; + +import java.util.Collection; +import org.opentripplanner.model.StopTime; +import org.opentripplanner.transit.model.framework.Deduplicator; + +/** + * The responsibility of this class is to create TripTimes based on StopTimes. The + * TripTimes should not have a dependency to StopTimes, so this class act as a middleman. + * Eventually this class should not be needed - the intermediate step to map feeds into + * StopTimes and then map stop-times into TripTimes is unnecessary - we should map the + * feeds directly into {@link ScheduledTripTimes} using the builder instead. + */ +public class TripTimesFactory { + + /** + * The provided stopTimes are assumed to be pre-filtered, valid, and monotonically increasing. The + * non-interpolated stoptimes should already be marked at timepoints by a previous filtering + * step. + */ + public static TripTimes tripTimes( + Trip trip, + Collection stopTimes, + Deduplicator deduplicator + ) { + return new TripTimes(StopTimeToScheduledTripTimesMapper.map(trip, stopTimes, deduplicator)); + } +} diff --git a/src/main/java/org/opentripplanner/updater/trip/TimetableSnapshotSource.java b/src/main/java/org/opentripplanner/updater/trip/TimetableSnapshotSource.java index d9a3a683c1a..6cda95eb983 100644 --- a/src/main/java/org/opentripplanner/updater/trip/TimetableSnapshotSource.java +++ b/src/main/java/org/opentripplanner/updater/trip/TimetableSnapshotSource.java @@ -55,6 +55,7 @@ import org.opentripplanner.transit.model.timetable.RealTimeState; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.opentripplanner.transit.service.DefaultTransitService; import org.opentripplanner.transit.service.TransitEditorService; import org.opentripplanner.transit.service.TransitModel; @@ -885,7 +886,7 @@ private Result addTripToGraphAndBuffer( ); // Create new trip times - final TripTimes newTripTimes = new TripTimes(trip, stopTimes, deduplicator); + final TripTimes newTripTimes = TripTimesFactory.tripTimes(trip, stopTimes, deduplicator); // Update all times to mark trip times as realtime // TODO: should we incorporate the delay field if present? @@ -945,7 +946,7 @@ private boolean cancelScheduledTrip( if (tripIndex == -1) { debug(tripId, "Could not cancel scheduled trip because it's not in the timetable"); } else { - final TripTimes newTripTimes = new TripTimes(timetable.getTripTimes(tripIndex)); + final TripTimes newTripTimes = timetable.getTripTimes(tripIndex).copyOfScheduledTimes(); switch (cancelationType) { case CANCEL -> newTripTimes.cancelTrip(); case DELETE -> newTripTimes.deleteTrip(); @@ -985,7 +986,7 @@ private boolean cancelPreviouslyAddedTrip( if (tripIndex == -1) { debug(tripId, "Could not cancel previously added trip on {}", serviceDate); } else { - final TripTimes newTripTimes = new TripTimes(timetable.getTripTimes(tripIndex)); + final TripTimes newTripTimes = timetable.getTripTimes(tripIndex).copyOfScheduledTimes(); switch (cancelationType) { case CANCEL -> newTripTimes.cancelTrip(); case DELETE -> newTripTimes.deleteTrip(); diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 7b5390eb51d..e71ba4aae49 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -73,6 +73,10 @@ + + + + diff --git a/src/test/java/org/opentripplanner/TestServerContext.java b/src/test/java/org/opentripplanner/TestServerContext.java index a62aba32759..1f3e6491232 100644 --- a/src/test/java/org/opentripplanner/TestServerContext.java +++ b/src/test/java/org/opentripplanner/TestServerContext.java @@ -49,6 +49,7 @@ public static OtpServerRequestContext createServerContext( createEmissionsService(), routerConfig.flexConfig(), List.of(), + null, null ); creatTransitLayerForRaptor(transitModel, routerConfig.transitTuningConfig()); diff --git a/src/test/java/org/opentripplanner/_support/geometry/Coordinates.java b/src/test/java/org/opentripplanner/_support/geometry/Coordinates.java index bfa8e0da94e..3e5bddd9f94 100644 --- a/src/test/java/org/opentripplanner/_support/geometry/Coordinates.java +++ b/src/test/java/org/opentripplanner/_support/geometry/Coordinates.java @@ -5,6 +5,8 @@ public class Coordinates { public static final Coordinate BERLIN = new Coordinate(52.5212, 13.4105); + public static final Coordinate BERLIN_BRANDENBURG_GATE = new Coordinate(52.51627, 13.37770); public static final Coordinate HAMBURG = new Coordinate(53.5566, 10.0003); public static final Coordinate KONGSBERG_PLATFORM_1 = new Coordinate(59.67216, 9.65107); + public static final Coordinate BOSTON = new Coordinate(42.36541, -71.06129); } diff --git a/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java b/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java index 16b078b3e77..a293c940713 100644 --- a/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java +++ b/src/test/java/org/opentripplanner/apis/gtfs/GraphQLIntegrationTest.java @@ -82,7 +82,7 @@ import org.opentripplanner.transit.model.network.TripPattern; import org.opentripplanner.transit.model.site.RegularStop; import org.opentripplanner.transit.model.site.StopLocation; -import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.opentripplanner.transit.service.DefaultTransitService; import org.opentripplanner.transit.service.TransitModel; @@ -138,7 +138,7 @@ static void setup() { final TripPattern pattern = TEST_MODEL.pattern(BUS).build(); var trip = TransitModelForTest.trip("123").withHeadsign(I18NString.of("Trip Headsign")).build(); var stopTimes = TEST_MODEL.stopTimesEvery5Minutes(3, trip, T11_00); - var tripTimes = new TripTimes(trip, stopTimes, DEDUPLICATOR); + var tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, DEDUPLICATOR); pattern.add(tripTimes); transitModel.addTripPattern(id("pattern-1"), pattern); diff --git a/src/test/java/org/opentripplanner/framework/tostring/MultiLineToStringBuilderTest.java b/src/test/java/org/opentripplanner/framework/tostring/MultiLineToStringBuilderTest.java new file mode 100644 index 00000000000..495a8649cef --- /dev/null +++ b/src/test/java/org/opentripplanner/framework/tostring/MultiLineToStringBuilderTest.java @@ -0,0 +1,62 @@ +package org.opentripplanner.framework.tostring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.time.Duration; +import java.util.List; +import org.junit.jupiter.api.Test; + +class MultiLineToStringBuilderTest { + + @Test + void testAdd() { + assertEquals( + """ + Test { + foo... : bar + number : 500 + } + """.trim(), + MultiLineToStringBuilder + .of("Test") + .add("foo", "bar") + .add("number", 500) + .add("null", null) + .toString() + ); + } + + @Test + void testAddDuration() { + assertEquals( + """ + Test { + foo : 5m20s + } + """.trim(), + MultiLineToStringBuilder.of("Test").addDuration("foo", Duration.ofSeconds(320)).toString() + ); + } + + @Test + void testAddColNl() { + assertEquals( + """ + Test { + foo : [ + A new line + for each entry + in list! + ] + } + """.trim(), + MultiLineToStringBuilder + .of("Test") + .addColNl("foo", List.of("A new line", "for each entry", "in list!")) + // These are not added: + .addColNl("null", null) + .addColNl("empty", List.of()) + .toString() + ); + } +} diff --git a/src/test/java/org/opentripplanner/generate/doc/StopConsolidationDocTest.java b/src/test/java/org/opentripplanner/generate/doc/StopConsolidationDocTest.java new file mode 100644 index 00000000000..62f76032a09 --- /dev/null +++ b/src/test/java/org/opentripplanner/generate/doc/StopConsolidationDocTest.java @@ -0,0 +1,76 @@ +package org.opentripplanner.generate.doc; + +import static org.opentripplanner.framework.io.FileUtils.assertFileEquals; +import static org.opentripplanner.framework.io.FileUtils.readFile; +import static org.opentripplanner.framework.io.FileUtils.writeFile; +import static org.opentripplanner.generate.doc.framework.DocsTestConstants.DOCS_ROOT; +import static org.opentripplanner.generate.doc.framework.DocsTestConstants.TEMPLATE_ROOT; +import static org.opentripplanner.generate.doc.framework.TemplateUtil.replaceSection; +import static org.opentripplanner.standalone.config.framework.json.JsonSupport.jsonNodeFromResource; + +import java.io.File; +import org.junit.jupiter.api.Test; +import org.opentripplanner.generate.doc.framework.DocBuilder; +import org.opentripplanner.generate.doc.framework.GeneratesDocumentation; +import org.opentripplanner.generate.doc.framework.TemplateUtil; +import org.opentripplanner.standalone.config.BuildConfig; +import org.opentripplanner.standalone.config.framework.json.NodeAdapter; +import org.opentripplanner.test.support.ResourceLoader; + +@GeneratesDocumentation +public class StopConsolidationDocTest { + + private static final String FILE_NAME = "StopConsolidation.md"; + private static final File TEMPLATE = new File(TEMPLATE_ROOT, FILE_NAME); + private static final File OUT_FILE = new File(DOCS_ROOT + "/sandbox", FILE_NAME); + + private static final String CONFIG_FILENAME = "standalone/config/build-config.json"; + + @Test + public void updateDoc() { + NodeAdapter node = readConfig(); + + var lines = ResourceLoader + .of(this) + .lines("/org/opentripplanner/ext/stopconsolidation/consolidated-stops.csv", 6); + + // Read and close input file (same as output file) + String template = readFile(TEMPLATE); + String original = readFile(OUT_FILE); + + var joined = String.join("\n", lines); + + var csvExample = """ + ``` + %s + ``` + """.formatted(joined); + + template = replaceSection(template, "config", updaterDoc(node)); + template = replaceSection(template, "file", csvExample); + + writeFile(OUT_FILE, template); + assertFileEquals(original, OUT_FILE); + } + + private NodeAdapter readConfig() { + var json = jsonNodeFromResource(CONFIG_FILENAME); + final String propName = "stopConsolidationFile"; + var node = json.path(propName); + var jsonNode = TemplateUtil.jsonExampleBuilder(node).wrapInObject(propName).build(); + var adapter = new NodeAdapter(jsonNode, "source"); + var conf = new BuildConfig(adapter, false); + return conf.asNodeAdapter(); + } + + private String updaterDoc(NodeAdapter node) { + DocBuilder buf = new DocBuilder(); + addExample(buf, node); + return buf.toString(); + } + + private void addExample(DocBuilder buf, NodeAdapter node) { + var root = TemplateUtil.jsonExampleBuilder(node.rawNode()).build(); + buf.addExample("build-config.json", root); + } +} diff --git a/src/test/java/org/opentripplanner/graph_builder/module/interlining/InterlineProcessorTest.java b/src/test/java/org/opentripplanner/gtfs/interlining/InterlineProcessorTest.java similarity index 96% rename from src/test/java/org/opentripplanner/graph_builder/module/interlining/InterlineProcessorTest.java rename to src/test/java/org/opentripplanner/gtfs/interlining/InterlineProcessorTest.java index 1519cce3372..1e931589204 100644 --- a/src/test/java/org/opentripplanner/graph_builder/module/interlining/InterlineProcessorTest.java +++ b/src/test/java/org/opentripplanner/gtfs/interlining/InterlineProcessorTest.java @@ -1,4 +1,4 @@ -package org.opentripplanner.graph_builder.module.interlining; +package org.opentripplanner.gtfs.interlining; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -21,7 +21,7 @@ import org.opentripplanner.transit.model.framework.FeedScopedId; import org.opentripplanner.transit.model.network.StopPattern; import org.opentripplanner.transit.model.network.TripPattern; -import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; class InterlineProcessorTest implements PlanTestConstants { @@ -167,7 +167,7 @@ private static TripPattern tripPattern(String tripId, String blockId, String ser .withRoute(trip.getRoute()) .withStopPattern(stopPattern) .build(); - var tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + var tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); tp.add(tripTimes); return tp; } diff --git a/src/test/java/org/opentripplanner/model/TripTimeOnDateTest.java b/src/test/java/org/opentripplanner/model/TripTimeOnDateTest.java index d3c21909e74..78002e46eae 100644 --- a/src/test/java/org/opentripplanner/model/TripTimeOnDateTest.java +++ b/src/test/java/org/opentripplanner/model/TripTimeOnDateTest.java @@ -8,7 +8,7 @@ import org.opentripplanner.transit.model._data.TransitModelForTest; import org.opentripplanner.transit.model.basic.TransitMode; import org.opentripplanner.transit.model.framework.Deduplicator; -import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; class TripTimeOnDateTest implements PlanTestConstants { @@ -19,7 +19,7 @@ void gtfsSequence() { var trip = TransitModelForTest.trip("123").build(); var stopTimes = testModel.stopTimesEvery5Minutes(3, trip, T11_00); - var tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + var tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); var subject = new TripTimeOnDate(tripTimes, 2, pattern); diff --git a/src/test/java/org/opentripplanner/model/impl/OtpTransitServiceBuilderLimitPeriodTest.java b/src/test/java/org/opentripplanner/model/impl/OtpTransitServiceBuilderLimitPeriodTest.java index 90a077eb205..5d1fef21271 100644 --- a/src/test/java/org/opentripplanner/model/impl/OtpTransitServiceBuilderLimitPeriodTest.java +++ b/src/test/java/org/opentripplanner/model/impl/OtpTransitServiceBuilderLimitPeriodTest.java @@ -25,7 +25,7 @@ import org.opentripplanner.transit.model.site.RegularStop; import org.opentripplanner.transit.model.timetable.Direction; import org.opentripplanner.transit.model.timetable.Trip; -import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.opentripplanner.transit.service.StopModel; /** @@ -193,7 +193,7 @@ private TripPattern createTripPattern(Collection trips) { .build(); for (Trip trip : trips) { - p.add(new TripTimes(trip, STOP_TIMES, DEDUPLICATOR)); + p.add(TripTimesFactory.tripTimes(trip, STOP_TIMES, DEDUPLICATOR)); } return p; } diff --git a/src/test/java/org/opentripplanner/model/plan/TestItineraryBuilder.java b/src/test/java/org/opentripplanner/model/plan/TestItineraryBuilder.java index 3eccdaaabd1..dafcc639ceb 100644 --- a/src/test/java/org/opentripplanner/model/plan/TestItineraryBuilder.java +++ b/src/test/java/org/opentripplanner/model/plan/TestItineraryBuilder.java @@ -44,6 +44,7 @@ import org.opentripplanner.transit.model.network.TripPattern; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; /** * This is a helper class to allow unit-testing on Itineraries. The builder does not necessarily @@ -475,7 +476,7 @@ public TestItineraryBuilder transit( .withRoute(route) .withStopPattern(stopPattern) .build(); - final TripTimes tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + final TripTimes tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); tripPattern.add(tripTimes); ScheduledTransitLeg leg; diff --git a/src/test/java/org/opentripplanner/model/plan/legreference/ScheduledTransitLegReferenceTest.java b/src/test/java/org/opentripplanner/model/plan/legreference/ScheduledTransitLegReferenceTest.java index 22252093aba..a3fab1838cb 100644 --- a/src/test/java/org/opentripplanner/model/plan/legreference/ScheduledTransitLegReferenceTest.java +++ b/src/test/java/org/opentripplanner/model/plan/legreference/ScheduledTransitLegReferenceTest.java @@ -23,7 +23,7 @@ import org.opentripplanner.transit.model.site.Station; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripOnServiceDate; -import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; import org.opentripplanner.transit.service.DefaultTransitService; import org.opentripplanner.transit.service.StopModel; import org.opentripplanner.transit.service.TransitModel; @@ -64,7 +64,7 @@ static void buildTransitService() { stopIdAtPosition0 = tripPattern.getStop(0).getId(); stopIdAtPosition1 = tripPattern.getStop(1).getId(); stopIdAtPosition2 = tripPattern.getStop(2).getId(); - TripTimes tripTimes = new TripTimes( + var tripTimes = TripTimesFactory.tripTimes( trip, TEST_MODEL.stopTimesEvery5Minutes(5, trip, PlanTestConstants.T11_00), new Deduplicator() diff --git a/src/test/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactoryTest.java b/src/test/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactoryTest.java index 29fcbcd2ce3..5e6951ea7cf 100644 --- a/src/test/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactoryTest.java +++ b/src/test/java/org/opentripplanner/model/plan/pagecursor/PageCursorFactoryTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.opentripplanner.model.plan.SortOrder.STREET_AND_ARRIVAL_TIME; import static org.opentripplanner.model.plan.SortOrder.STREET_AND_DEPARTURE_TIME; +import static org.opentripplanner.model.plan.TestItineraryBuilder.newItinerary; import static org.opentripplanner.model.plan.pagecursor.PageType.NEXT_PAGE; import static org.opentripplanner.model.plan.pagecursor.PageType.PREVIOUS_PAGE; @@ -10,6 +11,7 @@ import java.time.Instant; import org.junit.jupiter.api.Test; import org.opentripplanner.framework.time.TimeUtils; +import org.opentripplanner.model.plan.Itinerary; import org.opentripplanner.model.plan.PlanTestConstants; @SuppressWarnings("ConstantConditions") @@ -23,6 +25,7 @@ class PageCursorFactoryTest implements PlanTestConstants { private static final Instant T10_30 = time("10:30"); private static final Instant T11_01 = time("11:01"); private static final Instant T12_00 = time("12:00"); + private static final Instant T12_10 = time("12:10"); private static final Instant T12_30 = time("12:30"); private static final Instant T13_00 = time("13:00"); private static final Instant T13_30 = time("13:30"); @@ -33,23 +36,29 @@ public void sortArrivalAscending() { .withOriginalSearch(null, T12_00, null, D1H); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE, false); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T10_30, null, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T10_30, null, D90M, PREVIOUS_PAGE, false); } @Test public void sortArrivalAscendingCropSearchWindow() { var factory = new PageCursorFactory(STREET_AND_ARRIVAL_TIME, D90M) .withOriginalSearch(NEXT_PAGE, T12_00, null, D1H) - .withRemovedItineraries(new PageCursorFactoryParametersImpl(T12_00, T12_30, T12_30, T13_30)); + .withRemovedItineraries( + new TestPageCursorInput( + newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_10), B).build(), + newItinerary(A).bus(65, timeAsSeconds(T12_30), timeAsSeconds(T13_30), B).build(), + PagingDeduplicationSection.HEAD + ) + ); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T12_30, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T12_30, null, D90M, NEXT_PAGE, true); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T10_30, T12_00, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T10_30, T12_10, D90M, PREVIOUS_PAGE, true); } @Test @@ -58,23 +67,29 @@ public void sortArrivalAscendingPreviousPage() { .withOriginalSearch(PREVIOUS_PAGE, T12_00, null, D1H); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE, false); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T10_30, null, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T10_30, null, D90M, PREVIOUS_PAGE, false); } @Test public void sortArrivalAscendingCropSearchWindowPreviousPage() { var factory = new PageCursorFactory(STREET_AND_ARRIVAL_TIME, D90M) .withOriginalSearch(PREVIOUS_PAGE, T12_00, null, D1H) - .withRemovedItineraries(new PageCursorFactoryParametersImpl(T12_00, T12_30, T12_30, T13_30)); + .withRemovedItineraries( + new TestPageCursorInput( + newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_10), B).build(), + newItinerary(A).bus(65, timeAsSeconds(T12_30), timeAsSeconds(T13_30), B).build(), + PagingDeduplicationSection.TAIL + ) + ); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE, true); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T11_01, T13_30, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T11_01, T13_30, D90M, PREVIOUS_PAGE, true); } @Test @@ -83,23 +98,29 @@ public void sortDepartureDescending() { .withOriginalSearch(null, T12_00, T13_30, D1H); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE, false); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T10_30, T13_30, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T10_30, T13_30, D90M, PREVIOUS_PAGE, false); } @Test public void sortDepartureDescendingCropSearchWindow() { var factory = new PageCursorFactory(STREET_AND_DEPARTURE_TIME, D90M) .withOriginalSearch(PREVIOUS_PAGE, T12_00, T13_30, D1H) - .withRemovedItineraries(new PageCursorFactoryParametersImpl(T12_30, T12_30, T12_30, T13_00)); + .withRemovedItineraries( + new TestPageCursorInput( + newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_30), B).build(), + newItinerary(A).bus(65, timeAsSeconds(T12_30), timeAsSeconds(T13_00), B).build(), + PagingDeduplicationSection.HEAD + ) + ); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE, true); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T11_01, T13_00, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T11_01, T13_00, D90M, PREVIOUS_PAGE, true); } @Test @@ -108,47 +129,84 @@ public void sortDepartureDescendingNextPage() { .withOriginalSearch(NEXT_PAGE, T12_00, T13_30, D1H); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T13_00, null, D90M, NEXT_PAGE, false); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T10_30, T13_30, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T10_30, T13_30, D90M, PREVIOUS_PAGE, false); } @Test public void sortDepartureDescendingCropSearchWindowNextPage() { var factory = new PageCursorFactory(STREET_AND_DEPARTURE_TIME, D90M) .withOriginalSearch(NEXT_PAGE, T12_00, T13_30, D1H) - .withRemovedItineraries(new PageCursorFactoryParametersImpl(T12_00, T12_30, T12_30, T13_30)); + .withRemovedItineraries( + new TestPageCursorInput( + newItinerary(A).bus(55, timeAsSeconds(T12_00), timeAsSeconds(T12_30), B).build(), + newItinerary(A).bus(65, timeAsSeconds(T12_30), timeAsSeconds(T13_00), B).build(), + PagingDeduplicationSection.TAIL + ) + ); var nextPage = factory.nextPageCursor(); - assertPageCursor(nextPage, T12_30, null, D90M, NEXT_PAGE); + assertPageCursor(nextPage, T12_30, null, D90M, NEXT_PAGE, true); var prevPage = factory.previousPageCursor(); - assertPageCursor(prevPage, T10_30, T13_30, D90M, PREVIOUS_PAGE); + assertPageCursor(prevPage, T10_30, T13_30, D90M, PREVIOUS_PAGE, true); } private static Instant time(String input) { return TIME_ZERO.plusSeconds(TimeUtils.time(input)); } + private static int timeAsSeconds(Instant in) { + return (int) Duration.between(TIME_ZERO, in).getSeconds(); + } + private void assertPageCursor( PageCursor pageCursor, Instant expEdt, Instant expLat, Duration expSearchWindow, - PageType expPageType + PageType expPageType, + Boolean hasDedupeParams ) { assertEquals(expEdt, pageCursor.earliestDepartureTime); assertEquals(expLat, pageCursor.latestArrivalTime); assertEquals(expSearchWindow, pageCursor.searchWindow); assertEquals(expPageType, pageCursor.type); + assertEquals(hasDedupeParams, pageCursor.itineraryPageCut != null); } - private record PageCursorFactoryParametersImpl( + private record TestPageCursorInput( Instant earliestKeptArrival, Instant earliestRemovedDeparture, Instant latestRemovedDeparture, - Instant latestRemovedArrival + Instant latestRemovedArrival, + Instant firstRemovedArrivalTime, + boolean firstRemovedIsOnStreetAllTheWay, + int firstRemovedGeneralizedCost, + int firstRemovedNumOfTransfers, + Instant firstRemovedDepartureTime, + PagingDeduplicationSection deduplicationSection ) - implements PageCursorFactoryParameters {} + implements PageCursorInput { + public TestPageCursorInput( + Itinerary keptItinerary, + Itinerary removedItinerary, + PagingDeduplicationSection deduplicationSection + ) { + this( + keptItinerary.endTimeAsInstant(), + removedItinerary.startTimeAsInstant(), + removedItinerary.startTimeAsInstant(), + removedItinerary.endTimeAsInstant(), + removedItinerary.endTimeAsInstant(), + removedItinerary.isOnStreetAllTheWay(), + removedItinerary.getGeneralizedCost(), + removedItinerary.getNumberOfTransfers(), + removedItinerary.startTimeAsInstant(), + deduplicationSection + ); + } + } } diff --git a/src/test/java/org/opentripplanner/netex/mapping/FlexStopsMapperTest.java b/src/test/java/org/opentripplanner/netex/mapping/FlexStopsMapperTest.java index 474ff2557d8..b59f3c1b58a 100644 --- a/src/test/java/org/opentripplanner/netex/mapping/FlexStopsMapperTest.java +++ b/src/test/java/org/opentripplanner/netex/mapping/FlexStopsMapperTest.java @@ -9,6 +9,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Set; import net.opengis.gml._3.AbstractRingPropertyType; import net.opengis.gml._3.DirectPositionListType; import net.opengis.gml._3.LinearRingType; @@ -18,11 +19,13 @@ import org.opentripplanner.framework.geometry.GeometryUtils; import org.opentripplanner.graph_builder.issue.api.DataImportIssueStore; import org.opentripplanner.transit.model._data.TransitModelForTest; +import org.opentripplanner.transit.model.basic.TransitMode; import org.opentripplanner.transit.model.site.AreaStop; import org.opentripplanner.transit.model.site.GroupStop; import org.opentripplanner.transit.model.site.RegularStop; import org.opentripplanner.transit.model.site.StopLocation; import org.opentripplanner.transit.service.StopModelBuilder; +import org.rutebanken.netex.model.AllVehicleModesOfTransportEnumeration; import org.rutebanken.netex.model.FlexibleArea; import org.rutebanken.netex.model.FlexibleStopPlace; import org.rutebanken.netex.model.FlexibleStopPlace_VersionStructure; @@ -117,6 +120,12 @@ class FlexStopsMapperTest { 63.596915083462335, 10.878374152208456 ); + private static final KeyListStructure KEY_LIST_UNRESTRICTED_PUBLIC_TRANSPORT_AREAS = new KeyListStructure() + .withKeyValue( + new KeyValueStructure() + .withKey("FlexibleStopAreaType") + .withValue("UnrestrictedPublicTransportAreas") + ); private final TransitModelForTest testModel = TransitModelForTest.of(); private final StopModelBuilder stopModelBuilder = testModel.stopModelBuilder(); @@ -162,81 +171,27 @@ void testMapInvalidSelfIntersectingAreaStop() { } @Test - void testMapGroupStop() { - RegularStop stop1 = testModel.stop("A").withCoordinate(59.6505778, 6.3608759).build(); - RegularStop stop2 = testModel.stop("B").withCoordinate(59.6630333, 6.3697245).build(); - + void testMapGroupStopWithKeyValueOnFlexibleStopPlace() { FlexibleStopPlace flexibleStopPlace = getFlexibleStopPlace(AREA_POS_LIST); - flexibleStopPlace.setKeyList( - new KeyListStructure() - .withKeyValue( - new KeyValueStructure() - .withKey("FlexibleStopAreaType") - .withValue("UnrestrictedPublicTransportAreas") - ) - ); - - FlexStopsMapper subject = new FlexStopsMapper( - ID_FACTORY, - List.of(stop1, stop2), - stopModelBuilder, - DataImportIssueStore.NOOP - ); - - GroupStop groupStop = (GroupStop) subject.map(flexibleStopPlace); - - assertNotNull(groupStop); - - // Only one of the stops should be inside the polygon - assertEquals(1, groupStop.getLocations().size()); + flexibleStopPlace.setKeyList(KEY_LIST_UNRESTRICTED_PUBLIC_TRANSPORT_AREAS); + assertGroupStopMapping(flexibleStopPlace); } @Test - void testMapGroupStopVariantWithKeyValueOnArea() { - RegularStop stop1 = testModel.stop("A").withCoordinate(59.6505778, 6.3608759).build(); - RegularStop stop2 = testModel.stop("B").withCoordinate(59.6630333, 6.3697245).build(); - + void testMapGroupStopWithKeyValueOnArea() { FlexibleStopPlace flexibleStopPlace = getFlexibleStopPlace(AREA_POS_LIST); - var area = (FlexibleArea) flexibleStopPlace .getAreas() .getFlexibleAreaOrFlexibleAreaRefOrHailAndRideArea() .get(0); - area.withKeyList( - new KeyListStructure() - .withKeyValue( - new KeyValueStructure() - .withKey("FlexibleStopAreaType") - .withValue("UnrestrictedPublicTransportAreas") - ) - ); - - FlexStopsMapper subject = new FlexStopsMapper( - ID_FACTORY, - List.of(stop1, stop2), - stopModelBuilder, - DataImportIssueStore.NOOP - ); - - GroupStop groupStop = (GroupStop) subject.map(flexibleStopPlace); - - assertNotNull(groupStop); - - // Only one of the stops should be inside the polygon - assertEquals(1, groupStop.getLocations().size()); + area.withKeyList(KEY_LIST_UNRESTRICTED_PUBLIC_TRANSPORT_AREAS); + assertGroupStopMapping(flexibleStopPlace); } @Test void testMapFlexibleStopPlaceMissingStops() { FlexibleStopPlace flexibleStopPlace = getFlexibleStopPlace(AREA_POS_LIST); - flexibleStopPlace.setKeyList( - new KeyListStructure() - .withKeyValue( - new KeyValueStructure() - .withKey("FlexibleStopAreaType") - .withValue("UnrestrictedPublicTransportAreas") - ) - ); + flexibleStopPlace.setKeyList(KEY_LIST_UNRESTRICTED_PUBLIC_TRANSPORT_AREAS); FlexStopsMapper subject = new FlexStopsMapper( ID_FACTORY, @@ -257,14 +212,7 @@ void testMapFlexibleStopPlaceWithInvalidGeometryOnUnrestrictedPublicTransportAre var invalidPolygon = List.of(1.0); FlexibleStopPlace flexibleStopPlace = getFlexibleStopPlace(invalidPolygon); - flexibleStopPlace.setKeyList( - new KeyListStructure() - .withKeyValue( - new KeyValueStructure() - .withKey("FlexibleStopAreaType") - .withValue("UnrestrictedPublicTransportAreas") - ) - ); + flexibleStopPlace.setKeyList(KEY_LIST_UNRESTRICTED_PUBLIC_TRANSPORT_AREAS); FlexStopsMapper subject = new FlexStopsMapper( ID_FACTORY, @@ -278,10 +226,48 @@ void testMapFlexibleStopPlaceWithInvalidGeometryOnUnrestrictedPublicTransportAre assertNull(groupStop); } + private void assertGroupStopMapping(FlexibleStopPlace flexibleStopPlace) { + // Regular stop inside the polygon with same transport mode as the flexible stop + RegularStop stop1 = testModel + .stop("A") + .withCoordinate(59.6505778, 6.3608759) + .withVehicleType(TransitMode.BUS) + .build(); + // Regular stop outside the polygon with same transport mode as the flexible stop + RegularStop stop2 = testModel + .stop("B") + .withCoordinate(59.6630333, 6.3697245) + .withVehicleType(TransitMode.BUS) + .build(); + // Regular stop inside the polygon with another transport mode than the flexible stop + RegularStop stop3 = testModel + .stop("A") + .withCoordinate(59.6505778, 6.3608759) + .withVehicleType(TransitMode.RAIL) + .build(); + + FlexStopsMapper subject = new FlexStopsMapper( + ID_FACTORY, + List.of(stop1, stop2, stop3), + stopModelBuilder, + DataImportIssueStore.NOOP + ); + + GroupStop groupStop = (GroupStop) subject.map(flexibleStopPlace); + + assertNotNull(groupStop); + + // Only one of the stops should be inside the polygon + Set locations = groupStop.getLocations(); + assertEquals(1, locations.size()); + assertEquals(stop1.getId(), locations.stream().findFirst().orElseThrow().getId()); + } + private FlexibleStopPlace getFlexibleStopPlace(Collection areaPosList) { return new FlexibleStopPlace() .withId(FLEXIBLE_STOP_PLACE_ID) .withName(new MultilingualString().withValue(FLEXIBLE_STOP_PLACE_NAME)) + .withTransportMode(AllVehicleModesOfTransportEnumeration.BUS) .withAreas( new FlexibleStopPlace_VersionStructure.Areas() .withFlexibleAreaOrFlexibleAreaRefOrHailAndRideArea( diff --git a/src/test/java/org/opentripplanner/routing/algorithm/filterchain/DeleteResultHandlerTest.java b/src/test/java/org/opentripplanner/routing/algorithm/filterchain/DeleteResultHandlerTest.java index 6d7684907ce..beca0632114 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/filterchain/DeleteResultHandlerTest.java +++ b/src/test/java/org/opentripplanner/routing/algorithm/filterchain/DeleteResultHandlerTest.java @@ -9,7 +9,6 @@ import static org.opentripplanner.model.plan.PlanTestConstants.T11_09; import static org.opentripplanner.model.plan.PlanTestConstants.T11_33; import static org.opentripplanner.model.plan.TestItineraryBuilder.newItinerary; -import static org.opentripplanner.routing.algorithm.filterchain.ItineraryListFilterChainBuilder.MAX_NUMBER_OF_ITINERARIES_TAG; import static org.opentripplanner.routing.api.request.preference.ItineraryFilterDebugProfile.LIMIT_TO_NUM_OF_ITINERARIES; import static org.opentripplanner.routing.api.request.preference.ItineraryFilterDebugProfile.LIMIT_TO_SEARCH_WINDOW; import static org.opentripplanner.routing.api.request.preference.ItineraryFilterDebugProfile.LIST_ALL; @@ -22,6 +21,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.opentripplanner.model.SystemNotice; import org.opentripplanner.model.plan.Itinerary; +import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.NumItinerariesFilter; import org.opentripplanner.routing.algorithm.filterchain.deletionflagger.OutsideSearchWindowFilter; class DeleteResultHandlerTest { @@ -29,7 +29,7 @@ class DeleteResultHandlerTest { private static final String NO_TAG = null; private static final String ANY_TAG = "any-tag"; private static final String OUT_SW_TAG = OutsideSearchWindowFilter.TAG; - private static final String MAX_N_TAG = MAX_NUMBER_OF_ITINERARIES_TAG; + private static final String MAX_N_TAG = NumItinerariesFilter.TAG; private static final List EXP_ALL = List.of(true, true, true); private static final List EXP_1_AND_2 = List.of(true, true, false); private static final List EXP_1 = List.of(true, false, false); diff --git a/src/test/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/PagingFilterTest.java b/src/test/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/PagingFilterTest.java new file mode 100644 index 00000000000..3766f7a6766 --- /dev/null +++ b/src/test/java/org/opentripplanner/routing/algorithm/filterchain/deletionflagger/PagingFilterTest.java @@ -0,0 +1,111 @@ +package org.opentripplanner.routing.algorithm.filterchain.deletionflagger; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.opentripplanner.model.plan.Itinerary.toStr; +import static org.opentripplanner.model.plan.TestItineraryBuilder.newItinerary; +import static org.opentripplanner.model.plan.TestItineraryBuilder.newTime; + +import java.time.Instant; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.opentripplanner.model.plan.Itinerary; +import org.opentripplanner.model.plan.PlanTestConstants; +import org.opentripplanner.model.plan.SortOrder; +import org.opentripplanner.model.plan.pagecursor.ItineraryPageCut; +import org.opentripplanner.model.plan.pagecursor.PagingDeduplicationSection; + +public class PagingFilterTest implements PlanTestConstants { + + private static final Itinerary early = newItinerary(A).bus(1, T11_04, T11_07, B).build(); + + private static final Itinerary middle = newItinerary(A) + .bus(2, T11_03, T11_05, B) + .bus(21, T11_07, T11_10, C) + .build(); + private static final Itinerary late = newItinerary(A).bus(3, T11_00, T11_12, B).build(); + private static final Instant oldSearchWindowEndTime = newTime(T11_05).toInstant(); + + private static PagingFilter pagingFilter; + + @BeforeEach + public void setup() { + pagingFilter = + new PagingFilter( + new ItineraryPageCut( + late.startTime().toInstant(), + oldSearchWindowEndTime, + SortOrder.STREET_AND_ARRIVAL_TIME, + PagingDeduplicationSection.HEAD, + middle.endTime().toInstant(), + middle.startTime().toInstant(), + middle.getGeneralizedCost(), + middle.getNumberOfTransfers(), + false + ) + ); + } + + @Test + public void testName() { + assertEquals("paging-filter", pagingFilter.name()); + } + + @Test + public void testPotentialDuplicateMarkedForDeletionWithEarlierArrival() { + List itineraries = List.of(early, middle, late); + + assertEquals( + toStr(List.of(middle, late)), + toStr(DeletionFlaggerTestHelper.process(itineraries, pagingFilter)) + ); + } + + @Test + public void testPotentialDuplicateMarkedForDeletionWithLowerGeneralizedCost() { + Itinerary middleLowCost = newItinerary(A) + .bus(2, T11_03, T11_05, B) + .bus(21, T11_07, T11_10, C) + .build(); + + middleLowCost.setGeneralizedCost(1); + + List itineraries = List.of(middleLowCost, middle, late); + + assertEquals( + toStr(List.of(middle, late)), + toStr(DeletionFlaggerTestHelper.process(itineraries, pagingFilter)) + ); + } + + @Test + public void testPotentialDuplicateMarkedForDeletionWithFewerNumberOfTransfers() { + Itinerary middleNumberOfTransfers = newItinerary(A).bus(21, T11_03, T11_10, C).build(); + + middleNumberOfTransfers.setGeneralizedCost(middle.getGeneralizedCost()); + + List itineraries = List.of(middleNumberOfTransfers, middle, late); + + assertEquals( + toStr(List.of(middle, late)), + toStr(DeletionFlaggerTestHelper.process(itineraries, pagingFilter)) + ); + } + + @Test + public void testPotentialDuplicateMarkedForDeletionWithLaterDepartureTime() { + Itinerary middleLaterDepartureTime = newItinerary(A) + .bus(2, T11_04, T11_05, B) + .bus(21, T11_07, T11_10, C) + .build(); + + middleLaterDepartureTime.setGeneralizedCost(middle.getGeneralizedCost()); + + List itineraries = List.of(middleLaterDepartureTime, middle, late); + + assertEquals( + toStr(List.of(middle, late)), + toStr(DeletionFlaggerTestHelper.process(itineraries, pagingFilter)) + ); + } +} diff --git a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/BikeRentalSnapshotTest.snap b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/BikeRentalSnapshotTest.snap index d9695705c71..d99f479ac16 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/BikeRentalSnapshotTest.snap +++ b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/BikeRentalSnapshotTest.snap @@ -1,2598 +1,2598 @@ org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.accessBikeRental=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1049, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:32:24.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1049, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:32:24.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "17" + "feedId" : "prt", + "id" : "17" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2209, - "legs": [ + "generalizedCost" : 2209, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:17:26.000+00:00", - "from": { - "departure": "2009-10-21T23:14:55.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 288, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "}f{tGv}{kVjCA?e@WA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:14:55.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:17:26.000+00:00", + "from" : { + "departure" : "2009-10-21T23:14:55.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 288, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "}f{tGv}{kVjCA?e@WA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:14:55.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:17:26.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:17:26.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:17:26.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:17:26.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 493.43, - "endTime": "2009-10-21T23:19:58.000+00:00", - "from": { - "arrival": "2009-10-21T23:17:26.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:17:26.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 493.43, + "endTime" : "2009-10-21T23:19:58.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:17:26.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:17:26.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 409, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 7, - "points": "ic{tGl|{kVV@GsJEuKE}HAwAAo@" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:17:26.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 480.08, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 409, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 7, + "points" : "ic{tGl|{kVV@GsJEuKE}HAwAAo@" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:17:26.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 480.08, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:19:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:19:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:19:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:19:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 29.46, - "endTime": "2009-10-21T23:20:25.000+00:00", - "from": { - "arrival": "2009-10-21T23:19:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:19:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 29.46, + "endTime" : "2009-10-21T23:20:25.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:19:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:19:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 49, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 5, - "points": "ic{tG~uzkV@n@M@C??H" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:19:58.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 19.29, - "elevation": "", - "lat": 45.5277322, - "lon": -122.6942318, - "relativeDirection": "HARD_LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 10.17, - "elevation": "", - "lat": 45.5277276, - "lon": -122.6944793, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 49, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 5, + "points" : "ic{tG~uzkV@n@M@C??H" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:19:58.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 19.29, + "elevation" : "", + "lat" : 45.5277322, + "lon" : -122.6942318, + "relativeDirection" : "HARD_LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 10.17, + "elevation" : "", + "lat" : 45.5277276, + "lon" : -122.6944793, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:20:25.000+00:00", - "departure": "2009-10-21T23:20:25.000+00:00", - "lat": 45.527818, - "lon": -122.694539, - "name": "NW 21st & Irving", - "stopCode": "7114", - "stopId": "prt:7114", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:20:25.000+00:00", + "departure" : "2009-10-21T23:20:25.000+00:00", + "lat" : 45.527818, + "lon" : -122.694539, + "name" : "NW 21st & Irving", + "stopCode" : "7114", + "stopId" : "prt:7114", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1629.43, - "endTime": "2009-10-21T23:30:00.000+00:00", - "from": { - "arrival": "2009-10-21T23:20:25.000+00:00", - "departure": "2009-10-21T23:20:25.000+00:00", - "lat": 45.527818, - "lon": -122.694539, - "name": "NW 21st & Irving", - "stopCode": "7114", - "stopId": "prt:7114", - "stopIndex": 15, - "stopSequence": 16, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 1175, - "headsign": "136th Ave", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:21:20.000+00:00", - "departure": "2009-10-21T23:21:20.000+00:00", - "lat": 45.526408, - "lon": -122.694503, - "name": "NW 21st & Glisan", - "stopCode": "7112", - "stopId": "prt:7112", - "stopIndex": 16, - "stopSequence": 17, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:22:31.000+00:00", - "departure": "2009-10-21T23:22:31.000+00:00", - "lat": 45.524833, - "lon": -122.69398, - "name": "NW Everett & 21st", - "stopCode": "1615", - "stopId": "prt:1615", - "stopIndex": 17, - "stopSequence": 18, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:24:07.000+00:00", - "departure": "2009-10-21T23:24:07.000+00:00", - "lat": 45.524935, - "lon": -122.690502, - "name": "NW Everett & 19th", - "stopCode": "1611", - "stopId": "prt:1611", - "stopIndex": 18, - "stopSequence": 19, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:28.000+00:00", - "departure": "2009-10-21T23:26:28.000+00:00", - "lat": 45.524981, - "lon": -122.68537, - "name": "NW Everett & 14th", - "stopCode": "1608", - "stopId": "prt:1608", - "stopIndex": 19, - "stopSequence": 20, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:28:04.000+00:00", - "departure": "2009-10-21T23:28:04.000+00:00", - "lat": 45.525061, - "lon": -122.68187, - "name": "NW Everett & 11th", - "stopCode": "1607", - "stopId": "prt:1607", - "stopIndex": 20, - "stopSequence": 21, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:29:15.000+00:00", - "departure": "2009-10-21T23:29:15.000+00:00", - "lat": 45.525096, - "lon": -122.67929, - "name": "NW Everett & Park", - "stopCode": "8402", - "stopId": "prt:8402", - "stopIndex": 21, - "stopSequence": 22, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1629.43, + "endTime" : "2009-10-21T23:30:00.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:20:25.000+00:00", + "departure" : "2009-10-21T23:20:25.000+00:00", + "lat" : 45.527818, + "lon" : -122.694539, + "name" : "NW 21st & Irving", + "stopCode" : "7114", + "stopId" : "prt:7114", + "stopIndex" : 15, + "stopSequence" : 16, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 1175, + "headsign" : "136th Ave", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:21:20.000+00:00", + "departure" : "2009-10-21T23:21:20.000+00:00", + "lat" : 45.526408, + "lon" : -122.694503, + "name" : "NW 21st & Glisan", + "stopCode" : "7112", + "stopId" : "prt:7112", + "stopIndex" : 16, + "stopSequence" : 17, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:22:31.000+00:00", + "departure" : "2009-10-21T23:22:31.000+00:00", + "lat" : 45.524833, + "lon" : -122.69398, + "name" : "NW Everett & 21st", + "stopCode" : "1615", + "stopId" : "prt:1615", + "stopIndex" : 17, + "stopSequence" : 18, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:24:07.000+00:00", + "departure" : "2009-10-21T23:24:07.000+00:00", + "lat" : 45.524935, + "lon" : -122.690502, + "name" : "NW Everett & 19th", + "stopCode" : "1611", + "stopId" : "prt:1611", + "stopIndex" : 18, + "stopSequence" : 19, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:28.000+00:00", + "departure" : "2009-10-21T23:26:28.000+00:00", + "lat" : 45.524981, + "lon" : -122.68537, + "name" : "NW Everett & 14th", + "stopCode" : "1608", + "stopId" : "prt:1608", + "stopIndex" : 19, + "stopSequence" : 20, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:28:04.000+00:00", + "departure" : "2009-10-21T23:28:04.000+00:00", + "lat" : 45.525061, + "lon" : -122.68187, + "name" : "NW Everett & 11th", + "stopCode" : "1607", + "stopId" : "prt:1607", + "stopIndex" : 20, + "stopSequence" : 21, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:29:15.000+00:00", + "departure" : "2009-10-21T23:29:15.000+00:00", + "lat" : 45.525096, + "lon" : -122.67929, + "name" : "NW Everett & Park", + "stopCode" : "8402", + "stopId" : "prt:8402", + "stopIndex" : 21, + "stopSequence" : 22, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 39, - "points": "{c{tGnwzkVR?lCEvBC??VAlCClCEAkA??A}BCkEAkECaD???g@CiECiEEiE?c@?o@?]Aa@?w@AoD???YEkEAkECiEA_A??AiCCkECmD???[A_CCiD" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Holgate/NW 21st", - "routeId": "prt:17", - "routeLongName": "Holgate/NW 21st", - "routeShortName": "17", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:20:25.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:30:00.000+00:00", - "departure": "2009-10-21T23:30:00.000+00:00", - "lat": 45.525112, - "lon": -122.677664, - "name": "NW Everett & Broadway", - "stopCode": "1606", - "stopId": "prt:1606", - "stopIndex": 22, - "stopSequence": 23, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": true, - "tripBlockId": "1716", - "tripId": "prt:170W1460" + "legGeometry" : { + "length" : 39, + "points" : "{c{tGnwzkVR?lCEvBC??VAlCClCEAkA??A}BCkEAkECaD???g@CiECiEEiE?c@?o@?]Aa@?w@AoD???YEkEAkECiEA_A??AiCCkECmD???[A_CCiD" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Holgate/NW 21st", + "routeId" : "prt:17", + "routeLongName" : "Holgate/NW 21st", + "routeShortName" : "17", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:20:25.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:30:00.000+00:00", + "departure" : "2009-10-21T23:30:00.000+00:00", + "lat" : 45.525112, + "lon" : -122.677664, + "name" : "NW Everett & Broadway", + "stopCode" : "1606", + "stopId" : "prt:1606", + "stopIndex" : 22, + "stopSequence" : 23, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : true, + "tripBlockId" : "1716", + "tripId" : "prt:170W1460" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 188.35, - "endTime": "2009-10-21T23:32:24.000+00:00", - "from": { - "arrival": "2009-10-21T23:30:00.000+00:00", - "departure": "2009-10-21T23:30:00.000+00:00", - "lat": 45.525112, - "lon": -122.677664, - "name": "NW Everett & Broadway", - "stopCode": "1606", - "stopId": "prt:1606", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 285, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 15, - "points": "}rztGlnwkVM??C?[?SC_D?M?E?MCgD?A?O?C?M?a@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:30:00.000+00:00", - "steps": [ - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 188.36, - "elevation": "", - "lat": 45.5251827, - "lon": -122.6776666, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 188.35, + "endTime" : "2009-10-21T23:32:24.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:30:00.000+00:00", + "departure" : "2009-10-21T23:30:00.000+00:00", + "lat" : 45.525112, + "lon" : -122.677664, + "name" : "NW Everett & Broadway", + "stopCode" : "1606", + "stopId" : "prt:1606", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 285, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 15, + "points" : "}rztGlnwkVM??C?[?SC_D?M?E?MCgD?A?O?C?M?a@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:30:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 188.36, + "elevation" : "", + "lat" : 45.5251827, + "lon" : -122.6776666, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:32:24.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:32:24.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:14:55.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 575, - "waitingTime": 0, - "walkDistance": 817.83, - "walkLimitExceeded": false, - "walkTime": 474 + "startTime" : "2009-10-21T23:14:55.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 575, + "waitingTime" : 0, + "walkDistance" : 817.83, + "walkLimitExceeded" : false, + "walkTime" : 474 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1296, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:38:09.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1296, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:38:09.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2539, - "legs": [ + "generalizedCost" : 2539, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 565.96, - "endTime": "2009-10-21T23:23:59.000+00:00", - "from": { - "departure": "2009-10-21T23:16:33.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 865, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 34, - "points": "}f{tGv}{kVjCAjCEnCCFCFErACj@CLMHGFJLNNNDBDBDBF@FBLBH@FBDBNHNJLDPLb@Z^XPNNTBQT{ARJEP" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:16:33.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 317.41, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHEAST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHWEST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 45.17, - "elevation": "", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHWEST", - "area": false, - "bogusName": true, - "distance": 11.71, - "elevation": "", - "lat": 45.5238426, - "lon": -122.700835, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 565.96, + "endTime" : "2009-10-21T23:23:59.000+00:00", + "from" : { + "departure" : "2009-10-21T23:16:33.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 865, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 34, + "points" : "}f{tGv}{kVjCAjCEnCCFCFErACj@CLMHGFJLNNNDBDBDBF@FBLBH@FBDBNHNJLDPLb@Z^XPNNTBQT{ARJEP" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:16:33.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 317.41, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 45.17, + "elevation" : "", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHWEST", + "area" : false, + "bogusName" : true, + "distance" : 11.71, + "elevation" : "", + "lat" : 45.5238426, + "lon" : -122.700835, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:23:59.000+00:00", - "departure": "2009-10-21T23:23:59.000+00:00", - "lat": 45.523773, - "lon": -122.700988, - "name": "W Burnside & SW Osage", - "stopCode": "9354", - "stopId": "prt:9354", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:23:59.000+00:00", + "departure" : "2009-10-21T23:23:59.000+00:00", + "lat" : 45.523773, + "lon" : -122.700988, + "name" : "W Burnside & SW Osage", + "stopCode" : "9354", + "stopId" : "prt:9354", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2044.41, - "endTime": "2009-10-21T23:34:00.000+00:00", - "from": { - "arrival": "2009-10-21T23:23:59.000+00:00", - "departure": "2009-10-21T23:23:59.000+00:00", - "lat": 45.523773, - "lon": -122.700988, - "name": "W Burnside & SW Osage", - "stopCode": "9354", - "stopId": "prt:9354", - "stopIndex": 36, - "stopSequence": 37, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 1201, - "headsign": "Gresham TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:24:42.000+00:00", - "departure": "2009-10-21T23:24:42.000+00:00", - "lat": 45.523287, - "lon": -122.696995, - "name": "W Burnside & SW St Clair", - "stopCode": "718", - "stopId": "prt:718", - "stopIndex": 37, - "stopSequence": 38, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:25:10.000+00:00", - "departure": "2009-10-21T23:25:10.000+00:00", - "lat": 45.523106, - "lon": -122.69445, - "name": "W Burnside & SW 21st", - "stopCode": "749", - "stopId": "prt:749", - "stopIndex": 38, - "stopSequence": 39, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:25:30.000+00:00", - "departure": "2009-10-21T23:25:30.000+00:00", - "lat": 45.523089, - "lon": -122.692567, - "name": "W Burnside & SW 20th", - "stopCode": "8511", - "stopId": "prt:8511", - "stopIndex": 39, - "stopSequence": 40, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:00.000+00:00", - "departure": "2009-10-21T23:26:00.000+00:00", - "lat": 45.522942, - "lon": -122.689797, - "name": "W Burnside & SW 18th", - "stopCode": "9860", - "stopId": "prt:9860", - "stopIndex": 40, - "stopSequence": 41, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:27:40.000+00:00", - "departure": "2009-10-21T23:27:40.000+00:00", - "lat": 45.522786, - "lon": -122.686682, - "name": "W Burnside & SW 15th", - "stopCode": "725", - "stopId": "prt:725", - "stopIndex": 41, - "stopSequence": 42, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:28:53.000+00:00", - "departure": "2009-10-21T23:28:53.000+00:00", - "lat": 45.522829, - "lon": -122.68439, - "name": "W Burnside & SW 13th", - "stopCode": "723", - "stopId": "prt:723", - "stopIndex": 42, - "stopSequence": 43, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:30:31.000+00:00", - "departure": "2009-10-21T23:30:31.000+00:00", - "lat": 45.522919, - "lon": -122.681327, - "name": "W Burnside & SW 10th", - "stopCode": "10792", - "stopId": "prt:10792", - "stopIndex": 43, - "stopSequence": 44, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:32:01.000+00:00", - "departure": "2009-10-21T23:32:01.000+00:00", - "lat": 45.522977, - "lon": -122.678526, - "name": "W Burnside & SW 8th", - "stopCode": "715", - "stopId": "prt:715", - "stopIndex": 44, - "stopSequence": 45, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:32:52.000+00:00", - "departure": "2009-10-21T23:32:52.000+00:00", - "lat": 45.522961, - "lon": -122.676924, - "name": "W Burnside & SW 6th", - "stopCode": "792", - "stopId": "prt:792", - "stopIndex": 45, - "stopSequence": 46, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2044.41, + "endTime" : "2009-10-21T23:34:00.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:23:59.000+00:00", + "departure" : "2009-10-21T23:23:59.000+00:00", + "lat" : 45.523773, + "lon" : -122.700988, + "name" : "W Burnside & SW Osage", + "stopCode" : "9354", + "stopId" : "prt:9354", + "stopIndex" : 36, + "stopSequence" : 37, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 1201, + "headsign" : "Gresham TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:24:42.000+00:00", + "departure" : "2009-10-21T23:24:42.000+00:00", + "lat" : 45.523287, + "lon" : -122.696995, + "name" : "W Burnside & SW St Clair", + "stopCode" : "718", + "stopId" : "prt:718", + "stopIndex" : 37, + "stopSequence" : 38, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:25:10.000+00:00", + "departure" : "2009-10-21T23:25:10.000+00:00", + "lat" : 45.523106, + "lon" : -122.69445, + "name" : "W Burnside & SW 21st", + "stopCode" : "749", + "stopId" : "prt:749", + "stopIndex" : 38, + "stopSequence" : 39, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:25:30.000+00:00", + "departure" : "2009-10-21T23:25:30.000+00:00", + "lat" : 45.523089, + "lon" : -122.692567, + "name" : "W Burnside & SW 20th", + "stopCode" : "8511", + "stopId" : "prt:8511", + "stopIndex" : 39, + "stopSequence" : 40, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:00.000+00:00", + "departure" : "2009-10-21T23:26:00.000+00:00", + "lat" : 45.522942, + "lon" : -122.689797, + "name" : "W Burnside & SW 18th", + "stopCode" : "9860", + "stopId" : "prt:9860", + "stopIndex" : 40, + "stopSequence" : 41, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:27:40.000+00:00", + "departure" : "2009-10-21T23:27:40.000+00:00", + "lat" : 45.522786, + "lon" : -122.686682, + "name" : "W Burnside & SW 15th", + "stopCode" : "725", + "stopId" : "prt:725", + "stopIndex" : 41, + "stopSequence" : 42, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:28:53.000+00:00", + "departure" : "2009-10-21T23:28:53.000+00:00", + "lat" : 45.522829, + "lon" : -122.68439, + "name" : "W Burnside & SW 13th", + "stopCode" : "723", + "stopId" : "prt:723", + "stopIndex" : 42, + "stopSequence" : 43, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:30:31.000+00:00", + "departure" : "2009-10-21T23:30:31.000+00:00", + "lat" : 45.522919, + "lon" : -122.681327, + "name" : "W Burnside & SW 10th", + "stopCode" : "10792", + "stopId" : "prt:10792", + "stopIndex" : 43, + "stopSequence" : 44, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:32:01.000+00:00", + "departure" : "2009-10-21T23:32:01.000+00:00", + "lat" : 45.522977, + "lon" : -122.678526, + "name" : "W Burnside & SW 8th", + "stopCode" : "715", + "stopId" : "prt:715", + "stopIndex" : 44, + "stopSequence" : 45, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:32:52.000+00:00", + "departure" : "2009-10-21T23:32:52.000+00:00", + "lat" : 45.522961, + "lon" : -122.676924, + "name" : "W Burnside & SW 6th", + "stopCode" : "792", + "stopId" : "prt:792", + "stopIndex" : 45, + "stopSequence" : 46, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 57, - "points": "gkztGz_|kVTmALiBt@mJJ_DBoA??@e@D}AFyDBgADwB??@]BaADgCDmC??By@FiEJoEBuA??DsBD}BBiADmC@y@AiB???Y?g@As@?_@?YAeB@uD???{@G{D?mECeBAu@??Ai@CoEASAuDAmB???MCqEA_B??A{ACsEAwB" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:23:59.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:34:00.000+00:00", - "departure": "2009-10-21T23:34:00.000+00:00", - "lat": 45.522974, - "lon": -122.674799, - "name": "W Burnside & SW 4th", - "stopCode": "772", - "stopId": "prt:772", - "stopIndex": 46, - "stopSequence": 47, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": true, - "tripBlockId": "1237", - "tripId": "prt:201W1450" + "legGeometry" : { + "length" : 57, + "points" : "gkztGz_|kVTmALiBt@mJJ_DBoA??@e@D}AFyDBgADwB??@]BaADgCDmC??By@FiEJoEBuA??DsBD}BBiADmC@y@AiB???Y?g@As@?_@?YAeB@uD???{@G{D?mECeBAu@??Ai@CoEASAuDAmB???MCqEA_B??A{ACsEAwB" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:23:59.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:34:00.000+00:00", + "departure" : "2009-10-21T23:34:00.000+00:00", + "lat" : 45.522974, + "lon" : -122.674799, + "name" : "W Burnside & SW 4th", + "stopCode" : "772", + "stopId" : "prt:772", + "stopIndex" : 46, + "stopSequence" : 47, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : true, + "tripBlockId" : "1237", + "tripId" : "prt:201W1450" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 308.24, - "endTime": "2009-10-21T23:38:09.000+00:00", - "from": { - "arrival": "2009-10-21T23:34:00.000+00:00", - "departure": "2009-10-21T23:34:00.000+00:00", - "lat": 45.522974, - "lon": -122.674799, - "name": "W Burnside & SW 4th", - "stopCode": "772", - "stopId": "prt:772", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 472, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 18, - "points": "qeztGn|vkVK@?v@@f@?RWBK@kBBI?K?wBBI?K?I?mBBK@?M?a@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:34:00.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 45.56, - "elevation": "", - "lat": 45.5230377, - "lon": -122.6748017, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 12.94, - "elevation": "", - "lat": 45.5230254, - "lon": -122.6753863, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Southwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 231.75, - "elevation": "", - "lat": 45.5231412, - "lon": -122.6754031, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 308.24, + "endTime" : "2009-10-21T23:38:09.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:34:00.000+00:00", + "departure" : "2009-10-21T23:34:00.000+00:00", + "lat" : 45.522974, + "lon" : -122.674799, + "name" : "W Burnside & SW 4th", + "stopCode" : "772", + "stopId" : "prt:772", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 472, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 18, + "points" : "qeztGn|vkVK@?v@@f@?RWBK@kBBI?K?wBBI?K?I?mBBK@?M?a@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:34:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 45.56, + "elevation" : "", + "lat" : 45.5230377, + "lon" : -122.6748017, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 12.94, + "elevation" : "", + "lat" : 45.5230254, + "lon" : -122.6753863, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Southwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 231.75, + "elevation" : "", + "lat" : 45.5231412, + "lon" : -122.6754031, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:38:09.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:38:09.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:16:33.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 601, - "waitingTime": 0, - "walkDistance": 874.2, - "walkLimitExceeded": false, - "walkTime": 695 + "startTime" : "2009-10-21T23:16:33.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 601, + "waitingTime" : 0, + "walkDistance" : 874.2, + "walkLimitExceeded" : false, + "walkTime" : 695 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1001, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:40:10.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1001, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:40:10.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "77" + "feedId" : "prt", + "id" : "77" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 1805, - "legs": [ + "generalizedCost" : 1805, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 220.15, - "endTime": "2009-10-21T23:26:21.000+00:00", - "from": { - "departure": "2009-10-21T23:23:29.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 336, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 6, - "points": "}f{tGv}{kVC?mCBmCD@zCN?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:23:29.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 159.62, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 60.52, - "elevation": "", - "lat": 45.529755, - "lon": -122.7006488, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Lovejoy Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 220.15, + "endTime" : "2009-10-21T23:26:21.000+00:00", + "from" : { + "departure" : "2009-10-21T23:23:29.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 336, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 6, + "points" : "}f{tGv}{kVC?mCBmCD@zCN?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:23:29.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 159.62, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 60.52, + "elevation" : "", + "lat" : 45.529755, + "lon" : -122.7006488, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Lovejoy Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:26:21.000+00:00", - "departure": "2009-10-21T23:26:21.000+00:00", - "lat": 45.529662, - "lon": -122.701423, - "name": "2400 Block NW Lovejoy", - "stopCode": "3589", - "stopId": "prt:3589", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:26:21.000+00:00", + "departure" : "2009-10-21T23:26:21.000+00:00", + "lat" : 45.529662, + "lon" : -122.701423, + "name" : "2400 Block NW Lovejoy", + "stopCode" : "3589", + "stopId" : "prt:3589", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2804.13, - "endTime": "2009-10-21T23:39:32.000+00:00", - "from": { - "arrival": "2009-10-21T23:26:21.000+00:00", - "departure": "2009-10-21T23:26:21.000+00:00", - "lat": 45.529662, - "lon": -122.701423, - "name": "2400 Block NW Lovejoy", - "stopCode": "3589", - "stopId": "prt:3589", - "stopIndex": 6, - "stopSequence": 7, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 1391, - "headsign": "Troutdale", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:27:54.000+00:00", - "departure": "2009-10-21T23:27:54.000+00:00", - "lat": 45.529746, - "lon": -122.69688, - "name": "NW Lovejoy & 22nd", - "stopCode": "3596", - "stopId": "prt:3596", - "stopIndex": 7, - "stopSequence": 8, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:28:39.000+00:00", - "departure": "2009-10-21T23:28:39.000+00:00", - "lat": 45.529833, - "lon": -122.694676, - "name": "NW Lovejoy & 21st", - "stopCode": "3595", - "stopId": "prt:3595", - "stopIndex": 8, - "stopSequence": 9, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:30:23.000+00:00", - "departure": "2009-10-21T23:30:23.000+00:00", - "lat": 45.529925, - "lon": -122.689587, - "name": "NW Lovejoy & 18th", - "stopCode": "10751", - "stopId": "prt:10751", - "stopIndex": 9, - "stopSequence": 10, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:32:05.000+00:00", - "departure": "2009-10-21T23:32:05.000+00:00", - "lat": 45.529997, - "lon": -122.684611, - "name": "NW Lovejoy & 13th", - "stopCode": "10752", - "stopId": "prt:10752", - "stopIndex": 10, - "stopSequence": 11, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:33:07.000+00:00", - "departure": "2009-10-21T23:33:07.000+00:00", - "lat": 45.530034, - "lon": -122.68155, - "name": "NW Lovejoy & 10th", - "stopCode": "11000", - "stopId": "prt:11000", - "stopIndex": 11, - "stopSequence": 12, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:34:00.000+00:00", - "departure": "2009-10-21T23:34:00.000+00:00", - "lat": 45.531086, - "lon": -122.680302, - "name": "NW 9th & Marshall", - "stopCode": "12803", - "stopId": "prt:12803", - "stopIndex": 12, - "stopSequence": 13, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:36:50.000+00:00", - "departure": "2009-10-21T23:36:50.000+00:00", - "lat": 45.528405, - "lon": -122.676979, - "name": "NW Station Way & Union Station", - "stopCode": "12804", - "stopId": "prt:12804", - "stopIndex": 13, - "stopSequence": 14, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2804.13, + "endTime" : "2009-10-21T23:39:32.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:26:21.000+00:00", + "departure" : "2009-10-21T23:26:21.000+00:00", + "lat" : 45.529662, + "lon" : -122.701423, + "name" : "2400 Block NW Lovejoy", + "stopCode" : "3589", + "stopId" : "prt:3589", + "stopIndex" : 6, + "stopSequence" : 7, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 1391, + "headsign" : "Troutdale", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:27:54.000+00:00", + "departure" : "2009-10-21T23:27:54.000+00:00", + "lat" : 45.529746, + "lon" : -122.69688, + "name" : "NW Lovejoy & 22nd", + "stopCode" : "3596", + "stopId" : "prt:3596", + "stopIndex" : 7, + "stopSequence" : 8, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:28:39.000+00:00", + "departure" : "2009-10-21T23:28:39.000+00:00", + "lat" : 45.529833, + "lon" : -122.694676, + "name" : "NW Lovejoy & 21st", + "stopCode" : "3595", + "stopId" : "prt:3595", + "stopIndex" : 8, + "stopSequence" : 9, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:30:23.000+00:00", + "departure" : "2009-10-21T23:30:23.000+00:00", + "lat" : 45.529925, + "lon" : -122.689587, + "name" : "NW Lovejoy & 18th", + "stopCode" : "10751", + "stopId" : "prt:10751", + "stopIndex" : 9, + "stopSequence" : 10, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:32:05.000+00:00", + "departure" : "2009-10-21T23:32:05.000+00:00", + "lat" : 45.529997, + "lon" : -122.684611, + "name" : "NW Lovejoy & 13th", + "stopCode" : "10752", + "stopId" : "prt:10752", + "stopIndex" : 10, + "stopSequence" : 11, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:33:07.000+00:00", + "departure" : "2009-10-21T23:33:07.000+00:00", + "lat" : 45.530034, + "lon" : -122.68155, + "name" : "NW Lovejoy & 10th", + "stopCode" : "11000", + "stopId" : "prt:11000", + "stopIndex" : 11, + "stopSequence" : 12, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:34:00.000+00:00", + "departure" : "2009-10-21T23:34:00.000+00:00", + "lat" : 45.531086, + "lon" : -122.680302, + "name" : "NW 9th & Marshall", + "stopCode" : "12803", + "stopId" : "prt:12803", + "stopIndex" : 12, + "stopSequence" : 13, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:36:50.000+00:00", + "departure" : "2009-10-21T23:36:50.000+00:00", + "lat" : 45.528405, + "lon" : -122.676979, + "name" : "NW Station Way & Union Station", + "stopCode" : "12804", + "stopId" : "prt:12804", + "stopIndex" : 13, + "stopSequence" : 14, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 60, - "points": "yo{tG|b|kVC}CEuKGwI???}@G{J???YGsKEuKCuD???UCiECeEAgA?{@AkA?WAwDE{C???i@CiECkECcD??Ae@?mE{BDQ@q@@??{ADCsDbBiB`DaEt@_AVANIX?tBCLK`@c@\\c@l@w@??\\c@FKDCFEXCCgEvBEVAlCClCEnCECoD" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Broadway/Halsey", - "routeId": "prt:77", - "routeLongName": "Broadway/Halsey", - "routeShortName": "77", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:26:21.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:39:32.000+00:00", - "departure": "2009-10-21T23:39:32.000+00:00", - "lat": 45.525183, - "lon": -122.674607, - "name": "NW Everett & 4th", - "stopCode": "9546", - "stopId": "prt:9546", - "stopIndex": 14, - "stopSequence": 15, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": true, - "tripBlockId": "7701", - "tripId": "prt:770W1390" + "legGeometry" : { + "length" : 60, + "points" : "yo{tG|b|kVC}CEuKGwI???}@G{J???YGsKEuKCuD???UCiECeEAgA?{@AkA?WAwDE{C???i@CiECkECcD??Ae@?mE{BDQ@q@@??{ADCsDbBiB`DaEt@_AVANIX?tBCLK`@c@\\c@l@w@??\\c@FKDCFEXCCgEvBEVAlCClCEnCECoD" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Broadway/Halsey", + "routeId" : "prt:77", + "routeLongName" : "Broadway/Halsey", + "routeShortName" : "77", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:26:21.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:39:32.000+00:00", + "departure" : "2009-10-21T23:39:32.000+00:00", + "lat" : 45.525183, + "lon" : -122.674607, + "name" : "NW Everett & 4th", + "stopCode" : "9546", + "stopId" : "prt:9546", + "stopIndex" : 14, + "stopSequence" : 15, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : true, + "tripBlockId" : "7701", + "tripId" : "prt:770W1390" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 49.94, - "endTime": "2009-10-21T23:40:10.000+00:00", - "from": { - "arrival": "2009-10-21T23:39:32.000+00:00", - "departure": "2009-10-21T23:39:32.000+00:00", - "lat": 45.525183, - "lon": -122.674607, - "name": "NW Everett & 4th", - "stopCode": "9546", - "stopId": "prt:9546", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 77, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 3, - "points": "ksztGh{vkVI?@~B" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:39:32.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 49.94, - "elevation": "", - "lat": 45.5252397, - "lon": -122.6746091, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 49.94, + "endTime" : "2009-10-21T23:40:10.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:39:32.000+00:00", + "departure" : "2009-10-21T23:39:32.000+00:00", + "lat" : 45.525183, + "lon" : -122.674607, + "name" : "NW Everett & 4th", + "stopCode" : "9546", + "stopId" : "prt:9546", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 77, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 3, + "points" : "ksztGh{vkVI?@~B" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:39:32.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 49.94, + "elevation" : "", + "lat" : 45.5252397, + "lon" : -122.6746091, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:40:10.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:40:10.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:23:29.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 791, - "waitingTime": 0, - "walkDistance": 270.09, - "walkLimitExceeded": false, - "walkTime": 210 + "startTime" : "2009-10-21T23:23:29.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 791, + "waitingTime" : 0, + "walkDistance" : 270.09, + "walkLimitExceeded" : false, + "walkTime" : 210 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1049, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:45:24.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1049, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:45:24.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "17" + "feedId" : "prt", + "id" : "17" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2209, - "legs": [ + "generalizedCost" : 2209, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:30:26.000+00:00", - "from": { - "departure": "2009-10-21T23:27:55.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 288, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "}f{tGv}{kVjCA?e@WA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:27:55.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:30:26.000+00:00", + "from" : { + "departure" : "2009-10-21T23:27:55.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 288, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "}f{tGv}{kVjCA?e@WA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:27:55.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:30:26.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:30:26.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:30:26.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:30:26.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 493.43, - "endTime": "2009-10-21T23:32:58.000+00:00", - "from": { - "arrival": "2009-10-21T23:30:26.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:30:26.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 493.43, + "endTime" : "2009-10-21T23:32:58.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:30:26.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:30:26.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 409, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 7, - "points": "ic{tGl|{kVV@GsJEuKE}HAwAAo@" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:30:26.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 480.08, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 409, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 7, + "points" : "ic{tGl|{kVV@GsJEuKE}HAwAAo@" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:30:26.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 480.08, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:32:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:32:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:32:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:32:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 29.46, - "endTime": "2009-10-21T23:33:25.000+00:00", - "from": { - "arrival": "2009-10-21T23:32:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:32:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 29.46, + "endTime" : "2009-10-21T23:33:25.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:32:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:32:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 49, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 5, - "points": "ic{tG~uzkV@n@M@C??H" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:32:58.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 19.29, - "elevation": "", - "lat": 45.5277322, - "lon": -122.6942318, - "relativeDirection": "HARD_LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 10.17, - "elevation": "", - "lat": 45.5277276, - "lon": -122.6944793, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 49, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 5, + "points" : "ic{tG~uzkV@n@M@C??H" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:32:58.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 19.29, + "elevation" : "", + "lat" : 45.5277322, + "lon" : -122.6942318, + "relativeDirection" : "HARD_LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 10.17, + "elevation" : "", + "lat" : 45.5277276, + "lon" : -122.6944793, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:33:25.000+00:00", - "departure": "2009-10-21T23:33:25.000+00:00", - "lat": 45.527818, - "lon": -122.694539, - "name": "NW 21st & Irving", - "stopCode": "7114", - "stopId": "prt:7114", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:33:25.000+00:00", + "departure" : "2009-10-21T23:33:25.000+00:00", + "lat" : 45.527818, + "lon" : -122.694539, + "name" : "NW 21st & Irving", + "stopCode" : "7114", + "stopId" : "prt:7114", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1629.43, - "endTime": "2009-10-21T23:43:00.000+00:00", - "from": { - "arrival": "2009-10-21T23:33:25.000+00:00", - "departure": "2009-10-21T23:33:25.000+00:00", - "lat": 45.527818, - "lon": -122.694539, - "name": "NW 21st & Irving", - "stopCode": "7114", - "stopId": "prt:7114", - "stopIndex": 15, - "stopSequence": 16, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 1175, - "headsign": "136th Ave", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:34:20.000+00:00", - "departure": "2009-10-21T23:34:20.000+00:00", - "lat": 45.526408, - "lon": -122.694503, - "name": "NW 21st & Glisan", - "stopCode": "7112", - "stopId": "prt:7112", - "stopIndex": 16, - "stopSequence": 17, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:35:31.000+00:00", - "departure": "2009-10-21T23:35:31.000+00:00", - "lat": 45.524833, - "lon": -122.69398, - "name": "NW Everett & 21st", - "stopCode": "1615", - "stopId": "prt:1615", - "stopIndex": 17, - "stopSequence": 18, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:37:07.000+00:00", - "departure": "2009-10-21T23:37:07.000+00:00", - "lat": 45.524935, - "lon": -122.690502, - "name": "NW Everett & 19th", - "stopCode": "1611", - "stopId": "prt:1611", - "stopIndex": 18, - "stopSequence": 19, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:39:28.000+00:00", - "departure": "2009-10-21T23:39:28.000+00:00", - "lat": 45.524981, - "lon": -122.68537, - "name": "NW Everett & 14th", - "stopCode": "1608", - "stopId": "prt:1608", - "stopIndex": 19, - "stopSequence": 20, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:41:04.000+00:00", - "departure": "2009-10-21T23:41:04.000+00:00", - "lat": 45.525061, - "lon": -122.68187, - "name": "NW Everett & 11th", - "stopCode": "1607", - "stopId": "prt:1607", - "stopIndex": 20, - "stopSequence": 21, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:42:15.000+00:00", - "departure": "2009-10-21T23:42:15.000+00:00", - "lat": 45.525096, - "lon": -122.67929, - "name": "NW Everett & Park", - "stopCode": "8402", - "stopId": "prt:8402", - "stopIndex": 21, - "stopSequence": 22, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1629.43, + "endTime" : "2009-10-21T23:43:00.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:33:25.000+00:00", + "departure" : "2009-10-21T23:33:25.000+00:00", + "lat" : 45.527818, + "lon" : -122.694539, + "name" : "NW 21st & Irving", + "stopCode" : "7114", + "stopId" : "prt:7114", + "stopIndex" : 15, + "stopSequence" : 16, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 1175, + "headsign" : "136th Ave", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:34:20.000+00:00", + "departure" : "2009-10-21T23:34:20.000+00:00", + "lat" : 45.526408, + "lon" : -122.694503, + "name" : "NW 21st & Glisan", + "stopCode" : "7112", + "stopId" : "prt:7112", + "stopIndex" : 16, + "stopSequence" : 17, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:35:31.000+00:00", + "departure" : "2009-10-21T23:35:31.000+00:00", + "lat" : 45.524833, + "lon" : -122.69398, + "name" : "NW Everett & 21st", + "stopCode" : "1615", + "stopId" : "prt:1615", + "stopIndex" : 17, + "stopSequence" : 18, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:37:07.000+00:00", + "departure" : "2009-10-21T23:37:07.000+00:00", + "lat" : 45.524935, + "lon" : -122.690502, + "name" : "NW Everett & 19th", + "stopCode" : "1611", + "stopId" : "prt:1611", + "stopIndex" : 18, + "stopSequence" : 19, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:39:28.000+00:00", + "departure" : "2009-10-21T23:39:28.000+00:00", + "lat" : 45.524981, + "lon" : -122.68537, + "name" : "NW Everett & 14th", + "stopCode" : "1608", + "stopId" : "prt:1608", + "stopIndex" : 19, + "stopSequence" : 20, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:41:04.000+00:00", + "departure" : "2009-10-21T23:41:04.000+00:00", + "lat" : 45.525061, + "lon" : -122.68187, + "name" : "NW Everett & 11th", + "stopCode" : "1607", + "stopId" : "prt:1607", + "stopIndex" : 20, + "stopSequence" : 21, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:42:15.000+00:00", + "departure" : "2009-10-21T23:42:15.000+00:00", + "lat" : 45.525096, + "lon" : -122.67929, + "name" : "NW Everett & Park", + "stopCode" : "8402", + "stopId" : "prt:8402", + "stopIndex" : 21, + "stopSequence" : 22, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 39, - "points": "{c{tGnwzkVR?lCEvBC??VAlCClCEAkA??A}BCkEAkECaD???g@CiECiEEiE?c@?o@?]Aa@?w@AoD???YEkEAkECiEA_A??AiCCkECmD???[A_CCiD" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Holgate/NW 21st", - "routeId": "prt:17", - "routeLongName": "Holgate/NW 21st", - "routeShortName": "17", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:33:25.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:43:00.000+00:00", - "departure": "2009-10-21T23:43:00.000+00:00", - "lat": 45.525112, - "lon": -122.677664, - "name": "NW Everett & Broadway", - "stopCode": "1606", - "stopId": "prt:1606", - "stopIndex": 22, - "stopSequence": 23, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": true, - "tripBlockId": "1708", - "tripId": "prt:170W1470" + "legGeometry" : { + "length" : 39, + "points" : "{c{tGnwzkVR?lCEvBC??VAlCClCEAkA??A}BCkEAkECaD???g@CiECiEEiE?c@?o@?]Aa@?w@AoD???YEkEAkECiEA_A??AiCCkECmD???[A_CCiD" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Holgate/NW 21st", + "routeId" : "prt:17", + "routeLongName" : "Holgate/NW 21st", + "routeShortName" : "17", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:33:25.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:43:00.000+00:00", + "departure" : "2009-10-21T23:43:00.000+00:00", + "lat" : 45.525112, + "lon" : -122.677664, + "name" : "NW Everett & Broadway", + "stopCode" : "1606", + "stopId" : "prt:1606", + "stopIndex" : 22, + "stopSequence" : 23, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : true, + "tripBlockId" : "1708", + "tripId" : "prt:170W1470" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 188.35, - "endTime": "2009-10-21T23:45:24.000+00:00", - "from": { - "arrival": "2009-10-21T23:43:00.000+00:00", - "departure": "2009-10-21T23:43:00.000+00:00", - "lat": 45.525112, - "lon": -122.677664, - "name": "NW Everett & Broadway", - "stopCode": "1606", - "stopId": "prt:1606", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 285, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 15, - "points": "}rztGlnwkVM??C?[?SC_D?M?E?MCgD?A?O?C?M?a@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:43:00.000+00:00", - "steps": [ - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 188.36, - "elevation": "", - "lat": 45.5251827, - "lon": -122.6776666, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 188.35, + "endTime" : "2009-10-21T23:45:24.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:43:00.000+00:00", + "departure" : "2009-10-21T23:43:00.000+00:00", + "lat" : 45.525112, + "lon" : -122.677664, + "name" : "NW Everett & Broadway", + "stopCode" : "1606", + "stopId" : "prt:1606", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 285, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 15, + "points" : "}rztGlnwkVM??C?[?SC_D?M?E?MCgD?A?O?C?M?a@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:43:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 188.36, + "elevation" : "", + "lat" : 45.5251827, + "lon" : -122.6776666, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:45:24.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:45:24.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:27:55.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 575, - "waitingTime": 0, - "walkDistance": 817.83, - "walkLimitExceeded": false, - "walkTime": 474 + "startTime" : "2009-10-21T23:27:55.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 575, + "waitingTime" : 0, + "walkDistance" : 817.83, + "walkLimitExceeded" : false, + "walkTime" : 474 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1049, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:54:24.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1049, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:54:24.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "17" + "feedId" : "prt", + "id" : "17" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2209, - "legs": [ + "generalizedCost" : 2209, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:39:26.000+00:00", - "from": { - "departure": "2009-10-21T23:36:55.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 288, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "}f{tGv}{kVjCA?e@WA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:36:55.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:39:26.000+00:00", + "from" : { + "departure" : "2009-10-21T23:36:55.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 288, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "}f{tGv}{kVjCA?e@WA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:36:55.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:39:26.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:39:26.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:39:26.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:39:26.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 493.43, - "endTime": "2009-10-21T23:41:58.000+00:00", - "from": { - "arrival": "2009-10-21T23:39:26.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:39:26.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 493.43, + "endTime" : "2009-10-21T23:41:58.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:39:26.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:39:26.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 409, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 7, - "points": "ic{tGl|{kVV@GsJEuKE}HAwAAo@" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:39:26.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 480.08, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 409, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 7, + "points" : "ic{tGl|{kVV@GsJEuKE}HAwAAo@" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:39:26.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 480.08, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:41:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:41:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:41:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:41:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 29.46, - "endTime": "2009-10-21T23:42:25.000+00:00", - "from": { - "arrival": "2009-10-21T23:41:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:41:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 29.46, + "endTime" : "2009-10-21T23:42:25.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:41:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:41:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 49, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 5, - "points": "ic{tG~uzkV@n@M@C??H" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:41:58.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 19.29, - "elevation": "", - "lat": 45.5277322, - "lon": -122.6942318, - "relativeDirection": "HARD_LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 10.17, - "elevation": "", - "lat": 45.5277276, - "lon": -122.6944793, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 49, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 5, + "points" : "ic{tG~uzkV@n@M@C??H" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:41:58.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 19.29, + "elevation" : "", + "lat" : 45.5277322, + "lon" : -122.6942318, + "relativeDirection" : "HARD_LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 10.17, + "elevation" : "", + "lat" : 45.5277276, + "lon" : -122.6944793, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:42:25.000+00:00", - "departure": "2009-10-21T23:42:25.000+00:00", - "lat": 45.527818, - "lon": -122.694539, - "name": "NW 21st & Irving", - "stopCode": "7114", - "stopId": "prt:7114", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:42:25.000+00:00", + "departure" : "2009-10-21T23:42:25.000+00:00", + "lat" : 45.527818, + "lon" : -122.694539, + "name" : "NW 21st & Irving", + "stopCode" : "7114", + "stopId" : "prt:7114", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1629.43, - "endTime": "2009-10-21T23:52:00.000+00:00", - "from": { - "arrival": "2009-10-21T23:42:25.000+00:00", - "departure": "2009-10-21T23:42:25.000+00:00", - "lat": 45.527818, - "lon": -122.694539, - "name": "NW 21st & Irving", - "stopCode": "7114", - "stopId": "prt:7114", - "stopIndex": 50, - "stopSequence": 51, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 1175, - "headsign": "136th Ave", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:43:20.000+00:00", - "departure": "2009-10-21T23:43:20.000+00:00", - "lat": 45.526408, - "lon": -122.694503, - "name": "NW 21st & Glisan", - "stopCode": "7112", - "stopId": "prt:7112", - "stopIndex": 51, - "stopSequence": 52, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:44:31.000+00:00", - "departure": "2009-10-21T23:44:31.000+00:00", - "lat": 45.524833, - "lon": -122.69398, - "name": "NW Everett & 21st", - "stopCode": "1615", - "stopId": "prt:1615", - "stopIndex": 52, - "stopSequence": 53, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:46:07.000+00:00", - "departure": "2009-10-21T23:46:07.000+00:00", - "lat": 45.524935, - "lon": -122.690502, - "name": "NW Everett & 19th", - "stopCode": "1611", - "stopId": "prt:1611", - "stopIndex": 53, - "stopSequence": 54, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:48:28.000+00:00", - "departure": "2009-10-21T23:48:28.000+00:00", - "lat": 45.524981, - "lon": -122.68537, - "name": "NW Everett & 14th", - "stopCode": "1608", - "stopId": "prt:1608", - "stopIndex": 54, - "stopSequence": 55, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:50:04.000+00:00", - "departure": "2009-10-21T23:50:04.000+00:00", - "lat": 45.525061, - "lon": -122.68187, - "name": "NW Everett & 11th", - "stopCode": "1607", - "stopId": "prt:1607", - "stopIndex": 55, - "stopSequence": 56, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:51:15.000+00:00", - "departure": "2009-10-21T23:51:15.000+00:00", - "lat": 45.525096, - "lon": -122.67929, - "name": "NW Everett & Park", - "stopCode": "8402", - "stopId": "prt:8402", - "stopIndex": 56, - "stopSequence": 57, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1629.43, + "endTime" : "2009-10-21T23:52:00.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:42:25.000+00:00", + "departure" : "2009-10-21T23:42:25.000+00:00", + "lat" : 45.527818, + "lon" : -122.694539, + "name" : "NW 21st & Irving", + "stopCode" : "7114", + "stopId" : "prt:7114", + "stopIndex" : 50, + "stopSequence" : 51, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 1175, + "headsign" : "136th Ave", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:43:20.000+00:00", + "departure" : "2009-10-21T23:43:20.000+00:00", + "lat" : 45.526408, + "lon" : -122.694503, + "name" : "NW 21st & Glisan", + "stopCode" : "7112", + "stopId" : "prt:7112", + "stopIndex" : 51, + "stopSequence" : 52, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:44:31.000+00:00", + "departure" : "2009-10-21T23:44:31.000+00:00", + "lat" : 45.524833, + "lon" : -122.69398, + "name" : "NW Everett & 21st", + "stopCode" : "1615", + "stopId" : "prt:1615", + "stopIndex" : 52, + "stopSequence" : 53, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:46:07.000+00:00", + "departure" : "2009-10-21T23:46:07.000+00:00", + "lat" : 45.524935, + "lon" : -122.690502, + "name" : "NW Everett & 19th", + "stopCode" : "1611", + "stopId" : "prt:1611", + "stopIndex" : 53, + "stopSequence" : 54, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:48:28.000+00:00", + "departure" : "2009-10-21T23:48:28.000+00:00", + "lat" : 45.524981, + "lon" : -122.68537, + "name" : "NW Everett & 14th", + "stopCode" : "1608", + "stopId" : "prt:1608", + "stopIndex" : 54, + "stopSequence" : 55, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:50:04.000+00:00", + "departure" : "2009-10-21T23:50:04.000+00:00", + "lat" : 45.525061, + "lon" : -122.68187, + "name" : "NW Everett & 11th", + "stopCode" : "1607", + "stopId" : "prt:1607", + "stopIndex" : 55, + "stopSequence" : 56, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:51:15.000+00:00", + "departure" : "2009-10-21T23:51:15.000+00:00", + "lat" : 45.525096, + "lon" : -122.67929, + "name" : "NW Everett & Park", + "stopCode" : "8402", + "stopId" : "prt:8402", + "stopIndex" : 56, + "stopSequence" : 57, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 39, - "points": "{c{tGnwzkVR?lCEvBC??VAlCClCEAkA??A}BCkEAkECaD???g@CiECiEEiE?c@?o@?]Aa@?w@AoD???YEkEAkECiEA_A??AiCCkECmD???[A_CCiD" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Holgate/NW 21st", - "routeId": "prt:17", - "routeLongName": "Holgate/NW 21st", - "routeShortName": "17", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:42:25.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:52:00.000+00:00", - "departure": "2009-10-21T23:52:00.000+00:00", - "lat": 45.525112, - "lon": -122.677664, - "name": "NW Everett & Broadway", - "stopCode": "1606", - "stopId": "prt:1606", - "stopIndex": 57, - "stopSequence": 58, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": true, - "tripBlockId": "1705", - "tripId": "prt:170W1480" + "legGeometry" : { + "length" : 39, + "points" : "{c{tGnwzkVR?lCEvBC??VAlCClCEAkA??A}BCkEAkECaD???g@CiECiEEiE?c@?o@?]Aa@?w@AoD???YEkEAkECiEA_A??AiCCkECmD???[A_CCiD" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Holgate/NW 21st", + "routeId" : "prt:17", + "routeLongName" : "Holgate/NW 21st", + "routeShortName" : "17", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:42:25.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:52:00.000+00:00", + "departure" : "2009-10-21T23:52:00.000+00:00", + "lat" : 45.525112, + "lon" : -122.677664, + "name" : "NW Everett & Broadway", + "stopCode" : "1606", + "stopId" : "prt:1606", + "stopIndex" : 57, + "stopSequence" : 58, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : true, + "tripBlockId" : "1705", + "tripId" : "prt:170W1480" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 188.35, - "endTime": "2009-10-21T23:54:24.000+00:00", - "from": { - "arrival": "2009-10-21T23:52:00.000+00:00", - "departure": "2009-10-21T23:52:00.000+00:00", - "lat": 45.525112, - "lon": -122.677664, - "name": "NW Everett & Broadway", - "stopCode": "1606", - "stopId": "prt:1606", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 285, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 15, - "points": "}rztGlnwkVM??C?[?SC_D?M?E?MCgD?A?O?C?M?a@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:52:00.000+00:00", - "steps": [ - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 188.36, - "elevation": "", - "lat": 45.5251827, - "lon": -122.6776666, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 188.35, + "endTime" : "2009-10-21T23:54:24.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:52:00.000+00:00", + "departure" : "2009-10-21T23:52:00.000+00:00", + "lat" : 45.525112, + "lon" : -122.677664, + "name" : "NW Everett & Broadway", + "stopCode" : "1606", + "stopId" : "prt:1606", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 285, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 15, + "points" : "}rztGlnwkVM??C?[?SC_D?M?E?MCgD?A?O?C?M?a@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:52:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 188.36, + "elevation" : "", + "lat" : 45.5251827, + "lon" : -122.6776666, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:54:24.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:54:24.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:36:55.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 575, - "waitingTime": 0, - "walkDistance": 817.83, - "walkLimitExceeded": false, - "walkTime": 474 + "startTime" : "2009-10-21T23:36:55.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 575, + "waitingTime" : 0, + "walkDistance" : 817.83, + "walkLimitExceeded" : false, + "walkTime" : 474 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1001, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:56:10.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1001, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:56:10.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "77" + "feedId" : "prt", + "id" : "77" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 1805, - "legs": [ + "generalizedCost" : 1805, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 220.15, - "endTime": "2009-10-21T23:42:21.000+00:00", - "from": { - "departure": "2009-10-21T23:39:29.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 336, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 6, - "points": "}f{tGv}{kVC?mCBmCD@zCN?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:39:29.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 159.62, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 60.52, - "elevation": "", - "lat": 45.529755, - "lon": -122.7006488, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Lovejoy Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 220.15, + "endTime" : "2009-10-21T23:42:21.000+00:00", + "from" : { + "departure" : "2009-10-21T23:39:29.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 336, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 6, + "points" : "}f{tGv}{kVC?mCBmCD@zCN?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:39:29.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 159.62, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 60.52, + "elevation" : "", + "lat" : 45.529755, + "lon" : -122.7006488, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Lovejoy Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:42:21.000+00:00", - "departure": "2009-10-21T23:42:21.000+00:00", - "lat": 45.529662, - "lon": -122.701423, - "name": "2400 Block NW Lovejoy", - "stopCode": "3589", - "stopId": "prt:3589", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:42:21.000+00:00", + "departure" : "2009-10-21T23:42:21.000+00:00", + "lat" : 45.529662, + "lon" : -122.701423, + "name" : "2400 Block NW Lovejoy", + "stopCode" : "3589", + "stopId" : "prt:3589", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2804.13, - "endTime": "2009-10-21T23:55:32.000+00:00", - "from": { - "arrival": "2009-10-21T23:42:21.000+00:00", - "departure": "2009-10-21T23:42:21.000+00:00", - "lat": 45.529662, - "lon": -122.701423, - "name": "2400 Block NW Lovejoy", - "stopCode": "3589", - "stopId": "prt:3589", - "stopIndex": 6, - "stopSequence": 7, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 1391, - "headsign": "Troutdale", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:43:54.000+00:00", - "departure": "2009-10-21T23:43:54.000+00:00", - "lat": 45.529746, - "lon": -122.69688, - "name": "NW Lovejoy & 22nd", - "stopCode": "3596", - "stopId": "prt:3596", - "stopIndex": 7, - "stopSequence": 8, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:44:39.000+00:00", - "departure": "2009-10-21T23:44:39.000+00:00", - "lat": 45.529833, - "lon": -122.694676, - "name": "NW Lovejoy & 21st", - "stopCode": "3595", - "stopId": "prt:3595", - "stopIndex": 8, - "stopSequence": 9, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:46:23.000+00:00", - "departure": "2009-10-21T23:46:23.000+00:00", - "lat": 45.529925, - "lon": -122.689587, - "name": "NW Lovejoy & 18th", - "stopCode": "10751", - "stopId": "prt:10751", - "stopIndex": 9, - "stopSequence": 10, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:48:05.000+00:00", - "departure": "2009-10-21T23:48:05.000+00:00", - "lat": 45.529997, - "lon": -122.684611, - "name": "NW Lovejoy & 13th", - "stopCode": "10752", - "stopId": "prt:10752", - "stopIndex": 10, - "stopSequence": 11, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:49:07.000+00:00", - "departure": "2009-10-21T23:49:07.000+00:00", - "lat": 45.530034, - "lon": -122.68155, - "name": "NW Lovejoy & 10th", - "stopCode": "11000", - "stopId": "prt:11000", - "stopIndex": 11, - "stopSequence": 12, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:50:00.000+00:00", - "departure": "2009-10-21T23:50:00.000+00:00", - "lat": 45.531086, - "lon": -122.680302, - "name": "NW 9th & Marshall", - "stopCode": "12803", - "stopId": "prt:12803", - "stopIndex": 12, - "stopSequence": 13, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:52:50.000+00:00", - "departure": "2009-10-21T23:52:50.000+00:00", - "lat": 45.528405, - "lon": -122.676979, - "name": "NW Station Way & Union Station", - "stopCode": "12804", - "stopId": "prt:12804", - "stopIndex": 13, - "stopSequence": 14, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2804.13, + "endTime" : "2009-10-21T23:55:32.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:42:21.000+00:00", + "departure" : "2009-10-21T23:42:21.000+00:00", + "lat" : 45.529662, + "lon" : -122.701423, + "name" : "2400 Block NW Lovejoy", + "stopCode" : "3589", + "stopId" : "prt:3589", + "stopIndex" : 6, + "stopSequence" : 7, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 1391, + "headsign" : "Troutdale", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:43:54.000+00:00", + "departure" : "2009-10-21T23:43:54.000+00:00", + "lat" : 45.529746, + "lon" : -122.69688, + "name" : "NW Lovejoy & 22nd", + "stopCode" : "3596", + "stopId" : "prt:3596", + "stopIndex" : 7, + "stopSequence" : 8, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:44:39.000+00:00", + "departure" : "2009-10-21T23:44:39.000+00:00", + "lat" : 45.529833, + "lon" : -122.694676, + "name" : "NW Lovejoy & 21st", + "stopCode" : "3595", + "stopId" : "prt:3595", + "stopIndex" : 8, + "stopSequence" : 9, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:46:23.000+00:00", + "departure" : "2009-10-21T23:46:23.000+00:00", + "lat" : 45.529925, + "lon" : -122.689587, + "name" : "NW Lovejoy & 18th", + "stopCode" : "10751", + "stopId" : "prt:10751", + "stopIndex" : 9, + "stopSequence" : 10, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:48:05.000+00:00", + "departure" : "2009-10-21T23:48:05.000+00:00", + "lat" : 45.529997, + "lon" : -122.684611, + "name" : "NW Lovejoy & 13th", + "stopCode" : "10752", + "stopId" : "prt:10752", + "stopIndex" : 10, + "stopSequence" : 11, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:49:07.000+00:00", + "departure" : "2009-10-21T23:49:07.000+00:00", + "lat" : 45.530034, + "lon" : -122.68155, + "name" : "NW Lovejoy & 10th", + "stopCode" : "11000", + "stopId" : "prt:11000", + "stopIndex" : 11, + "stopSequence" : 12, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:50:00.000+00:00", + "departure" : "2009-10-21T23:50:00.000+00:00", + "lat" : 45.531086, + "lon" : -122.680302, + "name" : "NW 9th & Marshall", + "stopCode" : "12803", + "stopId" : "prt:12803", + "stopIndex" : 12, + "stopSequence" : 13, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:52:50.000+00:00", + "departure" : "2009-10-21T23:52:50.000+00:00", + "lat" : 45.528405, + "lon" : -122.676979, + "name" : "NW Station Way & Union Station", + "stopCode" : "12804", + "stopId" : "prt:12804", + "stopIndex" : 13, + "stopSequence" : 14, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 60, - "points": "yo{tG|b|kVC}CEuKGwI???}@G{J???YGsKEuKCuD???UCiECeEAgA?{@AkA?WAwDE{C???i@CiECkECcD??Ae@?mE{BDQ@q@@??{ADCsDbBiB`DaEt@_AVANIX?tBCLK`@c@\\c@l@w@??\\c@FKDCFEXCCgEvBEVAlCClCEnCECoD" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Broadway/Halsey", - "routeId": "prt:77", - "routeLongName": "Broadway/Halsey", - "routeShortName": "77", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:42:21.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:55:32.000+00:00", - "departure": "2009-10-21T23:55:32.000+00:00", - "lat": 45.525183, - "lon": -122.674607, - "name": "NW Everett & 4th", - "stopCode": "9546", - "stopId": "prt:9546", - "stopIndex": 14, - "stopSequence": 15, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": true, - "tripBlockId": "7703", - "tripId": "prt:770W1400" + "legGeometry" : { + "length" : 60, + "points" : "yo{tG|b|kVC}CEuKGwI???}@G{J???YGsKEuKCuD???UCiECeEAgA?{@AkA?WAwDE{C???i@CiECkECcD??Ae@?mE{BDQ@q@@??{ADCsDbBiB`DaEt@_AVANIX?tBCLK`@c@\\c@l@w@??\\c@FKDCFEXCCgEvBEVAlCClCEnCECoD" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Broadway/Halsey", + "routeId" : "prt:77", + "routeLongName" : "Broadway/Halsey", + "routeShortName" : "77", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:42:21.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:55:32.000+00:00", + "departure" : "2009-10-21T23:55:32.000+00:00", + "lat" : 45.525183, + "lon" : -122.674607, + "name" : "NW Everett & 4th", + "stopCode" : "9546", + "stopId" : "prt:9546", + "stopIndex" : 14, + "stopSequence" : 15, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : true, + "tripBlockId" : "7703", + "tripId" : "prt:770W1400" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 49.94, - "endTime": "2009-10-21T23:56:10.000+00:00", - "from": { - "arrival": "2009-10-21T23:55:32.000+00:00", - "departure": "2009-10-21T23:55:32.000+00:00", - "lat": 45.525183, - "lon": -122.674607, - "name": "NW Everett & 4th", - "stopCode": "9546", - "stopId": "prt:9546", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 77, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 3, - "points": "ksztGh{vkVI?@~B" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:55:32.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 49.94, - "elevation": "", - "lat": 45.5252397, - "lon": -122.6746091, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 49.94, + "endTime" : "2009-10-21T23:56:10.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:55:32.000+00:00", + "departure" : "2009-10-21T23:55:32.000+00:00", + "lat" : 45.525183, + "lon" : -122.674607, + "name" : "NW Everett & 4th", + "stopCode" : "9546", + "stopId" : "prt:9546", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 77, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 3, + "points" : "ksztGh{vkVI?@~B" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:55:32.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 49.94, + "elevation" : "", + "lat" : 45.5252397, + "lon" : -122.6746091, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:56:10.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:56:10.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:39:29.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 791, - "waitingTime": 0, - "walkDistance": 270.09, - "walkLimitExceeded": false, - "walkTime": 210 + "startTime" : "2009-10-21T23:39:29.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 791, + "waitingTime" : 0, + "walkDistance" : 270.09, + "walkLimitExceeded" : false, + "walkTime" : 210 } ] ] @@ -2601,261 +2601,261 @@ org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.accessBikeR org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.directBikeRental=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 477, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:17:57.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 477, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:17:57.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 1036, - "legs": [ + "generalizedCost" : 1036, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:12:31.000+00:00", - "from": { - "departure": "2009-10-21T23:10:00.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 288, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "}f{tGv}{kVjCA?e@WA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:00.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:12:31.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 288, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "}f{tGv}{kVjCA?e@WA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:12:31.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:12:31.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:12:31.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:12:31.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 493.43, - "endTime": "2009-10-21T23:15:03.000+00:00", - "from": { - "arrival": "2009-10-21T23:12:31.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:12:31.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 493.43, + "endTime" : "2009-10-21T23:15:03.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:12:31.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:12:31.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 409, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 7, - "points": "ic{tGl|{kVV@GsJEuKE}HAwAAo@" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:12:31.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 480.08, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 409, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 7, + "points" : "ic{tGl|{kVV@GsJEuKE}HAwAAo@" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:12:31.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 480.08, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:15:03.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:15:03.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:15:03.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:15:03.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 219.06, - "endTime": "2009-10-21T23:17:57.000+00:00", - "from": { - "arrival": "2009-10-21T23:15:03.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:15:03.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 219.06, + "endTime" : "2009-10-21T23:17:57.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:15:03.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:15:03.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 338, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "ic{tG~uzkVEcJlCE?C" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:15:03.000+00:00", - "steps": [ - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 138.31, - "elevation": "", - "lat": 45.5277322, - "lon": -122.6942318, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.79, - "elevation": "", - "lat": 45.5277652, - "lon": -122.6924569, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 20th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 1.97, - "elevation": "", - "lat": 45.527057, - "lon": -122.6924259, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Hoyt Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 338, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "ic{tG~uzkVEcJlCE?C" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:15:03.000+00:00", + "steps" : [ + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 138.31, + "elevation" : "", + "lat" : 45.5277322, + "lon" : -122.6942318, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.79, + "elevation" : "", + "lat" : 45.5277652, + "lon" : -122.6924569, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 20th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 1.97, + "elevation" : "", + "lat" : 45.527057, + "lon" : -122.6924259, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Hoyt Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:17:57.000+00:00", - "lat": 45.52704, - "lon": -122.6924, - "name": "NW Hoyt St. & NW 20th Ave. (P2)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:17:57.000+00:00", + "lat" : 45.52704, + "lon" : -122.6924, + "name" : "NW Hoyt St. & NW 20th Ave. (P2)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 819.08, - "walkLimitExceeded": false, - "walkTime": 477 + "startTime" : "2009-10-21T23:10:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 819.08, + "walkLimitExceeded" : false, + "walkTime" : 477 } ] ] @@ -2864,201 +2864,201 @@ org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.directBikeR org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.directBikeRentalArrivingAtDestinationWithArriveBy=[ [ { - "arrivedAtDestinationWithRentedBicycle": true, - "duration": 338, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:10:00.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : true, + "duration" : 338, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:10:00.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 830, - "legs": [ + "generalizedCost" : 830, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:06:53.000+00:00", - "from": { - "departure": "2009-10-21T23:04:22.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 288, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "}f{tGv}{kVjCA?e@WA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:04:22.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:06:53.000+00:00", + "from" : { + "departure" : "2009-10-21T23:04:22.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 288, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "}f{tGv}{kVjCA?e@WA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:04:22.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:06:53.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:06:53.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:06:53.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:06:53.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 711.97, - "endTime": "2009-10-21T23:10:00.000+00:00", - "from": { - "arrival": "2009-10-21T23:06:53.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:06:53.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 711.97, + "endTime" : "2009-10-21T23:10:00.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:06:53.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:06:53.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 541, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 11, - "points": "ic{tGl|{kVV@GsJL?F?tBCEuK?g@GmJEuK?C" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:06:53.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 144.55, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 77.98, - "elevation": "", - "lat": 45.5276519, - "lon": -122.6985374, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 476.09, - "elevation": "", - "lat": 45.5269509, - "lon": -122.6985103, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Hoyt Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 541, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 11, + "points" : "ic{tGl|{kVV@GsJL?F?tBCEuK?g@GmJEuK?C" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:06:53.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 144.55, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 77.98, + "elevation" : "", + "lat" : 45.5276519, + "lon" : -122.6985374, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 476.09, + "elevation" : "", + "lat" : 45.5269509, + "lon" : -122.6985103, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Hoyt Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:10:00.000+00:00", - "lat": 45.52704, - "lon": -122.6924, - "name": "NW Hoyt St. & NW 20th Ave. (P2)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.52704, + "lon" : -122.6924, + "name" : "NW Hoyt St. & NW 20th Ave. (P2)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:04:22.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 818.56, - "walkLimitExceeded": false, - "walkTime": 338 + "startTime" : "2009-10-21T23:04:22.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 818.56, + "walkLimitExceeded" : false, + "walkTime" : 338 } ] ] @@ -3067,201 +3067,201 @@ org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.directBikeR org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.directBikeRentalArrivingAtDestinationWithDepartAt=[ [ { - "arrivedAtDestinationWithRentedBicycle": true, - "duration": 337, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:15:37.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : true, + "duration" : 337, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:15:37.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 829, - "legs": [ + "generalizedCost" : 829, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:12:31.000+00:00", - "from": { - "departure": "2009-10-21T23:10:00.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 288, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "}f{tGv}{kVjCA?e@WA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:00.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:12:31.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 288, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "}f{tGv}{kVjCA?e@WA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:12:31.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:12:31.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:12:31.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:12:31.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 712.49, - "endTime": "2009-10-21T23:15:37.000+00:00", - "from": { - "arrival": "2009-10-21T23:12:31.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:12:31.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 712.49, + "endTime" : "2009-10-21T23:15:37.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:12:31.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:12:31.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 540, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 10, - "points": "ic{tGl|{kVV@GsJEuKE}HAwAAo@EcJlCE?C" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:12:31.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 618.39, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.79, - "elevation": "", - "lat": 45.5277652, - "lon": -122.6924569, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 20th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 1.97, - "elevation": "", - "lat": 45.527057, - "lon": -122.6924259, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Hoyt Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 540, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 10, + "points" : "ic{tGl|{kVV@GsJEuKE}HAwAAo@EcJlCE?C" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:12:31.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 618.39, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.79, + "elevation" : "", + "lat" : 45.5277652, + "lon" : -122.6924569, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 20th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 1.97, + "elevation" : "", + "lat" : 45.527057, + "lon" : -122.6924259, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Hoyt Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:15:37.000+00:00", - "lat": 45.52704, - "lon": -122.6924, - "name": "NW Hoyt St. & NW 20th Ave. (P2)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:15:37.000+00:00", + "lat" : 45.52704, + "lon" : -122.6924, + "name" : "NW Hoyt St. & NW 20th Ave. (P2)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 819.08, - "walkLimitExceeded": false, - "walkTime": 337 + "startTime" : "2009-10-21T23:10:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 819.08, + "walkLimitExceeded" : false, + "walkTime" : 337 } ] ] @@ -3270,2712 +3270,2712 @@ org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.directBikeR org.opentripplanner.routing.algorithm.mapping.BikeRentalSnapshotTest.egressBikeRental=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 977, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:28:51.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 977, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:28:51.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "17" + "feedId" : "prt", + "id" : "17" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2119, - "legs": [ + "generalizedCost" : 2119, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 167.87, - "endTime": "2009-10-21T23:14:50.000+00:00", - "from": { - "departure": "2009-10-21T23:12:34.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 261, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 10, - "points": "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:12:34.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.51, - "elevation": "", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 71.38, - "elevation": "", - "lat": 45.52593, - "lon": -122.6755097, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Flanders Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 167.87, + "endTime" : "2009-10-21T23:14:50.000+00:00", + "from" : { + "departure" : "2009-10-21T23:12:34.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 261, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 10, + "points" : "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:12:34.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.51, + "elevation" : "", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 71.38, + "elevation" : "", + "lat" : 45.52593, + "lon" : -122.6755097, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Flanders Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:14:50.000+00:00", - "departure": "2009-10-21T23:14:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:14:50.000+00:00", + "departure" : "2009-10-21T23:14:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1631.03, - "endTime": "2009-10-21T23:23:32.000+00:00", - "from": { - "arrival": "2009-10-21T23:14:50.000+00:00", - "departure": "2009-10-21T23:14:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "stopIndex": 66, - "stopSequence": 67, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1122, - "headsign": "Sauvie Is. via St.Johns", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:15:41.000+00:00", - "departure": "2009-10-21T23:15:41.000+00:00", - "lat": 45.526678, - "lon": -122.677476, - "name": "NW Glisan & Broadway", - "stopCode": "1997", - "stopId": "prt:1997", - "stopIndex": 67, - "stopSequence": 68, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:16:21.000+00:00", - "departure": "2009-10-21T23:16:21.000+00:00", - "lat": 45.526643, - "lon": -122.679075, - "name": "NW Glisan & Park", - "stopCode": "2007", - "stopId": "prt:2007", - "stopIndex": 68, - "stopSequence": 69, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:17:11.000+00:00", - "departure": "2009-10-21T23:17:11.000+00:00", - "lat": 45.526601, - "lon": -122.681091, - "name": "NW Glisan & 10th", - "stopCode": "2011", - "stopId": "prt:2011", - "stopIndex": 69, - "stopSequence": 70, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:18:03.000+00:00", - "departure": "2009-10-21T23:18:03.000+00:00", - "lat": 45.526578, - "lon": -122.683142, - "name": "NW Glisan & 12th", - "stopCode": "2030", - "stopId": "prt:2030", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:18:53.000+00:00", - "departure": "2009-10-21T23:18:53.000+00:00", - "lat": 45.526532, - "lon": -122.685164, - "name": "NW Glisan & 14th", - "stopCode": "2046", - "stopId": "prt:2046", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:19:43.000+00:00", - "departure": "2009-10-21T23:19:43.000+00:00", - "lat": 45.526503, - "lon": -122.687165, - "name": "NW Glisan & 16th", - "stopCode": "2062", - "stopId": "prt:2062", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:20:59.000+00:00", - "departure": "2009-10-21T23:20:59.000+00:00", - "lat": 45.526412, - "lon": -122.690196, - "name": "NW Glisan & 19th", - "stopCode": "2086", - "stopId": "prt:2086", - "stopIndex": 73, - "stopSequence": 74, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:22:31.000+00:00", - "departure": "2009-10-21T23:22:31.000+00:00", - "lat": 45.526387, - "lon": -122.693889, - "name": "NW Glisan & 21st", - "stopCode": "2099", - "stopId": "prt:2099", - "stopIndex": 74, - "stopSequence": 75, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1631.03, + "endTime" : "2009-10-21T23:23:32.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:14:50.000+00:00", + "departure" : "2009-10-21T23:14:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "stopIndex" : 66, + "stopSequence" : 67, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1122, + "headsign" : "Sauvie Is. via St.Johns", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:15:41.000+00:00", + "departure" : "2009-10-21T23:15:41.000+00:00", + "lat" : 45.526678, + "lon" : -122.677476, + "name" : "NW Glisan & Broadway", + "stopCode" : "1997", + "stopId" : "prt:1997", + "stopIndex" : 67, + "stopSequence" : 68, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:16:21.000+00:00", + "departure" : "2009-10-21T23:16:21.000+00:00", + "lat" : 45.526643, + "lon" : -122.679075, + "name" : "NW Glisan & Park", + "stopCode" : "2007", + "stopId" : "prt:2007", + "stopIndex" : 68, + "stopSequence" : 69, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:17:11.000+00:00", + "departure" : "2009-10-21T23:17:11.000+00:00", + "lat" : 45.526601, + "lon" : -122.681091, + "name" : "NW Glisan & 10th", + "stopCode" : "2011", + "stopId" : "prt:2011", + "stopIndex" : 69, + "stopSequence" : 70, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:18:03.000+00:00", + "departure" : "2009-10-21T23:18:03.000+00:00", + "lat" : 45.526578, + "lon" : -122.683142, + "name" : "NW Glisan & 12th", + "stopCode" : "2030", + "stopId" : "prt:2030", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:18:53.000+00:00", + "departure" : "2009-10-21T23:18:53.000+00:00", + "lat" : 45.526532, + "lon" : -122.685164, + "name" : "NW Glisan & 14th", + "stopCode" : "2046", + "stopId" : "prt:2046", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:19:43.000+00:00", + "departure" : "2009-10-21T23:19:43.000+00:00", + "lat" : 45.526503, + "lon" : -122.687165, + "name" : "NW Glisan & 16th", + "stopCode" : "2062", + "stopId" : "prt:2062", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:20:59.000+00:00", + "departure" : "2009-10-21T23:20:59.000+00:00", + "lat" : 45.526412, + "lon" : -122.690196, + "name" : "NW Glisan & 19th", + "stopCode" : "2086", + "stopId" : "prt:2086", + "stopIndex" : 73, + "stopSequence" : 74, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:22:31.000+00:00", + "departure" : "2009-10-21T23:22:31.000+00:00", + "lat" : 45.526387, + "lon" : -122.693889, + "name" : "NW Glisan & 21st", + "stopCode" : "2099", + "stopId" : "prt:2099", + "stopIndex" : 74, + "stopSequence" : 75, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 39, - "points": "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Holgate/NW 21st", - "routeId": "prt:17", - "routeLongName": "Holgate/NW 21st", - "routeShortName": "17", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:14:50.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:23:32.000+00:00", - "departure": "2009-10-21T23:23:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "stopIndex": 75, - "stopSequence": 76, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "1707", - "tripId": "prt:171W1490" + "legGeometry" : { + "length" : 39, + "points" : "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Holgate/NW 21st", + "routeId" : "prt:17", + "routeLongName" : "Holgate/NW 21st", + "routeShortName" : "17", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:14:50.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:23:32.000+00:00", + "departure" : "2009-10-21T23:23:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "stopIndex" : 75, + "stopSequence" : 76, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "1707", + "tripId" : "prt:171W1490" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 28.26, - "endTime": "2009-10-21T23:24:58.000+00:00", - "from": { - "arrival": "2009-10-21T23:23:32.000+00:00", - "departure": "2009-10-21T23:23:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 167, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "wb{tG`wzkV?LO?Ao@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:23:32.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 8.97, - "elevation": "", - "lat": 45.527647, - "lon": -122.6944769, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 19.29, - "elevation": "", - "lat": 45.5277276, - "lon": -122.6944793, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 28.26, + "endTime" : "2009-10-21T23:24:58.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:23:32.000+00:00", + "departure" : "2009-10-21T23:23:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 167, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "wb{tG`wzkV?LO?Ao@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:23:32.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 8.97, + "elevation" : "", + "lat" : 45.527647, + "lon" : -122.6944769, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 19.29, + "elevation" : "", + "lat" : 45.5277276, + "lon" : -122.6944793, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:24:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:24:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:24:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:24:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 493.43, - "endTime": "2009-10-21T23:27:20.000+00:00", - "from": { - "arrival": "2009-10-21T23:24:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:24:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 493.43, + "endTime" : "2009-10-21T23:27:20.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:24:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:24:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 399, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 7, - "points": "ic{tG~uzkV@n@@vAD|HDtKFrJWA" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:24:58.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 480.08, - "elevation": "", - "lat": 45.5277322, - "lon": -122.6942318, - "relativeDirection": "HARD_LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 399, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 7, + "points" : "ic{tG~uzkV@n@@vAD|HDtKFrJWA" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:24:58.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 480.08, + "elevation" : "", + "lat" : 45.5277322, + "lon" : -122.6942318, + "relativeDirection" : "HARD_LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true } ], - "to": { - "arrival": "2009-10-21T23:27:20.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:27:20.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:27:20.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:27:20.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:28:51.000+00:00", - "from": { - "arrival": "2009-10-21T23:27:20.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:27:20.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:28:51.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:27:20.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:27:20.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 168, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "ic{tGl|{kVV@?d@kC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:27:20.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 168, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "ic{tGl|{kVV@?d@kC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:27:20.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:28:51.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:28:51.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:12:34.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 522, - "waitingTime": 0, - "walkDistance": 796.15, - "walkLimitExceeded": false, - "walkTime": 455 + "startTime" : "2009-10-21T23:12:34.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 522, + "waitingTime" : 0, + "walkDistance" : 796.15, + "walkLimitExceeded" : false, + "walkTime" : 455 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1276, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:35:24.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1276, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:35:24.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2503, - "legs": [ + "generalizedCost" : 2503, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 287.82, - "endTime": "2009-10-21T23:18:00.000+00:00", - "from": { - "departure": "2009-10-21T23:14:08.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 442, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 17, - "points": "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:14:08.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 231.76, - "elevation": "", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 38.08, - "elevation": "", - "lat": 45.5231412, - "lon": -122.6754031, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 287.82, + "endTime" : "2009-10-21T23:18:00.000+00:00", + "from" : { + "departure" : "2009-10-21T23:14:08.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 442, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 17, + "points" : "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:14:08.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 231.76, + "elevation" : "", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 38.08, + "elevation" : "", + "lat" : 45.5231412, + "lon" : -122.6754031, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:18:00.000+00:00", - "departure": "2009-10-21T23:18:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:18:00.000+00:00", + "departure" : "2009-10-21T23:18:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1942.25, - "endTime": "2009-10-21T23:28:03.000+00:00", - "from": { - "arrival": "2009-10-21T23:18:00.000+00:00", - "departure": "2009-10-21T23:18:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1203, - "headsign": "Beaverton TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:19:43.000+00:00", - "departure": "2009-10-21T23:19:43.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:21:13.000+00:00", - "departure": "2009-10-21T23:21:13.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:22:18.000+00:00", - "departure": "2009-10-21T23:22:18.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:24:52.000+00:00", - "departure": "2009-10-21T23:24:52.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:00.000+00:00", - "departure": "2009-10-21T23:26:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:24.000+00:00", - "departure": "2009-10-21T23:26:24.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:35.000+00:00", - "departure": "2009-10-21T23:26:35.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:55.000+00:00", - "departure": "2009-10-21T23:26:55.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:27:32.000+00:00", - "departure": "2009-10-21T23:27:32.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1942.25, + "endTime" : "2009-10-21T23:28:03.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:18:00.000+00:00", + "departure" : "2009-10-21T23:18:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1203, + "headsign" : "Beaverton TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:19:43.000+00:00", + "departure" : "2009-10-21T23:19:43.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:21:13.000+00:00", + "departure" : "2009-10-21T23:21:13.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:22:18.000+00:00", + "departure" : "2009-10-21T23:22:18.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:24:52.000+00:00", + "departure" : "2009-10-21T23:24:52.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:00.000+00:00", + "departure" : "2009-10-21T23:26:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:24.000+00:00", + "departure" : "2009-10-21T23:26:24.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:35.000+00:00", + "departure" : "2009-10-21T23:26:35.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:55.000+00:00", + "departure" : "2009-10-21T23:26:55.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:27:32.000+00:00", + "departure" : "2009-10-21T23:27:32.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 56, - "points": "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:18:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:28:03.000+00:00", - "departure": "2009-10-21T23:28:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "stopIndex": 109, - "stopSequence": 110, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "2069", - "tripId": "prt:200W1440" + "legGeometry" : { + "length" : 56, + "points" : "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:18:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:28:03.000+00:00", + "departure" : "2009-10-21T23:28:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "stopIndex" : 109, + "stopSequence" : 110, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "2069", + "tripId" : "prt:200W1440" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 563.7, - "endTime": "2009-10-21T23:35:24.000+00:00", - "from": { - "arrival": "2009-10-21T23:28:03.000+00:00", - "departure": "2009-10-21T23:28:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 858, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 34, - "points": "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:28:03.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 54.63, - "elevation": "", - "lat": 45.5238156, - "lon": -122.7007199, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 317.41, - "elevation": "", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 563.7, + "endTime" : "2009-10-21T23:35:24.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:28:03.000+00:00", + "departure" : "2009-10-21T23:28:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 858, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 34, + "points" : "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:28:03.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 54.63, + "elevation" : "", + "lat" : 45.5238156, + "lon" : -122.7007199, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 317.41, + "elevation" : "", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:35:24.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:35:24.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:14:08.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 603, - "waitingTime": 0, - "walkDistance": 851.52, - "walkLimitExceeded": false, - "walkTime": 673 + "startTime" : "2009-10-21T23:14:08.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 603, + "waitingTime" : 0, + "walkDistance" : 851.52, + "walkLimitExceeded" : false, + "walkTime" : 673 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1134, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:37:21.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1134, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:37:21.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "77" + "feedId" : "prt", + "id" : "77" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2351, - "legs": [ + "generalizedCost" : 2351, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 252.88, - "endTime": "2009-10-21T23:21:53.000+00:00", - "from": { - "departure": "2009-10-21T23:18:27.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 392, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 15, - "points": "ssztGh_wkV?`@?LK?uBBK?K@sBBM??D?L@\\?lCC??E" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:18:27.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 158.01, - "elevation": "", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 74.23, - "elevation": "", - "lat": 45.5266447, - "lon": -122.6755391, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Glisan Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 2.66, - "elevation": "", - "lat": 45.5266303, - "lon": -122.6764917, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 252.88, + "endTime" : "2009-10-21T23:21:53.000+00:00", + "from" : { + "departure" : "2009-10-21T23:18:27.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 392, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 15, + "points" : "ssztGh_wkV?`@?LK?uBBK?K@sBBM??D?L@\\?lCC??E" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:18:27.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 158.01, + "elevation" : "", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 74.23, + "elevation" : "", + "lat" : 45.5266447, + "lon" : -122.6755391, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Glisan Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 2.66, + "elevation" : "", + "lat" : 45.5266303, + "lon" : -122.6764917, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:21:53.000+00:00", - "departure": "2009-10-21T23:21:53.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:21:53.000+00:00", + "departure" : "2009-10-21T23:21:53.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2232.31, - "endTime": "2009-10-21T23:29:50.000+00:00", - "from": { - "arrival": "2009-10-21T23:21:53.000+00:00", - "departure": "2009-10-21T23:21:53.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "stopIndex": 85, - "stopSequence": 86, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1077, - "headsign": "Montgomery Park", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:22:57.000+00:00", - "departure": "2009-10-21T23:22:57.000+00:00", - "lat": 45.528799, - "lon": -122.677238, - "name": "NW Station Way & Union Station", - "stopCode": "12801", - "stopId": "prt:12801", - "stopIndex": 86, - "stopSequence": 87, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:25:00.000+00:00", - "departure": "2009-10-21T23:25:00.000+00:00", - "lat": 45.531582, - "lon": -122.681193, - "name": "NW Northrup & 10th", - "stopCode": "12802", - "stopId": "prt:12802", - "stopIndex": 87, - "stopSequence": 88, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:25:33.000+00:00", - "departure": "2009-10-21T23:25:33.000+00:00", - "lat": 45.531534, - "lon": -122.683319, - "name": "NW 12th & Northrup", - "stopCode": "12796", - "stopId": "prt:12796", - "stopIndex": 88, - "stopSequence": 89, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:04.000+00:00", - "departure": "2009-10-21T23:26:04.000+00:00", - "lat": 45.531503, - "lon": -122.685357, - "name": "NW Northrup & 14th", - "stopCode": "10775", - "stopId": "prt:10775", - "stopIndex": 89, - "stopSequence": 90, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:27:07.000+00:00", - "departure": "2009-10-21T23:27:07.000+00:00", - "lat": 45.531434, - "lon": -122.689417, - "name": "NW Northrup & 18th", - "stopCode": "10776", - "stopId": "prt:10776", - "stopIndex": 90, - "stopSequence": 91, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:28:24.000+00:00", - "departure": "2009-10-21T23:28:24.000+00:00", - "lat": 45.531346, - "lon": -122.694455, - "name": "NW Northrup & 21st", - "stopCode": "10777", - "stopId": "prt:10777", - "stopIndex": 91, - "stopSequence": 92, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:28:55.000+00:00", - "departure": "2009-10-21T23:28:55.000+00:00", - "lat": 45.531308, - "lon": -122.696445, - "name": "NW Northrup & 22nd", - "stopCode": "10778", - "stopId": "prt:10778", - "stopIndex": 92, - "stopSequence": 93, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2232.31, + "endTime" : "2009-10-21T23:29:50.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:21:53.000+00:00", + "departure" : "2009-10-21T23:21:53.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "stopIndex" : 85, + "stopSequence" : 86, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1077, + "headsign" : "Montgomery Park", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:22:57.000+00:00", + "departure" : "2009-10-21T23:22:57.000+00:00", + "lat" : 45.528799, + "lon" : -122.677238, + "name" : "NW Station Way & Union Station", + "stopCode" : "12801", + "stopId" : "prt:12801", + "stopIndex" : 86, + "stopSequence" : 87, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:25:00.000+00:00", + "departure" : "2009-10-21T23:25:00.000+00:00", + "lat" : 45.531582, + "lon" : -122.681193, + "name" : "NW Northrup & 10th", + "stopCode" : "12802", + "stopId" : "prt:12802", + "stopIndex" : 87, + "stopSequence" : 88, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:25:33.000+00:00", + "departure" : "2009-10-21T23:25:33.000+00:00", + "lat" : 45.531534, + "lon" : -122.683319, + "name" : "NW 12th & Northrup", + "stopCode" : "12796", + "stopId" : "prt:12796", + "stopIndex" : 88, + "stopSequence" : 89, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:04.000+00:00", + "departure" : "2009-10-21T23:26:04.000+00:00", + "lat" : 45.531503, + "lon" : -122.685357, + "name" : "NW Northrup & 14th", + "stopCode" : "10775", + "stopId" : "prt:10775", + "stopIndex" : 89, + "stopSequence" : 90, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:27:07.000+00:00", + "departure" : "2009-10-21T23:27:07.000+00:00", + "lat" : 45.531434, + "lon" : -122.689417, + "name" : "NW Northrup & 18th", + "stopCode" : "10776", + "stopId" : "prt:10776", + "stopIndex" : 90, + "stopSequence" : 91, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:28:24.000+00:00", + "departure" : "2009-10-21T23:28:24.000+00:00", + "lat" : 45.531346, + "lon" : -122.694455, + "name" : "NW Northrup & 21st", + "stopCode" : "10777", + "stopId" : "prt:10777", + "stopIndex" : 91, + "stopSequence" : 92, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:28:55.000+00:00", + "departure" : "2009-10-21T23:28:55.000+00:00", + "lat" : 45.531308, + "lon" : -122.696445, + "name" : "NW Northrup & 22nd", + "stopCode" : "10778", + "stopId" : "prt:10778", + "stopIndex" : 92, + "stopSequence" : 93, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 53, - "points": "i|ztG|fwkV?LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Broadway/Halsey", - "routeId": "prt:77", - "routeLongName": "Broadway/Halsey", - "routeShortName": "77", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:21:53.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "stopIndex": 93, - "stopSequence": 94, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "7710", - "tripId": "prt:771W1370" + "legGeometry" : { + "length" : 53, + "points" : "i|ztG|fwkV?LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Broadway/Halsey", + "routeId" : "prt:77", + "routeLongName" : "Broadway/Halsey", + "routeShortName" : "77", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:21:53.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "stopIndex" : 93, + "stopSequence" : 94, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "7710", + "tripId" : "prt:771W1370" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 580.63, - "endTime": "2009-10-21T23:37:21.000+00:00", - "from": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 881, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 12, - "points": "}~{tGnq{kV?LVAF?J?FtKlCClCEnCElCElCCB?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:29:50.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 24.9, - "elevation": "", - "lat": 45.5321578, - "lon": -122.6987026, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 158.45, - "elevation": "", - "lat": 45.531934, - "lon": -122.698695, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Overton Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 397.28, - "elevation": "", - "lat": 45.5318916, - "lon": -122.7007283, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 580.63, + "endTime" : "2009-10-21T23:37:21.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 881, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 12, + "points" : "}~{tGnq{kV?LVAF?J?FtKlCClCEnCElCElCCB?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:29:50.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 24.9, + "elevation" : "", + "lat" : 45.5321578, + "lon" : -122.6987026, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 158.45, + "elevation" : "", + "lat" : 45.531934, + "lon" : -122.698695, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Overton Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 397.28, + "elevation" : "", + "lat" : 45.5318916, + "lon" : -122.7007283, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:37:21.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:37:21.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:18:27.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 477, - "waitingTime": 0, - "walkDistance": 833.51, - "walkLimitExceeded": false, - "walkTime": 657 + "startTime" : "2009-10-21T23:18:27.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 477, + "waitingTime" : 0, + "walkDistance" : 833.51, + "walkLimitExceeded" : false, + "walkTime" : 657 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 977, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:43:51.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 977, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:43:51.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "17" + "feedId" : "prt", + "id" : "17" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2119, - "legs": [ + "generalizedCost" : 2119, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 167.87, - "endTime": "2009-10-21T23:29:50.000+00:00", - "from": { - "departure": "2009-10-21T23:27:34.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 261, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 10, - "points": "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:27:34.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.51, - "elevation": "", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 71.38, - "elevation": "", - "lat": 45.52593, - "lon": -122.6755097, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Flanders Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 167.87, + "endTime" : "2009-10-21T23:29:50.000+00:00", + "from" : { + "departure" : "2009-10-21T23:27:34.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 261, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 10, + "points" : "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:27:34.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.51, + "elevation" : "", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 71.38, + "elevation" : "", + "lat" : 45.52593, + "lon" : -122.6755097, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Flanders Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1631.03, - "endTime": "2009-10-21T23:38:32.000+00:00", - "from": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "stopIndex": 66, - "stopSequence": 67, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1122, - "headsign": "31st & Industrial", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:30:41.000+00:00", - "departure": "2009-10-21T23:30:41.000+00:00", - "lat": 45.526678, - "lon": -122.677476, - "name": "NW Glisan & Broadway", - "stopCode": "1997", - "stopId": "prt:1997", - "stopIndex": 67, - "stopSequence": 68, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:31:21.000+00:00", - "departure": "2009-10-21T23:31:21.000+00:00", - "lat": 45.526643, - "lon": -122.679075, - "name": "NW Glisan & Park", - "stopCode": "2007", - "stopId": "prt:2007", - "stopIndex": 68, - "stopSequence": 69, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:32:11.000+00:00", - "departure": "2009-10-21T23:32:11.000+00:00", - "lat": 45.526601, - "lon": -122.681091, - "name": "NW Glisan & 10th", - "stopCode": "2011", - "stopId": "prt:2011", - "stopIndex": 69, - "stopSequence": 70, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:33:03.000+00:00", - "departure": "2009-10-21T23:33:03.000+00:00", - "lat": 45.526578, - "lon": -122.683142, - "name": "NW Glisan & 12th", - "stopCode": "2030", - "stopId": "prt:2030", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:33:53.000+00:00", - "departure": "2009-10-21T23:33:53.000+00:00", - "lat": 45.526532, - "lon": -122.685164, - "name": "NW Glisan & 14th", - "stopCode": "2046", - "stopId": "prt:2046", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:34:43.000+00:00", - "departure": "2009-10-21T23:34:43.000+00:00", - "lat": 45.526503, - "lon": -122.687165, - "name": "NW Glisan & 16th", - "stopCode": "2062", - "stopId": "prt:2062", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:35:59.000+00:00", - "departure": "2009-10-21T23:35:59.000+00:00", - "lat": 45.526412, - "lon": -122.690196, - "name": "NW Glisan & 19th", - "stopCode": "2086", - "stopId": "prt:2086", - "stopIndex": 73, - "stopSequence": 74, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:37:31.000+00:00", - "departure": "2009-10-21T23:37:31.000+00:00", - "lat": 45.526387, - "lon": -122.693889, - "name": "NW Glisan & 21st", - "stopCode": "2099", - "stopId": "prt:2099", - "stopIndex": 74, - "stopSequence": 75, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1631.03, + "endTime" : "2009-10-21T23:38:32.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "stopIndex" : 66, + "stopSequence" : 67, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1122, + "headsign" : "31st & Industrial", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:30:41.000+00:00", + "departure" : "2009-10-21T23:30:41.000+00:00", + "lat" : 45.526678, + "lon" : -122.677476, + "name" : "NW Glisan & Broadway", + "stopCode" : "1997", + "stopId" : "prt:1997", + "stopIndex" : 67, + "stopSequence" : 68, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:31:21.000+00:00", + "departure" : "2009-10-21T23:31:21.000+00:00", + "lat" : 45.526643, + "lon" : -122.679075, + "name" : "NW Glisan & Park", + "stopCode" : "2007", + "stopId" : "prt:2007", + "stopIndex" : 68, + "stopSequence" : 69, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:32:11.000+00:00", + "departure" : "2009-10-21T23:32:11.000+00:00", + "lat" : 45.526601, + "lon" : -122.681091, + "name" : "NW Glisan & 10th", + "stopCode" : "2011", + "stopId" : "prt:2011", + "stopIndex" : 69, + "stopSequence" : 70, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:33:03.000+00:00", + "departure" : "2009-10-21T23:33:03.000+00:00", + "lat" : 45.526578, + "lon" : -122.683142, + "name" : "NW Glisan & 12th", + "stopCode" : "2030", + "stopId" : "prt:2030", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:33:53.000+00:00", + "departure" : "2009-10-21T23:33:53.000+00:00", + "lat" : 45.526532, + "lon" : -122.685164, + "name" : "NW Glisan & 14th", + "stopCode" : "2046", + "stopId" : "prt:2046", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:34:43.000+00:00", + "departure" : "2009-10-21T23:34:43.000+00:00", + "lat" : 45.526503, + "lon" : -122.687165, + "name" : "NW Glisan & 16th", + "stopCode" : "2062", + "stopId" : "prt:2062", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:35:59.000+00:00", + "departure" : "2009-10-21T23:35:59.000+00:00", + "lat" : 45.526412, + "lon" : -122.690196, + "name" : "NW Glisan & 19th", + "stopCode" : "2086", + "stopId" : "prt:2086", + "stopIndex" : 73, + "stopSequence" : 74, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:37:31.000+00:00", + "departure" : "2009-10-21T23:37:31.000+00:00", + "lat" : 45.526387, + "lon" : -122.693889, + "name" : "NW Glisan & 21st", + "stopCode" : "2099", + "stopId" : "prt:2099", + "stopIndex" : 74, + "stopSequence" : 75, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 39, - "points": "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Holgate/NW 21st", - "routeId": "prt:17", - "routeLongName": "Holgate/NW 21st", - "routeShortName": "17", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:29:50.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:38:32.000+00:00", - "departure": "2009-10-21T23:38:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "stopIndex": 75, - "stopSequence": 76, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "1701", - "tripId": "prt:171W1500" + "legGeometry" : { + "length" : 39, + "points" : "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Holgate/NW 21st", + "routeId" : "prt:17", + "routeLongName" : "Holgate/NW 21st", + "routeShortName" : "17", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:29:50.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:38:32.000+00:00", + "departure" : "2009-10-21T23:38:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "stopIndex" : 75, + "stopSequence" : 76, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "1701", + "tripId" : "prt:171W1500" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 28.26, - "endTime": "2009-10-21T23:39:58.000+00:00", - "from": { - "arrival": "2009-10-21T23:38:32.000+00:00", - "departure": "2009-10-21T23:38:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 167, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "wb{tG`wzkV?LO?Ao@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:38:32.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 8.97, - "elevation": "", - "lat": 45.527647, - "lon": -122.6944769, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 19.29, - "elevation": "", - "lat": 45.5277276, - "lon": -122.6944793, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 28.26, + "endTime" : "2009-10-21T23:39:58.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:38:32.000+00:00", + "departure" : "2009-10-21T23:38:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 167, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "wb{tG`wzkV?LO?Ao@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:38:32.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 8.97, + "elevation" : "", + "lat" : 45.527647, + "lon" : -122.6944769, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 19.29, + "elevation" : "", + "lat" : 45.5277276, + "lon" : -122.6944793, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:39:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:39:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:39:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:39:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 493.43, - "endTime": "2009-10-21T23:42:20.000+00:00", - "from": { - "arrival": "2009-10-21T23:39:58.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:39:58.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 493.43, + "endTime" : "2009-10-21T23:42:20.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:39:58.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:39:58.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 399, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 7, - "points": "ic{tG~uzkV@n@@vAD|HDtKFrJWA" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:39:58.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 480.08, - "elevation": "", - "lat": 45.5277322, - "lon": -122.6942318, - "relativeDirection": "HARD_LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 399, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 7, + "points" : "ic{tG~uzkV@n@@vAD|HDtKFrJWA" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:39:58.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 480.08, + "elevation" : "", + "lat" : 45.5277322, + "lon" : -122.6942318, + "relativeDirection" : "HARD_LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true } ], - "to": { - "arrival": "2009-10-21T23:42:20.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:42:20.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:42:20.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:42:20.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:43:51.000+00:00", - "from": { - "arrival": "2009-10-21T23:42:20.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:42:20.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:43:51.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:42:20.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:42:20.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 168, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "ic{tGl|{kVV@?d@kC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:42:20.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 168, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "ic{tGl|{kVV@?d@kC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:42:20.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:43:51.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:43:51.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:27:34.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 522, - "waitingTime": 0, - "walkDistance": 796.15, - "walkLimitExceeded": false, - "walkTime": 455 + "startTime" : "2009-10-21T23:27:34.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 522, + "waitingTime" : 0, + "walkDistance" : 796.15, + "walkLimitExceeded" : false, + "walkTime" : 455 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1336, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:51:24.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1336, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:51:24.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2563, - "legs": [ + "generalizedCost" : 2563, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 287.82, - "endTime": "2009-10-21T23:33:00.000+00:00", - "from": { - "departure": "2009-10-21T23:29:08.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 442, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 17, - "points": "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:29:08.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 231.76, - "elevation": "", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 38.08, - "elevation": "", - "lat": 45.5231412, - "lon": -122.6754031, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 287.82, + "endTime" : "2009-10-21T23:33:00.000+00:00", + "from" : { + "departure" : "2009-10-21T23:29:08.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 442, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 17, + "points" : "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:29:08.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 231.76, + "elevation" : "", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 38.08, + "elevation" : "", + "lat" : 45.5231412, + "lon" : -122.6754031, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:33:00.000+00:00", - "departure": "2009-10-21T23:33:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:33:00.000+00:00", + "departure" : "2009-10-21T23:33:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1942.25, - "endTime": "2009-10-21T23:44:03.000+00:00", - "from": { - "arrival": "2009-10-21T23:33:00.000+00:00", - "departure": "2009-10-21T23:33:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1263, - "headsign": "Beaverton TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:34:56.000+00:00", - "departure": "2009-10-21T23:34:56.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:36:37.000+00:00", - "departure": "2009-10-21T23:36:37.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:37:50.000+00:00", - "departure": "2009-10-21T23:37:50.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:40:44.000+00:00", - "departure": "2009-10-21T23:40:44.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:00.000+00:00", - "departure": "2009-10-21T23:42:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:24.000+00:00", - "departure": "2009-10-21T23:42:24.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:35.000+00:00", - "departure": "2009-10-21T23:42:35.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:55.000+00:00", - "departure": "2009-10-21T23:42:55.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:43:32.000+00:00", - "departure": "2009-10-21T23:43:32.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1942.25, + "endTime" : "2009-10-21T23:44:03.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:33:00.000+00:00", + "departure" : "2009-10-21T23:33:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1263, + "headsign" : "Beaverton TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:34:56.000+00:00", + "departure" : "2009-10-21T23:34:56.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:36:37.000+00:00", + "departure" : "2009-10-21T23:36:37.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:37:50.000+00:00", + "departure" : "2009-10-21T23:37:50.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:40:44.000+00:00", + "departure" : "2009-10-21T23:40:44.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:00.000+00:00", + "departure" : "2009-10-21T23:42:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:24.000+00:00", + "departure" : "2009-10-21T23:42:24.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:35.000+00:00", + "departure" : "2009-10-21T23:42:35.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:55.000+00:00", + "departure" : "2009-10-21T23:42:55.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:43:32.000+00:00", + "departure" : "2009-10-21T23:43:32.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 56, - "points": "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:33:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:44:03.000+00:00", - "departure": "2009-10-21T23:44:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "stopIndex": 109, - "stopSequence": 110, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "2003", - "tripId": "prt:200W1450" + "legGeometry" : { + "length" : 56, + "points" : "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:33:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:44:03.000+00:00", + "departure" : "2009-10-21T23:44:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "stopIndex" : 109, + "stopSequence" : 110, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "2003", + "tripId" : "prt:200W1450" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 563.7, - "endTime": "2009-10-21T23:51:24.000+00:00", - "from": { - "arrival": "2009-10-21T23:44:03.000+00:00", - "departure": "2009-10-21T23:44:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 858, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 34, - "points": "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:44:03.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 54.63, - "elevation": "", - "lat": 45.5238156, - "lon": -122.7007199, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 317.41, - "elevation": "", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 563.7, + "endTime" : "2009-10-21T23:51:24.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:44:03.000+00:00", + "departure" : "2009-10-21T23:44:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 858, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 34, + "points" : "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:44:03.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 54.63, + "elevation" : "", + "lat" : 45.5238156, + "lon" : -122.7007199, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 317.41, + "elevation" : "", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:51:24.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:51:24.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:29:08.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 663, - "waitingTime": 0, - "walkDistance": 851.52, - "walkLimitExceeded": false, - "walkTime": 673 + "startTime" : "2009-10-21T23:29:08.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 663, + "waitingTime" : 0, + "walkDistance" : 851.52, + "walkLimitExceeded" : false, + "walkTime" : 673 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1134, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:56:21.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1134, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:56:21.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "77" + "feedId" : "prt", + "id" : "77" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2351, - "legs": [ + "generalizedCost" : 2351, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 252.88, - "endTime": "2009-10-21T23:40:53.000+00:00", - "from": { - "departure": "2009-10-21T23:37:27.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 392, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 15, - "points": "ssztGh_wkV?`@?LK?uBBK?K@sBBM??D?L@\\?lCC??E" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:37:27.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 158.01, - "elevation": "", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 74.23, - "elevation": "", - "lat": 45.5266447, - "lon": -122.6755391, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Glisan Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 2.66, - "elevation": "", - "lat": 45.5266303, - "lon": -122.6764917, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 252.88, + "endTime" : "2009-10-21T23:40:53.000+00:00", + "from" : { + "departure" : "2009-10-21T23:37:27.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 392, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 15, + "points" : "ssztGh_wkV?`@?LK?uBBK?K@sBBM??D?L@\\?lCC??E" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:37:27.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 158.01, + "elevation" : "", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 74.23, + "elevation" : "", + "lat" : 45.5266447, + "lon" : -122.6755391, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Glisan Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 2.66, + "elevation" : "", + "lat" : 45.5266303, + "lon" : -122.6764917, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:40:53.000+00:00", - "departure": "2009-10-21T23:40:53.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:40:53.000+00:00", + "departure" : "2009-10-21T23:40:53.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2232.31, - "endTime": "2009-10-21T23:48:50.000+00:00", - "from": { - "arrival": "2009-10-21T23:40:53.000+00:00", - "departure": "2009-10-21T23:40:53.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "stopIndex": 85, - "stopSequence": 86, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1077, - "headsign": "Montgomery Park", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:41:57.000+00:00", - "departure": "2009-10-21T23:41:57.000+00:00", - "lat": 45.528799, - "lon": -122.677238, - "name": "NW Station Way & Union Station", - "stopCode": "12801", - "stopId": "prt:12801", - "stopIndex": 86, - "stopSequence": 87, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:44:00.000+00:00", - "departure": "2009-10-21T23:44:00.000+00:00", - "lat": 45.531582, - "lon": -122.681193, - "name": "NW Northrup & 10th", - "stopCode": "12802", - "stopId": "prt:12802", - "stopIndex": 87, - "stopSequence": 88, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:44:33.000+00:00", - "departure": "2009-10-21T23:44:33.000+00:00", - "lat": 45.531534, - "lon": -122.683319, - "name": "NW 12th & Northrup", - "stopCode": "12796", - "stopId": "prt:12796", - "stopIndex": 88, - "stopSequence": 89, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:45:04.000+00:00", - "departure": "2009-10-21T23:45:04.000+00:00", - "lat": 45.531503, - "lon": -122.685357, - "name": "NW Northrup & 14th", - "stopCode": "10775", - "stopId": "prt:10775", - "stopIndex": 89, - "stopSequence": 90, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:46:07.000+00:00", - "departure": "2009-10-21T23:46:07.000+00:00", - "lat": 45.531434, - "lon": -122.689417, - "name": "NW Northrup & 18th", - "stopCode": "10776", - "stopId": "prt:10776", - "stopIndex": 90, - "stopSequence": 91, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:47:24.000+00:00", - "departure": "2009-10-21T23:47:24.000+00:00", - "lat": 45.531346, - "lon": -122.694455, - "name": "NW Northrup & 21st", - "stopCode": "10777", - "stopId": "prt:10777", - "stopIndex": 91, - "stopSequence": 92, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:47:55.000+00:00", - "departure": "2009-10-21T23:47:55.000+00:00", - "lat": 45.531308, - "lon": -122.696445, - "name": "NW Northrup & 22nd", - "stopCode": "10778", - "stopId": "prt:10778", - "stopIndex": 92, - "stopSequence": 93, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2232.31, + "endTime" : "2009-10-21T23:48:50.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:40:53.000+00:00", + "departure" : "2009-10-21T23:40:53.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "stopIndex" : 85, + "stopSequence" : 86, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1077, + "headsign" : "Montgomery Park", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:41:57.000+00:00", + "departure" : "2009-10-21T23:41:57.000+00:00", + "lat" : 45.528799, + "lon" : -122.677238, + "name" : "NW Station Way & Union Station", + "stopCode" : "12801", + "stopId" : "prt:12801", + "stopIndex" : 86, + "stopSequence" : 87, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:44:00.000+00:00", + "departure" : "2009-10-21T23:44:00.000+00:00", + "lat" : 45.531582, + "lon" : -122.681193, + "name" : "NW Northrup & 10th", + "stopCode" : "12802", + "stopId" : "prt:12802", + "stopIndex" : 87, + "stopSequence" : 88, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:44:33.000+00:00", + "departure" : "2009-10-21T23:44:33.000+00:00", + "lat" : 45.531534, + "lon" : -122.683319, + "name" : "NW 12th & Northrup", + "stopCode" : "12796", + "stopId" : "prt:12796", + "stopIndex" : 88, + "stopSequence" : 89, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:45:04.000+00:00", + "departure" : "2009-10-21T23:45:04.000+00:00", + "lat" : 45.531503, + "lon" : -122.685357, + "name" : "NW Northrup & 14th", + "stopCode" : "10775", + "stopId" : "prt:10775", + "stopIndex" : 89, + "stopSequence" : 90, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:46:07.000+00:00", + "departure" : "2009-10-21T23:46:07.000+00:00", + "lat" : 45.531434, + "lon" : -122.689417, + "name" : "NW Northrup & 18th", + "stopCode" : "10776", + "stopId" : "prt:10776", + "stopIndex" : 90, + "stopSequence" : 91, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:47:24.000+00:00", + "departure" : "2009-10-21T23:47:24.000+00:00", + "lat" : 45.531346, + "lon" : -122.694455, + "name" : "NW Northrup & 21st", + "stopCode" : "10777", + "stopId" : "prt:10777", + "stopIndex" : 91, + "stopSequence" : 92, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:47:55.000+00:00", + "departure" : "2009-10-21T23:47:55.000+00:00", + "lat" : 45.531308, + "lon" : -122.696445, + "name" : "NW Northrup & 22nd", + "stopCode" : "10778", + "stopId" : "prt:10778", + "stopIndex" : 92, + "stopSequence" : 93, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 53, - "points": "i|ztG|fwkV?LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Broadway/Halsey", - "routeId": "prt:77", - "routeLongName": "Broadway/Halsey", - "routeShortName": "77", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:40:53.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:48:50.000+00:00", - "departure": "2009-10-21T23:48:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "stopIndex": 93, - "stopSequence": 94, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "7708", - "tripId": "prt:771W1380" + "legGeometry" : { + "length" : 53, + "points" : "i|ztG|fwkV?LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Broadway/Halsey", + "routeId" : "prt:77", + "routeLongName" : "Broadway/Halsey", + "routeShortName" : "77", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:40:53.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:48:50.000+00:00", + "departure" : "2009-10-21T23:48:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "stopIndex" : 93, + "stopSequence" : 94, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "7708", + "tripId" : "prt:771W1380" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 580.63, - "endTime": "2009-10-21T23:56:21.000+00:00", - "from": { - "arrival": "2009-10-21T23:48:50.000+00:00", - "departure": "2009-10-21T23:48:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 881, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 12, - "points": "}~{tGnq{kV?LVAF?J?FtKlCClCEnCElCElCCB?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:48:50.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 24.9, - "elevation": "", - "lat": 45.5321578, - "lon": -122.6987026, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 158.45, - "elevation": "", - "lat": 45.531934, - "lon": -122.698695, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Overton Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 397.28, - "elevation": "", - "lat": 45.5318916, - "lon": -122.7007283, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 580.63, + "endTime" : "2009-10-21T23:56:21.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:48:50.000+00:00", + "departure" : "2009-10-21T23:48:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 881, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 12, + "points" : "}~{tGnq{kV?LVAF?J?FtKlCClCEnCElCElCCB?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:48:50.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 24.9, + "elevation" : "", + "lat" : 45.5321578, + "lon" : -122.6987026, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 158.45, + "elevation" : "", + "lat" : 45.531934, + "lon" : -122.698695, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Overton Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 397.28, + "elevation" : "", + "lat" : 45.5318916, + "lon" : -122.7007283, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:56:21.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:56:21.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:37:27.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 477, - "waitingTime": 0, - "walkDistance": 833.51, - "walkLimitExceeded": false, - "walkTime": 657 + "startTime" : "2009-10-21T23:37:27.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 477, + "waitingTime" : 0, + "walkDistance" : 833.51, + "walkLimitExceeded" : false, + "walkTime" : 657 } ] ] \ No newline at end of file diff --git a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/CarSnapshotTest.snap b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/CarSnapshotTest.snap index 3e5a7b06fd0..8f527b15bf7 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/CarSnapshotTest.snap +++ b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/CarSnapshotTest.snap @@ -1,221 +1,221 @@ org.opentripplanner.routing.algorithm.mapping.CarSnapshotTest.directCarPark=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 253, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:14:13.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 253, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:14:13.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 467, - "legs": [ + "generalizedCost" : 467, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 181.36, - "endTime": "2009-10-21T23:10:44.000+00:00", - "from": { - "departure": "2009-10-21T23:10:00.000+00:00", - "lat": 45.53261, - "lon": -122.70075, - "name": "NW Pettygrove Ave. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 181.36, + "endTime" : "2009-10-21T23:10:44.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.53261, + "lon" : -122.70075, + "name" : "NW Pettygrove Ave. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 61, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 5, - "points": "ya|tGv~{kV??nCEB|Dn@@" + "generalizedCost" : 61, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 5, + "points" : "ya|tGv~{kV??nCEB|Dn@@" }, - "mode": "CAR", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:00.000+00:00", - "steps": [ + "mode" : "CAR", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:00.000+00:00", + "steps" : [ { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 0.72, - "elevation": "", - "lat": 45.5326129, - "lon": -122.7007501, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Pettygrove Street", - "walkingBike": false + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 0.72, + "elevation" : "", + "lat" : 45.5326129, + "lon" : -122.7007501, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Pettygrove Street", + "walkingBike" : false }, { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 80.22, - "elevation": "", - "lat": 45.5326127, - "lon": -122.7007593, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 80.22, + "elevation" : "", + "lat" : 45.5326127, + "lon" : -122.7007593, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false }, { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 74.04, - "elevation": "", - "lat": 45.5318916, - "lon": -122.7007283, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Overton Street", - "walkingBike": false + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 74.04, + "elevation" : "", + "lat" : 45.5318916, + "lon" : -122.7007283, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Overton Street", + "walkingBike" : false }, { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 26.38, - "elevation": "", - "lat": 45.5318763, - "lon": -122.7016786, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "service road", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 26.38, + "elevation" : "", + "lat" : 45.5318763, + "lon" : -122.7016786, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "service road", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:10:44.000+00:00", - "departure": "2009-10-21T23:10:44.000+00:00", - "lat": 45.5316391, - "lon": -122.7016859, - "name": "P+R (#2)", - "vehicleParking": { - "entranceId": "OSM:OSMWay/-102488/osm:node:-102438", - "entranceName": "P+R (#2)", - "hasAnyCarPlaces": true, - "hasBicyclePlaces": false, - "hasCarPlaces": true, - "hasWheelchairAccessibleCarPlaces": false, - "id": "OSM:OSMWay/-102488", - "name": "P+R", - "realtime": false, - "tags": [ + "to" : { + "arrival" : "2009-10-21T23:10:44.000+00:00", + "departure" : "2009-10-21T23:10:44.000+00:00", + "lat" : 45.5316391, + "lon" : -122.7016859, + "name" : "P+R (#2)", + "vehicleParking" : { + "entranceId" : "OSM:OSMWay/-102488/osm:node:-102438", + "entranceName" : "P+R (#2)", + "hasAnyCarPlaces" : true, + "hasBicyclePlaces" : false, + "hasCarPlaces" : true, + "hasWheelchairAccessibleCarPlaces" : false, + "id" : "OSM:OSMWay/-102488", + "name" : "P+R", + "realtime" : false, + "tags" : [ "osm:amenity=parking" ] }, - "vertexType": "BIKEPARK" + "vertexType" : "BIKEPARK" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 184.06, - "endTime": "2009-10-21T23:14:13.000+00:00", - "from": { - "arrival": "2009-10-21T23:10:44.000+00:00", - "departure": "2009-10-21T23:10:44.000+00:00", - "lat": 45.5314019, - "lon": -122.7016931, - "name": "P+R (#1)", - "vehicleParking": { - "entranceId": "OSM:OSMWay/-102488/osm:node:-102437", - "entranceName": "P+R (#1)", - "hasAnyCarPlaces": true, - "hasBicyclePlaces": false, - "hasCarPlaces": true, - "hasWheelchairAccessibleCarPlaces": false, - "id": "OSM:OSMWay/-102488", - "name": "P+R", - "realtime": false, - "tags": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 184.06, + "endTime" : "2009-10-21T23:14:13.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:10:44.000+00:00", + "departure" : "2009-10-21T23:10:44.000+00:00", + "lat" : 45.5314019, + "lon" : -122.7016931, + "name" : "P+R (#1)", + "vehicleParking" : { + "entranceId" : "OSM:OSMWay/-102488/osm:node:-102437", + "entranceName" : "P+R (#1)", + "hasAnyCarPlaces" : true, + "hasBicyclePlaces" : false, + "hasCarPlaces" : true, + "hasWheelchairAccessibleCarPlaces" : false, + "id" : "OSM:OSMWay/-102488", + "name" : "P+R", + "realtime" : false, + "tags" : [ "osm:amenity=parking" ] }, - "vertexType": "BIKEPARK" + "vertexType" : "BIKEPARK" }, - "generalizedCost": 285, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 5, - "points": "gz{tGrd|kVn@@CgElCEB?" + "generalizedCost" : 285, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 5, + "points" : "gz{tGrd|kVn@@CgElCEB?" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:44.000+00:00", - "steps": [ + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:44.000+00:00", + "steps" : [ { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 26.38, - "elevation": "", - "lat": 45.5314019, - "lon": -122.7016931, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 26.38, + "elevation" : "", + "lat" : 45.5314019, + "lon" : -122.7016931, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false }, { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 77.46, - "elevation": "", - "lat": 45.5311647, - "lon": -122.7017004, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 77.46, + "elevation" : "", + "lat" : 45.5311647, + "lon" : -122.7017004, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false }, { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 80.22, - "elevation": "", - "lat": 45.531181, - "lon": -122.7007063, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 80.22, + "elevation" : "", + "lat" : 45.531181, + "lon" : -122.7007063, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:14:13.000+00:00", - "lat": 45.53046, - "lon": -122.70067, - "name": "NW Marshall St. & NW 24th Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:14:13.000+00:00", + "lat" : 45.53046, + "lon" : -122.70067, + "name" : "NW Marshall St. & NW 24th Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 365.42, - "walkLimitExceeded": false, - "walkTime": 253 + "startTime" : "2009-10-21T23:10:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 365.42, + "walkLimitExceeded" : false, + "walkTime" : 253 } ] ] @@ -224,193 +224,193 @@ org.opentripplanner.routing.algorithm.mapping.CarSnapshotTest.directCarPark=[ org.opentripplanner.routing.algorithm.mapping.CarSnapshotTest.directCarPickupWithWalking=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 379, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:16:19.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 379, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:16:19.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 713, - "legs": [ + "generalizedCost" : 713, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 108.24, - "endTime": "2009-10-21T23:11:30.000+00:00", - "from": { - "departure": "2009-10-21T23:10:00.000+00:00", - "lat": 45.53335, - "lon": -122.70517, - "name": "Chapman Elementary School (P3)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 108.24, + "endTime" : "2009-10-21T23:11:30.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.53335, + "lon" : -122.70517, + "name" : "Chapman Elementary School (P3)", + "vertexType" : "NORMAL" }, - "generalizedCost": 169, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 10, - "points": "kf|tGjz|kVR?p@AB@@D@BTAr@_A@ILA" + "generalizedCost" : 169, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 10, + "points" : "kf|tGjz|kVR?p@AB@@D@BTAr@_A@ILA" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:00.000+00:00", - "steps": [ + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:00.000+00:00", + "steps" : [ { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 108.24, - "elevation": "", - "lat": 45.5333498, - "lon": -122.7051771, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 108.24, + "elevation" : "", + "lat" : 45.5333498, + "lon" : -122.7051771, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:11:30.000+00:00", - "departure": "2009-10-21T23:11:30.000+00:00", - "lat": 45.5325089, - "lon": -122.7048383, - "name": "corner of path and Northwest Pettygrove Street", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:11:30.000+00:00", + "departure" : "2009-10-21T23:11:30.000+00:00", + "lat" : 45.5325089, + "lon" : -122.7048383, + "name" : "corner of path and Northwest Pettygrove Street", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 864.7, - "endTime": "2009-10-21T23:14:08.000+00:00", - "from": { - "arrival": "2009-10-21T23:11:30.000+00:00", - "departure": "2009-10-21T23:11:30.000+00:00", - "lat": 45.5325089, - "lon": -122.7048383, - "name": "corner of path and Northwest Pettygrove Street", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 864.7, + "endTime" : "2009-10-21T23:14:08.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:11:30.000+00:00", + "departure" : "2009-10-21T23:11:30.000+00:00", + "lat" : 45.5325089, + "lon" : -122.7048383, + "name" : "corner of path and Northwest Pettygrove Street", + "vertexType" : "NORMAL" }, - "generalizedCost": 290, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 14, - "points": "ca|tGfx|kVASCQAcAAiEAmBImKEwKGsKlCEbCCHA@?~BC" + "generalizedCost" : 290, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 14, + "points" : "ca|tGfx|kVASCQAcAAiEAmBImKEwKGsKlCEbCCHA@?~BC" }, - "mode": "CAR", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:11:30.000+00:00", - "steps": [ + "mode" : "CAR", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:11:30.000+00:00", + "steps" : [ { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 635.27, - "elevation": "", - "lat": 45.5325089, - "lon": -122.7048383, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Pettygrove Street", - "walkingBike": false + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 635.27, + "elevation" : "", + "lat" : 45.5325089, + "lon" : -122.7048383, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Pettygrove Street", + "walkingBike" : false }, { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 229.42, - "elevation": "", - "lat": 45.5326803, - "lon": -122.6966911, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 22nd Avenue", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 229.42, + "elevation" : "", + "lat" : 45.5326803, + "lon" : -122.6966911, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 22nd Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:14:08.000+00:00", - "departure": "2009-10-21T23:14:08.000+00:00", - "lat": 45.5306177, - "lon": -122.6966188, - "name": "corner of Northwest 22nd Avenue and path", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:14:08.000+00:00", + "departure" : "2009-10-21T23:14:08.000+00:00", + "lat" : 45.5306177, + "lon" : -122.6966188, + "name" : "corner of Northwest 22nd Avenue and path", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 85.65, - "endTime": "2009-10-21T23:16:19.000+00:00", - "from": { - "arrival": "2009-10-21T23:14:08.000+00:00", - "departure": "2009-10-21T23:14:08.000+00:00", - "lat": 45.5306177, - "lon": -122.6966188, - "name": "corner of Northwest 22nd Avenue and path", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 85.65, + "endTime" : "2009-10-21T23:16:19.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:14:08.000+00:00", + "departure" : "2009-10-21T23:14:08.000+00:00", + "lat" : 45.5306177, + "lon" : -122.6966188, + "name" : "corner of Northwest 22nd Avenue and path", + "vertexType" : "NORMAL" }, - "generalizedCost": 253, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 12, - "points": "iu{tGzd{kV?LAFAJ?RBX?N@^?\\B\\AX?B" + "generalizedCost" : 253, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 12, + "points" : "iu{tGzd{kV?LAFAJ?RBX?N@^?\\B\\AX?B" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:14:08.000+00:00", - "steps": [ + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:14:08.000+00:00", + "steps" : [ { - "absoluteDirection": "WEST", - "area": false, - "bogusName": true, - "distance": 85.65, - "elevation": "", - "lat": 45.5306177, - "lon": -122.6966188, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : true, + "distance" : 85.65, + "elevation" : "", + "lat" : 45.5306177, + "lon" : -122.6966188, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:16:19.000+00:00", - "lat": 45.5306, - "lon": -122.69771, - "name": "Legacy Good Samaritan Medical Center (P4)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:16:19.000+00:00", + "lat" : 45.5306, + "lon" : -122.69771, + "name" : "Legacy Good Samaritan Medical Center (P4)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 1058.59, - "walkLimitExceeded": false, - "walkTime": 379 + "startTime" : "2009-10-21T23:10:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 1058.59, + "walkLimitExceeded" : false, + "walkTime" : 379 } ] ] @@ -419,193 +419,193 @@ org.opentripplanner.routing.algorithm.mapping.CarSnapshotTest.directCarPickupWit org.opentripplanner.routing.algorithm.mapping.CarSnapshotTest.directCarPickupWithWalkingArriveBy=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 379, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:16:54.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 379, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:16:54.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 713, - "legs": [ + "generalizedCost" : 713, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 108.24, - "endTime": "2009-10-21T23:13:13.000+00:00", - "from": { - "departure": "2009-10-21T23:10:35.000+00:00", - "lat": 45.53335, - "lon": -122.70517, - "name": "Chapman Elementary School (P3)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 108.24, + "endTime" : "2009-10-21T23:13:13.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:35.000+00:00", + "lat" : 45.53335, + "lon" : -122.70517, + "name" : "Chapman Elementary School (P3)", + "vertexType" : "NORMAL" }, - "generalizedCost": 297, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 10, - "points": "kf|tGjz|kVR?p@AB@@D@BTAr@_A@ILA" + "generalizedCost" : 297, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 10, + "points" : "kf|tGjz|kVR?p@AB@@D@BTAr@_A@ILA" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:35.000+00:00", - "steps": [ + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:35.000+00:00", + "steps" : [ { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 108.24, - "elevation": "", - "lat": 45.5333498, - "lon": -122.7051771, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 108.24, + "elevation" : "", + "lat" : 45.5333498, + "lon" : -122.7051771, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:13:13.000+00:00", - "departure": "2009-10-21T23:13:13.000+00:00", - "lat": 45.5325089, - "lon": -122.7048383, - "name": "corner of path and Northwest Pettygrove Street", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:13:13.000+00:00", + "departure" : "2009-10-21T23:13:13.000+00:00", + "lat" : 45.5325089, + "lon" : -122.7048383, + "name" : "corner of path and Northwest Pettygrove Street", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 864.7, - "endTime": "2009-10-21T23:15:47.000+00:00", - "from": { - "arrival": "2009-10-21T23:13:13.000+00:00", - "departure": "2009-10-21T23:13:13.000+00:00", - "lat": 45.5325089, - "lon": -122.7048383, - "name": "corner of path and Northwest Pettygrove Street", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 864.7, + "endTime" : "2009-10-21T23:15:47.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:13:13.000+00:00", + "departure" : "2009-10-21T23:13:13.000+00:00", + "lat" : 45.5325089, + "lon" : -122.7048383, + "name" : "corner of path and Northwest Pettygrove Street", + "vertexType" : "NORMAL" }, - "generalizedCost": 286, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 14, - "points": "ca|tGfx|kVASCQAcAAiEAmBImKEwKGsKlCEbCCHA@?~BC" + "generalizedCost" : 286, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 14, + "points" : "ca|tGfx|kVASCQAcAAiEAmBImKEwKGsKlCEbCCHA@?~BC" }, - "mode": "CAR", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:13:13.000+00:00", - "steps": [ + "mode" : "CAR", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:13:13.000+00:00", + "steps" : [ { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 635.27, - "elevation": "", - "lat": 45.5325089, - "lon": -122.7048383, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Pettygrove Street", - "walkingBike": false + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 635.27, + "elevation" : "", + "lat" : 45.5325089, + "lon" : -122.7048383, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Pettygrove Street", + "walkingBike" : false }, { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 229.42, - "elevation": "", - "lat": 45.5326803, - "lon": -122.6966911, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 22nd Avenue", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 229.42, + "elevation" : "", + "lat" : 45.5326803, + "lon" : -122.6966911, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 22nd Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:15:47.000+00:00", - "departure": "2009-10-21T23:15:47.000+00:00", - "lat": 45.5306177, - "lon": -122.6966188, - "name": "corner of Northwest 22nd Avenue and path", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:15:47.000+00:00", + "departure" : "2009-10-21T23:15:47.000+00:00", + "lat" : 45.5306177, + "lon" : -122.6966188, + "name" : "corner of Northwest 22nd Avenue and path", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 85.65, - "endTime": "2009-10-21T23:16:54.000+00:00", - "from": { - "arrival": "2009-10-21T23:15:47.000+00:00", - "departure": "2009-10-21T23:15:47.000+00:00", - "lat": 45.5306177, - "lon": -122.6966188, - "name": "corner of Northwest 22nd Avenue and path", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 85.65, + "endTime" : "2009-10-21T23:16:54.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:15:47.000+00:00", + "departure" : "2009-10-21T23:15:47.000+00:00", + "lat" : 45.5306177, + "lon" : -122.6966188, + "name" : "corner of Northwest 22nd Avenue and path", + "vertexType" : "NORMAL" }, - "generalizedCost": 129, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 12, - "points": "iu{tGzd{kV?LAFAJ?RBX?N@^?\\B\\AX?B" + "generalizedCost" : 129, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 12, + "points" : "iu{tGzd{kV?LAFAJ?RBX?N@^?\\B\\AX?B" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:15:47.000+00:00", - "steps": [ + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:15:47.000+00:00", + "steps" : [ { - "absoluteDirection": "WEST", - "area": false, - "bogusName": true, - "distance": 85.65, - "elevation": "", - "lat": 45.5306177, - "lon": -122.6966188, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : true, + "distance" : 85.65, + "elevation" : "", + "lat" : 45.5306177, + "lon" : -122.6966188, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:16:54.000+00:00", - "lat": 45.5306, - "lon": -122.69771, - "name": "Legacy Good Samaritan Medical Center (P4)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:16:54.000+00:00", + "lat" : 45.5306, + "lon" : -122.69771, + "name" : "Legacy Good Samaritan Medical Center (P4)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:35.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 1058.59, - "walkLimitExceeded": false, - "walkTime": 379 + "startTime" : "2009-10-21T23:10:35.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 1058.59, + "walkLimitExceeded" : false, + "walkTime" : 379 } ] ] @@ -614,89 +614,89 @@ org.opentripplanner.routing.algorithm.mapping.CarSnapshotTest.directCarPickupWit org.opentripplanner.routing.algorithm.mapping.CarSnapshotTest.directCarPickupWithoutWalking=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 34, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-10-21T23:10:34.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 34, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-10-21T23:10:34.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 52, - "legs": [ + "generalizedCost" : 52, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 240.19, - "endTime": "2009-10-21T23:10:34.000+00:00", - "from": { - "departure": "2009-10-21T23:10:00.000+00:00", - "lat": 45.53261, - "lon": -122.70075, - "name": "NW Pettygrove Ave. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 240.19, + "endTime" : "2009-10-21T23:10:34.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.53261, + "lon" : -122.70075, + "name" : "NW Pettygrove Ave. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 52, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 6, - "points": "ya|tGv~{kV??nCElCClCEB?" + "generalizedCost" : 52, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 6, + "points" : "ya|tGv~{kV??nCElCClCEB?" }, - "mode": "CAR", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:00.000+00:00", - "steps": [ + "mode" : "CAR", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:00.000+00:00", + "steps" : [ { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 0.72, - "elevation": "", - "lat": 45.5326129, - "lon": -122.7007501, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Pettygrove Street", - "walkingBike": false + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 0.72, + "elevation" : "", + "lat" : 45.5326129, + "lon" : -122.7007501, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Pettygrove Street", + "walkingBike" : false }, { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 239.47, - "elevation": "", - "lat": 45.5326127, - "lon": -122.7007593, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 239.47, + "elevation" : "", + "lat" : 45.5326127, + "lon" : -122.7007593, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:10:34.000+00:00", - "lat": 45.53046, - "lon": -122.70067, - "name": "NW Marshall St. & NW 24th Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-10-21T23:10:34.000+00:00", + "lat" : 45.53046, + "lon" : -122.70067, + "name" : "NW Marshall St. & NW 24th Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 240.19, - "walkLimitExceeded": false, - "walkTime": 34 + "startTime" : "2009-10-21T23:10:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 240.19, + "walkLimitExceeded" : false, + "walkTime" : 34 } ] ] \ No newline at end of file diff --git a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap index 738ac44de5f..b5e40b383e4 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap +++ b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap @@ -1,129 +1,129 @@ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directBike=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 746, - "elevationGained": 18.9, - "elevationLost": 30.64, - "endTime": "2009-10-21T23:10:00.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 746, + "elevationGained" : 18.9, + "elevationLost" : 30.64, + "endTime" : "2009-10-21T23:10:00.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 1617, - "legs": [ + "generalizedCost" : 1617, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2636.74, - "endTime": "2009-10-21T23:10:00.000+00:00", - "from": { - "departure": "2009-10-21T22:57:34.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 1617, - "interlineWithPreviousLeg": false, - "legElevation": "0,63.7,1,63.7,11,63.4,21,63.2,31,63.3,41,63.5,51,63.3,61,62.9,71,62.5,81,62.2,91,62.0,101,61.7,111,61.5,121,61.2,131,60.9,141,60.6,151,60.3,160,60.2,240,60.2,1193,60.2,1272,55.5,1589,55.5,1668,40.4,1851,40.4,1920,37.3,1932,37.3,2079,55.5,2504,55.5,2504,NaN,2637,NaN", - "legGeometry": { - "length": 60, - "points": "}f{tGv}{kVC?mCBmCDoCDmCDmCBoCDmCDkCDoCB_CBM@iGEE@MB[H}@@s@@oCDmCBC@CkEAiEAg@AaC?YCqEAkECiEK?wDD}@@I?IAECKMKOIKyAmBCCQScB`DeAzBOVYj@eCxECF{@eAq@nAcAzBeAbBKDy@Ou@a@k@]c@_@Ws@M{@BsA" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T22:57:34.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 1193.29, - "elevation": "0,63.7,1,63.7,3,63.7,13,63.4,23,63.2,33,63.3,43,63.5,53,63.3,63,62.9,73,62.5,83,62.2,93,62.0,103,61.7,113,61.5,123,61.2,133,60.9,143,60.6,153,60.3,161,60.2,241,60.2,1195,60.2", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 474.29, - "elevation": "0,60.2,79,55.5,396,55.5,474,40.4", - "lat": 45.539042, - "lon": -122.7009919, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest York Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 264.57, - "elevation": "0,40.4,183,40.4,252,37.3,265,37.3", - "lat": 45.5391456, - "lon": -122.6949041, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 298.61, - "elevation": "0,37.3,147,55.5,299,55.5", - "lat": 45.5412919, - "lon": -122.6940312, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Front Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": true, - "distance": 406.0, - "elevation": "0,55.5,273,55.5", - "lat": 45.5430449, - "lon": -122.6969354, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "service road", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2636.74, + "endTime" : "2009-10-21T23:10:00.000+00:00", + "from" : { + "departure" : "2009-10-21T22:57:34.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 1617, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,63.7,1,63.7,11,63.4,21,63.2,31,63.3,41,63.5,51,63.3,61,62.9,71,62.5,81,62.2,91,62.0,101,61.7,111,61.5,121,61.2,131,60.9,141,60.6,151,60.3,160,60.2,240,60.2,1193,60.2,1272,55.5,1589,55.5,1668,40.4,1851,40.4,1920,37.3,1932,37.3,2079,55.5,2504,55.5,2504,NaN,2637,NaN", + "legGeometry" : { + "length" : 60, + "points" : "}f{tGv}{kVC?mCBmCDoCDmCDmCBoCDmCDkCDoCB_CBM@iGEE@MB[H}@@s@@oCDmCBC@CkEAiEAg@AaC?YCqEAkECiEK?wDD}@@I?IAECKMKOIKyAmBCCQScB`DeAzBOVYj@eCxECF{@eAq@nAcAzBeAbBKDy@Ou@a@k@]c@_@Ws@M{@BsA" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T22:57:34.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 1193.29, + "elevation" : "0,63.7,1,63.7,3,63.7,13,63.4,23,63.2,33,63.3,43,63.5,53,63.3,63,62.9,73,62.5,83,62.2,93,62.0,103,61.7,113,61.5,123,61.2,133,60.9,143,60.6,153,60.3,161,60.2,241,60.2,1195,60.2", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 474.29, + "elevation" : "0,60.2,79,55.5,396,55.5,474,40.4", + "lat" : 45.539042, + "lon" : -122.7009919, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest York Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 264.57, + "elevation" : "0,40.4,183,40.4,252,37.3,265,37.3", + "lat" : 45.5391456, + "lon" : -122.6949041, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 298.61, + "elevation" : "0,37.3,147,55.5,299,55.5", + "lat" : 45.5412919, + "lon" : -122.6940312, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Front Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : true, + "distance" : 406.0, + "elevation" : "0,55.5,273,55.5", + "lat" : 45.5430449, + "lon" : -122.6969354, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "service road", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:10:00.000+00:00", - "lat": 45.54549, - "lon": -122.69659, - "name": "Sulzer Pump (P4)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.54549, + "lon" : -122.69659, + "name" : "Sulzer Pump (P4)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T22:57:34.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 2636.74, - "walkLimitExceeded": false, - "walkTime": 746 + "startTime" : "2009-10-21T22:57:34.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 2636.74, + "walkLimitExceeded" : false, + "walkTime" : 746 } ] ] @@ -132,264 +132,264 @@ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directBike=[ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directBikeRental=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 459, - "elevationGained": 12.88, - "elevationLost": 38.14, - "endTime": "2009-10-21T23:17:39.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 459, + "elevationGained" : 12.88, + "elevationLost" : 38.14, + "endTime" : "2009-10-21T23:17:39.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 1103, - "legs": [ + "generalizedCost" : 1103, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 106.59, - "endTime": "2009-10-21T23:12:38.000+00:00", - "from": { - "departure": "2009-10-21T23:10:00.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 304, - "interlineWithPreviousLeg": false, - "legElevation": "0,63.7,9,64.1,19,64.7,29,65.2,39,65.8,49,66.3,59,66.8,69,67.2,79,67.4,93,66.6,107,66.2", - "legGeometry": { - "length": 4, - "points": "}f{tGv}{kVjCA?e@WA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:00.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "0,63.7,9,64.1,19,64.7,29,65.2,39,65.8,49,66.3,59,66.8,69,67.2,79,67.4", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 14.7, - "elevation": "0,67.4,15,66.6", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "0,66.6,13,66.2", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 106.59, + "endTime" : "2009-10-21T23:12:38.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 304, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,63.7,9,64.1,19,64.7,29,65.2,39,65.8,49,66.3,59,66.8,69,67.2,79,67.4,93,66.6,107,66.2", + "legGeometry" : { + "length" : 4, + "points" : "}f{tGv}{kVjCA?e@WA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "0,63.7,9,64.1,19,64.7,29,65.2,39,65.8,49,66.3,59,66.8,69,67.2,79,67.4", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 14.7, + "elevation" : "0,67.4,15,66.6", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "0,66.6,13,66.2", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:12:38.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:12:38.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:12:38.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:12:38.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 493.43, - "endTime": "2009-10-21T23:14:47.000+00:00", - "from": { - "arrival": "2009-10-21T23:12:38.000+00:00", - "bikeShareId": "-102309", - "departure": "2009-10-21T23:12:38.000+00:00", - "lat": 45.5277374, - "lon": -122.7003879, - "name": "-102309", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 493.43, + "endTime" : "2009-10-21T23:14:47.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:12:38.000+00:00", + "bikeShareId" : "-102309", + "departure" : "2009-10-21T23:12:38.000+00:00", + "lat" : 45.5277374, + "lon" : -122.7003879, + "name" : "-102309", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 464, - "interlineWithPreviousLeg": false, - "legElevation": "0,66.2,13,66.6,23,65.7,33,64.9,43,64.1,53,63.1,63,62.5,73,62.5,83,62.1,93,61.9,103,61.7,113,61.4,123,61.1,133,60.9,143,60.6,158,60.2,168,59.9,178,59.6,188,59.3,198,59.0,208,58.7,218,58.4,228,58.1,238,57.8,248,57.5,258,57.1,268,56.8,278,56.6,288,56.4,298,56.2,308,55.9,316,55.7,326,55.5,336,55.3,346,55.0,356,54.7,366,54.4,376,54.1,386,53.8,396,53.6,406,53.5,416,53.3,426,53.3,440,53.0,450,52.9,460,52.8,474,52.6,484,52.4,493,52.2", - "legGeometry": { - "length": 7, - "points": "ic{tGl|{kVV@GsJEuKE}HAwAAo@" - }, - "mode": "BICYCLE", - "pathway": false, - "realTime": false, - "rentedBike": true, - "route": "", - "startTime": "2009-10-21T23:12:38.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 13.36, - "elevation": "0,66.2,13,66.6", - "lat": 45.5277374, - "lon": -122.7003879, - "relativeDirection": "HARD_RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": true - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 480.08, - "elevation": "0,66.6,10,65.7,20,64.9,30,64.1,40,63.1,50,62.5,60,62.5,70,62.1,80,61.9,90,61.7,100,61.4,110,61.1,120,60.9,130,60.6,145,60.2,289,60.2,299,59.9,309,59.6,319,59.3,329,59.0,339,58.7,349,58.4,359,58.1,369,57.8,379,57.5,389,57.1,399,56.8,409,56.6,419,56.4,429,56.2,439,55.9,447,55.7,457,55.5,467,55.3,477,55.0,487,54.7,497,54.4,507,54.1,517,53.8,527,53.6,537,53.5,547,53.3,557,53.3,571,53.0,581,52.9,591,52.8,605,52.6,615,52.4,625,52.2", - "lat": 45.5276173, - "lon": -122.7003923, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 464, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,66.2,13,66.6,23,65.7,33,64.9,43,64.1,53,63.1,63,62.5,73,62.5,83,62.1,93,61.9,103,61.7,113,61.4,123,61.1,133,60.9,143,60.6,158,60.2,168,59.9,178,59.6,188,59.3,198,59.0,208,58.7,218,58.4,228,58.1,238,57.8,248,57.5,258,57.1,268,56.8,278,56.6,288,56.4,298,56.2,308,55.9,316,55.7,326,55.5,336,55.3,346,55.0,356,54.7,366,54.4,376,54.1,386,53.8,396,53.6,406,53.5,416,53.3,426,53.3,440,53.0,450,52.9,460,52.8,474,52.6,484,52.4,493,52.2", + "legGeometry" : { + "length" : 7, + "points" : "ic{tGl|{kVV@GsJEuKE}HAwAAo@" + }, + "mode" : "BICYCLE", + "pathway" : false, + "realTime" : false, + "rentedBike" : true, + "route" : "", + "startTime" : "2009-10-21T23:12:38.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 13.36, + "elevation" : "0,66.2,13,66.6", + "lat" : 45.5277374, + "lon" : -122.7003879, + "relativeDirection" : "HARD_RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : true + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 480.08, + "elevation" : "0,66.6,10,65.7,20,64.9,30,64.1,40,63.1,50,62.5,60,62.5,70,62.1,80,61.9,90,61.7,100,61.4,110,61.1,120,60.9,130,60.6,145,60.2,289,60.2,299,59.9,309,59.6,319,59.3,329,59.0,339,58.7,349,58.4,359,58.1,369,57.8,379,57.5,389,57.1,399,56.8,409,56.6,419,56.4,429,56.2,439,55.9,447,55.7,457,55.5,467,55.3,477,55.0,487,54.7,497,54.4,507,54.1,517,53.8,527,53.6,537,53.5,547,53.3,557,53.3,571,53.0,581,52.9,591,52.8,605,52.6,615,52.4,625,52.2", + "lat" : 45.5276173, + "lon" : -122.7003923, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:14:47.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:14:47.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "to" : { + "arrival" : "2009-10-21T23:14:47.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:14:47.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" + "vertexType" : "BIKESHARE" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 219.06, - "endTime": "2009-10-21T23:17:39.000+00:00", - "from": { - "arrival": "2009-10-21T23:14:47.000+00:00", - "bikeShareId": "-102323", - "departure": "2009-10-21T23:14:47.000+00:00", - "lat": 45.5278491, - "lon": -122.6942362, - "name": "-102323", - "networks": [ + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 219.06, + "endTime" : "2009-10-21T23:17:39.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:14:47.000+00:00", + "bikeShareId" : "-102323", + "departure" : "2009-10-21T23:14:47.000+00:00", + "lat" : 45.5278491, + "lon" : -122.6942362, + "name" : "-102323", + "networks" : [ "test-network" ], - "vertexType": "BIKESHARE" - }, - "generalizedCost": 334, - "interlineWithPreviousLeg": false, - "legElevation": "0,52.2,1,52.2,11,51.9,21,51.6,31,51.3,41,51.2,51,51.2,61,50.7,71,50.9,81,50.5,91,50.4,101,50.0,111,49.7,121,49.4,131,49.0,138,48.9,148,49.2,158,49.5,168,49.8,178,50.1,188,50.4,198,50.7,208,51.0,217,51.2,219,51.1", - "legGeometry": { - "length": 4, - "points": "ic{tG~uzkVEcJlCE?C" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:14:47.000+00:00", - "steps": [ - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 138.31, - "elevation": "0,52.2,1,52.2,11,51.9,21,51.6,31,51.3,41,51.2,51,51.2,61,50.7,71,50.9,81,50.5,91,50.4,101,50.0,111,49.7,121,49.4,131,49.0,138,48.9", - "lat": 45.5277322, - "lon": -122.6942318, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 78.79, - "elevation": "0,48.9,10,49.2,20,49.5,30,49.8,40,50.1,50,50.4,60,50.7,70,51.0,79,51.2", - "lat": 45.5277652, - "lon": -122.6924569, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 20th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 1.97, - "elevation": "0,51.2,2,51.1", - "lat": 45.527057, - "lon": -122.6924259, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Hoyt Street", - "walkingBike": false + "vertexType" : "BIKESHARE" + }, + "generalizedCost" : 334, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,52.2,1,52.2,11,51.9,21,51.6,31,51.3,41,51.2,51,51.2,61,50.7,71,50.9,81,50.5,91,50.4,101,50.0,111,49.7,121,49.4,131,49.0,138,48.9,148,49.2,158,49.5,168,49.8,178,50.1,188,50.4,198,50.7,208,51.0,217,51.2,219,51.1", + "legGeometry" : { + "length" : 4, + "points" : "ic{tG~uzkVEcJlCE?C" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:14:47.000+00:00", + "steps" : [ + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 138.31, + "elevation" : "0,52.2,1,52.2,11,51.9,21,51.6,31,51.3,41,51.2,51,51.2,61,50.7,71,50.9,81,50.5,91,50.4,101,50.0,111,49.7,121,49.4,131,49.0,138,48.9", + "lat" : 45.5277322, + "lon" : -122.6942318, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 78.79, + "elevation" : "0,48.9,10,49.2,20,49.5,30,49.8,40,50.1,50,50.4,60,50.7,70,51.0,79,51.2", + "lat" : 45.5277652, + "lon" : -122.6924569, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 20th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 1.97, + "elevation" : "0,51.2,2,51.1", + "lat" : 45.527057, + "lon" : -122.6924259, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Hoyt Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:17:39.000+00:00", - "lat": 45.52704, - "lon": -122.6924, - "name": "NW Hoyt St. & NW 20th Ave. (P2)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:17:39.000+00:00", + "lat" : 45.52704, + "lon" : -122.6924, + "name" : "NW Hoyt St. & NW 20th Ave. (P2)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 819.08, - "walkLimitExceeded": false, - "walkTime": 459 + "startTime" : "2009-10-21T23:10:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 819.08, + "walkLimitExceeded" : false, + "walkTime" : 459 } ] ] @@ -398,129 +398,129 @@ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directBikeRe org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directWalk=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1863, - "elevationGained": 0.7, - "elevationLost": 12.44, - "endTime": "2009-10-21T23:41:03.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1863, + "elevationGained" : 0.7, + "elevationLost" : 12.44, + "endTime" : "2009-10-21T23:41:03.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 3648, - "legs": [ + "generalizedCost" : 3648, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2431.99, - "endTime": "2009-10-21T23:41:03.000+00:00", - "from": { - "departure": "2009-10-21T23:10:00.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "generalizedCost": 3648, - "interlineWithPreviousLeg": false, - "legElevation": "0,63.7,1,63.7,11,63.4,21,63.2,31,63.3,41,63.5,51,63.3,61,62.9,71,62.5,81,62.2,91,62.0,101,61.7,111,61.5,121,61.2,131,60.9,141,60.6,151,60.3,160,60.2,240,60.2,1466,60.2,1540,55.5,2299,55.5,2299,NaN,2432,NaN", - "legGeometry": { - "length": 62, - "points": "}f{tGv}{kVC?mCBmCDoCDmCDmCBoCDmCDkCDoCB_CBM@iGEE@MB[H}@@s@@oCDmCBC@eCBK@SBWDeCZ]eFYyDEu@C_@Ce@Gm@EeAMmBGiAGoAWWg@s@EEGKIM]i@k@w@A?QWOVYj@eCxECF{@eAq@nAcAzBeAbBKDy@Ou@a@k@]c@_@Ws@M{@BsA" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:10:00.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 1374.92, - "elevation": "0,63.7,1,63.7,3,63.7,13,63.4,23,63.2,33,63.3,43,63.5,53,63.3,63,62.9,73,62.5,83,62.2,93,62.0,103,61.7,113,61.5,123,61.2,133,60.9,143,60.6,153,60.3,161,60.2,241,60.2,1376,60.2", - "lat": 45.5283199, - "lon": -122.7005963, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 364.26, - "elevation": "0,60.2,91,60.2,165,55.5,364,55.5", - "lat": 45.5406645, - "lon": -122.7012174, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Nicolai Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 135.08, - "elevation": "0,55.5,135,55.5", - "lat": 45.5412394, - "lon": -122.6966132, - "relativeDirection": "LEFT", - "stayOn": true, - "streetName": "Northwest Nicolai Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 151.74, - "elevation": "0,55.5,152,55.5", - "lat": 45.5421487, - "lon": -122.6954662, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Front Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": true, - "distance": 406.0, - "elevation": "0,55.5,273,55.5", - "lat": 45.5430449, - "lon": -122.6969354, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "service road", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2431.99, + "endTime" : "2009-10-21T23:41:03.000+00:00", + "from" : { + "departure" : "2009-10-21T23:10:00.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 3648, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,63.7,1,63.7,11,63.4,21,63.2,31,63.3,41,63.5,51,63.3,61,62.9,71,62.5,81,62.2,91,62.0,101,61.7,111,61.5,121,61.2,131,60.9,141,60.6,151,60.3,160,60.2,240,60.2,1466,60.2,1540,55.5,2299,55.5,2299,NaN,2432,NaN", + "legGeometry" : { + "length" : 62, + "points" : "}f{tGv}{kVC?mCBmCDoCDmCDmCBoCDmCDkCDoCB_CBM@iGEE@MB[H}@@s@@oCDmCBC@eCBK@SBWDeCZ]eFYyDEu@C_@Ce@Gm@EeAMmBGiAGoAWWg@s@EEGKIM]i@k@w@A?QWOVYj@eCxECF{@eAq@nAcAzBeAbBKDy@Ou@a@k@]c@_@Ws@M{@BsA" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:10:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 1374.92, + "elevation" : "0,63.7,1,63.7,3,63.7,13,63.4,23,63.2,33,63.3,43,63.5,53,63.3,63,62.9,73,62.5,83,62.2,93,62.0,103,61.7,113,61.5,123,61.2,133,60.9,143,60.6,153,60.3,161,60.2,241,60.2,1376,60.2", + "lat" : 45.5283199, + "lon" : -122.7005963, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 364.26, + "elevation" : "0,60.2,91,60.2,165,55.5,364,55.5", + "lat" : 45.5406645, + "lon" : -122.7012174, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Nicolai Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 135.08, + "elevation" : "0,55.5,135,55.5", + "lat" : 45.5412394, + "lon" : -122.6966132, + "relativeDirection" : "LEFT", + "stayOn" : true, + "streetName" : "Northwest Nicolai Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 151.74, + "elevation" : "0,55.5,152,55.5", + "lat" : 45.5421487, + "lon" : -122.6954662, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Front Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : true, + "distance" : 406.0, + "elevation" : "0,55.5,273,55.5", + "lat" : 45.5430449, + "lon" : -122.6969354, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "service road", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:41:03.000+00:00", - "lat": 45.54549, - "lon": -122.69659, - "name": "Sulzer Pump (P4)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:41:03.000+00:00", + "lat" : 45.54549, + "lon" : -122.69659, + "name" : "Sulzer Pump (P4)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:10:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 2431.99, - "walkLimitExceeded": false, - "walkTime": 1863 + "startTime" : "2009-10-21T23:10:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 2431.99, + "walkLimitExceeded" : false, + "walkTime" : 1863 } ] ] @@ -529,2510 +529,2510 @@ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directWalk=[ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.transit=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1125, - "elevationGained": 15.03, - "elevationLost": 4.23, - "endTime": "2009-10-21T23:31:21.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1125, + "elevationGained" : 15.03, + "elevationLost" : 4.23, + "endTime" : "2009-10-21T23:31:21.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "17" + "feedId" : "prt", + "id" : "17" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2305, - "legs": [ + "generalizedCost" : 2305, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 167.87, - "endTime": "2009-10-21T23:14:50.000+00:00", - "from": { - "departure": "2009-10-21T23:12:36.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 259, - "interlineWithPreviousLeg": false, - "legElevation": "0,29.6,0,29.6,10,29.5,18,29.3,28,29.3,38,29.3,48,29.3,58,29.3,68,29.4,78,29.3,88,29.3,96,29.3,106,29.3,116,29.4,126,29.4,136,29.4,146,29.4,156,29.3,168,29.3", - "legGeometry": { - "length": 10, - "points": "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:12:36.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "0,29.6,0,29.6,10,29.5,18,29.3", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.51, - "elevation": "0,29.3,10,29.3,20,29.3,30,29.3,40,29.3,50,29.4,60,29.3,70,29.3,79,29.3", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 71.38, - "elevation": "0,29.3,10,29.3,20,29.4,30,29.4,40,29.4,50,29.4,60,29.3,71,29.3", - "lat": 45.52593, - "lon": -122.6755097, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Flanders Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 167.87, + "endTime" : "2009-10-21T23:14:50.000+00:00", + "from" : { + "departure" : "2009-10-21T23:12:36.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 259, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,29.6,0,29.6,10,29.5,18,29.3,28,29.3,38,29.3,48,29.3,58,29.3,68,29.4,78,29.3,88,29.3,96,29.3,106,29.3,116,29.4,126,29.4,136,29.4,146,29.4,156,29.3,168,29.3", + "legGeometry" : { + "length" : 10, + "points" : "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:12:36.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "0,29.6,0,29.6,10,29.5,18,29.3", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.51, + "elevation" : "0,29.3,10,29.3,20,29.3,30,29.3,40,29.3,50,29.4,60,29.3,70,29.3,79,29.3", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 71.38, + "elevation" : "0,29.3,10,29.3,20,29.4,30,29.4,40,29.4,50,29.4,60,29.3,71,29.3", + "lat" : 45.52593, + "lon" : -122.6755097, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Flanders Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:14:50.000+00:00", - "departure": "2009-10-21T23:14:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:14:50.000+00:00", + "departure" : "2009-10-21T23:14:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1631.03, - "endTime": "2009-10-21T23:23:32.000+00:00", - "from": { - "arrival": "2009-10-21T23:14:50.000+00:00", - "departure": "2009-10-21T23:14:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "stopIndex": 66, - "stopSequence": 67, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1122, - "headsign": "Sauvie Is. via St.Johns", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:15:41.000+00:00", - "departure": "2009-10-21T23:15:41.000+00:00", - "lat": 45.526678, - "lon": -122.677476, - "name": "NW Glisan & Broadway", - "stopCode": "1997", - "stopId": "prt:1997", - "stopIndex": 67, - "stopSequence": 68, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:16:21.000+00:00", - "departure": "2009-10-21T23:16:21.000+00:00", - "lat": 45.526643, - "lon": -122.679075, - "name": "NW Glisan & Park", - "stopCode": "2007", - "stopId": "prt:2007", - "stopIndex": 68, - "stopSequence": 69, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:17:11.000+00:00", - "departure": "2009-10-21T23:17:11.000+00:00", - "lat": 45.526601, - "lon": -122.681091, - "name": "NW Glisan & 10th", - "stopCode": "2011", - "stopId": "prt:2011", - "stopIndex": 69, - "stopSequence": 70, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:18:03.000+00:00", - "departure": "2009-10-21T23:18:03.000+00:00", - "lat": 45.526578, - "lon": -122.683142, - "name": "NW Glisan & 12th", - "stopCode": "2030", - "stopId": "prt:2030", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:18:53.000+00:00", - "departure": "2009-10-21T23:18:53.000+00:00", - "lat": 45.526532, - "lon": -122.685164, - "name": "NW Glisan & 14th", - "stopCode": "2046", - "stopId": "prt:2046", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:19:43.000+00:00", - "departure": "2009-10-21T23:19:43.000+00:00", - "lat": 45.526503, - "lon": -122.687165, - "name": "NW Glisan & 16th", - "stopCode": "2062", - "stopId": "prt:2062", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:20:59.000+00:00", - "departure": "2009-10-21T23:20:59.000+00:00", - "lat": 45.526412, - "lon": -122.690196, - "name": "NW Glisan & 19th", - "stopCode": "2086", - "stopId": "prt:2086", - "stopIndex": 73, - "stopSequence": 74, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:22:31.000+00:00", - "departure": "2009-10-21T23:22:31.000+00:00", - "lat": 45.526387, - "lon": -122.693889, - "name": "NW Glisan & 21st", - "stopCode": "2099", - "stopId": "prt:2099", - "stopIndex": 74, - "stopSequence": 75, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1631.03, + "endTime" : "2009-10-21T23:23:32.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:14:50.000+00:00", + "departure" : "2009-10-21T23:14:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "stopIndex" : 66, + "stopSequence" : 67, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1122, + "headsign" : "Sauvie Is. via St.Johns", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:15:41.000+00:00", + "departure" : "2009-10-21T23:15:41.000+00:00", + "lat" : 45.526678, + "lon" : -122.677476, + "name" : "NW Glisan & Broadway", + "stopCode" : "1997", + "stopId" : "prt:1997", + "stopIndex" : 67, + "stopSequence" : 68, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:16:21.000+00:00", + "departure" : "2009-10-21T23:16:21.000+00:00", + "lat" : 45.526643, + "lon" : -122.679075, + "name" : "NW Glisan & Park", + "stopCode" : "2007", + "stopId" : "prt:2007", + "stopIndex" : 68, + "stopSequence" : 69, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:17:11.000+00:00", + "departure" : "2009-10-21T23:17:11.000+00:00", + "lat" : 45.526601, + "lon" : -122.681091, + "name" : "NW Glisan & 10th", + "stopCode" : "2011", + "stopId" : "prt:2011", + "stopIndex" : 69, + "stopSequence" : 70, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:18:03.000+00:00", + "departure" : "2009-10-21T23:18:03.000+00:00", + "lat" : 45.526578, + "lon" : -122.683142, + "name" : "NW Glisan & 12th", + "stopCode" : "2030", + "stopId" : "prt:2030", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:18:53.000+00:00", + "departure" : "2009-10-21T23:18:53.000+00:00", + "lat" : 45.526532, + "lon" : -122.685164, + "name" : "NW Glisan & 14th", + "stopCode" : "2046", + "stopId" : "prt:2046", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:19:43.000+00:00", + "departure" : "2009-10-21T23:19:43.000+00:00", + "lat" : 45.526503, + "lon" : -122.687165, + "name" : "NW Glisan & 16th", + "stopCode" : "2062", + "stopId" : "prt:2062", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:20:59.000+00:00", + "departure" : "2009-10-21T23:20:59.000+00:00", + "lat" : 45.526412, + "lon" : -122.690196, + "name" : "NW Glisan & 19th", + "stopCode" : "2086", + "stopId" : "prt:2086", + "stopIndex" : 73, + "stopSequence" : 74, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:22:31.000+00:00", + "departure" : "2009-10-21T23:22:31.000+00:00", + "lat" : 45.526387, + "lon" : -122.693889, + "name" : "NW Glisan & 21st", + "stopCode" : "2099", + "stopId" : "prt:2099", + "stopIndex" : 74, + "stopSequence" : 75, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 39, - "points": "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Holgate/NW 21st", - "routeId": "prt:17", - "routeLongName": "Holgate/NW 21st", - "routeShortName": "17", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:14:50.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:23:32.000+00:00", - "departure": "2009-10-21T23:23:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "stopIndex": 75, - "stopSequence": 76, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "1707", - "tripId": "prt:171W1490" + "legGeometry" : { + "length" : 39, + "points" : "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Holgate/NW 21st", + "routeId" : "prt:17", + "routeLongName" : "Holgate/NW 21st", + "routeShortName" : "17", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:14:50.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:23:32.000+00:00", + "departure" : "2009-10-21T23:23:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "stopIndex" : 75, + "stopSequence" : 76, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "1707", + "tripId" : "prt:171W1490" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 562.98, - "endTime": "2009-10-21T23:31:21.000+00:00", - "from": { - "arrival": "2009-10-21T23:23:32.000+00:00", - "departure": "2009-10-21T23:23:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 923, - "interlineWithPreviousLeg": false, - "legElevation": "0,52.7,9,52.6,19,52.7,29,52.9,43,53.0,53,53.2,63,53.3,73,53.4,83,53.6,93,53.7,103,54.0,113,54.3,123,54.6,133,54.9,143,55.2,153,55.4,167,55.7,177,56.0,187,56.3,197,56.5,207,56.6,217,56.9,227,57.2,237,57.5,247,57.8,257,58.1,267,58.5,277,58.8,287,59.1,297,59.3,307,59.6,317,59.9,325,60.2,335,60.5,345,60.8,355,61.1,365,61.2,375,61.5,385,61.8,395,62.0,405,62.3,415,62.5,425,62.7,435,63.6,445,64.5,455,65.3,470,66.6,484,67.4,494,67.2,504,66.8,514,66.3,524,65.8,534,65.2,544,64.7,554,64.1,563,63.7", - "legGeometry": { - "length": 9, - "points": "wb{tG`wzkV?LO?@vAD|HDtKFrJ?d@kC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:23:32.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 8.97, - "elevation": "0,52.7,9,52.6", - "lat": 45.527647, - "lon": -122.6944769, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 475.49, - "elevation": "0,52.6,10,52.7,20,52.9,34,53.0,44,53.2,54,53.3,64,53.4,74,53.6,84,53.7,94,54.0,104,54.3,114,54.6,124,54.9,134,55.2,144,55.4,158,55.7,168,56.0,178,56.3,188,56.5,198,56.6,208,56.9,218,57.2,228,57.5,238,57.8,248,58.1,258,58.5,268,58.8,278,59.1,288,59.3,298,59.6,308,59.9,316,60.2,326,60.5,336,60.8,346,61.1,356,61.2,366,61.5,376,61.8,386,62.0,396,62.3,406,62.5,416,62.7,426,63.6,436,64.5,446,65.3,461,66.6,475,67.4", - "lat": 45.5277276, - "lon": -122.6944793, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "0,67.4,10,67.2,20,66.8,30,66.3,40,65.8,50,65.2,60,64.7,70,64.1,79,63.7", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 562.98, + "endTime" : "2009-10-21T23:31:21.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:23:32.000+00:00", + "departure" : "2009-10-21T23:23:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 923, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,52.7,9,52.6,19,52.7,29,52.9,43,53.0,53,53.2,63,53.3,73,53.4,83,53.6,93,53.7,103,54.0,113,54.3,123,54.6,133,54.9,143,55.2,153,55.4,167,55.7,177,56.0,187,56.3,197,56.5,207,56.6,217,56.9,227,57.2,237,57.5,247,57.8,257,58.1,267,58.5,277,58.8,287,59.1,297,59.3,307,59.6,317,59.9,325,60.2,335,60.5,345,60.8,355,61.1,365,61.2,375,61.5,385,61.8,395,62.0,405,62.3,415,62.5,425,62.7,435,63.6,445,64.5,455,65.3,470,66.6,484,67.4,494,67.2,504,66.8,514,66.3,524,65.8,534,65.2,544,64.7,554,64.1,563,63.7", + "legGeometry" : { + "length" : 9, + "points" : "wb{tG`wzkV?LO?@vAD|HDtKFrJ?d@kC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:23:32.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 8.97, + "elevation" : "0,52.7,9,52.6", + "lat" : 45.527647, + "lon" : -122.6944769, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 475.49, + "elevation" : "0,52.6,10,52.7,20,52.9,34,53.0,44,53.2,54,53.3,64,53.4,74,53.6,84,53.7,94,54.0,104,54.3,114,54.6,124,54.9,134,55.2,144,55.4,158,55.7,168,56.0,178,56.3,188,56.5,198,56.6,208,56.9,218,57.2,228,57.5,238,57.8,248,58.1,258,58.5,268,58.8,278,59.1,288,59.3,298,59.6,308,59.9,316,60.2,326,60.5,336,60.8,346,61.1,356,61.2,366,61.5,376,61.8,386,62.0,396,62.3,406,62.5,416,62.7,426,63.6,436,64.5,446,65.3,461,66.6,475,67.4", + "lat" : 45.5277276, + "lon" : -122.6944793, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "0,67.4,10,67.2,20,66.8,30,66.3,40,65.8,50,65.2,60,64.7,70,64.1,79,63.7", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:31:21.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:31:21.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:12:36.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 522, - "waitingTime": 0, - "walkDistance": 730.85, - "walkLimitExceeded": false, - "walkTime": 603 + "startTime" : "2009-10-21T23:12:36.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 522, + "waitingTime" : 0, + "walkDistance" : 730.85, + "walkLimitExceeded" : false, + "walkTime" : 603 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1256, - "elevationGained": 5.48, - "elevationLost": 23.58, - "endTime": "2009-10-21T23:35:04.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1256, + "elevationGained" : 5.48, + "elevationLost" : 23.58, + "endTime" : "2009-10-21T23:35:04.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2465, - "legs": [ + "generalizedCost" : 2465, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 287.82, - "endTime": "2009-10-21T23:18:00.000+00:00", - "from": { - "departure": "2009-10-21T23:14:08.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 442, - "interlineWithPreviousLeg": false, - "legElevation": "0,29.6,0,29.6,10,29.5,18,29.3,28,29.4,38,29.3,48,29.3,58,29.3,68,29.2,78,29.2,86,29.3,98,29.3,104,29.4,114,29.4,124,29.4,134,29.4,144,29.4,154,29.3,164,29.3,170,29.3,177,29.3,187,29.4,197,29.4,207,29.4,237,29.4,250,29.7,260,29.7,270,29.8,280,29.7,288,29.7", - "legGeometry": { - "length": 17, - "points": "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:14:08.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "0,29.6,0,29.6,10,29.5,18,29.3", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 231.76, - "elevation": "0,29.3,10,29.4,20,29.3,30,29.3,40,29.3,50,29.2,60,29.2,68,29.3,80,29.3,86,29.4,96,29.4,106,29.4,116,29.4,126,29.4,136,29.3,146,29.3,152,29.3,159,29.3,169,29.4,179,29.4,189,29.4,219,29.4,232,29.7", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 38.08, - "elevation": "0,29.7,10,29.7,20,29.8,30,29.7,38,29.7", - "lat": 45.5231412, - "lon": -122.6754031, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 287.82, + "endTime" : "2009-10-21T23:18:00.000+00:00", + "from" : { + "departure" : "2009-10-21T23:14:08.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 442, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,29.6,0,29.6,10,29.5,18,29.3,28,29.4,38,29.3,48,29.3,58,29.3,68,29.2,78,29.2,86,29.3,98,29.3,104,29.4,114,29.4,124,29.4,134,29.4,144,29.4,154,29.3,164,29.3,170,29.3,177,29.3,187,29.4,197,29.4,207,29.4,237,29.4,250,29.7,260,29.7,270,29.8,280,29.7,288,29.7", + "legGeometry" : { + "length" : 17, + "points" : "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:14:08.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "0,29.6,0,29.6,10,29.5,18,29.3", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 231.76, + "elevation" : "0,29.3,10,29.4,20,29.3,30,29.3,40,29.3,50,29.2,60,29.2,68,29.3,80,29.3,86,29.4,96,29.4,106,29.4,116,29.4,126,29.4,136,29.3,146,29.3,152,29.3,159,29.3,169,29.4,179,29.4,189,29.4,219,29.4,232,29.7", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 38.08, + "elevation" : "0,29.7,10,29.7,20,29.8,30,29.7,38,29.7", + "lat" : 45.5231412, + "lon" : -122.6754031, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:18:00.000+00:00", - "departure": "2009-10-21T23:18:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:18:00.000+00:00", + "departure" : "2009-10-21T23:18:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1942.25, - "endTime": "2009-10-21T23:28:03.000+00:00", - "from": { - "arrival": "2009-10-21T23:18:00.000+00:00", - "departure": "2009-10-21T23:18:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1203, - "headsign": "Beaverton TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:19:43.000+00:00", - "departure": "2009-10-21T23:19:43.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:21:13.000+00:00", - "departure": "2009-10-21T23:21:13.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:22:18.000+00:00", - "departure": "2009-10-21T23:22:18.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:24:52.000+00:00", - "departure": "2009-10-21T23:24:52.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:00.000+00:00", - "departure": "2009-10-21T23:26:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:24.000+00:00", - "departure": "2009-10-21T23:26:24.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:35.000+00:00", - "departure": "2009-10-21T23:26:35.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:55.000+00:00", - "departure": "2009-10-21T23:26:55.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:27:32.000+00:00", - "departure": "2009-10-21T23:27:32.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1942.25, + "endTime" : "2009-10-21T23:28:03.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:18:00.000+00:00", + "departure" : "2009-10-21T23:18:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1203, + "headsign" : "Beaverton TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:19:43.000+00:00", + "departure" : "2009-10-21T23:19:43.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:21:13.000+00:00", + "departure" : "2009-10-21T23:21:13.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:22:18.000+00:00", + "departure" : "2009-10-21T23:22:18.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:24:52.000+00:00", + "departure" : "2009-10-21T23:24:52.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:00.000+00:00", + "departure" : "2009-10-21T23:26:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:24.000+00:00", + "departure" : "2009-10-21T23:26:24.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:35.000+00:00", + "departure" : "2009-10-21T23:26:35.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:55.000+00:00", + "departure" : "2009-10-21T23:26:55.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:27:32.000+00:00", + "departure" : "2009-10-21T23:27:32.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 56, - "points": "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:18:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:28:03.000+00:00", - "departure": "2009-10-21T23:28:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "stopIndex": 109, - "stopSequence": 110, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "2069", - "tripId": "prt:200W1440" + "legGeometry" : { + "length" : 56, + "points" : "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:18:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:28:03.000+00:00", + "departure" : "2009-10-21T23:28:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "stopIndex" : 109, + "stopSequence" : 110, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "2069", + "tripId" : "prt:200W1440" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 563.7, - "endTime": "2009-10-21T23:35:04.000+00:00", - "from": { - "arrival": "2009-10-21T23:28:03.000+00:00", - "departure": "2009-10-21T23:28:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 819, - "interlineWithPreviousLeg": false, - "legElevation": "0,82.0,9,82.8,19,83.4,29,84.1,39,85.0,49,85.7,55,86.1,65,85.8,75,85.2,85,83.4,95,82.6,105,82.8,115,82.3,125,82.2,135,82.0,142,81.9,152,81.5,162,81.1,172,80.8,182,80.5,192,80.0,202,79.8,212,79.6,222,79.6,231,79.3,241,79.7,246,79.8,256,79.8,266,79.4,276,78.4,286,77.5,296,76.5,306,75.5,316,74.5,323,74.1,328,73.8,338,73.7,348,73.4,358,73.0,368,72.4,378,72.0,388,71.5,398,71.0,407,70.7,417,70.5,427,70.1,437,69.7,447,69.1,457,68.7,467,68.2,477,67.7,485,67.4,495,67.2,505,66.8,515,66.3,525,65.8,535,65.2,545,64.7,555,64.1,564,63.7", - "legGeometry": { - "length": 34, - "points": "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:28:03.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 54.63, - "elevation": "0,82.0,9,82.8,19,82.8,29,83.4,39,84.1,49,85.0,59,85.7,64,86.1", - "lat": 45.5238156, - "lon": -122.7007199, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "0,86.1,10,85.8,20,85.2,30,83.4,40,82.6,50,82.8,60,82.3,70,82.2,80,82.0,87,81.9,97,81.5,107,81.1,117,80.8,127,80.5,137,80.0,147,79.8,157,79.6,167,79.6,176,79.3", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "0,79.3,10,79.7,15,79.8", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 317.41, - "elevation": "0,79.8,10,79.8,20,79.4,30,78.4,40,77.5,50,76.5,60,75.5,70,74.5,76,74.1,82,73.8,92,73.7,102,73.4,112,73.0,122,72.4,132,72.0,142,71.5,152,71.0,161,70.7,171,70.5,181,70.1,191,69.7,201,69.1,211,68.7,221,68.2,231,67.7,239,67.4,249,67.2,259,66.8,269,66.3,279,65.8,289,65.2,299,64.7,309,64.1,317,63.7", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 563.7, + "endTime" : "2009-10-21T23:35:04.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:28:03.000+00:00", + "departure" : "2009-10-21T23:28:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 819, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,82.0,9,82.8,19,83.4,29,84.1,39,85.0,49,85.7,55,86.1,65,85.8,75,85.2,85,83.4,95,82.6,105,82.8,115,82.3,125,82.2,135,82.0,142,81.9,152,81.5,162,81.1,172,80.8,182,80.5,192,80.0,202,79.8,212,79.6,222,79.6,231,79.3,241,79.7,246,79.8,256,79.8,266,79.4,276,78.4,286,77.5,296,76.5,306,75.5,316,74.5,323,74.1,328,73.8,338,73.7,348,73.4,358,73.0,368,72.4,378,72.0,388,71.5,398,71.0,407,70.7,417,70.5,427,70.1,437,69.7,447,69.1,457,68.7,467,68.2,477,67.7,485,67.4,495,67.2,505,66.8,515,66.3,525,65.8,535,65.2,545,64.7,555,64.1,564,63.7", + "legGeometry" : { + "length" : 34, + "points" : "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:28:03.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 54.63, + "elevation" : "0,82.0,9,82.8,19,82.8,29,83.4,39,84.1,49,85.0,59,85.7,64,86.1", + "lat" : 45.5238156, + "lon" : -122.7007199, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "0,86.1,10,85.8,20,85.2,30,83.4,40,82.6,50,82.8,60,82.3,70,82.2,80,82.0,87,81.9,97,81.5,107,81.1,117,80.8,127,80.5,137,80.0,147,79.8,157,79.6,167,79.6,176,79.3", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "0,79.3,10,79.7,15,79.8", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 317.41, + "elevation" : "0,79.8,10,79.8,20,79.4,30,78.4,40,77.5,50,76.5,60,75.5,70,74.5,76,74.1,82,73.8,92,73.7,102,73.4,112,73.0,122,72.4,132,72.0,142,71.5,152,71.0,161,70.7,171,70.5,181,70.1,191,69.7,201,69.1,211,68.7,221,68.2,231,67.7,239,67.4,249,67.2,259,66.8,269,66.3,279,65.8,289,65.2,299,64.7,309,64.1,317,63.7", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:35:04.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:35:04.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:14:08.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 603, - "waitingTime": 0, - "walkDistance": 851.52, - "walkLimitExceeded": false, - "walkTime": 653 + "startTime" : "2009-10-21T23:14:08.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 603, + "waitingTime" : 0, + "walkDistance" : 851.52, + "walkLimitExceeded" : false, + "walkTime" : 653 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1156, - "elevationGained": 9.14, - "elevationLost": 1.09, - "endTime": "2009-10-21T23:37:44.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1156, + "elevationGained" : 9.14, + "elevationLost" : 1.09, + "endTime" : "2009-10-21T23:37:44.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "77" + "feedId" : "prt", + "id" : "77" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2396, - "legs": [ + "generalizedCost" : 2396, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 252.88, - "endTime": "2009-10-21T23:21:53.000+00:00", - "from": { - "departure": "2009-10-21T23:18:28.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 391, - "interlineWithPreviousLeg": false, - "legElevation": "0,29.6,0,29.6,10,29.5,18,29.3,28,29.3,38,29.3,48,29.3,58,29.3,68,29.4,78,29.3,88,29.3,96,29.3,106,29.2,116,29.3,126,29.2,136,29.2,146,29.2,156,29.2,166,29.3,176,29.3,183,29.3,195,29.4,205,29.5,215,29.6,225,29.6,235,29.6,250,29.4,253,29.4", - "legGeometry": { - "length": 15, - "points": "ssztGh_wkV?`@?LK?uBBK?K@sBBM??D?L@\\?lCC??E" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:18:28.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "0,29.6,0,29.6,10,29.5,18,29.3", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 158.01, - "elevation": "0,29.3,10,29.3,20,29.3,30,29.3,40,29.3,50,29.4,60,29.3,70,29.3,79,29.3,89,29.2,99,29.3,109,29.2,119,29.2,129,29.2,139,29.2,149,29.3,158,29.3", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 74.23, - "elevation": "0,29.3,7,29.3,19,29.4,29,29.5,39,29.6,49,29.6,59,29.6,74,29.4", - "lat": 45.5266447, - "lon": -122.6755391, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Glisan Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 2.66, - "elevation": "0,29.4,3,29.4", - "lat": 45.5266303, - "lon": -122.6764917, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 252.88, + "endTime" : "2009-10-21T23:21:53.000+00:00", + "from" : { + "departure" : "2009-10-21T23:18:28.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 391, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,29.6,0,29.6,10,29.5,18,29.3,28,29.3,38,29.3,48,29.3,58,29.3,68,29.4,78,29.3,88,29.3,96,29.3,106,29.2,116,29.3,126,29.2,136,29.2,146,29.2,156,29.2,166,29.3,176,29.3,183,29.3,195,29.4,205,29.5,215,29.6,225,29.6,235,29.6,250,29.4,253,29.4", + "legGeometry" : { + "length" : 15, + "points" : "ssztGh_wkV?`@?LK?uBBK?K@sBBM??D?L@\\?lCC??E" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:18:28.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "0,29.6,0,29.6,10,29.5,18,29.3", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 158.01, + "elevation" : "0,29.3,10,29.3,20,29.3,30,29.3,40,29.3,50,29.4,60,29.3,70,29.3,79,29.3,89,29.2,99,29.3,109,29.2,119,29.2,129,29.2,139,29.2,149,29.3,158,29.3", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 74.23, + "elevation" : "0,29.3,7,29.3,19,29.4,29,29.5,39,29.6,49,29.6,59,29.6,74,29.4", + "lat" : 45.5266447, + "lon" : -122.6755391, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Glisan Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 2.66, + "elevation" : "0,29.4,3,29.4", + "lat" : 45.5266303, + "lon" : -122.6764917, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:21:53.000+00:00", - "departure": "2009-10-21T23:21:53.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:21:53.000+00:00", + "departure" : "2009-10-21T23:21:53.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2232.31, - "endTime": "2009-10-21T23:29:50.000+00:00", - "from": { - "arrival": "2009-10-21T23:21:53.000+00:00", - "departure": "2009-10-21T23:21:53.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "stopIndex": 85, - "stopSequence": 86, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1077, - "headsign": "Montgomery Park", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:22:57.000+00:00", - "departure": "2009-10-21T23:22:57.000+00:00", - "lat": 45.528799, - "lon": -122.677238, - "name": "NW Station Way & Union Station", - "stopCode": "12801", - "stopId": "prt:12801", - "stopIndex": 86, - "stopSequence": 87, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:25:00.000+00:00", - "departure": "2009-10-21T23:25:00.000+00:00", - "lat": 45.531582, - "lon": -122.681193, - "name": "NW Northrup & 10th", - "stopCode": "12802", - "stopId": "prt:12802", - "stopIndex": 87, - "stopSequence": 88, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:25:33.000+00:00", - "departure": "2009-10-21T23:25:33.000+00:00", - "lat": 45.531534, - "lon": -122.683319, - "name": "NW 12th & Northrup", - "stopCode": "12796", - "stopId": "prt:12796", - "stopIndex": 88, - "stopSequence": 89, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:26:04.000+00:00", - "departure": "2009-10-21T23:26:04.000+00:00", - "lat": 45.531503, - "lon": -122.685357, - "name": "NW Northrup & 14th", - "stopCode": "10775", - "stopId": "prt:10775", - "stopIndex": 89, - "stopSequence": 90, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:27:07.000+00:00", - "departure": "2009-10-21T23:27:07.000+00:00", - "lat": 45.531434, - "lon": -122.689417, - "name": "NW Northrup & 18th", - "stopCode": "10776", - "stopId": "prt:10776", - "stopIndex": 90, - "stopSequence": 91, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:28:24.000+00:00", - "departure": "2009-10-21T23:28:24.000+00:00", - "lat": 45.531346, - "lon": -122.694455, - "name": "NW Northrup & 21st", - "stopCode": "10777", - "stopId": "prt:10777", - "stopIndex": 91, - "stopSequence": 92, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:28:55.000+00:00", - "departure": "2009-10-21T23:28:55.000+00:00", - "lat": 45.531308, - "lon": -122.696445, - "name": "NW Northrup & 22nd", - "stopCode": "10778", - "stopId": "prt:10778", - "stopIndex": 92, - "stopSequence": 93, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2232.31, + "endTime" : "2009-10-21T23:29:50.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:21:53.000+00:00", + "departure" : "2009-10-21T23:21:53.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "stopIndex" : 85, + "stopSequence" : 86, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1077, + "headsign" : "Montgomery Park", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:22:57.000+00:00", + "departure" : "2009-10-21T23:22:57.000+00:00", + "lat" : 45.528799, + "lon" : -122.677238, + "name" : "NW Station Way & Union Station", + "stopCode" : "12801", + "stopId" : "prt:12801", + "stopIndex" : 86, + "stopSequence" : 87, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:25:00.000+00:00", + "departure" : "2009-10-21T23:25:00.000+00:00", + "lat" : 45.531582, + "lon" : -122.681193, + "name" : "NW Northrup & 10th", + "stopCode" : "12802", + "stopId" : "prt:12802", + "stopIndex" : 87, + "stopSequence" : 88, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:25:33.000+00:00", + "departure" : "2009-10-21T23:25:33.000+00:00", + "lat" : 45.531534, + "lon" : -122.683319, + "name" : "NW 12th & Northrup", + "stopCode" : "12796", + "stopId" : "prt:12796", + "stopIndex" : 88, + "stopSequence" : 89, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:26:04.000+00:00", + "departure" : "2009-10-21T23:26:04.000+00:00", + "lat" : 45.531503, + "lon" : -122.685357, + "name" : "NW Northrup & 14th", + "stopCode" : "10775", + "stopId" : "prt:10775", + "stopIndex" : 89, + "stopSequence" : 90, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:27:07.000+00:00", + "departure" : "2009-10-21T23:27:07.000+00:00", + "lat" : 45.531434, + "lon" : -122.689417, + "name" : "NW Northrup & 18th", + "stopCode" : "10776", + "stopId" : "prt:10776", + "stopIndex" : 90, + "stopSequence" : 91, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:28:24.000+00:00", + "departure" : "2009-10-21T23:28:24.000+00:00", + "lat" : 45.531346, + "lon" : -122.694455, + "name" : "NW Northrup & 21st", + "stopCode" : "10777", + "stopId" : "prt:10777", + "stopIndex" : 91, + "stopSequence" : 92, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:28:55.000+00:00", + "departure" : "2009-10-21T23:28:55.000+00:00", + "lat" : 45.531308, + "lon" : -122.696445, + "name" : "NW Northrup & 22nd", + "stopCode" : "10778", + "stopId" : "prt:10778", + "stopIndex" : 92, + "stopSequence" : 93, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 53, - "points": "i|ztG|fwkV?LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Broadway/Halsey", - "routeId": "prt:77", - "routeLongName": "Broadway/Halsey", - "routeShortName": "77", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:21:53.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "stopIndex": 93, - "stopSequence": 94, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "7710", - "tripId": "prt:771W1370" + "legGeometry" : { + "length" : 53, + "points" : "i|ztG|fwkV?LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Broadway/Halsey", + "routeId" : "prt:77", + "routeLongName" : "Broadway/Halsey", + "routeShortName" : "77", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:21:53.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "stopIndex" : 93, + "stopSequence" : 94, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "7710", + "tripId" : "prt:771W1370" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 580.63, - "endTime": "2009-10-21T23:37:44.000+00:00", - "from": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 927, - "interlineWithPreviousLeg": false, - "legElevation": "0,55.5,25,55.5,183,60.2,341,60.2,421,60.2,431,60.4,441,60.6,451,60.9,461,61.2,471,61.5,481,61.8,491,62.0,499,62.2,509,62.5,519,62.9,529,63.3,539,63.5,549,63.3,559,63.2,569,63.4,579,63.7,581,63.7", - "legGeometry": { - "length": 12, - "points": "}~{tGnq{kV?LVAF?J?FtKlCClCEnCElCElCCB?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:29:50.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 24.9, - "elevation": "0,55.5,39,55.5", - "lat": 45.5321578, - "lon": -122.6987026, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 158.45, - "elevation": "0,55.5,158,60.2", - "lat": 45.531934, - "lon": -122.698695, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Overton Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 397.28, - "elevation": "0,60.2,158,60.2,238,60.2,248,60.4,258,60.6,268,60.9,278,61.2,288,61.5,298,61.8,308,62.0,316,62.2,326,62.5,336,62.9,346,63.3,356,63.5,366,63.3,376,63.2,386,63.4,396,63.7,397,63.7", - "lat": 45.5318916, - "lon": -122.7007283, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 580.63, + "endTime" : "2009-10-21T23:37:44.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 927, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,55.5,25,55.5,183,60.2,341,60.2,421,60.2,431,60.4,441,60.6,451,60.9,461,61.2,471,61.5,481,61.8,491,62.0,499,62.2,509,62.5,519,62.9,529,63.3,539,63.5,549,63.3,559,63.2,569,63.4,579,63.7,581,63.7", + "legGeometry" : { + "length" : 12, + "points" : "}~{tGnq{kV?LVAF?J?FtKlCClCEnCElCElCCB?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:29:50.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 24.9, + "elevation" : "0,55.5,39,55.5", + "lat" : 45.5321578, + "lon" : -122.6987026, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 158.45, + "elevation" : "0,55.5,158,60.2", + "lat" : 45.531934, + "lon" : -122.698695, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Overton Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 397.28, + "elevation" : "0,60.2,158,60.2,238,60.2,248,60.4,258,60.6,268,60.9,278,61.2,288,61.5,298,61.8,308,62.0,316,62.2,326,62.5,336,62.9,346,63.3,356,63.5,366,63.3,376,63.2,386,63.4,396,63.7,397,63.7", + "lat" : 45.5318916, + "lon" : -122.7007283, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:37:44.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:37:44.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:18:28.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 477, - "waitingTime": 0, - "walkDistance": 833.51, - "walkLimitExceeded": false, - "walkTime": 679 + "startTime" : "2009-10-21T23:18:28.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 477, + "waitingTime" : 0, + "walkDistance" : 833.51, + "walkLimitExceeded" : false, + "walkTime" : 679 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1535, - "elevationGained": 9.48, - "elevationLost": 4.76, - "endTime": "2009-10-21T23:46:18.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1535, + "elevationGained" : 9.48, + "elevationLost" : 4.76, + "endTime" : "2009-10-21T23:46:18.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "15" + "feedId" : "prt", + "id" : "15" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2787, - "legs": [ + "generalizedCost" : 2787, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 618.76, - "endTime": "2009-10-21T23:29:00.000+00:00", - "from": { - "departure": "2009-10-21T23:20:43.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 949, - "interlineWithPreviousLeg": false, - "legElevation": "0,29.6,0,29.6,10,29.5,18,29.3,28,29.4,38,29.3,48,29.3,58,29.3,68,29.2,78,29.2,86,29.3,98,29.3,104,29.4,114,29.4,124,29.4,134,29.4,144,29.4,154,29.3,164,29.3,170,29.3,177,29.3,187,29.4,197,29.4,207,29.4,237,29.4,250,29.7,263,29.6,273,29.6,283,29.5,293,29.5,303,29.7,314,29.6,324,29.7,334,29.7,344,29.7,354,29.8,367,29.8,375,29.9,385,29.9,395,30.0,405,30.0,415,30.1,425,30.0,438,30.1,447,30.0,457,29.9,467,29.9,477,30.0,487,30.0,497,30.0,507,30.1,514,30.1,526,30.2,536,30.3,546,30.3,556,30.5,566,30.6,576,30.7,586,30.8,599,30.9,605,30.9,619,30.9", - "legGeometry": { - "length": 37, - "points": "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJAVCJAF@F@b@NPHFBD@fA`@JDJBhBx@NFNJ~Ap@F@LFLFhBx@@?HDBOBOGE" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:20:43.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "0,29.6,0,29.6,10,29.5,18,29.3", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 231.76, - "elevation": "0,29.3,10,29.4,20,29.3,30,29.3,40,29.3,50,29.2,60,29.2,68,29.3,80,29.3,86,29.4,96,29.4,106,29.4,116,29.4,126,29.4,136,29.3,146,29.3,152,29.3,159,29.3,169,29.4,179,29.4,189,29.4,219,29.4,232,29.7", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 355.36, - "elevation": "0,29.7,13,29.6,23,29.6,33,29.5,43,29.5,53,29.7,65,29.6,75,29.7,85,29.7,95,29.7,105,29.8,117,29.8,125,29.9,135,29.9,145,30.0,155,30.0,165,30.1,175,30.0,188,30.1,197,30.0,207,29.9,217,29.9,227,30.0,237,30.0,247,30.0,257,30.1,264,30.1,276,30.2,286,30.3,296,30.3,306,30.5,316,30.6,326,30.7,336,30.8,350,30.9,355,30.9", - "lat": 45.5231412, - "lon": -122.6754031, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Southwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 13.65, - "elevation": "0,30.9,14,30.9", - "lat": 45.5201247, - "lon": -122.676825, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Southwest Washington Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 618.76, + "endTime" : "2009-10-21T23:29:00.000+00:00", + "from" : { + "departure" : "2009-10-21T23:20:43.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 949, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,29.6,0,29.6,10,29.5,18,29.3,28,29.4,38,29.3,48,29.3,58,29.3,68,29.2,78,29.2,86,29.3,98,29.3,104,29.4,114,29.4,124,29.4,134,29.4,144,29.4,154,29.3,164,29.3,170,29.3,177,29.3,187,29.4,197,29.4,207,29.4,237,29.4,250,29.7,263,29.6,273,29.6,283,29.5,293,29.5,303,29.7,314,29.6,324,29.7,334,29.7,344,29.7,354,29.8,367,29.8,375,29.9,385,29.9,395,30.0,405,30.0,415,30.1,425,30.0,438,30.1,447,30.0,457,29.9,467,29.9,477,30.0,487,30.0,497,30.0,507,30.1,514,30.1,526,30.2,536,30.3,546,30.3,556,30.5,566,30.6,576,30.7,586,30.8,599,30.9,605,30.9,619,30.9", + "legGeometry" : { + "length" : 37, + "points" : "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJAVCJAF@F@b@NPHFBD@fA`@JDJBhBx@NFNJ~Ap@F@LFLFhBx@@?HDBOBOGE" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:20:43.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "0,29.6,0,29.6,10,29.5,18,29.3", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 231.76, + "elevation" : "0,29.3,10,29.4,20,29.3,30,29.3,40,29.3,50,29.2,60,29.2,68,29.3,80,29.3,86,29.4,96,29.4,106,29.4,116,29.4,126,29.4,136,29.3,146,29.3,152,29.3,159,29.3,169,29.4,179,29.4,189,29.4,219,29.4,232,29.7", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 355.36, + "elevation" : "0,29.7,13,29.6,23,29.6,33,29.5,43,29.5,53,29.7,65,29.6,75,29.7,85,29.7,95,29.7,105,29.8,117,29.8,125,29.9,135,29.9,145,30.0,155,30.0,165,30.1,175,30.0,188,30.1,197,30.0,207,29.9,217,29.9,227,30.0,237,30.0,247,30.0,257,30.1,264,30.1,276,30.2,286,30.3,296,30.3,306,30.5,316,30.6,326,30.7,336,30.8,350,30.9,355,30.9", + "lat" : 45.5231412, + "lon" : -122.6754031, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Southwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 13.65, + "elevation" : "0,30.9,14,30.9", + "lat" : 45.5201247, + "lon" : -122.676825, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Southwest Washington Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:29:00.000+00:00", - "departure": "2009-10-21T23:29:00.000+00:00", - "lat": 45.520129, - "lon": -122.676635, - "name": "SW Washington & 5th", - "stopCode": "6160", - "stopId": "prt:6160", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:29:00.000+00:00", + "departure" : "2009-10-21T23:29:00.000+00:00", + "lat" : 45.520129, + "lon" : -122.676635, + "name" : "SW Washington & 5th", + "stopCode" : "6160", + "stopId" : "prt:6160", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2504.42, - "endTime": "2009-10-21T23:42:47.000+00:00", - "from": { - "arrival": "2009-10-21T23:29:00.000+00:00", - "departure": "2009-10-21T23:29:00.000+00:00", - "lat": 45.520129, - "lon": -122.676635, - "name": "SW Washington & 5th", - "stopCode": "6160", - "stopId": "prt:6160", - "stopIndex": 58, - "stopSequence": 59, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1427, - "headsign": "27th & Thurman", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:30:01.000+00:00", - "departure": "2009-10-21T23:30:01.000+00:00", - "lat": 45.520695, - "lon": -122.678657, - "name": "SW Washington & Broadway", - "stopCode": "6137", - "stopId": "prt:6137", - "stopIndex": 59, - "stopSequence": 60, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:30:49.000+00:00", - "departure": "2009-10-21T23:30:49.000+00:00", - "lat": 45.521124, - "lon": -122.6803, - "name": "SW Washington & 9th", - "stopCode": "6169", - "stopId": "prt:6169", - "stopIndex": 60, - "stopSequence": 61, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:32:14.000+00:00", - "departure": "2009-10-21T23:32:14.000+00:00", - "lat": 45.521094, - "lon": -122.682819, - "name": "SW 11th & Alder", - "stopCode": "9600", - "stopId": "prt:9600", - "stopIndex": 61, - "stopSequence": 62, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:33:12.000+00:00", - "departure": "2009-10-21T23:33:12.000+00:00", - "lat": 45.52055, - "lon": -122.683933, - "name": "SW Morrison & 12th", - "stopCode": "9598", - "stopId": "prt:9598", - "stopIndex": 62, - "stopSequence": 63, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:34:09.000+00:00", - "departure": "2009-10-21T23:34:09.000+00:00", - "lat": 45.521063, - "lon": -122.685848, - "name": "SW Morrison & 14th", - "stopCode": "9708", - "stopId": "prt:9708", - "stopIndex": 63, - "stopSequence": 64, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:35:11.000+00:00", - "departure": "2009-10-21T23:35:11.000+00:00", - "lat": 45.521641, - "lon": -122.687932, - "name": "SW Morrison & 16th", - "stopCode": "9613", - "stopId": "prt:9613", - "stopIndex": 64, - "stopSequence": 65, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:36:00.000+00:00", - "departure": "2009-10-21T23:36:00.000+00:00", - "lat": 45.52206, - "lon": -122.689577, - "name": "SW Morrison & 17th", - "stopCode": "9599", - "stopId": "prt:9599", - "stopIndex": 65, - "stopSequence": 66, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:37:12.000+00:00", - "departure": "2009-10-21T23:37:12.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 66, - "stopSequence": 67, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:38:01.000+00:00", - "departure": "2009-10-21T23:38:01.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 67, - "stopSequence": 68, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:38:25.000+00:00", - "departure": "2009-10-21T23:38:25.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 68, - "stopSequence": 69, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:39:07.000+00:00", - "departure": "2009-10-21T23:39:07.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 69, - "stopSequence": 70, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:40:24.000+00:00", - "departure": "2009-10-21T23:40:24.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:41:35.000+00:00", - "departure": "2009-10-21T23:41:35.000+00:00", - "lat": 45.525416, - "lon": -122.698381, - "name": "NW 23rd & Flanders", - "stopCode": "7157", - "stopId": "prt:7157", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2504.42, + "endTime" : "2009-10-21T23:42:47.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:29:00.000+00:00", + "departure" : "2009-10-21T23:29:00.000+00:00", + "lat" : 45.520129, + "lon" : -122.676635, + "name" : "SW Washington & 5th", + "stopCode" : "6160", + "stopId" : "prt:6160", + "stopIndex" : 58, + "stopSequence" : 59, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1427, + "headsign" : "27th & Thurman", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:30:01.000+00:00", + "departure" : "2009-10-21T23:30:01.000+00:00", + "lat" : 45.520695, + "lon" : -122.678657, + "name" : "SW Washington & Broadway", + "stopCode" : "6137", + "stopId" : "prt:6137", + "stopIndex" : 59, + "stopSequence" : 60, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:30:49.000+00:00", + "departure" : "2009-10-21T23:30:49.000+00:00", + "lat" : 45.521124, + "lon" : -122.6803, + "name" : "SW Washington & 9th", + "stopCode" : "6169", + "stopId" : "prt:6169", + "stopIndex" : 60, + "stopSequence" : 61, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:32:14.000+00:00", + "departure" : "2009-10-21T23:32:14.000+00:00", + "lat" : 45.521094, + "lon" : -122.682819, + "name" : "SW 11th & Alder", + "stopCode" : "9600", + "stopId" : "prt:9600", + "stopIndex" : 61, + "stopSequence" : 62, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:33:12.000+00:00", + "departure" : "2009-10-21T23:33:12.000+00:00", + "lat" : 45.52055, + "lon" : -122.683933, + "name" : "SW Morrison & 12th", + "stopCode" : "9598", + "stopId" : "prt:9598", + "stopIndex" : 62, + "stopSequence" : 63, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:34:09.000+00:00", + "departure" : "2009-10-21T23:34:09.000+00:00", + "lat" : 45.521063, + "lon" : -122.685848, + "name" : "SW Morrison & 14th", + "stopCode" : "9708", + "stopId" : "prt:9708", + "stopIndex" : 63, + "stopSequence" : 64, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:35:11.000+00:00", + "departure" : "2009-10-21T23:35:11.000+00:00", + "lat" : 45.521641, + "lon" : -122.687932, + "name" : "SW Morrison & 16th", + "stopCode" : "9613", + "stopId" : "prt:9613", + "stopIndex" : 64, + "stopSequence" : 65, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:36:00.000+00:00", + "departure" : "2009-10-21T23:36:00.000+00:00", + "lat" : 45.52206, + "lon" : -122.689577, + "name" : "SW Morrison & 17th", + "stopCode" : "9599", + "stopId" : "prt:9599", + "stopIndex" : 65, + "stopSequence" : 66, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:37:12.000+00:00", + "departure" : "2009-10-21T23:37:12.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 66, + "stopSequence" : 67, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:38:01.000+00:00", + "departure" : "2009-10-21T23:38:01.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 67, + "stopSequence" : 68, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:38:25.000+00:00", + "departure" : "2009-10-21T23:38:25.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 68, + "stopSequence" : 69, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:39:07.000+00:00", + "departure" : "2009-10-21T23:39:07.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 69, + "stopSequence" : 70, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:40:24.000+00:00", + "departure" : "2009-10-21T23:40:24.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:41:35.000+00:00", + "departure" : "2009-10-21T23:41:35.000+00:00", + "lat" : 45.525416, + "lon" : -122.698381, + "name" : "NW 23rd & Flanders", + "stopCode" : "7157", + "stopId" : "prt:7157", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 73, - "points": "osytGbhwkVIf@u@jEk@bD??If@u@|DW`B??CPs@|Du@lElBz@??VJbCfAk@dD??Id@w@rEWvAId@AF??Q~@s@`Ei@~C??Ib@u@dEWzA??]jB]MQSe@WOKOKIIQe@GWE]GnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APkAh@o@?sCB{BD??S?mCDmCDyBB" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Belmont/NW 23rd", - "routeId": "prt:15", - "routeLongName": "Belmont/NW 23rd", - "routeShortName": "15", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:29:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:42:47.000+00:00", - "departure": "2009-10-21T23:42:47.000+00:00", - "lat": 45.527543, - "lon": -122.698473, - "name": "NW 23rd & Irving", - "stopCode": "7161", - "stopId": "prt:7161", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "1543", - "tripId": "prt:150W1650" + "legGeometry" : { + "length" : 73, + "points" : "osytGbhwkVIf@u@jEk@bD??If@u@|DW`B??CPs@|Du@lElBz@??VJbCfAk@dD??Id@w@rEWvAId@AF??Q~@s@`Ei@~C??Ib@u@dEWzA??]jB]MQSe@WOKOKIIQe@GWE]GnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APkAh@o@?sCB{BD??S?mCDmCDyBB" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Belmont/NW 23rd", + "routeId" : "prt:15", + "routeLongName" : "Belmont/NW 23rd", + "routeShortName" : "15", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:29:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:42:47.000+00:00", + "departure" : "2009-10-21T23:42:47.000+00:00", + "lat" : 45.527543, + "lon" : -122.698473, + "name" : "NW 23rd & Irving", + "stopCode" : "7161", + "stopId" : "prt:7161", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "1543", + "tripId" : "prt:150W1650" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 250.02, - "endTime": "2009-10-21T23:46:18.000+00:00", - "from": { - "arrival": "2009-10-21T23:42:47.000+00:00", - "departure": "2009-10-21T23:42:47.000+00:00", - "lat": 45.527543, - "lon": -122.698473, - "name": "NW 23rd & Irving", - "stopCode": "7161", - "stopId": "prt:7161", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 410, - "interlineWithPreviousLeg": false, - "legElevation": "0,60.3,12,60.2,22,60.5,32,60.8,42,61.1,52,61.2,62,61.5,72,61.8,82,62.0,92,62.3,102,62.5,112,62.7,122,63.6,132,64.5,142,65.3,157,66.6,171,67.4,181,67.2,191,66.8,201,66.3,211,65.8,221,65.2,231,64.7,241,64.1,250,63.7", - "legGeometry": { - "length": 7, - "points": "cb{tGnp{kV?JG?M?FrJ?d@kC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:42:47.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 12.24, - "elevation": "0,60.3,12,60.2", - "lat": 45.5275419, - "lon": -122.6985332, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 159.25, - "elevation": "0,60.2,10,60.5,20,60.8,30,61.1,40,61.2,50,61.5,60,61.8,70,62.0,80,62.3,90,62.5,100,62.7,110,63.6,120,64.5,130,65.3,145,66.6,159,67.4", - "lat": 45.5276519, - "lon": -122.6985374, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "0,67.4,10,67.2,20,66.8,30,66.3,40,65.8,50,65.2,60,64.7,70,64.1,79,63.7", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 250.02, + "endTime" : "2009-10-21T23:46:18.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:42:47.000+00:00", + "departure" : "2009-10-21T23:42:47.000+00:00", + "lat" : 45.527543, + "lon" : -122.698473, + "name" : "NW 23rd & Irving", + "stopCode" : "7161", + "stopId" : "prt:7161", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 410, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,60.3,12,60.2,22,60.5,32,60.8,42,61.1,52,61.2,62,61.5,72,61.8,82,62.0,92,62.3,102,62.5,112,62.7,122,63.6,132,64.5,142,65.3,157,66.6,171,67.4,181,67.2,191,66.8,201,66.3,211,65.8,221,65.2,231,64.7,241,64.1,250,63.7", + "legGeometry" : { + "length" : 7, + "points" : "cb{tGnp{kV?JG?M?FrJ?d@kC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:42:47.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 12.24, + "elevation" : "0,60.3,12,60.2", + "lat" : 45.5275419, + "lon" : -122.6985332, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 159.25, + "elevation" : "0,60.2,10,60.5,20,60.8,30,61.1,40,61.2,50,61.5,60,61.8,70,62.0,80,62.3,90,62.5,100,62.7,110,63.6,120,64.5,130,65.3,145,66.6,159,67.4", + "lat" : 45.5276519, + "lon" : -122.6985374, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "0,67.4,10,67.2,20,66.8,30,66.3,40,65.8,50,65.2,60,64.7,70,64.1,79,63.7", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:46:18.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:46:18.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:20:43.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 827, - "waitingTime": 0, - "walkDistance": 868.78, - "walkLimitExceeded": false, - "walkTime": 708 + "startTime" : "2009-10-21T23:20:43.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 827, + "waitingTime" : 0, + "walkDistance" : 868.78, + "walkLimitExceeded" : false, + "walkTime" : 708 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1125, - "elevationGained": 15.03, - "elevationLost": 4.23, - "endTime": "2009-10-21T23:46:21.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1125, + "elevationGained" : 15.03, + "elevationLost" : 4.23, + "endTime" : "2009-10-21T23:46:21.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "17" + "feedId" : "prt", + "id" : "17" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2305, - "legs": [ + "generalizedCost" : 2305, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 167.87, - "endTime": "2009-10-21T23:29:50.000+00:00", - "from": { - "departure": "2009-10-21T23:27:36.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 259, - "interlineWithPreviousLeg": false, - "legElevation": "0,29.6,0,29.6,10,29.5,18,29.3,28,29.3,38,29.3,48,29.3,58,29.3,68,29.4,78,29.3,88,29.3,96,29.3,106,29.3,116,29.4,126,29.4,136,29.4,146,29.4,156,29.3,168,29.3", - "legGeometry": { - "length": 10, - "points": "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:27:36.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "0,29.6,0,29.6,10,29.5,18,29.3", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.51, - "elevation": "0,29.3,10,29.3,20,29.3,30,29.3,40,29.3,50,29.4,60,29.3,70,29.3,79,29.3", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 71.38, - "elevation": "0,29.3,10,29.3,20,29.4,30,29.4,40,29.4,50,29.4,60,29.3,71,29.3", - "lat": 45.52593, - "lon": -122.6755097, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Flanders Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 167.87, + "endTime" : "2009-10-21T23:29:50.000+00:00", + "from" : { + "departure" : "2009-10-21T23:27:36.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 259, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,29.6,0,29.6,10,29.5,18,29.3,28,29.3,38,29.3,48,29.3,58,29.3,68,29.4,78,29.3,88,29.3,96,29.3,106,29.3,116,29.4,126,29.4,136,29.4,146,29.4,156,29.3,168,29.3", + "legGeometry" : { + "length" : 10, + "points" : "ssztGh_wkV?`@?LK?uBBK??F?JBbDN?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:27:36.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "0,29.6,0,29.6,10,29.5,18,29.3", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.51, + "elevation" : "0,29.3,10,29.3,20,29.3,30,29.3,40,29.3,50,29.4,60,29.3,70,29.3,79,29.3", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 71.38, + "elevation" : "0,29.3,10,29.3,20,29.4,30,29.4,40,29.4,50,29.4,60,29.3,71,29.3", + "lat" : 45.52593, + "lon" : -122.6755097, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Flanders Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1631.03, - "endTime": "2009-10-21T23:38:32.000+00:00", - "from": { - "arrival": "2009-10-21T23:29:50.000+00:00", - "departure": "2009-10-21T23:29:50.000+00:00", - "lat": 45.52583, - "lon": -122.676422, - "name": "NW 6th & Flanders", - "stopCode": "9300", - "stopId": "prt:9300", - "stopIndex": 66, - "stopSequence": 67, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1122, - "headsign": "31st & Industrial", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:30:41.000+00:00", - "departure": "2009-10-21T23:30:41.000+00:00", - "lat": 45.526678, - "lon": -122.677476, - "name": "NW Glisan & Broadway", - "stopCode": "1997", - "stopId": "prt:1997", - "stopIndex": 67, - "stopSequence": 68, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:31:21.000+00:00", - "departure": "2009-10-21T23:31:21.000+00:00", - "lat": 45.526643, - "lon": -122.679075, - "name": "NW Glisan & Park", - "stopCode": "2007", - "stopId": "prt:2007", - "stopIndex": 68, - "stopSequence": 69, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:32:11.000+00:00", - "departure": "2009-10-21T23:32:11.000+00:00", - "lat": 45.526601, - "lon": -122.681091, - "name": "NW Glisan & 10th", - "stopCode": "2011", - "stopId": "prt:2011", - "stopIndex": 69, - "stopSequence": 70, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:33:03.000+00:00", - "departure": "2009-10-21T23:33:03.000+00:00", - "lat": 45.526578, - "lon": -122.683142, - "name": "NW Glisan & 12th", - "stopCode": "2030", - "stopId": "prt:2030", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:33:53.000+00:00", - "departure": "2009-10-21T23:33:53.000+00:00", - "lat": 45.526532, - "lon": -122.685164, - "name": "NW Glisan & 14th", - "stopCode": "2046", - "stopId": "prt:2046", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:34:43.000+00:00", - "departure": "2009-10-21T23:34:43.000+00:00", - "lat": 45.526503, - "lon": -122.687165, - "name": "NW Glisan & 16th", - "stopCode": "2062", - "stopId": "prt:2062", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:35:59.000+00:00", - "departure": "2009-10-21T23:35:59.000+00:00", - "lat": 45.526412, - "lon": -122.690196, - "name": "NW Glisan & 19th", - "stopCode": "2086", - "stopId": "prt:2086", - "stopIndex": 73, - "stopSequence": 74, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:37:31.000+00:00", - "departure": "2009-10-21T23:37:31.000+00:00", - "lat": 45.526387, - "lon": -122.693889, - "name": "NW Glisan & 21st", - "stopCode": "2099", - "stopId": "prt:2099", - "stopIndex": 74, - "stopSequence": 75, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1631.03, + "endTime" : "2009-10-21T23:38:32.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:29:50.000+00:00", + "departure" : "2009-10-21T23:29:50.000+00:00", + "lat" : 45.52583, + "lon" : -122.676422, + "name" : "NW 6th & Flanders", + "stopCode" : "9300", + "stopId" : "prt:9300", + "stopIndex" : 66, + "stopSequence" : 67, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1122, + "headsign" : "31st & Industrial", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:30:41.000+00:00", + "departure" : "2009-10-21T23:30:41.000+00:00", + "lat" : 45.526678, + "lon" : -122.677476, + "name" : "NW Glisan & Broadway", + "stopCode" : "1997", + "stopId" : "prt:1997", + "stopIndex" : 67, + "stopSequence" : 68, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:31:21.000+00:00", + "departure" : "2009-10-21T23:31:21.000+00:00", + "lat" : 45.526643, + "lon" : -122.679075, + "name" : "NW Glisan & Park", + "stopCode" : "2007", + "stopId" : "prt:2007", + "stopIndex" : 68, + "stopSequence" : 69, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:32:11.000+00:00", + "departure" : "2009-10-21T23:32:11.000+00:00", + "lat" : 45.526601, + "lon" : -122.681091, + "name" : "NW Glisan & 10th", + "stopCode" : "2011", + "stopId" : "prt:2011", + "stopIndex" : 69, + "stopSequence" : 70, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:33:03.000+00:00", + "departure" : "2009-10-21T23:33:03.000+00:00", + "lat" : 45.526578, + "lon" : -122.683142, + "name" : "NW Glisan & 12th", + "stopCode" : "2030", + "stopId" : "prt:2030", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:33:53.000+00:00", + "departure" : "2009-10-21T23:33:53.000+00:00", + "lat" : 45.526532, + "lon" : -122.685164, + "name" : "NW Glisan & 14th", + "stopCode" : "2046", + "stopId" : "prt:2046", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:34:43.000+00:00", + "departure" : "2009-10-21T23:34:43.000+00:00", + "lat" : 45.526503, + "lon" : -122.687165, + "name" : "NW Glisan & 16th", + "stopCode" : "2062", + "stopId" : "prt:2062", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:35:59.000+00:00", + "departure" : "2009-10-21T23:35:59.000+00:00", + "lat" : 45.526412, + "lon" : -122.690196, + "name" : "NW Glisan & 19th", + "stopCode" : "2086", + "stopId" : "prt:2086", + "stopIndex" : 73, + "stopSequence" : 74, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:37:31.000+00:00", + "departure" : "2009-10-21T23:37:31.000+00:00", + "lat" : 45.526387, + "lon" : -122.693889, + "name" : "NW Glisan & 21st", + "stopCode" : "2099", + "stopId" : "prt:2099", + "stopIndex" : 74, + "stopSequence" : 75, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 39, - "points": "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Holgate/NW 21st", - "routeId": "prt:17", - "routeLongName": "Holgate/NW 21st", - "routeShortName": "17", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:29:50.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:38:32.000+00:00", - "departure": "2009-10-21T23:38:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "stopIndex": 75, - "stopSequence": 76, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "1701", - "tripId": "prt:171W1500" + "legGeometry" : { + "length" : 39, + "points" : "kwztGhgwkVQ?kC@@zD???PBjE?`B??@X@jEBjD???\\BhEBpD???XBhE@nD??@Z?hEBtA?h@@h@??@Z@nEBhEBhD???`@FtKDhH??@hBoCD}BB" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Holgate/NW 21st", + "routeId" : "prt:17", + "routeLongName" : "Holgate/NW 21st", + "routeShortName" : "17", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:29:50.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:38:32.000+00:00", + "departure" : "2009-10-21T23:38:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "stopIndex" : 75, + "stopSequence" : 76, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "1701", + "tripId" : "prt:171W1500" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 562.98, - "endTime": "2009-10-21T23:46:21.000+00:00", - "from": { - "arrival": "2009-10-21T23:38:32.000+00:00", - "departure": "2009-10-21T23:38:32.000+00:00", - "lat": 45.527648, - "lon": -122.694407, - "name": "NW 21st & Irving", - "stopCode": "7113", - "stopId": "prt:7113", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 923, - "interlineWithPreviousLeg": false, - "legElevation": "0,52.7,9,52.6,19,52.7,29,52.9,43,53.0,53,53.2,63,53.3,73,53.4,83,53.6,93,53.7,103,54.0,113,54.3,123,54.6,133,54.9,143,55.2,153,55.4,167,55.7,177,56.0,187,56.3,197,56.5,207,56.6,217,56.9,227,57.2,237,57.5,247,57.8,257,58.1,267,58.5,277,58.8,287,59.1,297,59.3,307,59.6,317,59.9,325,60.2,335,60.5,345,60.8,355,61.1,365,61.2,375,61.5,385,61.8,395,62.0,405,62.3,415,62.5,425,62.7,435,63.6,445,64.5,455,65.3,470,66.6,484,67.4,494,67.2,504,66.8,514,66.3,524,65.8,534,65.2,544,64.7,554,64.1,563,63.7", - "legGeometry": { - "length": 9, - "points": "wb{tG`wzkV?LO?@vAD|HDtKFrJ?d@kC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:38:32.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 8.97, - "elevation": "0,52.7,9,52.6", - "lat": 45.527647, - "lon": -122.6944769, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 21st Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 475.49, - "elevation": "0,52.6,10,52.7,20,52.9,34,53.0,44,53.2,54,53.3,64,53.4,74,53.6,84,53.7,94,54.0,104,54.3,114,54.6,124,54.9,134,55.2,144,55.4,158,55.7,168,56.0,178,56.3,188,56.5,198,56.6,208,56.9,218,57.2,228,57.5,238,57.8,248,58.1,258,58.5,268,58.8,278,59.1,288,59.3,298,59.6,308,59.9,316,60.2,326,60.5,336,60.8,346,61.1,356,61.2,366,61.5,376,61.8,386,62.0,396,62.3,406,62.5,416,62.7,426,63.6,436,64.5,446,65.3,461,66.6,475,67.4", - "lat": 45.5277276, - "lon": -122.6944793, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 78.53, - "elevation": "0,67.4,10,67.2,20,66.8,30,66.3,40,65.8,50,65.2,60,64.7,70,64.1,79,63.7", - "lat": 45.5276138, - "lon": -122.700581, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 562.98, + "endTime" : "2009-10-21T23:46:21.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:38:32.000+00:00", + "departure" : "2009-10-21T23:38:32.000+00:00", + "lat" : 45.527648, + "lon" : -122.694407, + "name" : "NW 21st & Irving", + "stopCode" : "7113", + "stopId" : "prt:7113", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 923, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,52.7,9,52.6,19,52.7,29,52.9,43,53.0,53,53.2,63,53.3,73,53.4,83,53.6,93,53.7,103,54.0,113,54.3,123,54.6,133,54.9,143,55.2,153,55.4,167,55.7,177,56.0,187,56.3,197,56.5,207,56.6,217,56.9,227,57.2,237,57.5,247,57.8,257,58.1,267,58.5,277,58.8,287,59.1,297,59.3,307,59.6,317,59.9,325,60.2,335,60.5,345,60.8,355,61.1,365,61.2,375,61.5,385,61.8,395,62.0,405,62.3,415,62.5,425,62.7,435,63.6,445,64.5,455,65.3,470,66.6,484,67.4,494,67.2,504,66.8,514,66.3,524,65.8,534,65.2,544,64.7,554,64.1,563,63.7", + "legGeometry" : { + "length" : 9, + "points" : "wb{tG`wzkV?LO?@vAD|HDtKFrJ?d@kC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:38:32.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 8.97, + "elevation" : "0,52.7,9,52.6", + "lat" : 45.527647, + "lon" : -122.6944769, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 21st Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 475.49, + "elevation" : "0,52.6,10,52.7,20,52.9,34,53.0,44,53.2,54,53.3,64,53.4,74,53.6,84,53.7,94,54.0,104,54.3,114,54.6,124,54.9,134,55.2,144,55.4,158,55.7,168,56.0,178,56.3,188,56.5,198,56.6,208,56.9,218,57.2,228,57.5,238,57.8,248,58.1,258,58.5,268,58.8,278,59.1,288,59.3,298,59.6,308,59.9,316,60.2,326,60.5,336,60.8,346,61.1,356,61.2,366,61.5,376,61.8,386,62.0,396,62.3,406,62.5,416,62.7,426,63.6,436,64.5,446,65.3,461,66.6,475,67.4", + "lat" : 45.5277276, + "lon" : -122.6944793, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 78.53, + "elevation" : "0,67.4,10,67.2,20,66.8,30,66.3,40,65.8,50,65.2,60,64.7,70,64.1,79,63.7", + "lat" : 45.5276138, + "lon" : -122.700581, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:46:21.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:46:21.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:27:36.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 522, - "waitingTime": 0, - "walkDistance": 730.85, - "walkLimitExceeded": false, - "walkTime": 603 + "startTime" : "2009-10-21T23:27:36.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 522, + "waitingTime" : 0, + "walkDistance" : 730.85, + "walkLimitExceeded" : false, + "walkTime" : 603 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1316, - "elevationGained": 5.48, - "elevationLost": 23.58, - "endTime": "2009-10-21T23:51:04.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1316, + "elevationGained" : 5.48, + "elevationLost" : 23.58, + "endTime" : "2009-10-21T23:51:04.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2525, - "legs": [ + "generalizedCost" : 2525, + "legs" : [ { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 287.82, - "endTime": "2009-10-21T23:33:00.000+00:00", - "from": { - "departure": "2009-10-21T23:29:08.000+00:00", - "lat": 45.52523, - "lon": -122.67525, - "name": "NW Everett St. & NW 5th Ave. (P3)", - "vertexType": "NORMAL" - }, - "generalizedCost": 442, - "interlineWithPreviousLeg": false, - "legElevation": "0,29.6,0,29.6,10,29.5,18,29.3,28,29.4,38,29.3,48,29.3,58,29.3,68,29.2,78,29.2,86,29.3,98,29.3,104,29.4,114,29.4,124,29.4,134,29.4,144,29.4,154,29.3,164,29.3,170,29.3,177,29.3,187,29.4,197,29.4,207,29.4,237,29.4,250,29.7,260,29.7,270,29.8,280,29.7,288,29.7", - "legGeometry": { - "length": 17, - "points": "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:29:08.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 17.98, - "elevation": "0,29.6,0,29.6,10,29.5,18,29.3", - "lat": 45.5252279, - "lon": -122.6752499, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Everett Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 231.76, - "elevation": "0,29.3,10,29.4,20,29.3,30,29.3,40,29.3,50,29.2,60,29.2,68,29.3,80,29.3,86,29.4,96,29.4,106,29.4,116,29.4,126,29.4,136,29.3,146,29.3,152,29.3,159,29.3,169,29.4,179,29.4,189,29.4,219,29.4,232,29.7", - "lat": 45.5252242, - "lon": -122.6754806, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 38.08, - "elevation": "0,29.7,10,29.7,20,29.8,30,29.7,38,29.7", - "lat": 45.5231412, - "lon": -122.6754031, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 287.82, + "endTime" : "2009-10-21T23:33:00.000+00:00", + "from" : { + "departure" : "2009-10-21T23:29:08.000+00:00", + "lat" : 45.52523, + "lon" : -122.67525, + "name" : "NW Everett St. & NW 5th Ave. (P3)", + "vertexType" : "NORMAL" + }, + "generalizedCost" : 442, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,29.6,0,29.6,10,29.5,18,29.3,28,29.4,38,29.3,48,29.3,58,29.3,68,29.2,78,29.2,86,29.3,98,29.3,104,29.4,114,29.4,124,29.4,134,29.4,144,29.4,154,29.3,164,29.3,170,29.3,177,29.3,187,29.4,197,29.4,207,29.4,237,29.4,250,29.7,260,29.7,270,29.8,280,29.7,288,29.7", + "legGeometry" : { + "length" : 17, + "points" : "ssztGh_wkV?`@?LJAlBCH?J?H?vBCJ?H?jBCJA?D@L?lAE?" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:29:08.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 17.98, + "elevation" : "0,29.6,0,29.6,10,29.5,18,29.3", + "lat" : 45.5252279, + "lon" : -122.6752499, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Everett Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 231.76, + "elevation" : "0,29.3,10,29.4,20,29.3,30,29.3,40,29.3,50,29.2,60,29.2,68,29.3,80,29.3,86,29.4,96,29.4,106,29.4,116,29.4,126,29.4,136,29.3,146,29.3,152,29.3,159,29.3,169,29.4,179,29.4,189,29.4,219,29.4,232,29.7", + "lat" : 45.5252242, + "lon" : -122.6754806, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 38.08, + "elevation" : "0,29.7,10,29.7,20,29.8,30,29.7,38,29.7", + "lat" : 45.5231412, + "lon" : -122.6754031, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:33:00.000+00:00", - "departure": "2009-10-21T23:33:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:33:00.000+00:00", + "departure" : "2009-10-21T23:33:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -25200000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1942.25, - "endTime": "2009-10-21T23:44:03.000+00:00", - "from": { - "arrival": "2009-10-21T23:33:00.000+00:00", - "departure": "2009-10-21T23:33:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - "generalizedCost": 1263, - "headsign": "Beaverton TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-10-21T23:34:56.000+00:00", - "departure": "2009-10-21T23:34:56.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:36:37.000+00:00", - "departure": "2009-10-21T23:36:37.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:37:50.000+00:00", - "departure": "2009-10-21T23:37:50.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-10-21T23:40:44.000+00:00", - "departure": "2009-10-21T23:40:44.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:00.000+00:00", - "departure": "2009-10-21T23:42:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:24.000+00:00", - "departure": "2009-10-21T23:42:24.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:35.000+00:00", - "departure": "2009-10-21T23:42:35.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:42:55.000+00:00", - "departure": "2009-10-21T23:42:55.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-10-21T23:43:32.000+00:00", - "departure": "2009-10-21T23:43:32.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -25200000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1942.25, + "endTime" : "2009-10-21T23:44:03.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:33:00.000+00:00", + "departure" : "2009-10-21T23:33:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + "generalizedCost" : 1263, + "headsign" : "Beaverton TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-10-21T23:34:56.000+00:00", + "departure" : "2009-10-21T23:34:56.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:36:37.000+00:00", + "departure" : "2009-10-21T23:36:37.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:37:50.000+00:00", + "departure" : "2009-10-21T23:37:50.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-10-21T23:40:44.000+00:00", + "departure" : "2009-10-21T23:40:44.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:00.000+00:00", + "departure" : "2009-10-21T23:42:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:24.000+00:00", + "departure" : "2009-10-21T23:42:24.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:35.000+00:00", + "departure" : "2009-10-21T23:42:35.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:42:55.000+00:00", + "departure" : "2009-10-21T23:42:55.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-10-21T23:43:32.000+00:00", + "departure" : "2009-10-21T23:43:32.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 56, - "points": "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" - }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-10-21", - "startTime": "2009-10-21T23:33:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-10-21T23:44:03.000+00:00", - "departure": "2009-10-21T23:44:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "stopIndex": 109, - "stopSequence": 110, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "transitLeg": true, - "tripBlockId": "2003", - "tripId": "prt:200W1450" + "legGeometry" : { + "length" : 56, + "points" : "efztGhcwkV@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" + }, + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-10-21", + "startTime" : "2009-10-21T23:33:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-10-21T23:44:03.000+00:00", + "departure" : "2009-10-21T23:44:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "stopIndex" : 109, + "stopSequence" : 110, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "transitLeg" : true, + "tripBlockId" : "2003", + "tripId" : "prt:200W1450" }, { - "agencyTimeZoneOffset": -25200000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 563.7, - "endTime": "2009-10-21T23:51:04.000+00:00", - "from": { - "arrival": "2009-10-21T23:44:03.000+00:00", - "departure": "2009-10-21T23:44:03.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "vertexType": "TRANSIT", - "zoneId": "1" - }, - "generalizedCost": 819, - "interlineWithPreviousLeg": false, - "legElevation": "0,82.0,9,82.8,19,83.4,29,84.1,39,85.0,49,85.7,55,86.1,65,85.8,75,85.2,85,83.4,95,82.6,105,82.8,115,82.3,125,82.2,135,82.0,142,81.9,152,81.5,162,81.1,172,80.8,182,80.5,192,80.0,202,79.8,212,79.6,222,79.6,231,79.3,241,79.7,246,79.8,256,79.8,266,79.4,276,78.4,286,77.5,296,76.5,306,75.5,316,74.5,323,74.1,328,73.8,338,73.7,348,73.4,358,73.0,368,72.4,378,72.0,388,71.5,398,71.0,407,70.7,417,70.5,427,70.1,437,69.7,447,69.1,457,68.7,467,68.2,477,67.7,485,67.4,495,67.2,505,66.8,515,66.3,525,65.8,535,65.2,545,64.7,555,64.1,564,63.7", - "legGeometry": { - "length": 34, - "points": "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" - }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-10-21T23:44:03.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 54.63, - "elevation": "0,82.0,9,82.8,19,82.8,29,83.4,39,84.1,49,85.0,59,85.7,64,86.1", - "lat": 45.5238156, - "lon": -122.7007199, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "0,86.1,10,85.8,20,85.2,30,83.4,40,82.6,50,82.8,60,82.3,70,82.2,80,82.0,87,81.9,97,81.5,107,81.1,117,80.8,127,80.5,137,80.0,147,79.8,157,79.6,167,79.6,176,79.3", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "0,79.3,10,79.7,15,79.8", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 317.41, - "elevation": "0,79.8,10,79.8,20,79.4,30,78.4,40,77.5,50,76.5,60,75.5,70,74.5,76,74.1,82,73.8,92,73.7,102,73.4,112,73.0,122,72.4,132,72.0,142,71.5,152,71.0,161,70.7,171,70.5,181,70.1,191,69.7,201,69.1,211,68.7,221,68.2,231,67.7,239,67.4,249,67.2,259,66.8,269,66.3,279,65.8,289,65.2,299,64.7,309,64.1,317,63.7", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false + "agencyTimeZoneOffset" : -25200000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 563.7, + "endTime" : "2009-10-21T23:51:04.000+00:00", + "from" : { + "arrival" : "2009-10-21T23:44:03.000+00:00", + "departure" : "2009-10-21T23:44:03.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + "generalizedCost" : 819, + "interlineWithPreviousLeg" : false, + "legElevation" : "0,82.0,9,82.8,19,83.4,29,84.1,39,85.0,49,85.7,55,86.1,65,85.8,75,85.2,85,83.4,95,82.6,105,82.8,115,82.3,125,82.2,135,82.0,142,81.9,152,81.5,162,81.1,172,80.8,182,80.5,192,80.0,202,79.8,212,79.6,222,79.6,231,79.3,241,79.7,246,79.8,256,79.8,266,79.4,276,78.4,286,77.5,296,76.5,306,75.5,316,74.5,323,74.1,328,73.8,338,73.7,348,73.4,358,73.0,368,72.4,378,72.0,388,71.5,398,71.0,407,70.7,417,70.5,427,70.1,437,69.7,447,69.1,457,68.7,467,68.2,477,67.7,485,67.4,495,67.2,505,66.8,515,66.3,525,65.8,535,65.2,545,64.7,555,64.1,564,63.7", + "legGeometry" : { + "length" : 34, + "points" : "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDkC@" + }, + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-10-21T23:44:03.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 54.63, + "elevation" : "0,82.0,9,82.8,19,82.8,29,83.4,39,84.1,49,85.0,59,85.7,64,86.1", + "lat" : 45.5238156, + "lon" : -122.7007199, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "0,86.1,10,85.8,20,85.2,30,83.4,40,82.6,50,82.8,60,82.3,70,82.2,80,82.0,87,81.9,97,81.5,107,81.1,117,80.8,127,80.5,137,80.0,147,79.8,157,79.6,167,79.6,176,79.3", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "0,79.3,10,79.7,15,79.8", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 317.41, + "elevation" : "0,79.8,10,79.8,20,79.4,30,78.4,40,77.5,50,76.5,60,75.5,70,74.5,76,74.1,82,73.8,92,73.7,102,73.4,112,73.0,122,72.4,132,72.0,142,71.5,152,71.0,161,70.7,171,70.5,181,70.1,191,69.7,201,69.1,211,68.7,221,68.2,231,67.7,239,67.4,249,67.2,259,66.8,269,66.3,279,65.8,289,65.2,299,64.7,309,64.1,317,63.7", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-10-21T23:51:04.000+00:00", - "lat": 45.52832, - "lon": -122.70059, - "name": "SW Johnson St. & NW 24th Ave. (P1)", - "vertexType": "NORMAL" - }, - "transitLeg": false, - "walkingBike": false + "to" : { + "arrival" : "2009-10-21T23:51:04.000+00:00", + "lat" : 45.52832, + "lon" : -122.70059, + "name" : "SW Johnson St. & NW 24th Ave. (P1)", + "vertexType" : "NORMAL" + }, + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-10-21T23:29:08.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 663, - "waitingTime": 0, - "walkDistance": 851.52, - "walkLimitExceeded": false, - "walkTime": 653 + "startTime" : "2009-10-21T23:29:08.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 663, + "waitingTime" : 0, + "walkDistance" : 851.52, + "walkLimitExceeded" : false, + "walkTime" : 653 } ] ] \ No newline at end of file diff --git a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/TransitSnapshotTest.snap b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/TransitSnapshotTest.snap index 4d991c93163..f67c75f44ec 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/TransitSnapshotTest.snap +++ b/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/TransitSnapshotTest.snap @@ -1,2837 +1,2837 @@ org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_planning_with_transit=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 3821, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T19:03:41.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 3821, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T19:03:41.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 7447, - "legs": [ + "generalizedCost" : 7447, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 4923.15, - "endTime": "2009-11-17T19:03:41.000+00:00", - "from": { - "departure": "2009-11-17T18:00:00.000+00:00", - "lat": 45.51726, - "lon": -122.64847, - "name": "SE Morrison St. & SE 17th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 4923.15, + "endTime" : "2009-11-17T19:03:41.000+00:00", + "from" : { + "departure" : "2009-11-17T18:00:00.000+00:00", + "lat" : 45.51726, + "lon" : -122.64847, + "name" : "SE Morrison St. & SE 17th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 7447, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 205, - "points": "kaytG~wqkV?T?fCAl@?R?jE?rC?t@?hEAvD?R?R?|@?dBAP?PAxD?nD?X?jE?bA?t@?N?Z?ZAX?^@bBrA?DF?l@V?Z??xB?t@?F?NLNBH?vB?\\?JAFEP?NCpD?lECfE?H?`E@T`@@LBBCD?D?HHCJAF@ZAL?FAJGTCJGLQPKLWVSVMLILY`@c@v@INKRGNELEPENKb@iAvGkAxGETCRGd@If@Eb@Ip@APANAJ?J?H?H?L?DG@E?A@?@?@AB?HOhCIvAFBCRGPKRERg@xCETGXg@zCETGZg@vCCPADERADi@|CEXABCTi@vCCRGZm@fD[jBm@jDCJAFEVk@|CCVCFALk@|CEVETk@|CERG\\SjASnAGVCPAFg@tCCPCRm@lDw@fEi@bDCNETKf@EVEHMNATAh@ElCIlD?D?VARA`@EpB?N?TEjBCfAAP?RC`BATClAI|DK?G?mCBkCDoCDmCBoCDkCBoCB[?sBD]?Y@eA@K?C?K?W@{A@M@C@I?_CB?G" + "generalizedCost" : 7447, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 205, + "points" : "kaytG~wqkV?T?fCAl@?R?jE?rC?t@?hEAvD?R?R?|@?dBAP?PAxD?nD?X?jE?bA?t@?N?Z?ZAX?^@bBrA?DF?l@V?Z??xB?t@?F?NLNBH?vB?\\?JAFEP?NCpD?lECfE?H?`E@T`@@LBBCD?D?HHCJAF@ZAL?FAJGTCJGLQPKLWVSVMLILY`@c@v@INKRGNELEPENKb@iAvGkAxGETCRGd@If@Eb@Ip@APANAJ?J?H?H?L?DG@E?A@?@?@AB?HOhCIvAFBCRGPKRERg@xCETGXg@zCETGZg@vCCPADERADi@|CEXABCTi@vCCRGZm@fD[jBm@jDCJAFEVk@|CCVCFALk@|CEVETk@|CERG\\SjASnAGVCPAFg@tCCPCRm@lDw@fEi@bDCNETKf@EVEHMNATAh@ElCIlD?D?VARA`@EpB?N?TEjBCfAAP?RC`BATClAI|DK?G?mCBkCDoCDmCBoCDkCBoCB[?sBD]?Y@eA@K?C?K?W@{A@M@C@I?_CB?G" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:00:00.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 857.89, - "elevation": "", - "lat": 45.517186, - "lon": -122.6484704, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Southeast Morrison Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 69.99, - "elevation": "", - "lat": 45.517229, - "lon": -122.6594795, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "parking aisle", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 28.34, - "elevation": "", - "lat": 45.5167705, - "lon": -122.6597431, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Southeast 6th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 78.11, - "elevation": "", - "lat": 45.5165156, - "lon": -122.6597447, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Southeast Belmont Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHWEST", - "area": false, - "bogusName": false, - "distance": 401.95, - "elevation": "", - "lat": 45.5165185, - "lon": -122.6607471, - "relativeDirection": "LEFT", - "stayOn": true, - "streetName": "Southeast Belmont Street", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": true, - "distance": 8.77, - "elevation": "", - "lat": 45.5165001, - "lon": -122.6658345, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "path", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 43.8, - "elevation": "", - "lat": 45.5164998, - "lon": -122.665947, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Southeast Water Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 697.32, - "elevation": "", - "lat": 45.5161288, - "lon": -122.6660075, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Morrison Bridge", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": true, - "distance": 5.12, - "elevation": "", - "lat": 45.5185836, - "lon": -122.6738909, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 1368.86, - "elevation": "", - "lat": 45.5185401, - "lon": -122.6739123, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Southwest Alder Street", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 477.25, - "elevation": "", - "lat": 45.5230171, - "lon": -122.6902466, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 882.16, - "elevation": "", - "lat": 45.5233204, - "lon": -122.696357, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 22nd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 3.68, - "elevation": "", - "lat": 45.5312508, - "lon": -122.6966386, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:00:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 857.89, + "elevation" : "", + "lat" : 45.517186, + "lon" : -122.6484704, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Southeast Morrison Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 69.99, + "elevation" : "", + "lat" : 45.517229, + "lon" : -122.6594795, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "parking aisle", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 28.34, + "elevation" : "", + "lat" : 45.5167705, + "lon" : -122.6597431, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Southeast 6th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 78.11, + "elevation" : "", + "lat" : 45.5165156, + "lon" : -122.6597447, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Southeast Belmont Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 401.95, + "elevation" : "", + "lat" : 45.5165185, + "lon" : -122.6607471, + "relativeDirection" : "LEFT", + "stayOn" : true, + "streetName" : "Southeast Belmont Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : true, + "distance" : 8.77, + "elevation" : "", + "lat" : 45.5165001, + "lon" : -122.6658345, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 43.8, + "elevation" : "", + "lat" : 45.5164998, + "lon" : -122.665947, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Southeast Water Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 697.32, + "elevation" : "", + "lat" : 45.5161288, + "lon" : -122.6660075, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Morrison Bridge", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : true, + "distance" : 5.12, + "elevation" : "", + "lat" : 45.5185836, + "lon" : -122.6738909, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 1368.86, + "elevation" : "", + "lat" : 45.5185401, + "lon" : -122.6739123, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Southwest Alder Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 477.25, + "elevation" : "", + "lat" : 45.5230171, + "lon" : -122.6902466, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 882.16, + "elevation" : "", + "lat" : 45.5233204, + "lon" : -122.696357, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 22nd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 3.68, + "elevation" : "", + "lat" : 45.5312508, + "lon" : -122.6966386, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T19:03:41.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T19:03:41.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:00:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 4923.15, - "walkLimitExceeded": false, - "walkTime": 3821 + "startTime" : "2009-11-17T18:00:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 4923.15, + "walkLimitExceeded" : false, + "walkTime" : 3821 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 2261, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:38:41.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 2261, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:38:41.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 4281, - "legs": [ + "generalizedCost" : 4281, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 920.33, - "endTime": "2009-11-17T18:12:58.000+00:00", - "from": { - "departure": "2009-11-17T18:01:00.000+00:00", - "lat": 45.51726, - "lon": -122.64847, - "name": "SE Morrison St. & SE 17th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 920.33, + "endTime" : "2009-11-17T18:12:58.000+00:00", + "from" : { + "departure" : "2009-11-17T18:01:00.000+00:00", + "lat" : 45.51726, + "lon" : -122.64847, + "name" : "SE Morrison St. & SE 17th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 1398, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 45, - "points": "kaytG~wqkV?T?fCAl@?RmC?oCAmCAoC?_CAM?aC??A?A?A?A??AA?AAA??AAA???A?A?A???A@A??@A@?@??A@?@?BcC?mCAmCAmC?QBIYIWOH" + "generalizedCost" : 1398, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 45, + "points" : "kaytG~wqkV?T?fCAl@?RmC?oCAmCAoC?_CAM?aC??A?A?A?A??AA?AAA??AAA???A?A?A???A@A??@A@?@??A@?@?BcC?mCAmCAmC?QBIYIWOH" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:01:00.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 87.68, - "elevation": "", - "lat": 45.517186, - "lon": -122.6484704, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Southeast Morrison Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 641.04, - "elevation": "", - "lat": 45.5171903, - "lon": -122.6495956, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Southeast 16th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 168.89, - "elevation": "", - "lat": 45.5228912, - "lon": -122.6495528, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Northeast 16th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 22.74, - "elevation": "", - "lat": 45.524409, - "lon": -122.6495675, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northeast Sandy Boulevard", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:01:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 87.68, + "elevation" : "", + "lat" : 45.517186, + "lon" : -122.6484704, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Southeast Morrison Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 641.04, + "elevation" : "", + "lat" : 45.5171903, + "lon" : -122.6495956, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Southeast 16th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 168.89, + "elevation" : "", + "lat" : 45.5228912, + "lon" : -122.6495528, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Northeast 16th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 22.74, + "elevation" : "", + "lat" : 45.524409, + "lon" : -122.6495675, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northeast Sandy Boulevard", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:12:58.000+00:00", - "departure": "2009-11-17T18:12:58.000+00:00", - "lat": 45.524581, - "lon": -122.649367, - "name": "NE Sandy & 16th", - "stopCode": "5060", - "stopId": "prt:5060", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:12:58.000+00:00", + "departure" : "2009-11-17T18:12:58.000+00:00", + "lat" : 45.524581, + "lon" : -122.649367, + "name" : "NE Sandy & 16th", + "stopCode" : "5060", + "stopId" : "prt:5060", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3602.73, - "endTime": "2009-11-17T18:25:49.000+00:00", - "from": { - "arrival": "2009-11-17T18:12:58.000+00:00", - "departure": "2009-11-17T18:12:58.000+00:00", - "lat": 45.524581, - "lon": -122.649367, - "name": "NE Sandy & 16th", - "stopCode": "5060", - "stopId": "prt:5060", - "stopIndex": 92, - "stopSequence": 93, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3602.73, + "endTime" : "2009-11-17T18:25:49.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:12:58.000+00:00", + "departure" : "2009-11-17T18:12:58.000+00:00", + "lat" : 45.524581, + "lon" : -122.649367, + "name" : "NE Sandy & 16th", + "stopCode" : "5060", + "stopId" : "prt:5060", + "stopIndex" : 92, + "stopSequence" : 93, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1371, - "headsign": "Beaverton TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:13:32.000+00:00", - "departure": "2009-11-17T18:13:32.000+00:00", - "lat": 45.523767, - "lon": -122.651428, - "name": "NE Sandy & 14th", - "stopCode": "5058", - "stopId": "prt:5058", - "stopIndex": 93, - "stopSequence": 94, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:14:00.000+00:00", - "departure": "2009-11-17T18:14:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "stopIndex": 94, - "stopSequence": 95, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:14:47.000+00:00", - "departure": "2009-11-17T18:14:47.000+00:00", - "lat": 45.523024, - "lon": -122.656526, - "name": "E Burnside & NE 9th", - "stopCode": "819", - "stopId": "prt:819", - "stopIndex": 95, - "stopSequence": 96, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:15:24.000+00:00", - "departure": "2009-11-17T18:15:24.000+00:00", - "lat": 45.523012, - "lon": -122.659365, - "name": "E Burnside & NE 6th", - "stopCode": "805", - "stopId": "prt:805", - "stopIndex": 96, - "stopSequence": 97, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:15:52.000+00:00", - "departure": "2009-11-17T18:15:52.000+00:00", - "lat": 45.523015, - "lon": -122.661534, - "name": "E Burnside & NE M L King", - "stopCode": "705", - "stopId": "prt:705", - "stopIndex": 97, - "stopSequence": 98, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:18:00.000+00:00", - "departure": "2009-11-17T18:18:00.000+00:00", - "lat": 45.523249, - "lon": -122.671269, - "name": "W Burnside & Burnside Bridge", - "stopCode": "689", - "stopId": "prt:689", - "stopIndex": 98, - "stopSequence": 99, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:19:00.000+00:00", - "departure": "2009-11-17T18:19:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:20:17.000+00:00", - "departure": "2009-11-17T18:20:17.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:21:25.000+00:00", - "departure": "2009-11-17T18:21:25.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:22:14.000+00:00", - "departure": "2009-11-17T18:22:14.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:24:09.000+00:00", - "departure": "2009-11-17T18:24:09.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:25:00.000+00:00", - "departure": "2009-11-17T18:25:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:25:21.000+00:00", - "departure": "2009-11-17T18:25:21.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:25:31.000+00:00", - "departure": "2009-11-17T18:25:31.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1371, + "headsign" : "Beaverton TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:13:32.000+00:00", + "departure" : "2009-11-17T18:13:32.000+00:00", + "lat" : 45.523767, + "lon" : -122.651428, + "name" : "NE Sandy & 14th", + "stopCode" : "5058", + "stopId" : "prt:5058", + "stopIndex" : 93, + "stopSequence" : 94, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:14:00.000+00:00", + "departure" : "2009-11-17T18:14:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "stopIndex" : 94, + "stopSequence" : 95, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:14:47.000+00:00", + "departure" : "2009-11-17T18:14:47.000+00:00", + "lat" : 45.523024, + "lon" : -122.656526, + "name" : "E Burnside & NE 9th", + "stopCode" : "819", + "stopId" : "prt:819", + "stopIndex" : 95, + "stopSequence" : 96, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:15:24.000+00:00", + "departure" : "2009-11-17T18:15:24.000+00:00", + "lat" : 45.523012, + "lon" : -122.659365, + "name" : "E Burnside & NE 6th", + "stopCode" : "805", + "stopId" : "prt:805", + "stopIndex" : 96, + "stopSequence" : 97, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:15:52.000+00:00", + "departure" : "2009-11-17T18:15:52.000+00:00", + "lat" : 45.523015, + "lon" : -122.661534, + "name" : "E Burnside & NE M L King", + "stopCode" : "705", + "stopId" : "prt:705", + "stopIndex" : 97, + "stopSequence" : 98, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:18:00.000+00:00", + "departure" : "2009-11-17T18:18:00.000+00:00", + "lat" : 45.523249, + "lon" : -122.671269, + "name" : "W Burnside & Burnside Bridge", + "stopCode" : "689", + "stopId" : "prt:689", + "stopIndex" : 98, + "stopSequence" : 99, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:19:00.000+00:00", + "departure" : "2009-11-17T18:19:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:20:17.000+00:00", + "departure" : "2009-11-17T18:20:17.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:21:25.000+00:00", + "departure" : "2009-11-17T18:21:25.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:22:14.000+00:00", + "departure" : "2009-11-17T18:22:14.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:24:09.000+00:00", + "departure" : "2009-11-17T18:24:09.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:25:00.000+00:00", + "departure" : "2009-11-17T18:25:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:25:21.000+00:00", + "departure" : "2009-11-17T18:25:21.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:25:31.000+00:00", + "departure" : "2009-11-17T18:25:31.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 94, - "points": "coztGd}qkVNl@r@`CZhA`A`D??Ph@l@tBb@rARh@Pd@???BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB" + "legGeometry" : { + "length" : 94, + "points" : "coztGd}qkVNl@r@`CZhA`A`D??Ph@l@tBb@rARh@Pd@???BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:12:58.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:25:49.000+00:00", - "departure": "2009-11-17T18:25:49.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:12:58.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:25:49.000+00:00", + "departure" : "2009-11-17T18:25:49.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "2002", - "tripId": "prt:200W1200" + "transitLeg" : true, + "tripBlockId" : "2002", + "tripId" : "prt:200W1200" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 999.1, - "endTime": "2009-11-17T18:38:41.000+00:00", - "from": { - "arrival": "2009-11-17T18:25:49.000+00:00", - "departure": "2009-11-17T18:25:49.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 999.1, + "endTime" : "2009-11-17T18:38:41.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:25:49.000+00:00", + "departure" : "2009-11-17T18:25:49.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1511, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 29, - "points": "ugztGdzzkVL?ATClAI|DK?G?mCBkCDoCDmCBoCDkCBoCB[?sBD]?Y@eA@K?C?K?W@{A@M@C@I?_CB?G" + "generalizedCost" : 1511, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 29, + "points" : "ugztGdzzkVL?ATClAI|DK?G?mCBkCDoCDmCBoCDkCBoCB[?sBD]?Y@eA@K?C?K?W@{A@M@C@I?_CB?G" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:25:49.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 113.27, - "elevation": "", - "lat": 45.5232491, - "lon": -122.6949067, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 882.16, - "elevation": "", - "lat": 45.5233204, - "lon": -122.696357, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 22nd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 3.68, - "elevation": "", - "lat": 45.5312508, - "lon": -122.6966386, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:25:49.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 113.27, + "elevation" : "", + "lat" : 45.5232491, + "lon" : -122.6949067, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 882.16, + "elevation" : "", + "lat" : 45.5233204, + "lon" : -122.696357, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 22nd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 3.68, + "elevation" : "", + "lat" : 45.5312508, + "lon" : -122.6966386, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:38:41.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:38:41.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:01:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 771, - "waitingTime": 0, - "walkDistance": 1919.43, - "walkLimitExceeded": false, - "walkTime": 1490 + "startTime" : "2009-11-17T18:01:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 771, + "waitingTime" : 0, + "walkDistance" : 1919.43, + "walkLimitExceeded" : false, + "walkTime" : 1490 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1470, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:39:22.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1470, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:39:22.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "15" + "feedId" : "prt", + "id" : "15" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2315, - "legs": [ + "generalizedCost" : 2315, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 62.01, - "endTime": "2009-11-17T18:15:40.000+00:00", - "from": { - "departure": "2009-11-17T18:14:52.000+00:00", - "lat": 45.51726, - "lon": -122.64847, - "name": "SE Morrison St. & SE 17th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 62.01, + "endTime" : "2009-11-17T18:15:40.000+00:00", + "from" : { + "departure" : "2009-11-17T18:14:52.000+00:00", + "lat" : 45.51726, + "lon" : -122.64847, + "name" : "SE Morrison St. & SE 17th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 95, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "kaytG~wqkV?T?fCG?" + "generalizedCost" : 95, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "kaytG~wqkV?T?fCG?" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:14:52.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 62.02, - "elevation": "", - "lat": 45.517186, - "lon": -122.6484704, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Southeast Morrison Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:14:52.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 62.02, + "elevation" : "", + "lat" : 45.517186, + "lon" : -122.6484704, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Southeast Morrison Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:15:40.000+00:00", - "departure": "2009-11-17T18:15:40.000+00:00", - "lat": 45.517226, - "lon": -122.649266, - "name": "SE Morrison & 16th", - "stopCode": "4019", - "stopId": "prt:4019", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:15:40.000+00:00", + "departure" : "2009-11-17T18:15:40.000+00:00", + "lat" : 45.517226, + "lon" : -122.649266, + "name" : "SE Morrison & 16th", + "stopCode" : "4019", + "stopId" : "prt:4019", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 5218.86, - "endTime": "2009-11-17T18:35:54.000+00:00", - "from": { - "arrival": "2009-11-17T18:15:40.000+00:00", - "departure": "2009-11-17T18:15:40.000+00:00", - "lat": 45.517226, - "lon": -122.649266, - "name": "SE Morrison & 16th", - "stopCode": "4019", - "stopId": "prt:4019", - "stopIndex": 50, - "stopSequence": 51, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 5218.86, + "endTime" : "2009-11-17T18:35:54.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:15:40.000+00:00", + "departure" : "2009-11-17T18:15:40.000+00:00", + "lat" : 45.517226, + "lon" : -122.649266, + "name" : "SE Morrison & 16th", + "stopCode" : "4019", + "stopId" : "prt:4019", + "stopIndex" : 50, + "stopSequence" : 51, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1814, - "headsign": "Montgomery Park", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:16:15.000+00:00", - "departure": "2009-11-17T18:16:15.000+00:00", - "lat": 45.517253, - "lon": -122.651354, - "name": "SE Morrison & 14th", - "stopCode": "4016", - "stopId": "prt:4016", - "stopIndex": 51, - "stopSequence": 52, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:17:00.000+00:00", - "departure": "2009-11-17T18:17:00.000+00:00", - "lat": 45.517299, - "lon": -122.654067, - "name": "SE Morrison & 12th", - "stopCode": "4014", - "stopId": "prt:4014", - "stopIndex": 52, - "stopSequence": 53, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:17:38.000+00:00", - "departure": "2009-11-17T18:17:38.000+00:00", - "lat": 45.517292, - "lon": -122.656563, - "name": "SE Morrison & 9th", - "stopCode": "4026", - "stopId": "prt:4026", - "stopIndex": 53, - "stopSequence": 54, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:18:08.000+00:00", - "departure": "2009-11-17T18:18:08.000+00:00", - "lat": 45.517322, - "lon": -122.65847, - "name": "SE Morrison & 7th", - "stopCode": "4025", - "stopId": "prt:4025", - "stopIndex": 54, - "stopSequence": 55, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:18:39.000+00:00", - "departure": "2009-11-17T18:18:39.000+00:00", - "lat": 45.517298, - "lon": -122.660523, - "name": "SE Morrison & Grand", - "stopCode": "4013", - "stopId": "prt:4013", - "stopIndex": 55, - "stopSequence": 56, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:20:03.000+00:00", - "departure": "2009-11-17T18:20:03.000+00:00", - "lat": 45.517351, - "lon": -122.66601, - "name": "Morrison Bridge", - "stopCode": "4029", - "stopId": "prt:4029", - "stopIndex": 56, - "stopSequence": 57, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:22:27.000+00:00", - "departure": "2009-11-17T18:22:27.000+00:00", - "lat": 45.51959, - "lon": -122.674599, - "name": "SW Washington & 3rd", - "stopCode": "6158", - "stopId": "prt:6158", - "stopIndex": 57, - "stopSequence": 58, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:23:00.000+00:00", - "departure": "2009-11-17T18:23:00.000+00:00", - "lat": 45.520129, - "lon": -122.676635, - "name": "SW Washington & 5th", - "stopCode": "6160", - "stopId": "prt:6160", - "stopIndex": 58, - "stopSequence": 59, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:23:52.000+00:00", - "departure": "2009-11-17T18:23:52.000+00:00", - "lat": 45.520695, - "lon": -122.678657, - "name": "SW Washington & Broadway", - "stopCode": "6137", - "stopId": "prt:6137", - "stopIndex": 59, - "stopSequence": 60, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:24:34.000+00:00", - "departure": "2009-11-17T18:24:34.000+00:00", - "lat": 45.521124, - "lon": -122.6803, - "name": "SW Washington & 9th", - "stopCode": "6169", - "stopId": "prt:6169", - "stopIndex": 60, - "stopSequence": 61, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:25:47.000+00:00", - "departure": "2009-11-17T18:25:47.000+00:00", - "lat": 45.521094, - "lon": -122.682819, - "name": "SW 11th & Alder", - "stopCode": "9600", - "stopId": "prt:9600", - "stopIndex": 61, - "stopSequence": 62, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:26:36.000+00:00", - "departure": "2009-11-17T18:26:36.000+00:00", - "lat": 45.52055, - "lon": -122.683933, - "name": "SW Morrison & 12th", - "stopCode": "9598", - "stopId": "prt:9598", - "stopIndex": 62, - "stopSequence": 63, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:27:25.000+00:00", - "departure": "2009-11-17T18:27:25.000+00:00", - "lat": 45.521063, - "lon": -122.685848, - "name": "SW Morrison & 14th", - "stopCode": "9708", - "stopId": "prt:9708", - "stopIndex": 63, - "stopSequence": 64, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:28:18.000+00:00", - "departure": "2009-11-17T18:28:18.000+00:00", - "lat": 45.521641, - "lon": -122.687932, - "name": "SW Morrison & 16th", - "stopCode": "9613", - "stopId": "prt:9613", - "stopIndex": 64, - "stopSequence": 65, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:29:00.000+00:00", - "departure": "2009-11-17T18:29:00.000+00:00", - "lat": 45.52206, - "lon": -122.689577, - "name": "SW Morrison & 17th", - "stopCode": "9599", - "stopId": "prt:9599", - "stopIndex": 65, - "stopSequence": 66, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:29:54.000+00:00", - "departure": "2009-11-17T18:29:54.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 66, - "stopSequence": 67, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:30:31.000+00:00", - "departure": "2009-11-17T18:30:31.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 67, - "stopSequence": 68, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:30:48.000+00:00", - "departure": "2009-11-17T18:30:48.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 68, - "stopSequence": 69, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:31:20.000+00:00", - "departure": "2009-11-17T18:31:20.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 69, - "stopSequence": 70, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:32:18.000+00:00", - "departure": "2009-11-17T18:32:18.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:33:11.000+00:00", - "departure": "2009-11-17T18:33:11.000+00:00", - "lat": 45.525416, - "lon": -122.698381, - "name": "NW 23rd & Flanders", - "stopCode": "7157", - "stopId": "prt:7157", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:34:05.000+00:00", - "departure": "2009-11-17T18:34:05.000+00:00", - "lat": 45.527543, - "lon": -122.698473, - "name": "NW 23rd & Irving", - "stopCode": "7161", - "stopId": "prt:7161", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:35:00.000+00:00", - "departure": "2009-11-17T18:35:00.000+00:00", - "lat": 45.529681, - "lon": -122.698529, - "name": "NW 23rd & Lovejoy", - "stopCode": "7163", - "stopId": "prt:7163", - "stopIndex": 73, - "stopSequence": 74, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1814, + "headsign" : "Montgomery Park", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:16:15.000+00:00", + "departure" : "2009-11-17T18:16:15.000+00:00", + "lat" : 45.517253, + "lon" : -122.651354, + "name" : "SE Morrison & 14th", + "stopCode" : "4016", + "stopId" : "prt:4016", + "stopIndex" : 51, + "stopSequence" : 52, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:17:00.000+00:00", + "departure" : "2009-11-17T18:17:00.000+00:00", + "lat" : 45.517299, + "lon" : -122.654067, + "name" : "SE Morrison & 12th", + "stopCode" : "4014", + "stopId" : "prt:4014", + "stopIndex" : 52, + "stopSequence" : 53, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:17:38.000+00:00", + "departure" : "2009-11-17T18:17:38.000+00:00", + "lat" : 45.517292, + "lon" : -122.656563, + "name" : "SE Morrison & 9th", + "stopCode" : "4026", + "stopId" : "prt:4026", + "stopIndex" : 53, + "stopSequence" : 54, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:18:08.000+00:00", + "departure" : "2009-11-17T18:18:08.000+00:00", + "lat" : 45.517322, + "lon" : -122.65847, + "name" : "SE Morrison & 7th", + "stopCode" : "4025", + "stopId" : "prt:4025", + "stopIndex" : 54, + "stopSequence" : 55, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:18:39.000+00:00", + "departure" : "2009-11-17T18:18:39.000+00:00", + "lat" : 45.517298, + "lon" : -122.660523, + "name" : "SE Morrison & Grand", + "stopCode" : "4013", + "stopId" : "prt:4013", + "stopIndex" : 55, + "stopSequence" : 56, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:20:03.000+00:00", + "departure" : "2009-11-17T18:20:03.000+00:00", + "lat" : 45.517351, + "lon" : -122.66601, + "name" : "Morrison Bridge", + "stopCode" : "4029", + "stopId" : "prt:4029", + "stopIndex" : 56, + "stopSequence" : 57, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:22:27.000+00:00", + "departure" : "2009-11-17T18:22:27.000+00:00", + "lat" : 45.51959, + "lon" : -122.674599, + "name" : "SW Washington & 3rd", + "stopCode" : "6158", + "stopId" : "prt:6158", + "stopIndex" : 57, + "stopSequence" : 58, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:23:00.000+00:00", + "departure" : "2009-11-17T18:23:00.000+00:00", + "lat" : 45.520129, + "lon" : -122.676635, + "name" : "SW Washington & 5th", + "stopCode" : "6160", + "stopId" : "prt:6160", + "stopIndex" : 58, + "stopSequence" : 59, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:23:52.000+00:00", + "departure" : "2009-11-17T18:23:52.000+00:00", + "lat" : 45.520695, + "lon" : -122.678657, + "name" : "SW Washington & Broadway", + "stopCode" : "6137", + "stopId" : "prt:6137", + "stopIndex" : 59, + "stopSequence" : 60, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:24:34.000+00:00", + "departure" : "2009-11-17T18:24:34.000+00:00", + "lat" : 45.521124, + "lon" : -122.6803, + "name" : "SW Washington & 9th", + "stopCode" : "6169", + "stopId" : "prt:6169", + "stopIndex" : 60, + "stopSequence" : 61, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:25:47.000+00:00", + "departure" : "2009-11-17T18:25:47.000+00:00", + "lat" : 45.521094, + "lon" : -122.682819, + "name" : "SW 11th & Alder", + "stopCode" : "9600", + "stopId" : "prt:9600", + "stopIndex" : 61, + "stopSequence" : 62, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:26:36.000+00:00", + "departure" : "2009-11-17T18:26:36.000+00:00", + "lat" : 45.52055, + "lon" : -122.683933, + "name" : "SW Morrison & 12th", + "stopCode" : "9598", + "stopId" : "prt:9598", + "stopIndex" : 62, + "stopSequence" : 63, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:27:25.000+00:00", + "departure" : "2009-11-17T18:27:25.000+00:00", + "lat" : 45.521063, + "lon" : -122.685848, + "name" : "SW Morrison & 14th", + "stopCode" : "9708", + "stopId" : "prt:9708", + "stopIndex" : 63, + "stopSequence" : 64, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:28:18.000+00:00", + "departure" : "2009-11-17T18:28:18.000+00:00", + "lat" : 45.521641, + "lon" : -122.687932, + "name" : "SW Morrison & 16th", + "stopCode" : "9613", + "stopId" : "prt:9613", + "stopIndex" : 64, + "stopSequence" : 65, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:29:00.000+00:00", + "departure" : "2009-11-17T18:29:00.000+00:00", + "lat" : 45.52206, + "lon" : -122.689577, + "name" : "SW Morrison & 17th", + "stopCode" : "9599", + "stopId" : "prt:9599", + "stopIndex" : 65, + "stopSequence" : 66, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:29:54.000+00:00", + "departure" : "2009-11-17T18:29:54.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 66, + "stopSequence" : 67, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:30:31.000+00:00", + "departure" : "2009-11-17T18:30:31.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 67, + "stopSequence" : 68, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:30:48.000+00:00", + "departure" : "2009-11-17T18:30:48.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 68, + "stopSequence" : 69, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:31:20.000+00:00", + "departure" : "2009-11-17T18:31:20.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 69, + "stopSequence" : 70, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:32:18.000+00:00", + "departure" : "2009-11-17T18:32:18.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:33:11.000+00:00", + "departure" : "2009-11-17T18:33:11.000+00:00", + "lat" : 45.525416, + "lon" : -122.698381, + "name" : "NW 23rd & Flanders", + "stopCode" : "7157", + "stopId" : "prt:7157", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:34:05.000+00:00", + "departure" : "2009-11-17T18:34:05.000+00:00", + "lat" : 45.527543, + "lon" : -122.698473, + "name" : "NW 23rd & Irving", + "stopCode" : "7161", + "stopId" : "prt:7161", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:35:00.000+00:00", + "departure" : "2009-11-17T18:35:00.000+00:00", + "lat" : 45.529681, + "lon" : -122.698529, + "name" : "NW 23rd & Lovejoy", + "stopCode" : "7163", + "stopId" : "prt:7163", + "stopIndex" : 73, + "stopSequence" : 74, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 135, - "points": "kaytG||qkVA~@?jE?tC???r@AhE?jE?rA???tBAjE?nD???X?hE?xC??Ah@?pE?~C???J?`@?vAAvBEbE?jEAlE?`BAbB@d@??@tAAj@Cx@Cb@Cp@_@dEcAtFoA`IS~@i@`BmAzDi@zAc@pAi@~C??Id@u@jEm@bD??If@u@jEk@bD??If@u@|DW`B??CPs@|Du@lElBz@??VJbCfAk@dD??Id@w@rEWvAId@AF??Q~@s@`Ei@~C??Ib@u@dEWzA??]jB]MQSe@WOKOKIIQe@GWE]GnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APkAh@o@?sCB{BD??S?mCDmCDyBB??U?mCDmCDyBB??S?oCDmCDmCBo@@" + "legGeometry" : { + "length" : 135, + "points" : "kaytG||qkVA~@?jE?tC???r@AhE?jE?rA???tBAjE?nD???X?hE?xC??Ah@?pE?~C???J?`@?vAAvBEbE?jEAlE?`BAbB@d@??@tAAj@Cx@Cb@Cp@_@dEcAtFoA`IS~@i@`BmAzDi@zAc@pAi@~C??Id@u@jEm@bD??If@u@jEk@bD??If@u@|DW`B??CPs@|Du@lElBz@??VJbCfAk@dD??Id@w@rEWvAId@AF??Q~@s@`Ei@~C??Ib@u@dEWzA??]jB]MQSe@WOKOKIIQe@GWE]GnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APkAh@o@?sCB{BD??S?mCDmCDyBB??U?mCDmCDyBB??S?oCDmCDmCBo@@" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Belmont/NW 23rd", - "routeId": "prt:15", - "routeLongName": "Belmont/NW 23rd", - "routeShortName": "15", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:15:40.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:35:54.000+00:00", - "departure": "2009-11-17T18:35:54.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "stopIndex": 74, - "stopSequence": 75, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Belmont/NW 23rd", + "routeId" : "prt:15", + "routeLongName" : "Belmont/NW 23rd", + "routeShortName" : "15", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:15:40.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:35:54.000+00:00", + "departure" : "2009-11-17T18:35:54.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "stopIndex" : 74, + "stopSequence" : 75, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "1549", - "tripId": "prt:150W1400" + "transitLeg" : true, + "tripBlockId" : "1549", + "tripId" : "prt:150W1400" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 266.21, - "endTime": "2009-11-17T18:39:22.000+00:00", - "from": { - "arrival": "2009-11-17T18:35:54.000+00:00", - "departure": "2009-11-17T18:35:54.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 266.21, + "endTime" : "2009-11-17T18:39:22.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:35:54.000+00:00", + "departure" : "2009-11-17T18:35:54.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 405, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 13, - "points": "}~{tGnq{kV?LVAF?J?L?rBCLA?Q?EAyAEcH?G" + "generalizedCost" : 405, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 13, + "points" : "}~{tGnq{kV?LVAF?J?L?rBCLA?Q?EAyAEcH?G" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:35:54.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 104.46, - "elevation": "", - "lat": 45.5321578, - "lon": -122.6987026, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 161.77, - "elevation": "", - "lat": 45.5312188, - "lon": -122.6986675, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:35:54.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 104.46, + "elevation" : "", + "lat" : 45.5321578, + "lon" : -122.6987026, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 161.77, + "elevation" : "", + "lat" : 45.5312188, + "lon" : -122.6986675, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:39:22.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:39:22.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:14:52.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 1214, - "waitingTime": 0, - "walkDistance": 328.22, - "walkLimitExceeded": false, - "walkTime": 256 + "startTime" : "2009-11-17T18:14:52.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 1214, + "waitingTime" : 0, + "walkDistance" : 328.22, + "walkLimitExceeded" : false, + "walkTime" : 256 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 2275, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:53:55.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 2275, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:53:55.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 4295, - "legs": [ + "generalizedCost" : 4295, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 920.33, - "endTime": "2009-11-17T18:27:58.000+00:00", - "from": { - "departure": "2009-11-17T18:16:00.000+00:00", - "lat": 45.51726, - "lon": -122.64847, - "name": "SE Morrison St. & SE 17th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 920.33, + "endTime" : "2009-11-17T18:27:58.000+00:00", + "from" : { + "departure" : "2009-11-17T18:16:00.000+00:00", + "lat" : 45.51726, + "lon" : -122.64847, + "name" : "SE Morrison St. & SE 17th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 1398, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 45, - "points": "kaytG~wqkV?T?fCAl@?RmC?oCAmCAoC?_CAM?aC??A?A?A?A??AA?AAA??AAA???A?A?A???A@A??@A@?@??A@?@?BcC?mCAmCAmC?QBIYIWOH" + "generalizedCost" : 1398, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 45, + "points" : "kaytG~wqkV?T?fCAl@?RmC?oCAmCAoC?_CAM?aC??A?A?A?A??AA?AAA??AAA???A?A?A???A@A??@A@?@??A@?@?BcC?mCAmCAmC?QBIYIWOH" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:16:00.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 87.68, - "elevation": "", - "lat": 45.517186, - "lon": -122.6484704, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Southeast Morrison Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 641.04, - "elevation": "", - "lat": 45.5171903, - "lon": -122.6495956, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Southeast 16th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 168.89, - "elevation": "", - "lat": 45.5228912, - "lon": -122.6495528, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Northeast 16th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 22.74, - "elevation": "", - "lat": 45.524409, - "lon": -122.6495675, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northeast Sandy Boulevard", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:16:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 87.68, + "elevation" : "", + "lat" : 45.517186, + "lon" : -122.6484704, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Southeast Morrison Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 641.04, + "elevation" : "", + "lat" : 45.5171903, + "lon" : -122.6495956, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Southeast 16th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 168.89, + "elevation" : "", + "lat" : 45.5228912, + "lon" : -122.6495528, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Northeast 16th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 22.74, + "elevation" : "", + "lat" : 45.524409, + "lon" : -122.6495675, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northeast Sandy Boulevard", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:27:58.000+00:00", - "departure": "2009-11-17T18:27:58.000+00:00", - "lat": 45.524581, - "lon": -122.649367, - "name": "NE Sandy & 16th", - "stopCode": "5060", - "stopId": "prt:5060", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:27:58.000+00:00", + "departure" : "2009-11-17T18:27:58.000+00:00", + "lat" : 45.524581, + "lon" : -122.649367, + "name" : "NE Sandy & 16th", + "stopCode" : "5060", + "stopId" : "prt:5060", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3602.73, - "endTime": "2009-11-17T18:41:03.000+00:00", - "from": { - "arrival": "2009-11-17T18:27:58.000+00:00", - "departure": "2009-11-17T18:27:58.000+00:00", - "lat": 45.524581, - "lon": -122.649367, - "name": "NE Sandy & 16th", - "stopCode": "5060", - "stopId": "prt:5060", - "stopIndex": 92, - "stopSequence": 93, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3602.73, + "endTime" : "2009-11-17T18:41:03.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:27:58.000+00:00", + "departure" : "2009-11-17T18:27:58.000+00:00", + "lat" : 45.524581, + "lon" : -122.649367, + "name" : "NE Sandy & 16th", + "stopCode" : "5060", + "stopId" : "prt:5060", + "stopIndex" : 92, + "stopSequence" : 93, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1385, - "headsign": "23rd Ave to Tichner", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:28:32.000+00:00", - "departure": "2009-11-17T18:28:32.000+00:00", - "lat": 45.523767, - "lon": -122.651428, - "name": "NE Sandy & 14th", - "stopCode": "5058", - "stopId": "prt:5058", - "stopIndex": 93, - "stopSequence": 94, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:29:00.000+00:00", - "departure": "2009-11-17T18:29:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "stopIndex": 94, - "stopSequence": 95, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:29:47.000+00:00", - "departure": "2009-11-17T18:29:47.000+00:00", - "lat": 45.523024, - "lon": -122.656526, - "name": "E Burnside & NE 9th", - "stopCode": "819", - "stopId": "prt:819", - "stopIndex": 95, - "stopSequence": 96, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:30:24.000+00:00", - "departure": "2009-11-17T18:30:24.000+00:00", - "lat": 45.523012, - "lon": -122.659365, - "name": "E Burnside & NE 6th", - "stopCode": "805", - "stopId": "prt:805", - "stopIndex": 96, - "stopSequence": 97, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:30:52.000+00:00", - "departure": "2009-11-17T18:30:52.000+00:00", - "lat": 45.523015, - "lon": -122.661534, - "name": "E Burnside & NE M L King", - "stopCode": "705", - "stopId": "prt:705", - "stopIndex": 97, - "stopSequence": 98, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:33:00.000+00:00", - "departure": "2009-11-17T18:33:00.000+00:00", - "lat": 45.523249, - "lon": -122.671269, - "name": "W Burnside & Burnside Bridge", - "stopCode": "689", - "stopId": "prt:689", - "stopIndex": 98, - "stopSequence": 99, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:34:00.000+00:00", - "departure": "2009-11-17T18:34:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:35:17.000+00:00", - "departure": "2009-11-17T18:35:17.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:36:25.000+00:00", - "departure": "2009-11-17T18:36:25.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:37:14.000+00:00", - "departure": "2009-11-17T18:37:14.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:39:09.000+00:00", - "departure": "2009-11-17T18:39:09.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:40:00.000+00:00", - "departure": "2009-11-17T18:40:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:40:27.000+00:00", - "departure": "2009-11-17T18:40:27.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:40:40.000+00:00", - "departure": "2009-11-17T18:40:40.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1385, + "headsign" : "23rd Ave to Tichner", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:28:32.000+00:00", + "departure" : "2009-11-17T18:28:32.000+00:00", + "lat" : 45.523767, + "lon" : -122.651428, + "name" : "NE Sandy & 14th", + "stopCode" : "5058", + "stopId" : "prt:5058", + "stopIndex" : 93, + "stopSequence" : 94, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:29:00.000+00:00", + "departure" : "2009-11-17T18:29:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "stopIndex" : 94, + "stopSequence" : 95, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:29:47.000+00:00", + "departure" : "2009-11-17T18:29:47.000+00:00", + "lat" : 45.523024, + "lon" : -122.656526, + "name" : "E Burnside & NE 9th", + "stopCode" : "819", + "stopId" : "prt:819", + "stopIndex" : 95, + "stopSequence" : 96, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:30:24.000+00:00", + "departure" : "2009-11-17T18:30:24.000+00:00", + "lat" : 45.523012, + "lon" : -122.659365, + "name" : "E Burnside & NE 6th", + "stopCode" : "805", + "stopId" : "prt:805", + "stopIndex" : 96, + "stopSequence" : 97, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:30:52.000+00:00", + "departure" : "2009-11-17T18:30:52.000+00:00", + "lat" : 45.523015, + "lon" : -122.661534, + "name" : "E Burnside & NE M L King", + "stopCode" : "705", + "stopId" : "prt:705", + "stopIndex" : 97, + "stopSequence" : 98, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:33:00.000+00:00", + "departure" : "2009-11-17T18:33:00.000+00:00", + "lat" : 45.523249, + "lon" : -122.671269, + "name" : "W Burnside & Burnside Bridge", + "stopCode" : "689", + "stopId" : "prt:689", + "stopIndex" : 98, + "stopSequence" : 99, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:34:00.000+00:00", + "departure" : "2009-11-17T18:34:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:35:17.000+00:00", + "departure" : "2009-11-17T18:35:17.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:36:25.000+00:00", + "departure" : "2009-11-17T18:36:25.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:37:14.000+00:00", + "departure" : "2009-11-17T18:37:14.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:39:09.000+00:00", + "departure" : "2009-11-17T18:39:09.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:40:00.000+00:00", + "departure" : "2009-11-17T18:40:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:40:27.000+00:00", + "departure" : "2009-11-17T18:40:27.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:40:40.000+00:00", + "departure" : "2009-11-17T18:40:40.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 94, - "points": "coztGd}qkVNl@r@`CZhA`A`D??Ph@l@tBb@rARh@Pd@???BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB" + "legGeometry" : { + "length" : 94, + "points" : "coztGd}qkVNl@r@`CZhA`A`D??Ph@l@tBb@rARh@Pd@???BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:27:58.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:41:03.000+00:00", - "departure": "2009-11-17T18:41:03.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:27:58.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:41:03.000+00:00", + "departure" : "2009-11-17T18:41:03.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "2071", - "tripId": "prt:200W1210" + "transitLeg" : true, + "tripBlockId" : "2071", + "tripId" : "prt:200W1210" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 999.1, - "endTime": "2009-11-17T18:53:55.000+00:00", - "from": { - "arrival": "2009-11-17T18:41:03.000+00:00", - "departure": "2009-11-17T18:41:03.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 999.1, + "endTime" : "2009-11-17T18:53:55.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:41:03.000+00:00", + "departure" : "2009-11-17T18:41:03.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1511, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 29, - "points": "ugztGdzzkVL?ATClAI|DK?G?mCBkCDoCDmCBoCDkCBoCB[?sBD]?Y@eA@K?C?K?W@{A@M@C@I?_CB?G" + "generalizedCost" : 1511, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 29, + "points" : "ugztGdzzkVL?ATClAI|DK?G?mCBkCDoCDmCBoCDkCBoCB[?sBD]?Y@eA@K?C?K?W@{A@M@C@I?_CB?G" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:41:03.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 113.27, - "elevation": "", - "lat": 45.5232491, - "lon": -122.6949067, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 882.16, - "elevation": "", - "lat": 45.5233204, - "lon": -122.696357, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 22nd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 3.68, - "elevation": "", - "lat": 45.5312508, - "lon": -122.6966386, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:41:03.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 113.27, + "elevation" : "", + "lat" : 45.5232491, + "lon" : -122.6949067, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 882.16, + "elevation" : "", + "lat" : 45.5233204, + "lon" : -122.696357, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 22nd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 3.68, + "elevation" : "", + "lat" : 45.5312508, + "lon" : -122.6966386, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:53:55.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:53:55.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:16:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 785, - "waitingTime": 0, - "walkDistance": 1919.43, - "walkLimitExceeded": false, - "walkTime": 1490 + "startTime" : "2009-11-17T18:16:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 785, + "waitingTime" : 0, + "walkDistance" : 1919.43, + "walkLimitExceeded" : false, + "walkTime" : 1490 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1540, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:55:32.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1540, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:55:32.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "15" + "feedId" : "prt", + "id" : "15" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2385, - "legs": [ + "generalizedCost" : 2385, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 62.01, - "endTime": "2009-11-17T18:30:40.000+00:00", - "from": { - "departure": "2009-11-17T18:29:52.000+00:00", - "lat": 45.51726, - "lon": -122.64847, - "name": "SE Morrison St. & SE 17th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 62.01, + "endTime" : "2009-11-17T18:30:40.000+00:00", + "from" : { + "departure" : "2009-11-17T18:29:52.000+00:00", + "lat" : 45.51726, + "lon" : -122.64847, + "name" : "SE Morrison St. & SE 17th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 95, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "kaytG~wqkV?T?fCG?" + "generalizedCost" : 95, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "kaytG~wqkV?T?fCG?" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:29:52.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 62.02, - "elevation": "", - "lat": 45.517186, - "lon": -122.6484704, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Southeast Morrison Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:29:52.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 62.02, + "elevation" : "", + "lat" : 45.517186, + "lon" : -122.6484704, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Southeast Morrison Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:30:40.000+00:00", - "departure": "2009-11-17T18:30:40.000+00:00", - "lat": 45.517226, - "lon": -122.649266, - "name": "SE Morrison & 16th", - "stopCode": "4019", - "stopId": "prt:4019", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:30:40.000+00:00", + "departure" : "2009-11-17T18:30:40.000+00:00", + "lat" : 45.517226, + "lon" : -122.649266, + "name" : "SE Morrison & 16th", + "stopCode" : "4019", + "stopId" : "prt:4019", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 5218.86, - "endTime": "2009-11-17T18:52:04.000+00:00", - "from": { - "arrival": "2009-11-17T18:30:40.000+00:00", - "departure": "2009-11-17T18:30:40.000+00:00", - "lat": 45.517226, - "lon": -122.649266, - "name": "SE Morrison & 16th", - "stopCode": "4019", - "stopId": "prt:4019", - "stopIndex": 50, - "stopSequence": 51, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 5218.86, + "endTime" : "2009-11-17T18:52:04.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:30:40.000+00:00", + "departure" : "2009-11-17T18:30:40.000+00:00", + "lat" : 45.517226, + "lon" : -122.649266, + "name" : "SE Morrison & 16th", + "stopCode" : "4019", + "stopId" : "prt:4019", + "stopIndex" : 50, + "stopSequence" : 51, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1884, - "headsign": "NW 27th & Thurman", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:31:15.000+00:00", - "departure": "2009-11-17T18:31:15.000+00:00", - "lat": 45.517253, - "lon": -122.651354, - "name": "SE Morrison & 14th", - "stopCode": "4016", - "stopId": "prt:4016", - "stopIndex": 51, - "stopSequence": 52, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:32:00.000+00:00", - "departure": "2009-11-17T18:32:00.000+00:00", - "lat": 45.517299, - "lon": -122.654067, - "name": "SE Morrison & 12th", - "stopCode": "4014", - "stopId": "prt:4014", - "stopIndex": 52, - "stopSequence": 53, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:32:38.000+00:00", - "departure": "2009-11-17T18:32:38.000+00:00", - "lat": 45.517292, - "lon": -122.656563, - "name": "SE Morrison & 9th", - "stopCode": "4026", - "stopId": "prt:4026", - "stopIndex": 53, - "stopSequence": 54, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:33:08.000+00:00", - "departure": "2009-11-17T18:33:08.000+00:00", - "lat": 45.517322, - "lon": -122.65847, - "name": "SE Morrison & 7th", - "stopCode": "4025", - "stopId": "prt:4025", - "stopIndex": 54, - "stopSequence": 55, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:33:39.000+00:00", - "departure": "2009-11-17T18:33:39.000+00:00", - "lat": 45.517298, - "lon": -122.660523, - "name": "SE Morrison & Grand", - "stopCode": "4013", - "stopId": "prt:4013", - "stopIndex": 55, - "stopSequence": 56, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:35:03.000+00:00", - "departure": "2009-11-17T18:35:03.000+00:00", - "lat": 45.517351, - "lon": -122.66601, - "name": "Morrison Bridge", - "stopCode": "4029", - "stopId": "prt:4029", - "stopIndex": 56, - "stopSequence": 57, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:37:27.000+00:00", - "departure": "2009-11-17T18:37:27.000+00:00", - "lat": 45.51959, - "lon": -122.674599, - "name": "SW Washington & 3rd", - "stopCode": "6158", - "stopId": "prt:6158", - "stopIndex": 57, - "stopSequence": 58, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:38:00.000+00:00", - "departure": "2009-11-17T18:38:00.000+00:00", - "lat": 45.520129, - "lon": -122.676635, - "name": "SW Washington & 5th", - "stopCode": "6160", - "stopId": "prt:6160", - "stopIndex": 58, - "stopSequence": 59, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:38:52.000+00:00", - "departure": "2009-11-17T18:38:52.000+00:00", - "lat": 45.520695, - "lon": -122.678657, - "name": "SW Washington & Broadway", - "stopCode": "6137", - "stopId": "prt:6137", - "stopIndex": 59, - "stopSequence": 60, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:39:34.000+00:00", - "departure": "2009-11-17T18:39:34.000+00:00", - "lat": 45.521124, - "lon": -122.6803, - "name": "SW Washington & 9th", - "stopCode": "6169", - "stopId": "prt:6169", - "stopIndex": 60, - "stopSequence": 61, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:40:47.000+00:00", - "departure": "2009-11-17T18:40:47.000+00:00", - "lat": 45.521094, - "lon": -122.682819, - "name": "SW 11th & Alder", - "stopCode": "9600", - "stopId": "prt:9600", - "stopIndex": 61, - "stopSequence": 62, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:41:36.000+00:00", - "departure": "2009-11-17T18:41:36.000+00:00", - "lat": 45.52055, - "lon": -122.683933, - "name": "SW Morrison & 12th", - "stopCode": "9598", - "stopId": "prt:9598", - "stopIndex": 62, - "stopSequence": 63, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:42:25.000+00:00", - "departure": "2009-11-17T18:42:25.000+00:00", - "lat": 45.521063, - "lon": -122.685848, - "name": "SW Morrison & 14th", - "stopCode": "9708", - "stopId": "prt:9708", - "stopIndex": 63, - "stopSequence": 64, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:43:18.000+00:00", - "departure": "2009-11-17T18:43:18.000+00:00", - "lat": 45.521641, - "lon": -122.687932, - "name": "SW Morrison & 16th", - "stopCode": "9613", - "stopId": "prt:9613", - "stopIndex": 64, - "stopSequence": 65, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:44:00.000+00:00", - "departure": "2009-11-17T18:44:00.000+00:00", - "lat": 45.52206, - "lon": -122.689577, - "name": "SW Morrison & 17th", - "stopCode": "9599", - "stopId": "prt:9599", - "stopIndex": 65, - "stopSequence": 66, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:45:03.000+00:00", - "departure": "2009-11-17T18:45:03.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 66, - "stopSequence": 67, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:45:46.000+00:00", - "departure": "2009-11-17T18:45:46.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 67, - "stopSequence": 68, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:46:07.000+00:00", - "departure": "2009-11-17T18:46:07.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 68, - "stopSequence": 69, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:46:44.000+00:00", - "departure": "2009-11-17T18:46:44.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 69, - "stopSequence": 70, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:47:51.000+00:00", - "departure": "2009-11-17T18:47:51.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:48:53.000+00:00", - "departure": "2009-11-17T18:48:53.000+00:00", - "lat": 45.525416, - "lon": -122.698381, - "name": "NW 23rd & Flanders", - "stopCode": "7157", - "stopId": "prt:7157", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:49:56.000+00:00", - "departure": "2009-11-17T18:49:56.000+00:00", - "lat": 45.527543, - "lon": -122.698473, - "name": "NW 23rd & Irving", - "stopCode": "7161", - "stopId": "prt:7161", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:51:00.000+00:00", - "departure": "2009-11-17T18:51:00.000+00:00", - "lat": 45.529681, - "lon": -122.698529, - "name": "NW 23rd & Lovejoy", - "stopCode": "7163", - "stopId": "prt:7163", - "stopIndex": 73, - "stopSequence": 74, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1884, + "headsign" : "NW 27th & Thurman", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:31:15.000+00:00", + "departure" : "2009-11-17T18:31:15.000+00:00", + "lat" : 45.517253, + "lon" : -122.651354, + "name" : "SE Morrison & 14th", + "stopCode" : "4016", + "stopId" : "prt:4016", + "stopIndex" : 51, + "stopSequence" : 52, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:32:00.000+00:00", + "departure" : "2009-11-17T18:32:00.000+00:00", + "lat" : 45.517299, + "lon" : -122.654067, + "name" : "SE Morrison & 12th", + "stopCode" : "4014", + "stopId" : "prt:4014", + "stopIndex" : 52, + "stopSequence" : 53, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:32:38.000+00:00", + "departure" : "2009-11-17T18:32:38.000+00:00", + "lat" : 45.517292, + "lon" : -122.656563, + "name" : "SE Morrison & 9th", + "stopCode" : "4026", + "stopId" : "prt:4026", + "stopIndex" : 53, + "stopSequence" : 54, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:33:08.000+00:00", + "departure" : "2009-11-17T18:33:08.000+00:00", + "lat" : 45.517322, + "lon" : -122.65847, + "name" : "SE Morrison & 7th", + "stopCode" : "4025", + "stopId" : "prt:4025", + "stopIndex" : 54, + "stopSequence" : 55, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:33:39.000+00:00", + "departure" : "2009-11-17T18:33:39.000+00:00", + "lat" : 45.517298, + "lon" : -122.660523, + "name" : "SE Morrison & Grand", + "stopCode" : "4013", + "stopId" : "prt:4013", + "stopIndex" : 55, + "stopSequence" : 56, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:35:03.000+00:00", + "departure" : "2009-11-17T18:35:03.000+00:00", + "lat" : 45.517351, + "lon" : -122.66601, + "name" : "Morrison Bridge", + "stopCode" : "4029", + "stopId" : "prt:4029", + "stopIndex" : 56, + "stopSequence" : 57, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:37:27.000+00:00", + "departure" : "2009-11-17T18:37:27.000+00:00", + "lat" : 45.51959, + "lon" : -122.674599, + "name" : "SW Washington & 3rd", + "stopCode" : "6158", + "stopId" : "prt:6158", + "stopIndex" : 57, + "stopSequence" : 58, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:38:00.000+00:00", + "departure" : "2009-11-17T18:38:00.000+00:00", + "lat" : 45.520129, + "lon" : -122.676635, + "name" : "SW Washington & 5th", + "stopCode" : "6160", + "stopId" : "prt:6160", + "stopIndex" : 58, + "stopSequence" : 59, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:38:52.000+00:00", + "departure" : "2009-11-17T18:38:52.000+00:00", + "lat" : 45.520695, + "lon" : -122.678657, + "name" : "SW Washington & Broadway", + "stopCode" : "6137", + "stopId" : "prt:6137", + "stopIndex" : 59, + "stopSequence" : 60, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:39:34.000+00:00", + "departure" : "2009-11-17T18:39:34.000+00:00", + "lat" : 45.521124, + "lon" : -122.6803, + "name" : "SW Washington & 9th", + "stopCode" : "6169", + "stopId" : "prt:6169", + "stopIndex" : 60, + "stopSequence" : 61, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:40:47.000+00:00", + "departure" : "2009-11-17T18:40:47.000+00:00", + "lat" : 45.521094, + "lon" : -122.682819, + "name" : "SW 11th & Alder", + "stopCode" : "9600", + "stopId" : "prt:9600", + "stopIndex" : 61, + "stopSequence" : 62, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:41:36.000+00:00", + "departure" : "2009-11-17T18:41:36.000+00:00", + "lat" : 45.52055, + "lon" : -122.683933, + "name" : "SW Morrison & 12th", + "stopCode" : "9598", + "stopId" : "prt:9598", + "stopIndex" : 62, + "stopSequence" : 63, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:42:25.000+00:00", + "departure" : "2009-11-17T18:42:25.000+00:00", + "lat" : 45.521063, + "lon" : -122.685848, + "name" : "SW Morrison & 14th", + "stopCode" : "9708", + "stopId" : "prt:9708", + "stopIndex" : 63, + "stopSequence" : 64, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:43:18.000+00:00", + "departure" : "2009-11-17T18:43:18.000+00:00", + "lat" : 45.521641, + "lon" : -122.687932, + "name" : "SW Morrison & 16th", + "stopCode" : "9613", + "stopId" : "prt:9613", + "stopIndex" : 64, + "stopSequence" : 65, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:44:00.000+00:00", + "departure" : "2009-11-17T18:44:00.000+00:00", + "lat" : 45.52206, + "lon" : -122.689577, + "name" : "SW Morrison & 17th", + "stopCode" : "9599", + "stopId" : "prt:9599", + "stopIndex" : 65, + "stopSequence" : 66, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:45:03.000+00:00", + "departure" : "2009-11-17T18:45:03.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 66, + "stopSequence" : 67, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:45:46.000+00:00", + "departure" : "2009-11-17T18:45:46.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 67, + "stopSequence" : 68, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:46:07.000+00:00", + "departure" : "2009-11-17T18:46:07.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 68, + "stopSequence" : 69, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:46:44.000+00:00", + "departure" : "2009-11-17T18:46:44.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 69, + "stopSequence" : 70, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:47:51.000+00:00", + "departure" : "2009-11-17T18:47:51.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:48:53.000+00:00", + "departure" : "2009-11-17T18:48:53.000+00:00", + "lat" : 45.525416, + "lon" : -122.698381, + "name" : "NW 23rd & Flanders", + "stopCode" : "7157", + "stopId" : "prt:7157", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:49:56.000+00:00", + "departure" : "2009-11-17T18:49:56.000+00:00", + "lat" : 45.527543, + "lon" : -122.698473, + "name" : "NW 23rd & Irving", + "stopCode" : "7161", + "stopId" : "prt:7161", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:51:00.000+00:00", + "departure" : "2009-11-17T18:51:00.000+00:00", + "lat" : 45.529681, + "lon" : -122.698529, + "name" : "NW 23rd & Lovejoy", + "stopCode" : "7163", + "stopId" : "prt:7163", + "stopIndex" : 73, + "stopSequence" : 74, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 135, - "points": "kaytG||qkVA~@?jE?tC???r@AhE?jE?rA???tBAjE?nD???X?hE?xC??Ah@?pE?~C???J?`@?vAAvBEbE?jEAlE?`BAbB@d@??@tAAj@Cx@Cb@Cp@_@dEcAtFoA`IS~@i@`BmAzDi@zAc@pAi@~C??Id@u@jEm@bD??If@u@jEk@bD??If@u@|DW`B??CPs@|Du@lElBz@??VJbCfAk@dD??Id@w@rEWvAId@AF??Q~@s@`Ei@~C??Ib@u@dEWzA??]jB]MQSe@WOKOKIIQe@GWE]GnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APkAh@o@?sCB{BD??S?mCDmCDyBB??U?mCDmCDyBB??S?oCDmCDmCBo@@" + "legGeometry" : { + "length" : 135, + "points" : "kaytG||qkVA~@?jE?tC???r@AhE?jE?rA???tBAjE?nD???X?hE?xC??Ah@?pE?~C???J?`@?vAAvBEbE?jEAlE?`BAbB@d@??@tAAj@Cx@Cb@Cp@_@dEcAtFoA`IS~@i@`BmAzDi@zAc@pAi@~C??Id@u@jEm@bD??If@u@jEk@bD??If@u@|DW`B??CPs@|Du@lElBz@??VJbCfAk@dD??Id@w@rEWvAId@AF??Q~@s@`Ei@~C??Ib@u@dEWzA??]jB]MQSe@WOKOKIIQe@GWE]GnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APkAh@o@?sCB{BD??S?mCDmCDyBB??U?mCDmCDyBB??S?oCDmCDmCBo@@" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Belmont/NW 23rd", - "routeId": "prt:15", - "routeLongName": "Belmont/NW 23rd", - "routeShortName": "15", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:30:40.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:52:04.000+00:00", - "departure": "2009-11-17T18:52:04.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "stopIndex": 74, - "stopSequence": 75, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Belmont/NW 23rd", + "routeId" : "prt:15", + "routeLongName" : "Belmont/NW 23rd", + "routeShortName" : "15", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:30:40.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:52:04.000+00:00", + "departure" : "2009-11-17T18:52:04.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "stopIndex" : 74, + "stopSequence" : 75, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "1541", - "tripId": "prt:150W1410" + "transitLeg" : true, + "tripBlockId" : "1541", + "tripId" : "prt:150W1410" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 266.21, - "endTime": "2009-11-17T18:55:32.000+00:00", - "from": { - "arrival": "2009-11-17T18:52:04.000+00:00", - "departure": "2009-11-17T18:52:04.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 266.21, + "endTime" : "2009-11-17T18:55:32.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:52:04.000+00:00", + "departure" : "2009-11-17T18:52:04.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 405, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 13, - "points": "}~{tGnq{kV?LVAF?J?L?rBCLA?Q?EAyAEcH?G" + "generalizedCost" : 405, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 13, + "points" : "}~{tGnq{kV?LVAF?J?L?rBCLA?Q?EAyAEcH?G" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:52:04.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 104.46, - "elevation": "", - "lat": 45.5321578, - "lon": -122.6987026, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 161.77, - "elevation": "", - "lat": 45.5312188, - "lon": -122.6986675, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:52:04.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 104.46, + "elevation" : "", + "lat" : 45.5321578, + "lon" : -122.6987026, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 161.77, + "elevation" : "", + "lat" : 45.5312188, + "lon" : -122.6986675, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:55:32.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:55:32.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:29:52.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 1284, - "waitingTime": 0, - "walkDistance": 328.22, - "walkLimitExceeded": false, - "walkTime": 256 + "startTime" : "2009-11-17T18:29:52.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 1284, + "waitingTime" : 0, + "walkDistance" : 328.22, + "walkLimitExceeded" : false, + "walkTime" : 256 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1849, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T19:08:19.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1849, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T19:08:19.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "70" + "feedId" : "prt", + "id" : "70" }, { - "feedId": "prt", - "id": "77" + "feedId" : "prt", + "id" : "77" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 3375, - "legs": [ + "generalizedCost" : 3375, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 419.62, - "endTime": "2009-11-17T18:42:54.000+00:00", - "from": { - "departure": "2009-11-17T18:37:30.000+00:00", - "lat": 45.51726, - "lon": -122.64847, - "name": "SE Morrison St. & SE 17th Ave. (P1)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 419.62, + "endTime" : "2009-11-17T18:42:54.000+00:00", + "from" : { + "departure" : "2009-11-17T18:37:30.000+00:00", + "lat" : 45.51726, + "lon" : -122.64847, + "name" : "SE Morrison St. & SE 17th Ave. (P1)", + "vertexType" : "NORMAL" }, - "generalizedCost": 636, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 14, - "points": "kaytG~wqkV?T?fCAl@?R?jE?rC?t@?hEAvD?RN?L??O" + "generalizedCost" : 636, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 14, + "points" : "kaytG~wqkV?T?fCAl@?R?jE?rC?t@?hEAvD?RN?L??O" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:37:30.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 403.66, - "elevation": "", - "lat": 45.517186, - "lon": -122.6484704, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Southeast Morrison Street", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 15.96, - "elevation": "", - "lat": 45.5172031, - "lon": -122.6536511, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Southeast 12th Avenue", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:37:30.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 403.66, + "elevation" : "", + "lat" : 45.517186, + "lon" : -122.6484704, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Southeast Morrison Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 15.96, + "elevation" : "", + "lat" : 45.5172031, + "lon" : -122.6536511, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Southeast 12th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:42:54.000+00:00", - "departure": "2009-11-17T18:42:54.000+00:00", - "lat": 45.517059, - "lon": -122.65358, - "name": "SE 12th & Morrison", - "stopCode": "6588", - "stopId": "prt:6588", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:42:54.000+00:00", + "departure" : "2009-11-17T18:42:54.000+00:00", + "lat" : 45.517059, + "lon" : -122.65358, + "name" : "SE 12th & Morrison", + "stopCode" : "6588", + "stopId" : "prt:6588", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2035.62, - "endTime": "2009-11-17T18:51:01.000+00:00", - "from": { - "arrival": "2009-11-17T18:42:54.000+00:00", - "departure": "2009-11-17T18:42:54.000+00:00", - "lat": 45.517059, - "lon": -122.65358, - "name": "SE 12th & Morrison", - "stopCode": "6588", - "stopId": "prt:6588", - "stopIndex": 31, - "stopSequence": 32, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2035.62, + "endTime" : "2009-11-17T18:51:01.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:42:54.000+00:00", + "departure" : "2009-11-17T18:42:54.000+00:00", + "lat" : 45.517059, + "lon" : -122.65358, + "name" : "SE 12th & Morrison", + "stopCode" : "6588", + "stopId" : "prt:6588", + "stopIndex" : 31, + "stopSequence" : 32, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1087, - "headsign": "Rose Qtr TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:44:00.000+00:00", - "departure": "2009-11-17T18:44:00.000+00:00", - "lat": 45.519229, - "lon": -122.653546, - "name": "SE 12th & Stark", - "stopCode": "6594", - "stopId": "prt:6594", - "stopIndex": 32, - "stopSequence": 33, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:44:44.000+00:00", - "departure": "2009-11-17T18:44:44.000+00:00", - "lat": 45.520674, - "lon": -122.653544, - "name": "SE 12th & Pine", - "stopCode": "6589", - "stopId": "prt:6589", - "stopIndex": 33, - "stopSequence": 34, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:46:00.000+00:00", - "departure": "2009-11-17T18:46:00.000+00:00", - "lat": 45.52318, - "lon": -122.653507, - "name": "NE 12th & Sandy", - "stopCode": "6592", - "stopId": "prt:6592", - "stopIndex": 34, - "stopSequence": 35, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:47:45.000+00:00", - "departure": "2009-11-17T18:47:45.000+00:00", - "lat": 45.527449, - "lon": -122.653462, - "name": "NE 12th & Irving", - "stopCode": "6582", - "stopId": "prt:6582", - "stopIndex": 35, - "stopSequence": 36, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:49:00.000+00:00", - "departure": "2009-11-17T18:49:00.000+00:00", - "lat": 45.529793, - "lon": -122.654429, - "name": "NE 11th & Holladay", - "stopCode": "8513", - "stopId": "prt:8513", - "stopIndex": 36, - "stopSequence": 37, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:49:39.000+00:00", - "departure": "2009-11-17T18:49:39.000+00:00", - "lat": 45.53135, - "lon": -122.654497, - "name": "NE 11th & Multnomah", - "stopCode": "8938", - "stopId": "prt:8938", - "stopIndex": 37, - "stopSequence": 38, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:50:15.000+00:00", - "departure": "2009-11-17T18:50:15.000+00:00", - "lat": 45.531573, - "lon": -122.656408, - "name": "NE Multnomah & 9th", - "stopCode": "4056", - "stopId": "prt:4056", - "stopIndex": 38, - "stopSequence": 39, - "vertexType": "TRANSIT", - "zoneId": "0" + "generalizedCost" : 1087, + "headsign" : "Rose Qtr TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:44:00.000+00:00", + "departure" : "2009-11-17T18:44:00.000+00:00", + "lat" : 45.519229, + "lon" : -122.653546, + "name" : "SE 12th & Stark", + "stopCode" : "6594", + "stopId" : "prt:6594", + "stopIndex" : 32, + "stopSequence" : 33, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:44:44.000+00:00", + "departure" : "2009-11-17T18:44:44.000+00:00", + "lat" : 45.520674, + "lon" : -122.653544, + "name" : "SE 12th & Pine", + "stopCode" : "6589", + "stopId" : "prt:6589", + "stopIndex" : 33, + "stopSequence" : 34, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:46:00.000+00:00", + "departure" : "2009-11-17T18:46:00.000+00:00", + "lat" : 45.52318, + "lon" : -122.653507, + "name" : "NE 12th & Sandy", + "stopCode" : "6592", + "stopId" : "prt:6592", + "stopIndex" : 34, + "stopSequence" : 35, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:47:45.000+00:00", + "departure" : "2009-11-17T18:47:45.000+00:00", + "lat" : 45.527449, + "lon" : -122.653462, + "name" : "NE 12th & Irving", + "stopCode" : "6582", + "stopId" : "prt:6582", + "stopIndex" : 35, + "stopSequence" : 36, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:49:00.000+00:00", + "departure" : "2009-11-17T18:49:00.000+00:00", + "lat" : 45.529793, + "lon" : -122.654429, + "name" : "NE 11th & Holladay", + "stopCode" : "8513", + "stopId" : "prt:8513", + "stopIndex" : 36, + "stopSequence" : 37, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:49:39.000+00:00", + "departure" : "2009-11-17T18:49:39.000+00:00", + "lat" : 45.53135, + "lon" : -122.654497, + "name" : "NE 11th & Multnomah", + "stopCode" : "8938", + "stopId" : "prt:8938", + "stopIndex" : 37, + "stopSequence" : 38, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:50:15.000+00:00", + "departure" : "2009-11-17T18:50:15.000+00:00", + "lat" : 45.531573, + "lon" : -122.656408, + "name" : "NE Multnomah & 9th", + "stopCode" : "4056", + "stopId" : "prt:4056", + "stopIndex" : 38, + "stopSequence" : 39, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 49, - "points": "s`ytGhxrkV[?mCAmC?wBA??W?mC?{BA??Q?oC?mC?kBAa@?w@???wA?mCAmC?oCA}C?sDC??aBAm@@k@AY?uABU@I@IBQFb@fC}@d@OFO@q@???Q?]?gGA??[??nJ???b@?vK?rA" + "legGeometry" : { + "length" : 49, + "points" : "s`ytGhxrkV[?mCAmC?wBA??W?mC?{BA??Q?oC?mC?kBAa@?w@???wA?mCAmC?oCA}C?sDC??aBAm@@k@AY?uABU@I@IBQFb@fC}@d@OFO@q@???Q?]?gGA??[??nJ???b@?vK?rA" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "12th Ave", - "routeId": "prt:70", - "routeLongName": "12th Ave", - "routeShortName": "70", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:42:54.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:51:01.000+00:00", - "departure": "2009-11-17T18:54:29.000+00:00", - "lat": 45.531569, - "lon": -122.659045, - "name": "NE Multnomah & 7th", - "stopCode": "4054", - "stopId": "prt:4054", - "stopIndex": 39, - "stopSequence": 40, - "vertexType": "TRANSIT", - "zoneId": "0" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "12th Ave", + "routeId" : "prt:70", + "routeLongName" : "12th Ave", + "routeShortName" : "70", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:42:54.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:51:01.000+00:00", + "departure" : "2009-11-17T18:54:29.000+00:00", + "lat" : 45.531569, + "lon" : -122.659045, + "name" : "NE Multnomah & 7th", + "stopCode" : "4054", + "stopId" : "prt:4054", + "stopIndex" : 39, + "stopSequence" : 40, + "vertexType" : "TRANSIT", + "zoneId" : "0" }, - "transitLeg": true, - "tripBlockId": "7002", - "tripId": "prt:700W1170" + "transitLeg" : true, + "tripBlockId" : "7002", + "tripId" : "prt:700W1170" }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3560.24, - "endTime": "2009-11-17T19:07:55.000+00:00", - "from": { - "arrival": "2009-11-17T18:51:01.000+00:00", - "departure": "2009-11-17T18:54:29.000+00:00", - "lat": 45.531569, - "lon": -122.659045, - "name": "NE Multnomah & 7th", - "stopCode": "4054", - "stopId": "prt:4054", - "stopIndex": 81, - "stopSequence": 82, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3560.24, + "endTime" : "2009-11-17T19:07:55.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:51:01.000+00:00", + "departure" : "2009-11-17T18:54:29.000+00:00", + "lat" : 45.531569, + "lon" : -122.659045, + "name" : "NE Multnomah & 7th", + "stopCode" : "4054", + "stopId" : "prt:4054", + "stopIndex" : 81, + "stopSequence" : 82, + "vertexType" : "TRANSIT", + "zoneId" : "0" }, - "generalizedCost": 1614, - "headsign": "Montgomery Park", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:55:05.000+00:00", - "departure": "2009-11-17T18:55:05.000+00:00", - "lat": 45.531586, - "lon": -122.660482, - "name": "NE Multnomah & Grand", - "stopCode": "4043", - "stopId": "prt:4043", - "stopIndex": 82, - "stopSequence": 83, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:56:09.000+00:00", - "departure": "2009-11-17T18:56:09.000+00:00", - "lat": 45.531159, - "lon": -122.66293, - "name": "NE Multnomah & 3rd", - "stopCode": "11492", - "stopId": "prt:11492", - "stopIndex": 83, - "stopSequence": 84, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:58:00.000+00:00", - "departure": "2009-11-17T18:58:00.000+00:00", - "lat": 45.530005, - "lon": -122.666476, - "name": "Rose Quarter Transit Center", - "stopCode": "2592", - "stopId": "prt:2592", - "stopIndex": 84, - "stopSequence": 85, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:01:20.000+00:00", - "departure": "2009-11-17T19:01:20.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "stopIndex": 85, - "stopSequence": 86, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:02:15.000+00:00", - "departure": "2009-11-17T19:02:15.000+00:00", - "lat": 45.528799, - "lon": -122.677238, - "name": "NW Station Way & Union Station", - "stopCode": "12801", - "stopId": "prt:12801", - "stopIndex": 86, - "stopSequence": 87, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:04:00.000+00:00", - "departure": "2009-11-17T19:04:00.000+00:00", - "lat": 45.531582, - "lon": -122.681193, - "name": "NW Northrup & 10th", - "stopCode": "12802", - "stopId": "prt:12802", - "stopIndex": 87, - "stopSequence": 88, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:04:33.000+00:00", - "departure": "2009-11-17T19:04:33.000+00:00", - "lat": 45.531534, - "lon": -122.683319, - "name": "NW 12th & Northrup", - "stopCode": "12796", - "stopId": "prt:12796", - "stopIndex": 88, - "stopSequence": 89, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:05:04.000+00:00", - "departure": "2009-11-17T19:05:04.000+00:00", - "lat": 45.531503, - "lon": -122.685357, - "name": "NW Northrup & 14th", - "stopCode": "10775", - "stopId": "prt:10775", - "stopIndex": 89, - "stopSequence": 90, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:06:07.000+00:00", - "departure": "2009-11-17T19:06:07.000+00:00", - "lat": 45.531434, - "lon": -122.689417, - "name": "NW Northrup & 18th", - "stopCode": "10776", - "stopId": "prt:10776", - "stopIndex": 90, - "stopSequence": 91, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:07:24.000+00:00", - "departure": "2009-11-17T19:07:24.000+00:00", - "lat": 45.531346, - "lon": -122.694455, - "name": "NW Northrup & 21st", - "stopCode": "10777", - "stopId": "prt:10777", - "stopIndex": 91, - "stopSequence": 92, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1614, + "headsign" : "Montgomery Park", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:55:05.000+00:00", + "departure" : "2009-11-17T18:55:05.000+00:00", + "lat" : 45.531586, + "lon" : -122.660482, + "name" : "NE Multnomah & Grand", + "stopCode" : "4043", + "stopId" : "prt:4043", + "stopIndex" : 82, + "stopSequence" : 83, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:56:09.000+00:00", + "departure" : "2009-11-17T18:56:09.000+00:00", + "lat" : 45.531159, + "lon" : -122.66293, + "name" : "NE Multnomah & 3rd", + "stopCode" : "11492", + "stopId" : "prt:11492", + "stopIndex" : 83, + "stopSequence" : 84, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:58:00.000+00:00", + "departure" : "2009-11-17T18:58:00.000+00:00", + "lat" : 45.530005, + "lon" : -122.666476, + "name" : "Rose Quarter Transit Center", + "stopCode" : "2592", + "stopId" : "prt:2592", + "stopIndex" : 84, + "stopSequence" : 85, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:01:20.000+00:00", + "departure" : "2009-11-17T19:01:20.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "stopIndex" : 85, + "stopSequence" : 86, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:02:15.000+00:00", + "departure" : "2009-11-17T19:02:15.000+00:00", + "lat" : 45.528799, + "lon" : -122.677238, + "name" : "NW Station Way & Union Station", + "stopCode" : "12801", + "stopId" : "prt:12801", + "stopIndex" : 86, + "stopSequence" : 87, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:04:00.000+00:00", + "departure" : "2009-11-17T19:04:00.000+00:00", + "lat" : 45.531582, + "lon" : -122.681193, + "name" : "NW Northrup & 10th", + "stopCode" : "12802", + "stopId" : "prt:12802", + "stopIndex" : 87, + "stopSequence" : 88, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:04:33.000+00:00", + "departure" : "2009-11-17T19:04:33.000+00:00", + "lat" : 45.531534, + "lon" : -122.683319, + "name" : "NW 12th & Northrup", + "stopCode" : "12796", + "stopId" : "prt:12796", + "stopIndex" : 88, + "stopSequence" : 89, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:05:04.000+00:00", + "departure" : "2009-11-17T19:05:04.000+00:00", + "lat" : 45.531503, + "lon" : -122.685357, + "name" : "NW Northrup & 14th", + "stopCode" : "10775", + "stopId" : "prt:10775", + "stopIndex" : 89, + "stopSequence" : 90, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:06:07.000+00:00", + "departure" : "2009-11-17T19:06:07.000+00:00", + "lat" : 45.531434, + "lon" : -122.689417, + "name" : "NW Northrup & 18th", + "stopCode" : "10776", + "stopId" : "prt:10776", + "stopIndex" : 90, + "stopSequence" : 91, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:07:24.000+00:00", + "departure" : "2009-11-17T19:07:24.000+00:00", + "lat" : 45.531346, + "lon" : -122.694455, + "name" : "NW Northrup & 21st", + "stopCode" : "10777", + "stopId" : "prt:10777", + "stopIndex" : 91, + "stopSequence" : 92, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 104, - "points": "yz{tG`zskV?tBCfD???^?nE?V@Z?PH\\Nb@`@~@Rf@??`@bANb@FV@R?P?pE?jA@h@AnAbBl@LFJN\\f@LT??NXJPPVJFf@Vf@Pp@Nd@NRLB@RNXZR\\vAhC@BhAhD`AhClAbDBrDCnG@n@@^@d@HdAP`CBjEDvD???LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ" + "legGeometry" : { + "length" : 104, + "points" : "yz{tG`zskV?tBCfD???^?nE?V@Z?PH\\Nb@`@~@Rf@??`@bANb@FV@R?P?pE?jA@h@AnAbBl@LFJN\\f@LT??NXJPPVJFf@Vf@Pp@Nd@NRLB@RNXZR\\vAhC@BhAhD`AhClAbDBrDCnG@n@@^@d@HdAP`CBjEDvD???LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Broadway/Halsey", - "routeId": "prt:77", - "routeLongName": "Broadway/Halsey", - "routeShortName": "77", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:54:29.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T19:07:55.000+00:00", - "departure": "2009-11-17T19:07:55.000+00:00", - "lat": 45.531308, - "lon": -122.696445, - "name": "NW Northrup & 22nd", - "stopCode": "10778", - "stopId": "prt:10778", - "stopIndex": 92, - "stopSequence": 93, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Broadway/Halsey", + "routeId" : "prt:77", + "routeLongName" : "Broadway/Halsey", + "routeShortName" : "77", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:54:29.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T19:07:55.000+00:00", + "departure" : "2009-11-17T19:07:55.000+00:00", + "lat" : 45.531308, + "lon" : -122.696445, + "name" : "NW Northrup & 22nd", + "stopCode" : "10778", + "stopId" : "prt:10778", + "stopIndex" : 92, + "stopSequence" : 93, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "7702", - "tripId": "prt:771W1180" + "transitLeg" : true, + "tripBlockId" : "7702", + "tripId" : "prt:771W1180" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 18.81, - "endTime": "2009-11-17T19:08:19.000+00:00", - "from": { - "arrival": "2009-11-17T19:07:55.000+00:00", - "departure": "2009-11-17T19:07:55.000+00:00", - "lat": 45.531308, - "lon": -122.696445, - "name": "NW Northrup & 22nd", - "stopCode": "10778", - "stopId": "prt:10778", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 18.81, + "endTime" : "2009-11-17T19:08:19.000+00:00", + "from" : { + "arrival" : "2009-11-17T19:07:55.000+00:00", + "departure" : "2009-11-17T19:07:55.000+00:00", + "lat" : 45.531308, + "lon" : -122.696445, + "name" : "NW Northrup & 22nd", + "stopCode" : "10778", + "stopId" : "prt:10778", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 37, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 7, - "points": "sy{tGxc{kV???LABF?B??J" + "generalizedCost" : 37, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 7, + "points" : "sy{tGxc{kV???LABF?B??J" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T19:07:55.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 18.81, - "elevation": "", - "lat": 45.5313019, - "lon": -122.6964448, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T19:07:55.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 18.81, + "elevation" : "", + "lat" : 45.5313019, + "lon" : -122.6964448, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T19:08:19.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T19:08:19.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:37:30.000+00:00", - "tooSloped": false, - "transfers": 1, - "transitTime": 1293, - "waitingTime": 208, - "walkDistance": 438.43, - "walkLimitExceeded": false, - "walkTime": 348 + "startTime" : "2009-11-17T18:37:30.000+00:00", + "tooSloped" : false, + "transfers" : 1, + "transitTime" : 1293, + "waitingTime" : 208, + "walkDistance" : 438.43, + "walkLimitExceeded" : false, + "walkTime" : 348 } ] ] @@ -2840,2710 +2840,2710 @@ org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_plan org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_planning_with_transit_stop=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 3451, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:57:31.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 3451, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:57:31.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 6717, - "legs": [ + "generalizedCost" : 6717, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 4442.91, - "endTime": "2009-11-17T18:57:31.000+00:00", - "from": { - "departure": "2009-11-17T18:00:00.000+00:00", - "lat": 45.52337, - "lon": -122.653725, - "name": "NE 12th & Couch", - "stopCode": "6577", - "stopId": "prt:6577", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 4442.91, + "endTime" : "2009-11-17T18:57:31.000+00:00", + "from" : { + "departure" : "2009-11-17T18:00:00.000+00:00", + "lat" : 45.52337, + "lon" : -122.653725, + "name" : "NE 12th & Couch", + "stopCode" : "6577", + "stopId" : "prt:6577", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 6717, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 208, - "points": "ahztGxxrkV@Sb@?`@@T??V?vCAT?R?`D?T?RA`D?R?R?t@?n@?z@?T?R?jB?@?r@?R?R?tA?\\?l@?R?T?VAd@?jA?N?N?J?Z?jA?z@?P?Z?J@N?hA@x@Ap@ATETGpJCjEA|CArAAxAAxAAdBEzHClF?@Ax@GTAjBAZ?R@hC@h@Q@cBBM?M?_CDsA@Y?Q@O?K?Q?mBB[?C?W@[?]@E?IDI@]DO@SBM?S@G@A?GDEJQ|@AL?L@nA?j@@L?V?d@@~@@NI?E?W@Q?Q?m@@Q@AF?DAJBzB?V?NANM@K?GBEDEHIJUX_@f@KNQRSVGFCBQPIHGDGBIBK@W@a@?mA@E?C@C@A?CBQTKJEHIJeC~CYZo@v@g@d@IJAFAD?L@vC@hB@p@?X?T@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?RDbH@xA?D?P?RDpH" + "generalizedCost" : 6717, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 208, + "points" : "ahztGxxrkV@Sb@?`@@T??V?vCAT?R?`D?T?RA`D?R?R?t@?n@?z@?T?R?jB?@?r@?R?R?tA?\\?l@?R?T?VAd@?jA?N?N?J?Z?jA?z@?P?Z?J@N?hA@x@Ap@ATETGpJCjEA|CArAAxAAxAAdBEzHClF?@Ax@GTAjBAZ?R@hC@h@Q@cBBM?M?_CDsA@Y?Q@O?K?Q?mBB[?C?W@[?]@E?IDI@]DO@SBM?S@G@A?GDEJQ|@AL?L@nA?j@@L?V?d@@~@@NI?E?W@Q?Q?m@@Q@AF?DAJBzB?V?NANM@K?GBEDEHIJUX_@f@KNQRSVGFCBQPIHGDGBIBK@W@a@?mA@E?C@C@A?CBQTKJEHIJeC~CYZo@v@g@d@IJAFAD?L@vC@hB@p@?X?T@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?RDbH@xA?D?P?RDpH" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:00:00.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 51.53, - "elevation": "", - "lat": 45.5233684, - "lon": -122.6536225, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northeast 12th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 877.28, - "elevation": "", - "lat": 45.5229051, - "lon": -122.6536312, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "East Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 407.38, - "elevation": "", - "lat": 45.523001, - "lon": -122.6648816, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Burnside Bridge", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 256.85, - "elevation": "", - "lat": 45.5231054, - "lon": -122.6701087, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 460.65, - "elevation": "", - "lat": 45.5231776, - "lon": -122.6733895, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 3rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 145.82, - "elevation": "", - "lat": 45.5272866, - "lon": -122.6737165, - "relativeDirection": "SLIGHTLY_LEFT", - "stayOn": false, - "streetName": "Northwest Hoyt Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 77.35, - "elevation": "", - "lat": 45.5273496, - "lon": -122.6755629, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 80.53, - "elevation": "", - "lat": 45.5280449, - "lon": -122.6755935, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 465.44, - "elevation": "", - "lat": 45.5280515, - "lon": -122.6766232, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Station Way", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 1620.15, - "elevation": "", - "lat": 45.5315452, - "lon": -122.679511, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:00:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 51.53, + "elevation" : "", + "lat" : 45.5233684, + "lon" : -122.6536225, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northeast 12th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 877.28, + "elevation" : "", + "lat" : 45.5229051, + "lon" : -122.6536312, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "East Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 407.38, + "elevation" : "", + "lat" : 45.523001, + "lon" : -122.6648816, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Burnside Bridge", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 256.85, + "elevation" : "", + "lat" : 45.5231054, + "lon" : -122.6701087, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 460.65, + "elevation" : "", + "lat" : 45.5231776, + "lon" : -122.6733895, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 3rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 145.82, + "elevation" : "", + "lat" : 45.5272866, + "lon" : -122.6737165, + "relativeDirection" : "SLIGHTLY_LEFT", + "stayOn" : false, + "streetName" : "Northwest Hoyt Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 77.35, + "elevation" : "", + "lat" : 45.5273496, + "lon" : -122.6755629, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 80.53, + "elevation" : "", + "lat" : 45.5280449, + "lon" : -122.6755935, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 465.44, + "elevation" : "", + "lat" : 45.5280515, + "lon" : -122.6766232, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Station Way", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 1620.15, + "elevation" : "", + "lat" : 45.5315452, + "lon" : -122.679511, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:57:31.000+00:00", - "lat": 45.531, - "lon": -122.70029, - "name": "NW Northrup St. & NW 24th Ave. (P3)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:57:31.000+00:00", + "lat" : 45.531, + "lon" : -122.70029, + "name" : "NW Northrup St. & NW 24th Ave. (P3)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:00:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 4442.91, - "walkLimitExceeded": false, - "walkTime": 3451 + "startTime" : "2009-11-17T18:00:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 4442.91, + "walkLimitExceeded" : false, + "walkTime" : 3451 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1553, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:38:40.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1553, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:38:40.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2895, - "legs": [ + "generalizedCost" : 2895, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 87.02, - "endTime": "2009-11-17T18:14:00.000+00:00", - "from": { - "departure": "2009-11-17T18:12:47.000+00:00", - "lat": 45.52337, - "lon": -122.653725, - "name": "NE 12th & Couch", - "stopCode": "6577", - "stopId": "prt:6577", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 87.02, + "endTime" : "2009-11-17T18:14:00.000+00:00", + "from" : { + "departure" : "2009-11-17T18:12:47.000+00:00", + "lat" : 45.52337, + "lon" : -122.653725, + "name" : "NE 12th & Couch", + "stopCode" : "6577", + "stopId" : "prt:6577", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 137, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 9, - "points": "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" + "generalizedCost" : 137, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 9, + "points" : "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:12:47.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 39.06, - "elevation": "", - "lat": 45.5233684, - "lon": -122.6536225, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northeast 12th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": true, - "distance": 47.96, - "elevation": "", - "lat": 45.5230172, - "lon": -122.6536338, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:12:47.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 39.06, + "elevation" : "", + "lat" : 45.5233684, + "lon" : -122.6536225, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northeast 12th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : true, + "distance" : 47.96, + "elevation" : "", + "lat" : 45.5230172, + "lon" : -122.6536338, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:14:00.000+00:00", - "departure": "2009-11-17T18:14:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:14:00.000+00:00", + "departure" : "2009-11-17T18:14:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3729.97, - "endTime": "2009-11-17T18:26:49.000+00:00", - "from": { - "arrival": "2009-11-17T18:14:00.000+00:00", - "departure": "2009-11-17T18:14:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "stopIndex": 94, - "stopSequence": 95, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3729.97, + "endTime" : "2009-11-17T18:26:49.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:14:00.000+00:00", + "departure" : "2009-11-17T18:14:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "stopIndex" : 94, + "stopSequence" : 95, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1369, - "headsign": "Beaverton TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:14:47.000+00:00", - "departure": "2009-11-17T18:14:47.000+00:00", - "lat": 45.523024, - "lon": -122.656526, - "name": "E Burnside & NE 9th", - "stopCode": "819", - "stopId": "prt:819", - "stopIndex": 95, - "stopSequence": 96, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:15:24.000+00:00", - "departure": "2009-11-17T18:15:24.000+00:00", - "lat": 45.523012, - "lon": -122.659365, - "name": "E Burnside & NE 6th", - "stopCode": "805", - "stopId": "prt:805", - "stopIndex": 96, - "stopSequence": 97, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:15:52.000+00:00", - "departure": "2009-11-17T18:15:52.000+00:00", - "lat": 45.523015, - "lon": -122.661534, - "name": "E Burnside & NE M L King", - "stopCode": "705", - "stopId": "prt:705", - "stopIndex": 97, - "stopSequence": 98, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:18:00.000+00:00", - "departure": "2009-11-17T18:18:00.000+00:00", - "lat": 45.523249, - "lon": -122.671269, - "name": "W Burnside & Burnside Bridge", - "stopCode": "689", - "stopId": "prt:689", - "stopIndex": 98, - "stopSequence": 99, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:19:00.000+00:00", - "departure": "2009-11-17T18:19:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:20:17.000+00:00", - "departure": "2009-11-17T18:20:17.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:21:25.000+00:00", - "departure": "2009-11-17T18:21:25.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:22:14.000+00:00", - "departure": "2009-11-17T18:22:14.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:24:09.000+00:00", - "departure": "2009-11-17T18:24:09.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:25:00.000+00:00", - "departure": "2009-11-17T18:25:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:25:21.000+00:00", - "departure": "2009-11-17T18:25:21.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:25:31.000+00:00", - "departure": "2009-11-17T18:25:31.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:25:49.000+00:00", - "departure": "2009-11-17T18:25:49.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:26:22.000+00:00", - "departure": "2009-11-17T18:26:22.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1369, + "headsign" : "Beaverton TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:14:47.000+00:00", + "departure" : "2009-11-17T18:14:47.000+00:00", + "lat" : 45.523024, + "lon" : -122.656526, + "name" : "E Burnside & NE 9th", + "stopCode" : "819", + "stopId" : "prt:819", + "stopIndex" : 95, + "stopSequence" : 96, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:15:24.000+00:00", + "departure" : "2009-11-17T18:15:24.000+00:00", + "lat" : 45.523012, + "lon" : -122.659365, + "name" : "E Burnside & NE 6th", + "stopCode" : "805", + "stopId" : "prt:805", + "stopIndex" : 96, + "stopSequence" : 97, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:15:52.000+00:00", + "departure" : "2009-11-17T18:15:52.000+00:00", + "lat" : 45.523015, + "lon" : -122.661534, + "name" : "E Burnside & NE M L King", + "stopCode" : "705", + "stopId" : "prt:705", + "stopIndex" : 97, + "stopSequence" : 98, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:18:00.000+00:00", + "departure" : "2009-11-17T18:18:00.000+00:00", + "lat" : 45.523249, + "lon" : -122.671269, + "name" : "W Burnside & Burnside Bridge", + "stopCode" : "689", + "stopId" : "prt:689", + "stopIndex" : 98, + "stopSequence" : 99, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:19:00.000+00:00", + "departure" : "2009-11-17T18:19:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:20:17.000+00:00", + "departure" : "2009-11-17T18:20:17.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:21:25.000+00:00", + "departure" : "2009-11-17T18:21:25.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:22:14.000+00:00", + "departure" : "2009-11-17T18:22:14.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:24:09.000+00:00", + "departure" : "2009-11-17T18:24:09.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:25:00.000+00:00", + "departure" : "2009-11-17T18:25:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:25:21.000+00:00", + "departure" : "2009-11-17T18:25:21.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:25:31.000+00:00", + "departure" : "2009-11-17T18:25:31.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:25:49.000+00:00", + "departure" : "2009-11-17T18:25:49.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:26:22.000+00:00", + "departure" : "2009-11-17T18:26:22.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 95, - "points": "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" + "legGeometry" : { + "length" : 95, + "points" : "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:14:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:26:49.000+00:00", - "departure": "2009-11-17T18:26:49.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "stopIndex": 109, - "stopSequence": 110, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:14:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:26:49.000+00:00", + "departure" : "2009-11-17T18:26:49.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "stopIndex" : 109, + "stopSequence" : 110, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "2002", - "tripId": "prt:200W1200" + "transitLeg" : true, + "tripBlockId" : "2002", + "tripId" : "prt:200W1200" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 913.81, - "endTime": "2009-11-17T18:38:40.000+00:00", - "from": { - "arrival": "2009-11-17T18:26:49.000+00:00", - "departure": "2009-11-17T18:26:49.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 913.81, + "endTime" : "2009-11-17T18:38:40.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:26:49.000+00:00", + "departure" : "2009-11-17T18:26:49.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1388, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 39, - "points": "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDoC@mCBmCDoCDmCD?qA" + "generalizedCost" : 1388, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 39, + "points" : "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDoC@mCBmCDoCDmCD?qA" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:26:49.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 54.63, - "elevation": "", - "lat": 45.5238156, - "lon": -122.7007199, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 635.66, - "elevation": "", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 31.86, - "elevation": "", - "lat": 45.531181, - "lon": -122.7007063, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:26:49.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 54.63, + "elevation" : "", + "lat" : 45.5238156, + "lon" : -122.7007199, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 635.66, + "elevation" : "", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 31.86, + "elevation" : "", + "lat" : 45.531181, + "lon" : -122.7007063, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:38:40.000+00:00", - "lat": 45.531, - "lon": -122.70029, - "name": "NW Northrup St. & NW 24th Ave. (P3)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:38:40.000+00:00", + "lat" : 45.531, + "lon" : -122.70029, + "name" : "NW Northrup St. & NW 24th Ave. (P3)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:12:47.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 769, - "waitingTime": 0, - "walkDistance": 1000.83, - "walkLimitExceeded": false, - "walkTime": 784 + "startTime" : "2009-11-17T18:12:47.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 769, + "waitingTime" : 0, + "walkDistance" : 1000.83, + "walkLimitExceeded" : false, + "walkTime" : 784 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1583, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:54:10.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1583, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:54:10.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2925, - "legs": [ + "generalizedCost" : 2925, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 87.02, - "endTime": "2009-11-17T18:29:00.000+00:00", - "from": { - "departure": "2009-11-17T18:27:47.000+00:00", - "lat": 45.52337, - "lon": -122.653725, - "name": "NE 12th & Couch", - "stopCode": "6577", - "stopId": "prt:6577", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 87.02, + "endTime" : "2009-11-17T18:29:00.000+00:00", + "from" : { + "departure" : "2009-11-17T18:27:47.000+00:00", + "lat" : 45.52337, + "lon" : -122.653725, + "name" : "NE 12th & Couch", + "stopCode" : "6577", + "stopId" : "prt:6577", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 137, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 9, - "points": "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" + "generalizedCost" : 137, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 9, + "points" : "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:27:47.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 39.06, - "elevation": "", - "lat": 45.5233684, - "lon": -122.6536225, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northeast 12th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": true, - "distance": 47.96, - "elevation": "", - "lat": 45.5230172, - "lon": -122.6536338, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:27:47.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 39.06, + "elevation" : "", + "lat" : 45.5233684, + "lon" : -122.6536225, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northeast 12th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : true, + "distance" : 47.96, + "elevation" : "", + "lat" : 45.5230172, + "lon" : -122.6536338, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:29:00.000+00:00", - "departure": "2009-11-17T18:29:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:29:00.000+00:00", + "departure" : "2009-11-17T18:29:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3729.97, - "endTime": "2009-11-17T18:42:19.000+00:00", - "from": { - "arrival": "2009-11-17T18:29:00.000+00:00", - "departure": "2009-11-17T18:29:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "stopIndex": 94, - "stopSequence": 95, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3729.97, + "endTime" : "2009-11-17T18:42:19.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:29:00.000+00:00", + "departure" : "2009-11-17T18:29:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "stopIndex" : 94, + "stopSequence" : 95, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1399, - "headsign": "23rd Ave to Tichner", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:29:47.000+00:00", - "departure": "2009-11-17T18:29:47.000+00:00", - "lat": 45.523024, - "lon": -122.656526, - "name": "E Burnside & NE 9th", - "stopCode": "819", - "stopId": "prt:819", - "stopIndex": 95, - "stopSequence": 96, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:30:24.000+00:00", - "departure": "2009-11-17T18:30:24.000+00:00", - "lat": 45.523012, - "lon": -122.659365, - "name": "E Burnside & NE 6th", - "stopCode": "805", - "stopId": "prt:805", - "stopIndex": 96, - "stopSequence": 97, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:30:52.000+00:00", - "departure": "2009-11-17T18:30:52.000+00:00", - "lat": 45.523015, - "lon": -122.661534, - "name": "E Burnside & NE M L King", - "stopCode": "705", - "stopId": "prt:705", - "stopIndex": 97, - "stopSequence": 98, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:33:00.000+00:00", - "departure": "2009-11-17T18:33:00.000+00:00", - "lat": 45.523249, - "lon": -122.671269, - "name": "W Burnside & Burnside Bridge", - "stopCode": "689", - "stopId": "prt:689", - "stopIndex": 98, - "stopSequence": 99, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:34:00.000+00:00", - "departure": "2009-11-17T18:34:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:35:17.000+00:00", - "departure": "2009-11-17T18:35:17.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:36:25.000+00:00", - "departure": "2009-11-17T18:36:25.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:37:14.000+00:00", - "departure": "2009-11-17T18:37:14.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:39:09.000+00:00", - "departure": "2009-11-17T18:39:09.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:40:00.000+00:00", - "departure": "2009-11-17T18:40:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:40:27.000+00:00", - "departure": "2009-11-17T18:40:27.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:40:40.000+00:00", - "departure": "2009-11-17T18:40:40.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:41:03.000+00:00", - "departure": "2009-11-17T18:41:03.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:41:44.000+00:00", - "departure": "2009-11-17T18:41:44.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1399, + "headsign" : "23rd Ave to Tichner", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:29:47.000+00:00", + "departure" : "2009-11-17T18:29:47.000+00:00", + "lat" : 45.523024, + "lon" : -122.656526, + "name" : "E Burnside & NE 9th", + "stopCode" : "819", + "stopId" : "prt:819", + "stopIndex" : 95, + "stopSequence" : 96, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:30:24.000+00:00", + "departure" : "2009-11-17T18:30:24.000+00:00", + "lat" : 45.523012, + "lon" : -122.659365, + "name" : "E Burnside & NE 6th", + "stopCode" : "805", + "stopId" : "prt:805", + "stopIndex" : 96, + "stopSequence" : 97, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:30:52.000+00:00", + "departure" : "2009-11-17T18:30:52.000+00:00", + "lat" : 45.523015, + "lon" : -122.661534, + "name" : "E Burnside & NE M L King", + "stopCode" : "705", + "stopId" : "prt:705", + "stopIndex" : 97, + "stopSequence" : 98, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:33:00.000+00:00", + "departure" : "2009-11-17T18:33:00.000+00:00", + "lat" : 45.523249, + "lon" : -122.671269, + "name" : "W Burnside & Burnside Bridge", + "stopCode" : "689", + "stopId" : "prt:689", + "stopIndex" : 98, + "stopSequence" : 99, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:34:00.000+00:00", + "departure" : "2009-11-17T18:34:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:35:17.000+00:00", + "departure" : "2009-11-17T18:35:17.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:36:25.000+00:00", + "departure" : "2009-11-17T18:36:25.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:37:14.000+00:00", + "departure" : "2009-11-17T18:37:14.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:39:09.000+00:00", + "departure" : "2009-11-17T18:39:09.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:40:00.000+00:00", + "departure" : "2009-11-17T18:40:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:40:27.000+00:00", + "departure" : "2009-11-17T18:40:27.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:40:40.000+00:00", + "departure" : "2009-11-17T18:40:40.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:41:03.000+00:00", + "departure" : "2009-11-17T18:41:03.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:41:44.000+00:00", + "departure" : "2009-11-17T18:41:44.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 95, - "points": "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" + "legGeometry" : { + "length" : 95, + "points" : "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:29:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:42:19.000+00:00", - "departure": "2009-11-17T18:42:19.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "stopIndex": 109, - "stopSequence": 110, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:29:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:42:19.000+00:00", + "departure" : "2009-11-17T18:42:19.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "stopIndex" : 109, + "stopSequence" : 110, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "2071", - "tripId": "prt:200W1210" + "transitLeg" : true, + "tripBlockId" : "2071", + "tripId" : "prt:200W1210" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 913.81, - "endTime": "2009-11-17T18:54:10.000+00:00", - "from": { - "arrival": "2009-11-17T18:42:19.000+00:00", - "departure": "2009-11-17T18:42:19.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 913.81, + "endTime" : "2009-11-17T18:54:10.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:42:19.000+00:00", + "departure" : "2009-11-17T18:42:19.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1388, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 39, - "points": "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDoC@mCBmCDoCDmCD?qA" + "generalizedCost" : 1388, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 39, + "points" : "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDoC@mCBmCDoCDmCD?qA" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:42:19.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 54.63, - "elevation": "", - "lat": 45.5238156, - "lon": -122.7007199, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 635.66, - "elevation": "", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 31.86, - "elevation": "", - "lat": 45.531181, - "lon": -122.7007063, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:42:19.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 54.63, + "elevation" : "", + "lat" : 45.5238156, + "lon" : -122.7007199, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 635.66, + "elevation" : "", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 31.86, + "elevation" : "", + "lat" : 45.531181, + "lon" : -122.7007063, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:54:10.000+00:00", - "lat": 45.531, - "lon": -122.70029, - "name": "NW Northrup St. & NW 24th Ave. (P3)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:54:10.000+00:00", + "lat" : 45.531, + "lon" : -122.70029, + "name" : "NW Northrup St. & NW 24th Ave. (P3)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:27:47.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 799, - "waitingTime": 0, - "walkDistance": 1000.83, - "walkLimitExceeded": false, - "walkTime": 784 + "startTime" : "2009-11-17T18:27:47.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 799, + "waitingTime" : 0, + "walkDistance" : 1000.83, + "walkLimitExceeded" : false, + "walkTime" : 784 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1553, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T19:09:40.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1553, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T19:09:40.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2895, - "legs": [ + "generalizedCost" : 2895, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 87.02, - "endTime": "2009-11-17T18:45:00.000+00:00", - "from": { - "departure": "2009-11-17T18:43:47.000+00:00", - "lat": 45.52337, - "lon": -122.653725, - "name": "NE 12th & Couch", - "stopCode": "6577", - "stopId": "prt:6577", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 87.02, + "endTime" : "2009-11-17T18:45:00.000+00:00", + "from" : { + "departure" : "2009-11-17T18:43:47.000+00:00", + "lat" : 45.52337, + "lon" : -122.653725, + "name" : "NE 12th & Couch", + "stopCode" : "6577", + "stopId" : "prt:6577", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 137, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 9, - "points": "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" + "generalizedCost" : 137, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 9, + "points" : "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:43:47.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 39.06, - "elevation": "", - "lat": 45.5233684, - "lon": -122.6536225, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northeast 12th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": true, - "distance": 47.96, - "elevation": "", - "lat": 45.5230172, - "lon": -122.6536338, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:43:47.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 39.06, + "elevation" : "", + "lat" : 45.5233684, + "lon" : -122.6536225, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northeast 12th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : true, + "distance" : 47.96, + "elevation" : "", + "lat" : 45.5230172, + "lon" : -122.6536338, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:45:00.000+00:00", - "departure": "2009-11-17T18:45:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:45:00.000+00:00", + "departure" : "2009-11-17T18:45:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3729.97, - "endTime": "2009-11-17T18:57:49.000+00:00", - "from": { - "arrival": "2009-11-17T18:45:00.000+00:00", - "departure": "2009-11-17T18:45:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "stopIndex": 94, - "stopSequence": 95, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3729.97, + "endTime" : "2009-11-17T18:57:49.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:45:00.000+00:00", + "departure" : "2009-11-17T18:45:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "stopIndex" : 94, + "stopSequence" : 95, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1369, - "headsign": "Beaverton TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:45:47.000+00:00", - "departure": "2009-11-17T18:45:47.000+00:00", - "lat": 45.523024, - "lon": -122.656526, - "name": "E Burnside & NE 9th", - "stopCode": "819", - "stopId": "prt:819", - "stopIndex": 95, - "stopSequence": 96, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:46:24.000+00:00", - "departure": "2009-11-17T18:46:24.000+00:00", - "lat": 45.523012, - "lon": -122.659365, - "name": "E Burnside & NE 6th", - "stopCode": "805", - "stopId": "prt:805", - "stopIndex": 96, - "stopSequence": 97, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:46:52.000+00:00", - "departure": "2009-11-17T18:46:52.000+00:00", - "lat": 45.523015, - "lon": -122.661534, - "name": "E Burnside & NE M L King", - "stopCode": "705", - "stopId": "prt:705", - "stopIndex": 97, - "stopSequence": 98, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:49:00.000+00:00", - "departure": "2009-11-17T18:49:00.000+00:00", - "lat": 45.523249, - "lon": -122.671269, - "name": "W Burnside & Burnside Bridge", - "stopCode": "689", - "stopId": "prt:689", - "stopIndex": 98, - "stopSequence": 99, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:50:00.000+00:00", - "departure": "2009-11-17T18:50:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:51:17.000+00:00", - "departure": "2009-11-17T18:51:17.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:52:25.000+00:00", - "departure": "2009-11-17T18:52:25.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:53:14.000+00:00", - "departure": "2009-11-17T18:53:14.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:55:09.000+00:00", - "departure": "2009-11-17T18:55:09.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:56:00.000+00:00", - "departure": "2009-11-17T18:56:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:56:21.000+00:00", - "departure": "2009-11-17T18:56:21.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:56:31.000+00:00", - "departure": "2009-11-17T18:56:31.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:56:49.000+00:00", - "departure": "2009-11-17T18:56:49.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:57:22.000+00:00", - "departure": "2009-11-17T18:57:22.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1369, + "headsign" : "Beaverton TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:45:47.000+00:00", + "departure" : "2009-11-17T18:45:47.000+00:00", + "lat" : 45.523024, + "lon" : -122.656526, + "name" : "E Burnside & NE 9th", + "stopCode" : "819", + "stopId" : "prt:819", + "stopIndex" : 95, + "stopSequence" : 96, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:46:24.000+00:00", + "departure" : "2009-11-17T18:46:24.000+00:00", + "lat" : 45.523012, + "lon" : -122.659365, + "name" : "E Burnside & NE 6th", + "stopCode" : "805", + "stopId" : "prt:805", + "stopIndex" : 96, + "stopSequence" : 97, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:46:52.000+00:00", + "departure" : "2009-11-17T18:46:52.000+00:00", + "lat" : 45.523015, + "lon" : -122.661534, + "name" : "E Burnside & NE M L King", + "stopCode" : "705", + "stopId" : "prt:705", + "stopIndex" : 97, + "stopSequence" : 98, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:49:00.000+00:00", + "departure" : "2009-11-17T18:49:00.000+00:00", + "lat" : 45.523249, + "lon" : -122.671269, + "name" : "W Burnside & Burnside Bridge", + "stopCode" : "689", + "stopId" : "prt:689", + "stopIndex" : 98, + "stopSequence" : 99, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:50:00.000+00:00", + "departure" : "2009-11-17T18:50:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:51:17.000+00:00", + "departure" : "2009-11-17T18:51:17.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:52:25.000+00:00", + "departure" : "2009-11-17T18:52:25.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:53:14.000+00:00", + "departure" : "2009-11-17T18:53:14.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:55:09.000+00:00", + "departure" : "2009-11-17T18:55:09.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:56:00.000+00:00", + "departure" : "2009-11-17T18:56:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:56:21.000+00:00", + "departure" : "2009-11-17T18:56:21.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:56:31.000+00:00", + "departure" : "2009-11-17T18:56:31.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:56:49.000+00:00", + "departure" : "2009-11-17T18:56:49.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:57:22.000+00:00", + "departure" : "2009-11-17T18:57:22.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 95, - "points": "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" + "legGeometry" : { + "length" : 95, + "points" : "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC??APu@lJMhBI`@" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:45:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:57:49.000+00:00", - "departure": "2009-11-17T18:57:49.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "stopIndex": 109, - "stopSequence": 110, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:45:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:57:49.000+00:00", + "departure" : "2009-11-17T18:57:49.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "stopIndex" : 109, + "stopSequence" : 110, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "2037", - "tripId": "prt:200W1220" + "transitLeg" : true, + "tripBlockId" : "2037", + "tripId" : "prt:200W1220" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 913.81, - "endTime": "2009-11-17T19:09:40.000+00:00", - "from": { - "arrival": "2009-11-17T18:57:49.000+00:00", - "departure": "2009-11-17T18:57:49.000+00:00", - "lat": 45.523897, - "lon": -122.700681, - "name": "W Burnside & NW 23rd Pl", - "stopCode": "9555", - "stopId": "prt:9555", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 913.81, + "endTime" : "2009-11-17T19:09:40.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:57:49.000+00:00", + "departure" : "2009-11-17T18:57:49.000+00:00", + "lat" : 45.523897, + "lon" : -122.700681, + "name" : "W Burnside & NW 23rd Pl", + "stopCode" : "9555", + "stopId" : "prt:9555", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1388, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 39, - "points": "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDoC@mCBmCDoCDmCD?qA" + "generalizedCost" : 1388, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 39, + "points" : "ikztGh~{kVNDEVUzACPOUQO_@Yc@[QMMEOKOIECGCIAMCGCGAECECECOOMOGKIFMLk@BsABGDGBoCBkCDoC@mCBmCDoCDmCD?qA" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:57:49.000+00:00", - "steps": [ - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 54.63, - "elevation": "", - "lat": 45.5238156, - "lon": -122.7007199, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHEAST", - "area": false, - "bogusName": false, - "distance": 176.41, - "elevation": "", - "lat": 45.5239733, - "lon": -122.701384, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Place", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 15.26, - "elevation": "", - "lat": 45.5253583, - "lon": -122.7003357, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Westover Road", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 635.66, - "elevation": "", - "lat": 45.5254724, - "lon": -122.7004445, - "relativeDirection": "SLIGHTLY_RIGHT", - "stayOn": false, - "streetName": "Northwest 24th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": false, - "distance": 31.86, - "elevation": "", - "lat": 45.531181, - "lon": -122.7007063, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:57:49.000+00:00", + "steps" : [ + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 54.63, + "elevation" : "", + "lat" : 45.5238156, + "lon" : -122.7007199, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHEAST", + "area" : false, + "bogusName" : false, + "distance" : 176.41, + "elevation" : "", + "lat" : 45.5239733, + "lon" : -122.701384, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Place", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 15.26, + "elevation" : "", + "lat" : 45.5253583, + "lon" : -122.7003357, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Westover Road", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 635.66, + "elevation" : "", + "lat" : 45.5254724, + "lon" : -122.7004445, + "relativeDirection" : "SLIGHTLY_RIGHT", + "stayOn" : false, + "streetName" : "Northwest 24th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : false, + "distance" : 31.86, + "elevation" : "", + "lat" : 45.531181, + "lon" : -122.7007063, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T19:09:40.000+00:00", - "lat": 45.531, - "lon": -122.70029, - "name": "NW Northrup St. & NW 24th Ave. (P3)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T19:09:40.000+00:00", + "lat" : 45.531, + "lon" : -122.70029, + "name" : "NW Northrup St. & NW 24th Ave. (P3)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:43:47.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 769, - "waitingTime": 0, - "walkDistance": 1000.83, - "walkLimitExceeded": false, - "walkTime": 784 + "startTime" : "2009-11-17T18:43:47.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 769, + "waitingTime" : 0, + "walkDistance" : 1000.83, + "walkLimitExceeded" : false, + "walkTime" : 784 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1567, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T19:11:51.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1567, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T19:11:51.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "70" + "feedId" : "prt", + "id" : "70" }, { - "feedId": "prt", - "id": "77" + "feedId" : "prt", + "id" : "77" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 2957, - "legs": [ + "generalizedCost" : 2957, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 20.74, - "endTime": "2009-11-17T18:46:00.000+00:00", - "from": { - "departure": "2009-11-17T18:45:44.000+00:00", - "lat": 45.52337, - "lon": -122.653725, - "name": "NE 12th & Couch", - "stopCode": "6577", - "stopId": "prt:6577", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 20.74, + "endTime" : "2009-11-17T18:46:00.000+00:00", + "from" : { + "departure" : "2009-11-17T18:45:44.000+00:00", + "lat" : 45.52337, + "lon" : -122.653725, + "name" : "NE 12th & Couch", + "stopCode" : "6577", + "stopId" : "prt:6577", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 33, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 4, - "points": "ahztGxxrkV@Sb@??W" + "generalizedCost" : 33, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 4, + "points" : "ahztGxxrkV@Sb@??W" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:45:44.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 20.74, - "elevation": "", - "lat": 45.5233684, - "lon": -122.6536225, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northeast 12th Avenue", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:45:44.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 20.74, + "elevation" : "", + "lat" : 45.5233684, + "lon" : -122.6536225, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northeast 12th Avenue", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:46:00.000+00:00", - "departure": "2009-11-17T18:46:00.000+00:00", - "lat": 45.52318, - "lon": -122.653507, - "name": "NE 12th & Sandy", - "stopCode": "6592", - "stopId": "prt:6592", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T18:46:00.000+00:00", + "departure" : "2009-11-17T18:46:00.000+00:00", + "lat" : 45.52318, + "lon" : -122.653507, + "name" : "NE 12th & Sandy", + "stopCode" : "6592", + "stopId" : "prt:6592", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 1355.21, - "endTime": "2009-11-17T18:51:01.000+00:00", - "from": { - "arrival": "2009-11-17T18:46:00.000+00:00", - "departure": "2009-11-17T18:46:00.000+00:00", - "lat": 45.52318, - "lon": -122.653507, - "name": "NE 12th & Sandy", - "stopCode": "6592", - "stopId": "prt:6592", - "stopIndex": 34, - "stopSequence": 35, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 1355.21, + "endTime" : "2009-11-17T18:51:01.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:46:00.000+00:00", + "departure" : "2009-11-17T18:46:00.000+00:00", + "lat" : 45.52318, + "lon" : -122.653507, + "name" : "NE 12th & Sandy", + "stopCode" : "6592", + "stopId" : "prt:6592", + "stopIndex" : 34, + "stopSequence" : 35, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 901, - "headsign": "Rose Qtr TC", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:47:45.000+00:00", - "departure": "2009-11-17T18:47:45.000+00:00", - "lat": 45.527449, - "lon": -122.653462, - "name": "NE 12th & Irving", - "stopCode": "6582", - "stopId": "prt:6582", - "stopIndex": 35, - "stopSequence": 36, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T18:49:00.000+00:00", - "departure": "2009-11-17T18:49:00.000+00:00", - "lat": 45.529793, - "lon": -122.654429, - "name": "NE 11th & Holladay", - "stopCode": "8513", - "stopId": "prt:8513", - "stopIndex": 36, - "stopSequence": 37, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:49:39.000+00:00", - "departure": "2009-11-17T18:49:39.000+00:00", - "lat": 45.53135, - "lon": -122.654497, - "name": "NE 11th & Multnomah", - "stopCode": "8938", - "stopId": "prt:8938", - "stopIndex": 37, - "stopSequence": 38, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:50:15.000+00:00", - "departure": "2009-11-17T18:50:15.000+00:00", - "lat": 45.531573, - "lon": -122.656408, - "name": "NE Multnomah & 9th", - "stopCode": "4056", - "stopId": "prt:4056", - "stopIndex": 38, - "stopSequence": 39, - "vertexType": "TRANSIT", - "zoneId": "0" + "generalizedCost" : 901, + "headsign" : "Rose Qtr TC", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:47:45.000+00:00", + "departure" : "2009-11-17T18:47:45.000+00:00", + "lat" : 45.527449, + "lon" : -122.653462, + "name" : "NE 12th & Irving", + "stopCode" : "6582", + "stopId" : "prt:6582", + "stopIndex" : 35, + "stopSequence" : 36, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T18:49:00.000+00:00", + "departure" : "2009-11-17T18:49:00.000+00:00", + "lat" : 45.529793, + "lon" : -122.654429, + "name" : "NE 11th & Holladay", + "stopCode" : "8513", + "stopId" : "prt:8513", + "stopIndex" : 36, + "stopSequence" : 37, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:49:39.000+00:00", + "departure" : "2009-11-17T18:49:39.000+00:00", + "lat" : 45.53135, + "lon" : -122.654497, + "name" : "NE 11th & Multnomah", + "stopCode" : "8938", + "stopId" : "prt:8938", + "stopIndex" : 37, + "stopSequence" : 38, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:50:15.000+00:00", + "departure" : "2009-11-17T18:50:15.000+00:00", + "lat" : 45.531573, + "lon" : -122.656408, + "name" : "NE Multnomah & 9th", + "stopCode" : "4056", + "stopId" : "prt:4056", + "stopIndex" : 38, + "stopSequence" : 39, + "vertexType" : "TRANSIT", + "zoneId" : "0" } ], - "legGeometry": { - "length": 33, - "points": "{fztG`xrkVwA?mCAmC?oCA}C?sDC??aBAm@@k@AY?uABU@I@IBQFb@fC}@d@OFO@q@???Q?]?gGA??[??nJ???b@?vK?rA" + "legGeometry" : { + "length" : 33, + "points" : "{fztG`xrkVwA?mCAmC?oCA}C?sDC??aBAm@@k@AY?uABU@I@IBQFb@fC}@d@OFO@q@???Q?]?gGA??[??nJ???b@?vK?rA" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "12th Ave", - "routeId": "prt:70", - "routeLongName": "12th Ave", - "routeShortName": "70", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:46:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T18:51:01.000+00:00", - "departure": "2009-11-17T18:54:29.000+00:00", - "lat": 45.531569, - "lon": -122.659045, - "name": "NE Multnomah & 7th", - "stopCode": "4054", - "stopId": "prt:4054", - "stopIndex": 39, - "stopSequence": 40, - "vertexType": "TRANSIT", - "zoneId": "0" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "12th Ave", + "routeId" : "prt:70", + "routeLongName" : "12th Ave", + "routeShortName" : "70", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:46:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T18:51:01.000+00:00", + "departure" : "2009-11-17T18:54:29.000+00:00", + "lat" : 45.531569, + "lon" : -122.659045, + "name" : "NE Multnomah & 7th", + "stopCode" : "4054", + "stopId" : "prt:4054", + "stopIndex" : 39, + "stopSequence" : 40, + "vertexType" : "TRANSIT", + "zoneId" : "0" }, - "transitLeg": true, - "tripBlockId": "7002", - "tripId": "prt:700W1170" + "transitLeg" : true, + "tripBlockId" : "7002", + "tripId" : "prt:700W1170" }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3838.71, - "endTime": "2009-11-17T19:08:50.000+00:00", - "from": { - "arrival": "2009-11-17T18:51:01.000+00:00", - "departure": "2009-11-17T18:54:29.000+00:00", - "lat": 45.531569, - "lon": -122.659045, - "name": "NE Multnomah & 7th", - "stopCode": "4054", - "stopId": "prt:4054", - "stopIndex": 81, - "stopSequence": 82, - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3838.71, + "endTime" : "2009-11-17T19:08:50.000+00:00", + "from" : { + "arrival" : "2009-11-17T18:51:01.000+00:00", + "departure" : "2009-11-17T18:54:29.000+00:00", + "lat" : 45.531569, + "lon" : -122.659045, + "name" : "NE Multnomah & 7th", + "stopCode" : "4054", + "stopId" : "prt:4054", + "stopIndex" : 81, + "stopSequence" : 82, + "vertexType" : "TRANSIT", + "zoneId" : "0" }, - "generalizedCost": 1669, - "headsign": "Montgomery Park", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T18:55:05.000+00:00", - "departure": "2009-11-17T18:55:05.000+00:00", - "lat": 45.531586, - "lon": -122.660482, - "name": "NE Multnomah & Grand", - "stopCode": "4043", - "stopId": "prt:4043", - "stopIndex": 82, - "stopSequence": 83, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:56:09.000+00:00", - "departure": "2009-11-17T18:56:09.000+00:00", - "lat": 45.531159, - "lon": -122.66293, - "name": "NE Multnomah & 3rd", - "stopCode": "11492", - "stopId": "prt:11492", - "stopIndex": 83, - "stopSequence": 84, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T18:58:00.000+00:00", - "departure": "2009-11-17T18:58:00.000+00:00", - "lat": 45.530005, - "lon": -122.666476, - "name": "Rose Quarter Transit Center", - "stopCode": "2592", - "stopId": "prt:2592", - "stopIndex": 84, - "stopSequence": 85, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:01:20.000+00:00", - "departure": "2009-11-17T19:01:20.000+00:00", - "lat": 45.526655, - "lon": -122.676462, - "name": "NW Glisan & 6th", - "stopCode": "10803", - "stopId": "prt:10803", - "stopIndex": 85, - "stopSequence": 86, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:02:15.000+00:00", - "departure": "2009-11-17T19:02:15.000+00:00", - "lat": 45.528799, - "lon": -122.677238, - "name": "NW Station Way & Union Station", - "stopCode": "12801", - "stopId": "prt:12801", - "stopIndex": 86, - "stopSequence": 87, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:04:00.000+00:00", - "departure": "2009-11-17T19:04:00.000+00:00", - "lat": 45.531582, - "lon": -122.681193, - "name": "NW Northrup & 10th", - "stopCode": "12802", - "stopId": "prt:12802", - "stopIndex": 87, - "stopSequence": 88, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:04:33.000+00:00", - "departure": "2009-11-17T19:04:33.000+00:00", - "lat": 45.531534, - "lon": -122.683319, - "name": "NW 12th & Northrup", - "stopCode": "12796", - "stopId": "prt:12796", - "stopIndex": 88, - "stopSequence": 89, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:05:04.000+00:00", - "departure": "2009-11-17T19:05:04.000+00:00", - "lat": 45.531503, - "lon": -122.685357, - "name": "NW Northrup & 14th", - "stopCode": "10775", - "stopId": "prt:10775", - "stopIndex": 89, - "stopSequence": 90, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:06:07.000+00:00", - "departure": "2009-11-17T19:06:07.000+00:00", - "lat": 45.531434, - "lon": -122.689417, - "name": "NW Northrup & 18th", - "stopCode": "10776", - "stopId": "prt:10776", - "stopIndex": 90, - "stopSequence": 91, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:07:24.000+00:00", - "departure": "2009-11-17T19:07:24.000+00:00", - "lat": 45.531346, - "lon": -122.694455, - "name": "NW Northrup & 21st", - "stopCode": "10777", - "stopId": "prt:10777", - "stopIndex": 91, - "stopSequence": 92, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:07:55.000+00:00", - "departure": "2009-11-17T19:07:55.000+00:00", - "lat": 45.531308, - "lon": -122.696445, - "name": "NW Northrup & 22nd", - "stopCode": "10778", - "stopId": "prt:10778", - "stopIndex": 92, - "stopSequence": 93, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1669, + "headsign" : "Montgomery Park", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T18:55:05.000+00:00", + "departure" : "2009-11-17T18:55:05.000+00:00", + "lat" : 45.531586, + "lon" : -122.660482, + "name" : "NE Multnomah & Grand", + "stopCode" : "4043", + "stopId" : "prt:4043", + "stopIndex" : 82, + "stopSequence" : 83, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:56:09.000+00:00", + "departure" : "2009-11-17T18:56:09.000+00:00", + "lat" : 45.531159, + "lon" : -122.66293, + "name" : "NE Multnomah & 3rd", + "stopCode" : "11492", + "stopId" : "prt:11492", + "stopIndex" : 83, + "stopSequence" : 84, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T18:58:00.000+00:00", + "departure" : "2009-11-17T18:58:00.000+00:00", + "lat" : 45.530005, + "lon" : -122.666476, + "name" : "Rose Quarter Transit Center", + "stopCode" : "2592", + "stopId" : "prt:2592", + "stopIndex" : 84, + "stopSequence" : 85, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:01:20.000+00:00", + "departure" : "2009-11-17T19:01:20.000+00:00", + "lat" : 45.526655, + "lon" : -122.676462, + "name" : "NW Glisan & 6th", + "stopCode" : "10803", + "stopId" : "prt:10803", + "stopIndex" : 85, + "stopSequence" : 86, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:02:15.000+00:00", + "departure" : "2009-11-17T19:02:15.000+00:00", + "lat" : 45.528799, + "lon" : -122.677238, + "name" : "NW Station Way & Union Station", + "stopCode" : "12801", + "stopId" : "prt:12801", + "stopIndex" : 86, + "stopSequence" : 87, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:04:00.000+00:00", + "departure" : "2009-11-17T19:04:00.000+00:00", + "lat" : 45.531582, + "lon" : -122.681193, + "name" : "NW Northrup & 10th", + "stopCode" : "12802", + "stopId" : "prt:12802", + "stopIndex" : 87, + "stopSequence" : 88, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:04:33.000+00:00", + "departure" : "2009-11-17T19:04:33.000+00:00", + "lat" : 45.531534, + "lon" : -122.683319, + "name" : "NW 12th & Northrup", + "stopCode" : "12796", + "stopId" : "prt:12796", + "stopIndex" : 88, + "stopSequence" : 89, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:05:04.000+00:00", + "departure" : "2009-11-17T19:05:04.000+00:00", + "lat" : 45.531503, + "lon" : -122.685357, + "name" : "NW Northrup & 14th", + "stopCode" : "10775", + "stopId" : "prt:10775", + "stopIndex" : 89, + "stopSequence" : 90, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:06:07.000+00:00", + "departure" : "2009-11-17T19:06:07.000+00:00", + "lat" : 45.531434, + "lon" : -122.689417, + "name" : "NW Northrup & 18th", + "stopCode" : "10776", + "stopId" : "prt:10776", + "stopIndex" : 90, + "stopSequence" : 91, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:07:24.000+00:00", + "departure" : "2009-11-17T19:07:24.000+00:00", + "lat" : 45.531346, + "lon" : -122.694455, + "name" : "NW Northrup & 21st", + "stopCode" : "10777", + "stopId" : "prt:10777", + "stopIndex" : 91, + "stopSequence" : 92, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:07:55.000+00:00", + "departure" : "2009-11-17T19:07:55.000+00:00", + "lat" : 45.531308, + "lon" : -122.696445, + "name" : "NW Northrup & 22nd", + "stopCode" : "10778", + "stopId" : "prt:10778", + "stopIndex" : 92, + "stopSequence" : 93, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 109, - "points": "yz{tG`zskV?tBCfD???^?nE?V@Z?PH\\Nb@`@~@Rf@??`@bANb@FV@R?P?pE?jA@h@AnAbBl@LFJN\\f@LT??NXJPPVJFf@Vf@Pp@Nd@NRLB@RNXZR\\vAhC@BhAhD`AhClAbDBrDCnG@n@@^@d@HdAP`CBjEDvD???LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" + "legGeometry" : { + "length" : 109, + "points" : "yz{tG`zskV?tBCfD???^?nE?V@Z?PH\\Nb@`@~@Rf@??`@bANb@FV@R?P?pE?jA@h@AnAbBl@LFJN\\f@LT??NXJPPVJFf@Vf@Pp@Nd@NRLB@RNXZR\\vAhC@BhAhD`AhClAbDBrDCnG@n@@^@d@HdAP`CBjEDvD???LqCFmCDYBGDEBGJkAzAQR??KNa@b@MJuBBY?OHW@u@~@aD`EcBhBBrD@xC??@l@BlE@lD???XBjEBpD???VBlE?dA@t@?b@?h@BfEBrD???VBhEFtKDvJ??@\\DnJ???d@FtKmCBo@@" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Broadway/Halsey", - "routeId": "prt:77", - "routeLongName": "Broadway/Halsey", - "routeShortName": "77", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T18:54:29.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T19:08:50.000+00:00", - "departure": "2009-11-17T19:08:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "stopIndex": 93, - "stopSequence": 94, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Broadway/Halsey", + "routeId" : "prt:77", + "routeLongName" : "Broadway/Halsey", + "routeShortName" : "77", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T18:54:29.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T19:08:50.000+00:00", + "departure" : "2009-11-17T19:08:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "stopIndex" : 93, + "stopSequence" : 94, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "7702", - "tripId": "prt:771W1180" + "transitLeg" : true, + "tripBlockId" : "7702", + "tripId" : "prt:771W1180" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 231.46, - "endTime": "2009-11-17T19:11:51.000+00:00", - "from": { - "arrival": "2009-11-17T19:08:50.000+00:00", - "departure": "2009-11-17T19:08:50.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 231.46, + "endTime" : "2009-11-17T19:11:51.000+00:00", + "from" : { + "arrival" : "2009-11-17T19:08:50.000+00:00", + "departure" : "2009-11-17T19:08:50.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 353, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 10, - "points": "}~{tGnq{kV?LVAF?J?L?rBCLA?RDpH" + "generalizedCost" : 353, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 10, + "points" : "}~{tGnq{kV?LVAF?J?L?rBCLA?RDpH" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T19:08:50.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 104.46, - "elevation": "", - "lat": 45.5321578, - "lon": -122.6987026, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 127.01, - "elevation": "", - "lat": 45.5312188, - "lon": -122.6986675, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T19:08:50.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 104.46, + "elevation" : "", + "lat" : 45.5321578, + "lon" : -122.6987026, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 127.01, + "elevation" : "", + "lat" : 45.5312188, + "lon" : -122.6986675, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T19:11:51.000+00:00", - "lat": 45.531, - "lon": -122.70029, - "name": "NW Northrup St. & NW 24th Ave. (P3)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T19:11:51.000+00:00", + "lat" : 45.531, + "lon" : -122.70029, + "name" : "NW Northrup St. & NW 24th Ave. (P3)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:45:44.000+00:00", - "tooSloped": false, - "transfers": 1, - "transitTime": 1162, - "waitingTime": 208, - "walkDistance": 252.2, - "walkLimitExceeded": false, - "walkTime": 197 + "startTime" : "2009-11-17T18:45:44.000+00:00", + "tooSloped" : false, + "transfers" : 1, + "transitTime" : 1162, + "waitingTime" : 208, + "walkDistance" : 252.2, + "walkLimitExceeded" : false, + "walkTime" : 197 }, { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 1578, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T19:25:05.000+00:00", - "fare": { - "coveringItinerary": [ + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 1578, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T19:25:05.000+00:00", + "fare" : { + "coveringItinerary" : [ { - "amount": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "amount" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "id": "prt:regular", - "name": "regular" + "id" : "prt:regular", + "name" : "regular" } ], - "details": { - "regular": [ + "details" : { + "regular" : [ { - "fareId": { - "feedId": "prt", - "id": "8" + "fareId" : { + "feedId" : "prt", + "id" : "8" }, - "price": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "price" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } }, - "routes": [ + "routes" : [ { - "feedId": "prt", - "id": "20" + "feedId" : "prt", + "id" : "20" }, { - "feedId": "prt", - "id": "15" + "feedId" : "prt", + "id" : "15" } ] } ] }, - "fare": { - "regular": { - "cents": 200, - "currency": { - "currency": "USD", - "currencyCode": "USD", - "defaultFractionDigits": 2, - "symbol": "$" + "fare" : { + "regular" : { + "cents" : 200, + "currency" : { + "currency" : "USD", + "currencyCode" : "USD", + "defaultFractionDigits" : 2, + "symbol" : "$" } } } }, - "generalizedCost": 3015, - "legs": [ + "generalizedCost" : 3015, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 87.02, - "endTime": "2009-11-17T19:00:00.000+00:00", - "from": { - "departure": "2009-11-17T18:58:47.000+00:00", - "lat": 45.52337, - "lon": -122.653725, - "name": "NE 12th & Couch", - "stopCode": "6577", - "stopId": "prt:6577", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 87.02, + "endTime" : "2009-11-17T19:00:00.000+00:00", + "from" : { + "departure" : "2009-11-17T18:58:47.000+00:00", + "lat" : 45.52337, + "lon" : -122.653725, + "name" : "NE 12th & Couch", + "stopCode" : "6577", + "stopId" : "prt:6577", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 137, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 9, - "points": "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" + "generalizedCost" : 137, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 9, + "points" : "ahztGxxrkV@Sb@?`@@?a@?k@GGKY@A" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:58:47.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 39.06, - "elevation": "", - "lat": 45.5233684, - "lon": -122.6536225, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northeast 12th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "EAST", - "area": false, - "bogusName": true, - "distance": 47.96, - "elevation": "", - "lat": 45.5230172, - "lon": -122.6536338, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:58:47.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 39.06, + "elevation" : "", + "lat" : 45.5233684, + "lon" : -122.6536225, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northeast 12th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "EAST", + "area" : false, + "bogusName" : true, + "distance" : 47.96, + "elevation" : "", + "lat" : 45.5230172, + "lon" : -122.6536338, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T19:00:00.000+00:00", - "departure": "2009-11-17T19:00:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "vertexType": "TRANSIT", - "zoneId": "1" + "to" : { + "arrival" : "2009-11-17T19:00:00.000+00:00", + "departure" : "2009-11-17T19:00:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 3520.32, - "endTime": "2009-11-17T19:12:44.000+00:00", - "from": { - "arrival": "2009-11-17T19:00:00.000+00:00", - "departure": "2009-11-17T19:00:00.000+00:00", - "lat": 45.523103, - "lon": -122.653064, - "name": "NE Sandy & 12th", - "stopCode": "5055", - "stopId": "prt:5055", - "stopIndex": 94, - "stopSequence": 95, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 3520.32, + "endTime" : "2009-11-17T19:12:44.000+00:00", + "from" : { + "arrival" : "2009-11-17T19:00:00.000+00:00", + "departure" : "2009-11-17T19:00:00.000+00:00", + "lat" : 45.523103, + "lon" : -122.653064, + "name" : "NE Sandy & 12th", + "stopCode" : "5055", + "stopId" : "prt:5055", + "stopIndex" : 94, + "stopSequence" : 95, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1364, - "headsign": "23rd Ave to Tichner", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T19:00:47.000+00:00", - "departure": "2009-11-17T19:00:47.000+00:00", - "lat": 45.523024, - "lon": -122.656526, - "name": "E Burnside & NE 9th", - "stopCode": "819", - "stopId": "prt:819", - "stopIndex": 95, - "stopSequence": 96, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:01:24.000+00:00", - "departure": "2009-11-17T19:01:24.000+00:00", - "lat": 45.523012, - "lon": -122.659365, - "name": "E Burnside & NE 6th", - "stopCode": "805", - "stopId": "prt:805", - "stopIndex": 96, - "stopSequence": 97, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:01:52.000+00:00", - "departure": "2009-11-17T19:01:52.000+00:00", - "lat": 45.523015, - "lon": -122.661534, - "name": "E Burnside & NE M L King", - "stopCode": "705", - "stopId": "prt:705", - "stopIndex": 97, - "stopSequence": 98, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:04:00.000+00:00", - "departure": "2009-11-17T19:04:00.000+00:00", - "lat": 45.523249, - "lon": -122.671269, - "name": "W Burnside & Burnside Bridge", - "stopCode": "689", - "stopId": "prt:689", - "stopIndex": 98, - "stopSequence": 99, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:05:00.000+00:00", - "departure": "2009-11-17T19:05:00.000+00:00", - "lat": 45.523169, - "lon": -122.675893, - "name": "W Burnside & NW 5th", - "stopCode": "782", - "stopId": "prt:782", - "stopIndex": 99, - "stopSequence": 100, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:06:17.000+00:00", - "departure": "2009-11-17T19:06:17.000+00:00", - "lat": 45.523115, - "lon": -122.678939, - "name": "W Burnside & NW Park", - "stopCode": "716", - "stopId": "prt:716", - "stopIndex": 100, - "stopSequence": 101, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:07:25.000+00:00", - "departure": "2009-11-17T19:07:25.000+00:00", - "lat": 45.523048, - "lon": -122.681606, - "name": "W Burnside & NW 10th", - "stopCode": "10791", - "stopId": "prt:10791", - "stopIndex": 101, - "stopSequence": 102, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:08:14.000+00:00", - "departure": "2009-11-17T19:08:14.000+00:00", - "lat": 45.523, - "lon": -122.683535, - "name": "W Burnside & NW 12th", - "stopCode": "11032", - "stopId": "prt:11032", - "stopIndex": 102, - "stopSequence": 103, - "vertexType": "TRANSIT", - "zoneId": "0" - }, - { - "arrival": "2009-11-17T19:10:09.000+00:00", - "departure": "2009-11-17T19:10:09.000+00:00", - "lat": 45.522985, - "lon": -122.688091, - "name": "W Burnside & NW 17th", - "stopCode": "10809", - "stopId": "prt:10809", - "stopIndex": 103, - "stopSequence": 104, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:11:00.000+00:00", - "departure": "2009-11-17T19:11:00.000+00:00", - "lat": 45.523097, - "lon": -122.690083, - "name": "W Burnside & NW 19th", - "stopCode": "735", - "stopId": "prt:735", - "stopIndex": 104, - "stopSequence": 105, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:11:27.000+00:00", - "departure": "2009-11-17T19:11:27.000+00:00", - "lat": 45.523176, - "lon": -122.692139, - "name": "W Burnside & NW 20th", - "stopCode": "741", - "stopId": "prt:741", - "stopIndex": 105, - "stopSequence": 106, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:11:40.000+00:00", - "departure": "2009-11-17T19:11:40.000+00:00", - "lat": 45.52322, - "lon": -122.69313, - "name": "W Burnside & NW 20th Pl", - "stopCode": "742", - "stopId": "prt:742", - "stopIndex": 106, - "stopSequence": 107, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:12:03.000+00:00", - "departure": "2009-11-17T19:12:03.000+00:00", - "lat": 45.523312, - "lon": -122.694901, - "name": "W Burnside & NW King", - "stopCode": "747", - "stopId": "prt:747", - "stopIndex": 107, - "stopSequence": 108, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1364, + "headsign" : "23rd Ave to Tichner", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T19:00:47.000+00:00", + "departure" : "2009-11-17T19:00:47.000+00:00", + "lat" : 45.523024, + "lon" : -122.656526, + "name" : "E Burnside & NE 9th", + "stopCode" : "819", + "stopId" : "prt:819", + "stopIndex" : 95, + "stopSequence" : 96, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:01:24.000+00:00", + "departure" : "2009-11-17T19:01:24.000+00:00", + "lat" : 45.523012, + "lon" : -122.659365, + "name" : "E Burnside & NE 6th", + "stopCode" : "805", + "stopId" : "prt:805", + "stopIndex" : 96, + "stopSequence" : 97, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:01:52.000+00:00", + "departure" : "2009-11-17T19:01:52.000+00:00", + "lat" : 45.523015, + "lon" : -122.661534, + "name" : "E Burnside & NE M L King", + "stopCode" : "705", + "stopId" : "prt:705", + "stopIndex" : 97, + "stopSequence" : 98, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:04:00.000+00:00", + "departure" : "2009-11-17T19:04:00.000+00:00", + "lat" : 45.523249, + "lon" : -122.671269, + "name" : "W Burnside & Burnside Bridge", + "stopCode" : "689", + "stopId" : "prt:689", + "stopIndex" : 98, + "stopSequence" : 99, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:05:00.000+00:00", + "departure" : "2009-11-17T19:05:00.000+00:00", + "lat" : 45.523169, + "lon" : -122.675893, + "name" : "W Burnside & NW 5th", + "stopCode" : "782", + "stopId" : "prt:782", + "stopIndex" : 99, + "stopSequence" : 100, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:06:17.000+00:00", + "departure" : "2009-11-17T19:06:17.000+00:00", + "lat" : 45.523115, + "lon" : -122.678939, + "name" : "W Burnside & NW Park", + "stopCode" : "716", + "stopId" : "prt:716", + "stopIndex" : 100, + "stopSequence" : 101, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:07:25.000+00:00", + "departure" : "2009-11-17T19:07:25.000+00:00", + "lat" : 45.523048, + "lon" : -122.681606, + "name" : "W Burnside & NW 10th", + "stopCode" : "10791", + "stopId" : "prt:10791", + "stopIndex" : 101, + "stopSequence" : 102, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:08:14.000+00:00", + "departure" : "2009-11-17T19:08:14.000+00:00", + "lat" : 45.523, + "lon" : -122.683535, + "name" : "W Burnside & NW 12th", + "stopCode" : "11032", + "stopId" : "prt:11032", + "stopIndex" : 102, + "stopSequence" : 103, + "vertexType" : "TRANSIT", + "zoneId" : "0" + }, + { + "arrival" : "2009-11-17T19:10:09.000+00:00", + "departure" : "2009-11-17T19:10:09.000+00:00", + "lat" : 45.522985, + "lon" : -122.688091, + "name" : "W Burnside & NW 17th", + "stopCode" : "10809", + "stopId" : "prt:10809", + "stopIndex" : 103, + "stopSequence" : 104, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:11:00.000+00:00", + "departure" : "2009-11-17T19:11:00.000+00:00", + "lat" : 45.523097, + "lon" : -122.690083, + "name" : "W Burnside & NW 19th", + "stopCode" : "735", + "stopId" : "prt:735", + "stopIndex" : 104, + "stopSequence" : 105, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:11:27.000+00:00", + "departure" : "2009-11-17T19:11:27.000+00:00", + "lat" : 45.523176, + "lon" : -122.692139, + "name" : "W Burnside & NW 20th", + "stopCode" : "741", + "stopId" : "prt:741", + "stopIndex" : 105, + "stopSequence" : 106, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:11:40.000+00:00", + "departure" : "2009-11-17T19:11:40.000+00:00", + "lat" : 45.52322, + "lon" : -122.69313, + "name" : "W Burnside & NW 20th Pl", + "stopCode" : "742", + "stopId" : "prt:742", + "stopIndex" : 106, + "stopSequence" : 107, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:12:03.000+00:00", + "departure" : "2009-11-17T19:12:03.000+00:00", + "lat" : 45.523312, + "lon" : -122.694901, + "name" : "W Burnside & NW King", + "stopCode" : "747", + "stopId" : "prt:747", + "stopIndex" : 107, + "stopSequence" : 108, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 90, - "points": "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC" + "legGeometry" : { + "length" : 90, + "points" : "weztGdtrkV?BPj@@jA?jEAhE?pD???VAjE?hE?dB?b@???`AAhE?dD???l@C`EAhEEhE?bAA|@?XAZ@\\AzACnGKbKAjC?bE???JEnE@fEDlE@hE@~A??@rBBzDBpE@~A???Z@tD@RBnEB|A???@BdB?lEBjA??BnBApF@dB?X?^@r@?f@@bCAx@EtB???VChAE|BGnD??AXKnEGnD???XGjD??AZEfCC`AEzB??AXCfAGxDE|AEtBIlC" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Burnside/Stark", - "routeId": "prt:20", - "routeLongName": "Burnside/Stark", - "routeShortName": "20", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T19:00:00.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T19:12:44.000+00:00", - "departure": "2009-11-17T19:17:51.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 108, - "stopSequence": 109, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Burnside/Stark", + "routeId" : "prt:20", + "routeLongName" : "Burnside/Stark", + "routeShortName" : "20", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T19:00:00.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T19:12:44.000+00:00", + "departure" : "2009-11-17T19:17:51.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 108, + "stopSequence" : 109, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "2038", - "tripId": "prt:200W1230" + "transitLeg" : true, + "tripBlockId" : "2038", + "tripId" : "prt:200W1230" }, { - "agencyId": "prt:prt", - "agencyName": "TriMet", - "agencyTimeZoneOffset": -28800000, - "agencyUrl": "http://trimet.org", - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 981.85, - "endTime": "2009-11-17T19:22:04.000+00:00", - "from": { - "arrival": "2009-11-17T19:12:44.000+00:00", - "departure": "2009-11-17T19:17:51.000+00:00", - "lat": 45.523512, - "lon": -122.698081, - "name": "W Burnside & NW 23rd", - "stopCode": "755", - "stopId": "prt:755", - "stopIndex": 70, - "stopSequence": 71, - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyId" : "prt:prt", + "agencyName" : "TriMet", + "agencyTimeZoneOffset" : -28800000, + "agencyUrl" : "http://trimet.org", + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 981.85, + "endTime" : "2009-11-17T19:22:04.000+00:00", + "from" : { + "arrival" : "2009-11-17T19:12:44.000+00:00", + "departure" : "2009-11-17T19:17:51.000+00:00", + "lat" : 45.523512, + "lon" : -122.698081, + "name" : "W Burnside & NW 23rd", + "stopCode" : "755", + "stopId" : "prt:755", + "stopIndex" : 70, + "stopSequence" : 71, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 1160, - "headsign": "27th & Thurman", - "interlineWithPreviousLeg": false, - "intermediateStops": [ - { - "arrival": "2009-11-17T19:18:53.000+00:00", - "departure": "2009-11-17T19:18:53.000+00:00", - "lat": 45.525416, - "lon": -122.698381, - "name": "NW 23rd & Flanders", - "stopCode": "7157", - "stopId": "prt:7157", - "stopIndex": 71, - "stopSequence": 72, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:19:56.000+00:00", - "departure": "2009-11-17T19:19:56.000+00:00", - "lat": 45.527543, - "lon": -122.698473, - "name": "NW 23rd & Irving", - "stopCode": "7161", - "stopId": "prt:7161", - "stopIndex": 72, - "stopSequence": 73, - "vertexType": "TRANSIT", - "zoneId": "1" - }, - { - "arrival": "2009-11-17T19:21:00.000+00:00", - "departure": "2009-11-17T19:21:00.000+00:00", - "lat": 45.529681, - "lon": -122.698529, - "name": "NW 23rd & Lovejoy", - "stopCode": "7163", - "stopId": "prt:7163", - "stopIndex": 73, - "stopSequence": 74, - "vertexType": "TRANSIT", - "zoneId": "1" + "generalizedCost" : 1160, + "headsign" : "27th & Thurman", + "interlineWithPreviousLeg" : false, + "intermediateStops" : [ + { + "arrival" : "2009-11-17T19:18:53.000+00:00", + "departure" : "2009-11-17T19:18:53.000+00:00", + "lat" : 45.525416, + "lon" : -122.698381, + "name" : "NW 23rd & Flanders", + "stopCode" : "7157", + "stopId" : "prt:7157", + "stopIndex" : 71, + "stopSequence" : 72, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:19:56.000+00:00", + "departure" : "2009-11-17T19:19:56.000+00:00", + "lat" : 45.527543, + "lon" : -122.698473, + "name" : "NW 23rd & Irving", + "stopCode" : "7161", + "stopId" : "prt:7161", + "stopIndex" : 72, + "stopSequence" : 73, + "vertexType" : "TRANSIT", + "zoneId" : "1" + }, + { + "arrival" : "2009-11-17T19:21:00.000+00:00", + "departure" : "2009-11-17T19:21:00.000+00:00", + "lat" : 45.529681, + "lon" : -122.698529, + "name" : "NW 23rd & Lovejoy", + "stopCode" : "7163", + "stopId" : "prt:7163", + "stopIndex" : 73, + "stopSequence" : 74, + "vertexType" : "TRANSIT", + "zoneId" : "1" } ], - "legGeometry": { - "length": 22, - "points": "khztGbn{kVAPkAh@o@?sCB{BD??S?mCDmCDyBB??U?mCDmCDyBB??S?oCDmCDmCBo@@" + "legGeometry" : { + "length" : 22, + "points" : "khztGbn{kVAPkAh@o@?sCB{BD??S?mCDmCDyBB??U?mCDmCDyBB??S?oCDmCDmCBo@@" }, - "mode": "BUS", - "pathway": false, - "realTime": false, - "route": "Belmont/NW 23rd", - "routeId": "prt:15", - "routeLongName": "Belmont/NW 23rd", - "routeShortName": "15", - "routeType": 3, - "serviceDate": "2009-11-17", - "startTime": "2009-11-17T19:17:51.000+00:00", - "steps": [ ], - "to": { - "arrival": "2009-11-17T19:22:04.000+00:00", - "departure": "2009-11-17T19:22:04.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "stopIndex": 74, - "stopSequence": 75, - "vertexType": "TRANSIT", - "zoneId": "1" + "mode" : "BUS", + "pathway" : false, + "realTime" : false, + "route" : "Belmont/NW 23rd", + "routeId" : "prt:15", + "routeLongName" : "Belmont/NW 23rd", + "routeShortName" : "15", + "routeType" : 3, + "serviceDate" : "2009-11-17", + "startTime" : "2009-11-17T19:17:51.000+00:00", + "steps" : [ ], + "to" : { + "arrival" : "2009-11-17T19:22:04.000+00:00", + "departure" : "2009-11-17T19:22:04.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "stopIndex" : 74, + "stopSequence" : 75, + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "transitLeg": true, - "tripBlockId": "1550", - "tripId": "prt:150W1430" + "transitLeg" : true, + "tripBlockId" : "1550", + "tripId" : "prt:150W1430" }, { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 231.46, - "endTime": "2009-11-17T19:25:05.000+00:00", - "from": { - "arrival": "2009-11-17T19:22:04.000+00:00", - "departure": "2009-11-17T19:22:04.000+00:00", - "lat": 45.532159, - "lon": -122.698634, - "name": "NW 23rd & Overton", - "stopCode": "8981", - "stopId": "prt:8981", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 231.46, + "endTime" : "2009-11-17T19:25:05.000+00:00", + "from" : { + "arrival" : "2009-11-17T19:22:04.000+00:00", + "departure" : "2009-11-17T19:22:04.000+00:00", + "lat" : 45.532159, + "lon" : -122.698634, + "name" : "NW 23rd & Overton", + "stopCode" : "8981", + "stopId" : "prt:8981", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 353, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 10, - "points": "}~{tGnq{kV?LVAF?J?L?rBCLA?RDpH" + "generalizedCost" : 353, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 10, + "points" : "}~{tGnq{kV?LVAF?J?L?rBCLA?RDpH" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T19:22:04.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 104.46, - "elevation": "", - "lat": 45.5321578, - "lon": -122.6987026, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northwest 23rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 127.01, - "elevation": "", - "lat": 45.5312188, - "lon": -122.6986675, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T19:22:04.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 104.46, + "elevation" : "", + "lat" : 45.5321578, + "lon" : -122.6987026, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northwest 23rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 127.01, + "elevation" : "", + "lat" : 45.5312188, + "lon" : -122.6986675, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T19:25:05.000+00:00", - "lat": 45.531, - "lon": -122.70029, - "name": "NW Northrup St. & NW 24th Ave. (P3)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T19:25:05.000+00:00", + "lat" : 45.531, + "lon" : -122.70029, + "name" : "NW Northrup St. & NW 24th Ave. (P3)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:58:47.000+00:00", - "tooSloped": false, - "transfers": 1, - "transitTime": 1017, - "waitingTime": 307, - "walkDistance": 318.48, - "walkLimitExceeded": false, - "walkTime": 254 + "startTime" : "2009-11-17T18:58:47.000+00:00", + "tooSloped" : false, + "transfers" : 1, + "transitTime" : 1017, + "waitingTime" : 307, + "walkDistance" : 318.48, + "walkLimitExceeded" : false, + "walkTime" : 254 } ] ] @@ -5552,258 +5552,258 @@ org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_plan org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_planning_with_walk_only=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 3804, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T19:03:24.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 3804, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T19:03:24.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 7384, - "legs": [ + "generalizedCost" : 7384, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 4875.79, - "endTime": "2009-11-17T19:03:24.000+00:00", - "from": { - "departure": "2009-11-17T18:00:00.000+00:00", - "lat": 45.51932, - "lon": -122.648567, - "name": "SE Stark St. & SE 17th Ave. (P0)", - "vertexType": "NORMAL" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 4875.79, + "endTime" : "2009-11-17T19:03:24.000+00:00", + "from" : { + "departure" : "2009-11-17T18:00:00.000+00:00", + "lat" : 45.51932, + "lon" : -122.648567, + "name" : "SE Stark St. & SE 17th Ave. (P0)", + "vertexType" : "NORMAL" }, - "generalizedCost": 7384, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 252, - "points": "unytGpxqkVA??dACpB@P?f@?p@?j@?dAAhE?jE?vD?P?RK?GFCDCFADABADADAF?D?FADCF?B?B?@?D@DADABCBC?A?C?AA??GICAAAA?A?A?AACAC?A@ABABC@CDCBCBC@CBABABCJ?J?@?@MR?hE?fEAdB?dB?lE?`A?T?pBA|D?J?x@?r@y@??bBuA?y@AU?{@?O?}@?E?y@?_@Aa@?u@?W??J@N?hA@x@Ap@ATETGpJCjEA|CArAAxAAxAAdBEzHClF?@Ax@GTAjBAZ?R@hC@h@Q@cBBM?M?_CDsA@Y?Q@O?K?Q?mBB[?C?W@[?]@E?IDI@]DO@SBM?S@G@A?GDEJQ|@AL?L@nA?j@@L?V?d@@~@@NI?E?W@Q?Q?m@@Q@AF?DAJBzB?V?NANM@K?GBEDEHIJUX_@f@KNQRSVGFCBQPIHGDGBIBK@W@a@?mA@E?C@C@A?CBQTKJEHIJeC~CYZo@v@g@d@IJAFAD?L@vC@hB@p@?X?T@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?J" + "generalizedCost" : 7384, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 252, + "points" : "unytGpxqkVA??dACpB@P?f@?p@?j@?dAAhE?jE?vD?P?RK?GFCDCFADABADADAF?D?FADCF?B?B?@?D@DADABCBC?A?C?AA??GICAAAA?A?A?AACAC?A@ABABC@CDCBCBC@CBABABCJ?J?@?@MR?hE?fEAdB?dB?lE?`A?T?pBA|D?J?x@?r@y@??bBuA?y@AU?{@?O?}@?E?y@?_@Aa@?u@?W??J@N?hA@x@Ap@ATETGpJCjEA|CArAAxAAxAAdBEzHClF?@Ax@GTAjBAZ?R@hC@h@Q@cBBM?M?_CDsA@Y?Q@O?K?Q?mBB[?C?W@[?]@E?IDI@]DO@SBM?S@G@A?GDEJQ|@AL?L@nA?j@@L?V?d@@~@@NI?E?W@Q?Q?m@@Q@AF?DAJBzB?V?NANM@K?GBEDEHIJUX_@f@KNQRSVGFCBQPIHGDGBIBK@W@a@?mA@E?C@C@A?CBQTKJEHIJeC~CYZo@v@g@d@IJAFAD?L@vC@hB@p@?X?T@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?J" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:00:00.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 0.69, - "elevation": "", - "lat": 45.51932, - "lon": -122.6485648, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Southeast 17th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 402.49, - "elevation": "", - "lat": 45.5193262, - "lon": -122.6485648, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Southeast Stark Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 131.76, - "elevation": "", - "lat": 45.5193421, - "lon": -122.6537305, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "path", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 516.5, - "elevation": "", - "lat": 45.5200623, - "lon": -122.6546522, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Southeast Oak Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": true, - "distance": 70.84, - "elevation": "", - "lat": 45.5200842, - "lon": -122.6612814, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "parking aisle", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 284.75, - "elevation": "", - "lat": 45.5203736, - "lon": -122.661783, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Southeast Martin Luther King, Junior Boulevard", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 243.45, - "elevation": "", - "lat": 45.5229343, - "lon": -122.6617665, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "East Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 407.38, - "elevation": "", - "lat": 45.523001, - "lon": -122.6648816, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Burnside Bridge", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 256.85, - "elevation": "", - "lat": 45.5231054, - "lon": -122.6701087, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 460.65, - "elevation": "", - "lat": 45.5231776, - "lon": -122.6733895, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 3rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 145.82, - "elevation": "", - "lat": 45.5272866, - "lon": -122.6737165, - "relativeDirection": "SLIGHTLY_LEFT", - "stayOn": false, - "streetName": "Northwest Hoyt Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 77.35, - "elevation": "", - "lat": 45.5273496, - "lon": -122.6755629, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 80.53, - "elevation": "", - "lat": 45.5280449, - "lon": -122.6755935, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 465.44, - "elevation": "", - "lat": 45.5280515, - "lon": -122.6766232, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Station Way", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 1331.38, - "elevation": "", - "lat": 45.5315452, - "lon": -122.679511, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:00:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 0.69, + "elevation" : "", + "lat" : 45.51932, + "lon" : -122.6485648, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Southeast 17th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 402.49, + "elevation" : "", + "lat" : 45.5193262, + "lon" : -122.6485648, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Southeast Stark Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 131.76, + "elevation" : "", + "lat" : 45.5193421, + "lon" : -122.6537305, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 516.5, + "elevation" : "", + "lat" : 45.5200623, + "lon" : -122.6546522, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Southeast Oak Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : true, + "distance" : 70.84, + "elevation" : "", + "lat" : 45.5200842, + "lon" : -122.6612814, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "parking aisle", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 284.75, + "elevation" : "", + "lat" : 45.5203736, + "lon" : -122.661783, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Southeast Martin Luther King, Junior Boulevard", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 243.45, + "elevation" : "", + "lat" : 45.5229343, + "lon" : -122.6617665, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "East Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 407.38, + "elevation" : "", + "lat" : 45.523001, + "lon" : -122.6648816, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Burnside Bridge", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 256.85, + "elevation" : "", + "lat" : 45.5231054, + "lon" : -122.6701087, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 460.65, + "elevation" : "", + "lat" : 45.5231776, + "lon" : -122.6733895, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 3rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 145.82, + "elevation" : "", + "lat" : 45.5272866, + "lon" : -122.6737165, + "relativeDirection" : "SLIGHTLY_LEFT", + "stayOn" : false, + "streetName" : "Northwest Hoyt Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 77.35, + "elevation" : "", + "lat" : 45.5273496, + "lon" : -122.6755629, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 80.53, + "elevation" : "", + "lat" : 45.5280449, + "lon" : -122.6755935, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 465.44, + "elevation" : "", + "lat" : 45.5280515, + "lon" : -122.6766232, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Station Way", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 1331.38, + "elevation" : "", + "lat" : 45.5315452, + "lon" : -122.679511, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T19:03:24.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T19:03:24.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:00:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 4875.79, - "walkLimitExceeded": false, - "walkTime": 3804 + "startTime" : "2009-11-17T18:00:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 4875.79, + "walkLimitExceeded" : false, + "walkTime" : 3804 } ] ] @@ -5812,196 +5812,196 @@ org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_plan org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_planning_with_walk_only_stop=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 3230, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:53:50.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 3230, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:53:50.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 6283, - "legs": [ + "generalizedCost" : 6283, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 4154.15, - "endTime": "2009-11-17T18:53:50.000+00:00", - "from": { - "departure": "2009-11-17T18:00:00.000+00:00", - "lat": 45.52337, - "lon": -122.653725, - "name": "NE 12th & Couch", - "stopCode": "6577", - "stopId": "prt:6577", - "vertexType": "TRANSIT", - "zoneId": "1" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 4154.15, + "endTime" : "2009-11-17T18:53:50.000+00:00", + "from" : { + "departure" : "2009-11-17T18:00:00.000+00:00", + "lat" : 45.52337, + "lon" : -122.653725, + "name" : "NE 12th & Couch", + "stopCode" : "6577", + "stopId" : "prt:6577", + "vertexType" : "TRANSIT", + "zoneId" : "1" }, - "generalizedCost": 6283, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 202, - "points": "ahztGxxrkV@Sb@?`@@T??V?vCAT?R?`D?T?RA`D?R?R?t@?n@?z@?T?R?jB?@?r@?R?R?tA?\\?l@?R?T?VAd@?jA?N?N?J?Z?jA?z@?P?Z?J@N?hA@x@Ap@ATETGpJCjEA|CArAAxAAxAAdBEzHClF?@Ax@GTAjBAZ?R@hC@h@Q@cBBM?M?_CDsA@Y?Q@O?K?Q?mBB[?C?W@[?]@E?IDI@]DO@SBM?S@G@A?GDEJQ|@AL?L@nA?j@@L?V?d@@~@@NI?E?W@Q?Q?m@@Q@AF?DAJBzB?V?NANM@K?GBEDEHIJUX_@f@KNQRSVGFCBQPIHGDGBIBK@W@a@?mA@E?C@C@A?CBQTKJEHIJeC~CYZo@v@g@d@IJAFAD?L@vC@hB@p@?X?T@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?J" + "generalizedCost" : 6283, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 202, + "points" : "ahztGxxrkV@Sb@?`@@T??V?vCAT?R?`D?T?RA`D?R?R?t@?n@?z@?T?R?jB?@?r@?R?R?tA?\\?l@?R?T?VAd@?jA?N?N?J?Z?jA?z@?P?Z?J@N?hA@x@Ap@ATETGpJCjEA|CArAAxAAxAAdBEzHClF?@Ax@GTAjBAZ?R@hC@h@Q@cBBM?M?_CDsA@Y?Q@O?K?Q?mBB[?C?W@[?]@E?IDI@]DO@SBM?S@G@A?GDEJQ|@AL?L@nA?j@@L?V?d@@~@@NI?E?W@Q?Q?m@@Q@AF?DAJBzB?V?NANM@K?GBEDEHIJUX_@f@KNQRSVGFCBQPIHGDGBIBK@W@a@?mA@E?C@C@A?CBQTKJEHIJeC~CYZo@v@g@d@IJAFAD?L@vC@hB@p@?X?T@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?J" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:00:00.000+00:00", - "steps": [ - { - "absoluteDirection": "SOUTH", - "area": false, - "bogusName": false, - "distance": 51.53, - "elevation": "", - "lat": 45.5233684, - "lon": -122.6536225, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Northeast 12th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 877.28, - "elevation": "", - "lat": 45.5229051, - "lon": -122.6536312, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "East Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 407.38, - "elevation": "", - "lat": 45.523001, - "lon": -122.6648816, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Burnside Bridge", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 256.85, - "elevation": "", - "lat": 45.5231054, - "lon": -122.6701087, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "West Burnside Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 460.65, - "elevation": "", - "lat": 45.5231776, - "lon": -122.6733895, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 3rd Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 145.82, - "elevation": "", - "lat": 45.5272866, - "lon": -122.6737165, - "relativeDirection": "SLIGHTLY_LEFT", - "stayOn": false, - "streetName": "Northwest Hoyt Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 77.35, - "elevation": "", - "lat": 45.5273496, - "lon": -122.6755629, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 5th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 80.53, - "elevation": "", - "lat": 45.5280449, - "lon": -122.6755935, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Irving Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 465.44, - "elevation": "", - "lat": 45.5280515, - "lon": -122.6766232, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest Station Way", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 1331.38, - "elevation": "", - "lat": 45.5315452, - "lon": -122.679511, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:00:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "SOUTH", + "area" : false, + "bogusName" : false, + "distance" : 51.53, + "elevation" : "", + "lat" : 45.5233684, + "lon" : -122.6536225, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Northeast 12th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 877.28, + "elevation" : "", + "lat" : 45.5229051, + "lon" : -122.6536312, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "East Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 407.38, + "elevation" : "", + "lat" : 45.523001, + "lon" : -122.6648816, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Burnside Bridge", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 256.85, + "elevation" : "", + "lat" : 45.5231054, + "lon" : -122.6701087, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "West Burnside Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 460.65, + "elevation" : "", + "lat" : 45.5231776, + "lon" : -122.6733895, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 3rd Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 145.82, + "elevation" : "", + "lat" : 45.5272866, + "lon" : -122.6737165, + "relativeDirection" : "SLIGHTLY_LEFT", + "stayOn" : false, + "streetName" : "Northwest Hoyt Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 77.35, + "elevation" : "", + "lat" : 45.5273496, + "lon" : -122.6755629, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 5th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 80.53, + "elevation" : "", + "lat" : 45.5280449, + "lon" : -122.6755935, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Irving Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 465.44, + "elevation" : "", + "lat" : 45.5280515, + "lon" : -122.6766232, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest Station Way", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 1331.38, + "elevation" : "", + "lat" : 45.5315452, + "lon" : -122.679511, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:53:50.000+00:00", - "lat": 45.53122, - "lon": -122.69659, - "name": "NW Northrup St. & NW 22nd Ave. (P2)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:53:50.000+00:00", + "lat" : 45.53122, + "lon" : -122.69659, + "name" : "NW Northrup St. & NW 22nd Ave. (P2)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:00:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 4154.15, - "walkLimitExceeded": false, - "walkTime": 3230 + "startTime" : "2009-11-17T18:00:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 4154.15, + "walkLimitExceeded" : false, + "walkTime" : 3230 } ] ] @@ -6010,209 +6010,209 @@ org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_plan org.opentripplanner.routing.algorithm.mapping.TransitSnapshotTest.test_trip_planning_with_walk_only_stop_collection=[ [ { - "arrivedAtDestinationWithRentedBicycle": false, - "duration": 2366, - "elevationGained": 0.0, - "elevationLost": 0.0, - "endTime": "2009-11-17T18:39:26.000+00:00", - "fare": { - "details": { }, - "fare": { } + "arrivedAtDestinationWithRentedBicycle" : false, + "duration" : 2366, + "elevationGained" : 0.0, + "elevationLost" : 0.0, + "endTime" : "2009-11-17T18:39:26.000+00:00", + "fare" : { + "details" : { }, + "fare" : { } }, - "generalizedCost": 4597, - "legs": [ + "generalizedCost" : 4597, + "legs" : [ { - "agencyTimeZoneOffset": -28800000, - "arrivalDelay": 0, - "departureDelay": 0, - "distance": 2985.43, - "endTime": "2009-11-17T18:39:26.000+00:00", - "from": { - "departure": "2009-11-17T18:00:00.000+00:00", - "lat": 45.530244, - "lon": -122.667794, - "name": "Interstate/Rose Quarter MAX Station", - "stopCode": "11508", - "stopId": "prt:11508", - "vertexType": "TRANSIT", - "zoneId": "0" + "agencyTimeZoneOffset" : -28800000, + "arrivalDelay" : 0, + "departureDelay" : 0, + "distance" : 2985.43, + "endTime" : "2009-11-17T18:39:26.000+00:00", + "from" : { + "departure" : "2009-11-17T18:00:00.000+00:00", + "lat" : 45.530244, + "lon" : -122.667794, + "name" : "Interstate/Rose Quarter MAX Station", + "stopCode" : "11508", + "stopId" : "prt:11508", + "vertexType" : "TRANSIT", + "zoneId" : "0" }, - "generalizedCost": 4597, - "interlineWithPreviousLeg": false, - "legGeometry": { - "length": 143, - "points": "_s{tGvpukV??c@tADDFDDDHHYx@Wt@{@lBS^MROZ]h@Y`@[`@k@r@kAtASVEDa@f@EDm@l@s@p@JVA@GOCBzEfKxF`M|AfDJRLPVb@DBBBBBDBB@CRE\\C?A@A@ABAB?DAHATC\\AXAVCZATAPAPATG`AATAPAL?J?F?F?D?F@x@AJ@D@B@DAB?RK@I??TBlBCJ?D?BAFAB?DADABEFCDA@CDC?c@@{@@O?K?eBBM?M@@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?RDbH@xA?D?P?RDpH" + "generalizedCost" : 4597, + "interlineWithPreviousLeg" : false, + "legGeometry" : { + "length" : 143, + "points" : "_s{tGvpukV??c@tADDFDDDHHYx@Wt@{@lBS^MROZ]h@Y`@[`@k@r@kAtASVEDa@f@EDm@l@s@p@JVA@GOCBzEfKxF`M|AfDJRLPVb@DBBBBBDBB@CRE\\C?A@A@ABAB?DAHATC\\AXAVCZATAPAPATG`AATAPAL?J?F?F?D?F@x@AJ@D@B@DAB?RK@I??TBlBCJ?D?BAFAB?DADABEFCDA@CDC?c@@{@@O?K?eBBM?M@@P?N@P@nA?j@AX?L@`B@dA?R?RBbD?T?NBbD?R?P@|D@jB?x@@J?N?B?P?LBjD@N@fD?T?LBdD?R?PF`K?RDlJ?R?PFlJ?RDbH@xA?D?P?RDpH" }, - "mode": "WALK", - "pathway": false, - "realTime": false, - "rentedBike": false, - "route": "", - "startTime": "2009-11-17T18:00:00.000+00:00", - "steps": [ - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 39.04, - "elevation": "", - "lat": 45.5302409, - "lon": -122.6677968, - "relativeDirection": "DEPART", - "stayOn": false, - "streetName": "Interstate/Rose Quarter Northbound Yellow Line MAX Platform", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHWEST", - "area": false, - "bogusName": true, - "distance": 20.61, - "elevation": "", - "lat": 45.5304271, - "lon": -122.6682216, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "path", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 410.02, - "elevation": "", - "lat": 45.5302724, - "lon": -122.6683673, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "North Interstate Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHWEST", - "area": false, - "bogusName": true, - "distance": 20.18, - "elevation": "", - "lat": 45.5329128, - "lon": -122.6719792, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "steps", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": true, - "distance": 2.25, - "elevation": "", - "lat": 45.5329079, - "lon": -122.672028, - "relativeDirection": "RIGHT", - "stayOn": true, - "streetName": "footbridge", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHWEST", - "area": false, - "bogusName": false, - "distance": 543.67, - "elevation": "", - "lat": 45.5329251, - "lon": -122.6720431, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Broadway Bridge", - "walkingBike": false - }, - { - "absoluteDirection": "SOUTHWEST", - "area": false, - "bogusName": false, - "distance": 14.16, - "elevation": "", - "lat": 45.5298506, - "lon": -122.6774667, - "relativeDirection": "CONTINUE", - "stayOn": false, - "streetName": "Northwest Broadway", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 23.67, - "elevation": "", - "lat": 45.5297871, - "lon": -122.6778001, - "relativeDirection": "UTURN_RIGHT", - "stayOn": true, - "streetName": "Northwest Broadway", - "walkingBike": false - }, - { - "absoluteDirection": "NORTHWEST", - "area": false, - "bogusName": false, - "distance": 298.37, - "elevation": "", - "lat": 45.5298172, - "lon": -122.6778163, - "relativeDirection": "SLIGHTLY_LEFT", - "stayOn": false, - "streetName": "Northwest Lovejoy Street", - "walkingBike": false - }, - { - "absoluteDirection": "NORTH", - "area": false, - "bogusName": false, - "distance": 143.24, - "elevation": "", - "lat": 45.5302432, - "lon": -122.6813836, - "relativeDirection": "RIGHT", - "stayOn": false, - "streetName": "Northwest 10th Avenue", - "walkingBike": false - }, - { - "absoluteDirection": "WEST", - "area": false, - "bogusName": false, - "distance": 1470.24, - "elevation": "", - "lat": 45.5315309, - "lon": -122.6814307, - "relativeDirection": "LEFT", - "stayOn": false, - "streetName": "Northwest Northrup Street", - "walkingBike": false + "mode" : "WALK", + "pathway" : false, + "realTime" : false, + "rentedBike" : false, + "route" : "", + "startTime" : "2009-11-17T18:00:00.000+00:00", + "steps" : [ + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 39.04, + "elevation" : "", + "lat" : 45.5302409, + "lon" : -122.6677968, + "relativeDirection" : "DEPART", + "stayOn" : false, + "streetName" : "Interstate/Rose Quarter Northbound Yellow Line MAX Platform", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHWEST", + "area" : false, + "bogusName" : true, + "distance" : 20.61, + "elevation" : "", + "lat" : 45.5304271, + "lon" : -122.6682216, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "path", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 410.02, + "elevation" : "", + "lat" : 45.5302724, + "lon" : -122.6683673, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "North Interstate Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHWEST", + "area" : false, + "bogusName" : true, + "distance" : 20.18, + "elevation" : "", + "lat" : 45.5329128, + "lon" : -122.6719792, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "steps", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : true, + "distance" : 2.25, + "elevation" : "", + "lat" : 45.5329079, + "lon" : -122.672028, + "relativeDirection" : "RIGHT", + "stayOn" : true, + "streetName" : "footbridge", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 543.67, + "elevation" : "", + "lat" : 45.5329251, + "lon" : -122.6720431, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Broadway Bridge", + "walkingBike" : false + }, + { + "absoluteDirection" : "SOUTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 14.16, + "elevation" : "", + "lat" : 45.5298506, + "lon" : -122.6774667, + "relativeDirection" : "CONTINUE", + "stayOn" : false, + "streetName" : "Northwest Broadway", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 23.67, + "elevation" : "", + "lat" : 45.5297871, + "lon" : -122.6778001, + "relativeDirection" : "UTURN_RIGHT", + "stayOn" : true, + "streetName" : "Northwest Broadway", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTHWEST", + "area" : false, + "bogusName" : false, + "distance" : 298.37, + "elevation" : "", + "lat" : 45.5298172, + "lon" : -122.6778163, + "relativeDirection" : "SLIGHTLY_LEFT", + "stayOn" : false, + "streetName" : "Northwest Lovejoy Street", + "walkingBike" : false + }, + { + "absoluteDirection" : "NORTH", + "area" : false, + "bogusName" : false, + "distance" : 143.24, + "elevation" : "", + "lat" : 45.5302432, + "lon" : -122.6813836, + "relativeDirection" : "RIGHT", + "stayOn" : false, + "streetName" : "Northwest 10th Avenue", + "walkingBike" : false + }, + { + "absoluteDirection" : "WEST", + "area" : false, + "bogusName" : false, + "distance" : 1470.24, + "elevation" : "", + "lat" : 45.5315309, + "lon" : -122.6814307, + "relativeDirection" : "LEFT", + "stayOn" : false, + "streetName" : "Northwest Northrup Street", + "walkingBike" : false } ], - "to": { - "arrival": "2009-11-17T18:39:26.000+00:00", - "lat": 45.531, - "lon": -122.70029, - "name": "NW Northrup St. & NW 24th Ave. (P3)", - "vertexType": "NORMAL" + "to" : { + "arrival" : "2009-11-17T18:39:26.000+00:00", + "lat" : 45.531, + "lon" : -122.70029, + "name" : "NW Northrup St. & NW 24th Ave. (P3)", + "vertexType" : "NORMAL" }, - "transitLeg": false, - "walkingBike": false + "transitLeg" : false, + "walkingBike" : false } ], - "startTime": "2009-11-17T18:00:00.000+00:00", - "tooSloped": false, - "transfers": 0, - "transitTime": 0, - "waitingTime": 0, - "walkDistance": 2985.43, - "walkLimitExceeded": false, - "walkTime": 2366 + "startTime" : "2009-11-17T18:00:00.000+00:00", + "tooSloped" : false, + "transfers" : 0, + "transitTime" : 0, + "waitingTime" : 0, + "walkDistance" : 2985.43, + "walkLimitExceeded" : false, + "walkTime" : 2366 } ] ] \ No newline at end of file diff --git a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/TransferTest.java b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/TransferTest.java new file mode 100644 index 00000000000..b1e2b881b1a --- /dev/null +++ b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/TransferTest.java @@ -0,0 +1,96 @@ +package org.opentripplanner.routing.algorithm.raptoradapter.transit; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.opentripplanner.street.model._data.StreetModelForTest.intersectionVertex; + +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.opentripplanner._support.geometry.Coordinates; +import org.opentripplanner.raptor.api.model.RaptorTransfer; +import org.opentripplanner.routing.algorithm.raptoradapter.transit.cost.RaptorCostConverter; +import org.opentripplanner.street.model._data.StreetModelForTest; +import org.opentripplanner.street.model.vertex.IntersectionVertex; +import org.opentripplanner.street.search.request.StreetSearchRequest; + +class TransferTest { + + private static final IntersectionVertex BERLIN_V = intersectionVertex(Coordinates.BERLIN); + private static final IntersectionVertex BRANDENBURG_GATE_V = intersectionVertex( + Coordinates.BERLIN_BRANDENBURG_GATE + ); + private static final IntersectionVertex BOSTON_V = intersectionVertex(Coordinates.BOSTON); + private static final int MAX_RAPTOR_TRANSFER_COST = RaptorCostConverter.toRaptorCost( + Transfer.MAX_TRANSFER_COST + ); + + @Nested + class WithEdges { + + @Test + void limitMaxCost() { + // very long edge from Berlin to Boston that has of course a huge cost to traverse + var edge = StreetModelForTest.streetEdge(BERLIN_V, BOSTON_V); + + var veryLongTransfer = new Transfer(0, List.of(edge)); + assertTrue(veryLongTransfer.getDistanceMeters() > 1_000_000); + // cost would be too high, so it should be capped to a maximum value + assertMaxCost(veryLongTransfer.asRaptorTransfer(StreetSearchRequest.of().build()).get()); + } + + @Test + void allowLowCost() { + var edge = StreetModelForTest.streetEdge(BERLIN_V, BRANDENBURG_GATE_V); + var transfer = new Transfer(0, List.of(edge)); + assertTrue(transfer.getDistanceMeters() < 4000); + final Optional raptorTransfer = transfer.asRaptorTransfer( + StreetSearchRequest.of().build() + ); + // cost is below max limit and included as is in RAPTOR unchanged + assertBelowMaxCost(raptorTransfer.get()); + } + } + + @Nested + class WithoutEdges { + + @Test + void overflow() { + var veryLongTransfer = new Transfer(0, Integer.MAX_VALUE); + assertMaxCost(veryLongTransfer.asRaptorTransfer(StreetSearchRequest.of().build()).get()); + } + + @Test + void negativeCost() { + var veryLongTransfer = new Transfer(0, -5); + assertMaxCost(veryLongTransfer.asRaptorTransfer(StreetSearchRequest.of().build()).get()); + } + + @Test + void limitMaxCost() { + var veryLongTransfer = new Transfer(0, 8_000_000); + // cost would be too high, so it will be capped before passing to RAPTOR + assertMaxCost(veryLongTransfer.asRaptorTransfer(StreetSearchRequest.of().build()).get()); + } + + @Test + void allowLowCost() { + var transfer = new Transfer(0, 200); + final Optional raptorTransfer = transfer.asRaptorTransfer( + StreetSearchRequest.of().build() + ); + // cost is below max limit and should be included as is in RAPTOR + assertBelowMaxCost(raptorTransfer.get()); + } + } + + private static void assertMaxCost(RaptorTransfer transfer) { + assertEquals(MAX_RAPTOR_TRANSFER_COST, transfer.generalizedCost()); + } + + private static void assertBelowMaxCost(RaptorTransfer transfer) { + assertTrue(MAX_RAPTOR_TRANSFER_COST > transfer.generalizedCost()); + } +} diff --git a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/TripPatternForDateTest.java b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/TripPatternForDateTest.java index ed13d6cbf19..ecd75f5d273 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/TripPatternForDateTest.java +++ b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/TripPatternForDateTest.java @@ -20,13 +20,14 @@ import org.opentripplanner.transit.model.site.RegularStop; import org.opentripplanner.transit.model.timetable.FrequencyEntry; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; class TripPatternForDateTest { private static final TransitModelForTest TEST_MODEL = TransitModelForTest.of(); private static final RegularStop STOP = TEST_MODEL.stop("TEST:STOP", 0, 0).build(); private static final Route ROUTE = TransitModelForTest.route("1").build(); - private static final TripTimes tripTimes = new TripTimes( + private static final TripTimes tripTimes = TripTimesFactory.tripTimes( TransitModelForTest.trip("1").withRoute(ROUTE).build(), List.of(new StopTime()), new Deduplicator() diff --git a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/mappers/TripPatternForDateMapperTest.java b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/mappers/TripPatternForDateMapperTest.java index 6ee2d7bcd11..020dc6305a4 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/mappers/TripPatternForDateMapperTest.java +++ b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/mappers/TripPatternForDateMapperTest.java @@ -19,6 +19,7 @@ import org.opentripplanner.transit.model._data.TransitModelForTest; import org.opentripplanner.transit.model.framework.Deduplicator; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; public class TripPatternForDateMapperTest { @@ -37,7 +38,7 @@ public static void setUp() throws Exception { var pattern = TEST_MODEL.pattern(BUS).build(); timetable = new Timetable(pattern); var trip = TransitModelForTest.trip("1").build(); - var tripTimes = new TripTimes( + var tripTimes = TripTimesFactory.tripTimes( trip, TEST_MODEL.stopTimesEvery5Minutes(5, trip, PlanTestConstants.T11_00), new Deduplicator() diff --git a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRoutingRequestTransitDataCreatorTest.java b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRoutingRequestTransitDataCreatorTest.java index b5fbcf55e1e..20ca21a50a6 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRoutingRequestTransitDataCreatorTest.java +++ b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRoutingRequestTransitDataCreatorTest.java @@ -22,6 +22,7 @@ import org.opentripplanner.transit.model.network.StopPattern; import org.opentripplanner.transit.model.network.TripPattern; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; public class RaptorRoutingRequestTransitDataCreatorTest { @@ -103,7 +104,7 @@ private TripTimes createTripTimesForTest() { stopTime1.setDepartureTime(0); stopTime2.setArrivalTime(7200); - return new TripTimes( + return TripTimesFactory.tripTimes( TransitModelForTest.trip("Test").build(), Arrays.asList(stopTime1, stopTime2), new Deduplicator() diff --git a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RouteRequestTransitDataProviderFilterTest.java b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RouteRequestTransitDataProviderFilterTest.java index 77d5cce6980..86d5f9404ed 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RouteRequestTransitDataProviderFilterTest.java +++ b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RouteRequestTransitDataProviderFilterTest.java @@ -44,6 +44,7 @@ import org.opentripplanner.transit.model.timetable.TripAlteration; import org.opentripplanner.transit.model.timetable.TripBuilder; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; class RouteRequestTransitDataProviderFilterTest { @@ -811,7 +812,7 @@ private TripPatternForDate createTestTripPatternForDate() { .build() .getRoutingTripPattern(); - TripTimes tripTimes = new TripTimes( + TripTimes tripTimes = TripTimesFactory.tripTimes( TransitModelForTest.trip("1").withRoute(route).build(), List.of(new StopTime()), new Deduplicator() @@ -884,7 +885,7 @@ private TripTimes createTestTripTimes( stopTime.setDepartureTime(60); stopTime.setStopSequence(0); - return new TripTimes(trip, List.of(stopTime), new Deduplicator()); + return TripTimesFactory.tripTimes(trip, List.of(stopTime), new Deduplicator()); } private TripTimes createTestTripTimesWithSubmode(String submode) { diff --git a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/TestRouteData.java b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/TestRouteData.java index 2c14a8b0b9d..a7a0c2fd160 100644 --- a/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/TestRouteData.java +++ b/src/test/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/TestRouteData.java @@ -26,6 +26,7 @@ import org.opentripplanner.transit.model.site.StopLocation; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; public class TestRouteData { @@ -139,7 +140,7 @@ private Trip parseTripInfo( .build(); var stopTimes = stopTimes(trip, stops, tripTimes); this.stopTimesByTrip.put(trip, stopTimes); - this.tripTimesByTrip.put(trip, new TripTimes(trip, stopTimes, deduplicator)); + this.tripTimesByTrip.put(trip, TripTimesFactory.tripTimes(trip, stopTimes, deduplicator)); return trip; } diff --git a/src/test/java/org/opentripplanner/routing/graph/GraphSerializationTest.java b/src/test/java/org/opentripplanner/routing/graph/GraphSerializationTest.java index a6560a81ee6..818efb67d41 100644 --- a/src/test/java/org/opentripplanner/routing/graph/GraphSerializationTest.java +++ b/src/test/java/org/opentripplanner/routing/graph/GraphSerializationTest.java @@ -187,7 +187,8 @@ private void testRoundTrip( BuildConfig.DEFAULT, RouterConfig.DEFAULT, DataImportIssueSummary.empty(), - emissionsDataModel + emissionsDataModel, + null ); serializedObj.save(new FileDataSource(tempFile, FileType.GRAPH)); SerializedGraphObject deserializedGraph = SerializedGraphObject.load(tempFile); diff --git a/src/test/java/org/opentripplanner/routing/trippattern/FrequencyEntryTest.java b/src/test/java/org/opentripplanner/routing/trippattern/FrequencyEntryTest.java index bfc4887f756..49ca6d9221b 100644 --- a/src/test/java/org/opentripplanner/routing/trippattern/FrequencyEntryTest.java +++ b/src/test/java/org/opentripplanner/routing/trippattern/FrequencyEntryTest.java @@ -14,6 +14,7 @@ import org.opentripplanner.transit.model.timetable.FrequencyEntry; import org.opentripplanner.transit.model.timetable.Trip; import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; public class FrequencyEntryTest { @@ -43,7 +44,7 @@ public class FrequencyEntryTest { stopTimes.add(stopTime); } - tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); } @Test diff --git a/src/test/java/org/opentripplanner/test/support/ResourceLoader.java b/src/test/java/org/opentripplanner/test/support/ResourceLoader.java index 74d34c573ef..38fe02a8c74 100644 --- a/src/test/java/org/opentripplanner/test/support/ResourceLoader.java +++ b/src/test/java/org/opentripplanner/test/support/ResourceLoader.java @@ -4,9 +4,14 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.List; /** * Loads files from the resources folder relative to the package name of the class/instances @@ -70,4 +75,27 @@ public URI uri(String s) { throw new IllegalArgumentException(e); } } + + /** + * Returns the specified number of lines from a file. + */ + public List lines(String s, int lines) { + var path = file(s).toPath(); + try { + return Files.readAllLines(path, StandardCharsets.UTF_8).stream().limit(lines).toList(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Returns the specified resources as an input stream. + */ + public InputStream inputStream(String path) { + try { + return url(path).openStream(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/test/java/org/opentripplanner/transit/model/network/StopPatternTest.java b/src/test/java/org/opentripplanner/transit/model/network/StopPatternTest.java index cdee510a86a..d92aad0e159 100644 --- a/src/test/java/org/opentripplanner/transit/model/network/StopPatternTest.java +++ b/src/test/java/org/opentripplanner/transit/model/network/StopPatternTest.java @@ -1,5 +1,6 @@ package org.opentripplanner.transit.model.network; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -60,4 +61,19 @@ void boardingAlightingConditions() { assertFalse(stopPattern.canBoard(2), "Forbidden at GroupStop"); assertFalse(stopPattern.canBoard(3), "Forbidden at AreaStop"); } + + @Test + void replaceStop() { + var s1 = testModel.stop("1").build(); + var s2 = testModel.stop("2").build(); + var s3 = testModel.stop("3").build(); + var s4 = testModel.stop("4").build(); + + var pattern = TransitModelForTest.stopPattern(s1, s2, s3); + + assertEquals(List.of(s1, s2, s3), pattern.getStops()); + + var updated = pattern.mutate().replaceStop(s2.getId(), s4).build(); + assertEquals(List.of(s1, s4, s3), updated.getStops()); + } } diff --git a/src/test/java/org/opentripplanner/transit/model/network/TripPatternTest.java b/src/test/java/org/opentripplanner/transit/model/network/TripPatternTest.java index 3f7c6d0ee65..b2adc7544a3 100644 --- a/src/test/java/org/opentripplanner/transit/model/network/TripPatternTest.java +++ b/src/test/java/org/opentripplanner/transit/model/network/TripPatternTest.java @@ -5,25 +5,44 @@ import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.opentripplanner.framework.geometry.GeometryUtils.makeLineString; +import static org.opentripplanner.transit.model._data.TransitModelForTest.id; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.locationtech.jts.geom.LineString; import org.opentripplanner.transit.model._data.TransitModelForTest; import org.opentripplanner.transit.model.basic.TransitMode; +import org.opentripplanner.transit.model.site.RegularStop; class TripPatternTest { private static final String ID = "1"; private static final String NAME = "short name"; - private static TransitModelForTest TEST_MODEL = TransitModelForTest.of(); + private static final TransitModelForTest TEST_MODEL = TransitModelForTest.of(); private static final Route ROUTE = TransitModelForTest.route("routeId").build(); - private static final StopPattern STOP_PATTERN = TEST_MODEL.stopPattern(10); + public static final RegularStop STOP_A = TEST_MODEL.stop("A").build(); + public static final RegularStop STOP_B = TEST_MODEL.stop("B").build(); + public static final RegularStop STOP_C = TEST_MODEL.stop("C").build(); + private static final StopPattern STOP_PATTERN = TransitModelForTest.stopPattern( + STOP_A, + STOP_B, + STOP_C + ); + + private static final List HOP_GEOMETRIES = List.of( + makeLineString(STOP_A.getCoordinate(), STOP_B.getCoordinate()), + makeLineString(STOP_B.getCoordinate(), STOP_C.getCoordinate()) + ); + private static final TripPattern subject = TripPattern - .of(TransitModelForTest.id(ID)) + .of(id(ID)) .withName(NAME) .withRoute(ROUTE) .withStopPattern(STOP_PATTERN) + .withHopGeometries(HOP_GEOMETRIES) .build(); @Test @@ -46,12 +65,15 @@ void copy() { assertEquals("v2", copy.getName()); assertEquals(ROUTE, copy.getRoute()); assertEquals(STOP_PATTERN, copy.getStopPattern()); + assertEquals(subject.getHopGeometry(0), copy.getHopGeometry(0)); + assertEquals(subject.getHopGeometry(1), copy.getHopGeometry(1)); + assertEquals(HOP_GEOMETRIES.get(1), copy.getHopGeometry(1)); } @Test void sameAs() { assertTrue(subject.sameAs(subject.copy().build())); - assertFalse(subject.sameAs(subject.copy().withId(TransitModelForTest.id("X")).build())); + assertFalse(subject.sameAs(subject.copy().withId(id("X")).build())); assertFalse(subject.sameAs(subject.copy().withName("X").build())); assertFalse( subject.sameAs( @@ -70,11 +92,7 @@ void initNameShouldThrow() { @Test void shouldAddName() { var name = "xyz"; - var noNameYet = TripPattern - .of(TransitModelForTest.id(ID)) - .withRoute(ROUTE) - .withStopPattern(STOP_PATTERN) - .build(); + var noNameYet = TripPattern.of(id(ID)).withRoute(ROUTE).withStopPattern(STOP_PATTERN).build(); noNameYet.initName(name); @@ -84,11 +102,19 @@ void shouldAddName() { @Test void shouldResolveMode() { var patternWithoutExplicitMode = TripPattern - .of(TransitModelForTest.id(ID)) + .of(id(ID)) .withRoute(ROUTE) .withStopPattern(STOP_PATTERN) .build(); assertEquals(patternWithoutExplicitMode.getMode(), ROUTE.getMode()); } + + @Test + void containsAnyStopId() { + assertFalse(subject.containsAnyStopId(List.of())); + assertFalse(subject.containsAnyStopId(List.of(id("not-in-pattern")))); + assertTrue(subject.containsAnyStopId(List.of(STOP_A.getId()))); + assertTrue(subject.containsAnyStopId(List.of(STOP_A.getId(), id("not-in-pattern")))); + } } diff --git a/src/test/java/org/opentripplanner/transit/model/timetable/TripTimesTest.java b/src/test/java/org/opentripplanner/transit/model/timetable/TripTimesTest.java index 6456dd732eb..4c2cc41cef2 100644 --- a/src/test/java/org/opentripplanner/transit/model/timetable/TripTimesTest.java +++ b/src/test/java/org/opentripplanner/transit/model/timetable/TripTimesTest.java @@ -23,7 +23,7 @@ class TripTimesTest { - private static TransitModelForTest TEST_MODEL = TransitModelForTest.of(); + private static final TransitModelForTest TEST_MODEL = TransitModelForTest.of(); private static final String TRIP_ID = "testTripId"; @@ -54,7 +54,7 @@ static TripTimes createInitialTripTimes() { stopTimes.add(stopTime); } - return new TripTimes(trip, stopTimes, new Deduplicator()); + return TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); } @Nested @@ -71,7 +71,7 @@ void shouldHandleBothNullScenario() { Trip trip = TransitModelForTest.trip("TRIP").build(); Collection stopTimes = List.of(EMPTY_STOPPOINT, EMPTY_STOPPOINT, EMPTY_STOPPOINT); - TripTimes tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + TripTimes tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); I18NString headsignFirstStop = tripTimes.getHeadsign(0); assertNull(headsignFirstStop); @@ -82,7 +82,7 @@ void shouldHandleTripOnlyHeadSignScenario() { Trip trip = TransitModelForTest.trip("TRIP").withHeadsign(DIRECTION).build(); Collection stopTimes = List.of(EMPTY_STOPPOINT, EMPTY_STOPPOINT, EMPTY_STOPPOINT); - TripTimes tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + TripTimes tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); I18NString headsignFirstStop = tripTimes.getHeadsign(0); assertEquals(DIRECTION, headsignFirstStop); @@ -99,7 +99,7 @@ void shouldHandleStopsOnlyHeadSignScenario() { stopWithHeadsign ); - TripTimes tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + TripTimes tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); I18NString headsignFirstStop = tripTimes.getHeadsign(0); assertEquals(STOP_TEST_DIRECTION, headsignFirstStop); @@ -116,7 +116,7 @@ void shouldHandleStopsEqualToTripHeadSignScenario() { stopWithHeadsign ); - TripTimes tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + TripTimes tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); I18NString headsignFirstStop = tripTimes.getHeadsign(0); assertEquals(DIRECTION, headsignFirstStop); @@ -129,7 +129,7 @@ void shouldHandleDifferingTripAndStopHeadSignScenario() { stopWithHeadsign.setStopHeadsign(STOP_TEST_DIRECTION); Collection stopTimes = List.of(stopWithHeadsign, EMPTY_STOPPOINT, EMPTY_STOPPOINT); - TripTimes tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + TripTimes tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); I18NString headsignFirstStop = tripTimes.getHeadsign(0); assertEquals(STOP_TEST_DIRECTION, headsignFirstStop); @@ -141,7 +141,7 @@ void shouldHandleDifferingTripAndStopHeadSignScenario() { @Test public void testStopUpdate() { - TripTimes updatedTripTimesA = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesA = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesA.updateArrivalTime(3, 190); updatedTripTimesA.updateDepartureTime(3, 190); @@ -156,7 +156,7 @@ public void testStopUpdate() { @Test public void testPassedUpdate() { - TripTimes updatedTripTimesA = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesA = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesA.updateDepartureTime(0, 30); @@ -166,7 +166,7 @@ public void testPassedUpdate() { @Test public void testNegativeDwellTime() { - TripTimes updatedTripTimesA = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesA = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesA.updateArrivalTime(1, 60); updatedTripTimesA.updateDepartureTime(1, 59); @@ -179,7 +179,7 @@ public void testNegativeDwellTime() { @Test public void testNegativeHopTime() { - TripTimes updatedTripTimesB = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesB = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesB.updateDepartureTime(6, 421); updatedTripTimesB.updateArrivalTime(7, 420); @@ -200,7 +200,7 @@ public void testNegativeHopTime() { */ @Test public void testNegativeHopTimeWithStopCancellations() { - TripTimes updatedTripTimes = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimes = createInitialTripTimes(); updatedTripTimes.updateDepartureTime(5, 421); updatedTripTimes.updateArrivalTime(6, 481); @@ -227,7 +227,7 @@ public void testNegativeHopTimeWithStopCancellations() { */ @Test public void testPositiveHopTimeWithStopCancellationsLate() { - TripTimes updatedTripTimes = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimes = createInitialTripTimes(); updatedTripTimes.updateDepartureTime(5, 400); updatedTripTimes.updateArrivalTime(6, 460); @@ -253,7 +253,7 @@ public void testPositiveHopTimeWithStopCancellationsLate() { */ @Test public void testPositiveHopTimeWithStopCancellationsEarly() { - TripTimes updatedTripTimes = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimes = createInitialTripTimes(); updatedTripTimes.updateDepartureTime(5, 300); updatedTripTimes.setCancelled(6); @@ -278,7 +278,7 @@ public void testPositiveHopTimeWithStopCancellationsEarly() { */ @Test public void testPositiveHopTimeWithTerminalCancellation() { - TripTimes updatedTripTimes = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimes = createInitialTripTimes(); updatedTripTimes.setCancelled(0); updatedTripTimes.setCancelled(1); @@ -304,7 +304,7 @@ public void testPositiveHopTimeWithTerminalCancellation() { */ @Test public void testInterpolationWithTerminalCancellation() { - TripTimes updatedTripTimes = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimes = createInitialTripTimes(); updatedTripTimes.setCancelled(6); updatedTripTimes.setCancelled(7); @@ -323,7 +323,7 @@ public void testInterpolationWithTerminalCancellation() { */ @Test public void testInterpolationWithMultipleStopCancellations() { - TripTimes updatedTripTimes = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimes = createInitialTripTimes(); updatedTripTimes.setCancelled(1); updatedTripTimes.setCancelled(2); @@ -352,7 +352,7 @@ public void testInterpolationWithMultipleStopCancellations() { */ @Test public void testInterpolationWithMultipleStopCancellations2() { - TripTimes updatedTripTimes = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimes = createInitialTripTimes(); updatedTripTimes.setCancelled(1); updatedTripTimes.setCancelled(2); @@ -375,7 +375,7 @@ public void testInterpolationWithMultipleStopCancellations2() { @Test public void testNonIncreasingUpdateCrossingMidnight() { - TripTimes updatedTripTimesA = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesA = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesA.updateArrivalTime(0, -300); //"Yesterday" updatedTripTimesA.updateDepartureTime(0, 50); @@ -385,7 +385,7 @@ public void testNonIncreasingUpdateCrossingMidnight() { @Test public void testDelay() { - TripTimes updatedTripTimesA = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesA = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesA.updateDepartureDelay(0, 10); updatedTripTimesA.updateArrivalDelay(6, 13); @@ -395,14 +395,14 @@ public void testDelay() { @Test public void testCancel() { - TripTimes updatedTripTimesA = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesA = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesA.cancelTrip(); assertEquals(RealTimeState.CANCELED, updatedTripTimesA.getRealTimeState()); } @Test public void testNoData() { - TripTimes updatedTripTimesA = new TripTimes(createInitialTripTimes()); + TripTimes updatedTripTimesA = createInitialTripTimes().copyOfScheduledTimes(); updatedTripTimesA.setNoData(1); assertFalse(updatedTripTimesA.isNoDataStop(0)); assertTrue(updatedTripTimesA.isNoDataStop(1)); @@ -463,9 +463,9 @@ public void testApply() { stopTimes.add(stopTime1); stopTimes.add(stopTime2); - TripTimes differingTripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + TripTimes differingTripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); - TripTimes updatedTripTimesA = new TripTimes(differingTripTimes); + TripTimes updatedTripTimesA = differingTripTimes.copyOfScheduledTimes(); updatedTripTimesA.updateArrivalTime(1, 89); updatedTripTimesA.updateDepartureTime(1, 98); diff --git a/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java b/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java index f7f290e4608..463e9342e6d 100644 --- a/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java +++ b/src/test/java/org/opentripplanner/transit/speed_test/SpeedTest.java @@ -15,6 +15,8 @@ import java.util.function.Predicate; import org.opentripplanner.TestServerContext; import org.opentripplanner.datastore.OtpDataStore; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationRepository; +import org.opentripplanner.ext.stopconsolidation.internal.DefaultStopConsolidationService; import org.opentripplanner.framework.application.OtpAppException; import org.opentripplanner.model.plan.Itinerary; import org.opentripplanner.raptor.configure.RaptorConfig; @@ -118,6 +120,7 @@ public SpeedTest( TestServerContext.createEmissionsService(), config.flexConfig, List.of(), + null, null ); // Creating transitLayerForRaptor should be integrated into the TransitModel, but for now diff --git a/src/test/java/org/opentripplanner/updater/vehicle_position/RealtimeVehicleMatcherTest.java b/src/test/java/org/opentripplanner/updater/vehicle_position/RealtimeVehicleMatcherTest.java index 0654211d1e1..29d03844260 100644 --- a/src/test/java/org/opentripplanner/updater/vehicle_position/RealtimeVehicleMatcherTest.java +++ b/src/test/java/org/opentripplanner/updater/vehicle_position/RealtimeVehicleMatcherTest.java @@ -37,7 +37,7 @@ import org.opentripplanner.transit.model.network.TripPattern; import org.opentripplanner.transit.model.timetable.OccupancyStatus; import org.opentripplanner.transit.model.timetable.Trip; -import org.opentripplanner.transit.model.timetable.TripTimes; +import org.opentripplanner.transit.model.timetable.TripTimesFactory; public class RealtimeVehicleMatcherTest { @@ -345,7 +345,7 @@ void inferServiceDayOfTripAt6(String time, String expectedDate) { testModel.stopTime(trip, 1, fivePast6) ); - var tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + var tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); var instant = OffsetDateTime.parse(time).toInstant(); var inferredDate = RealtimeVehiclePatternMatcher.inferServiceDate(tripTimes, zoneId, instant); @@ -364,7 +364,7 @@ void inferServiceDateCloseToMidnight() { testModel.stopTime(trip, 1, fivePastMidnight) ); - var tripTimes = new TripTimes(trip, stopTimes, new Deduplicator()); + var tripTimes = TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator()); var time = OffsetDateTime.parse("2022-04-05T00:04:00+02:00").toInstant(); @@ -384,7 +384,7 @@ private static TripPattern tripPattern(Trip trip, List stopTimes) { .build(); pattern .getScheduledTimetable() - .addTripTimes(new TripTimes(trip, stopTimes, new Deduplicator())); + .addTripTimes(TripTimesFactory.tripTimes(trip, stopTimes, new Deduplicator())); return pattern; } diff --git a/src/test/resources/standalone/config/build-config.json b/src/test/resources/standalone/config/build-config.json index fbdaf3598dd..63df4608944 100644 --- a/src/test/resources/standalone/config/build-config.json +++ b/src/test/resources/standalone/config/build-config.json @@ -74,6 +74,7 @@ } } ], + "stopConsolidationFile": "consolidated-stops.csv", "emissions": { "carAvgCo2PerKm": 170, "carAvgOccupancy": 1.3