diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80531a5de..f516e09e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ on: branches: [ master ] jobs: - test: + build: runs-on: ubuntu-latest @@ -16,10 +16,10 @@ jobs: - name: Set up JDK uses: actions/setup-java@v1 with: - java-version: 8 + java-version: 11 - name: Cache Maven dependencies - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -27,4 +27,14 @@ jobs: ${{ runner.os }}-maven- - name: Test project with Maven - run: mvn --no-transfer-progress test verify + run: mvn --no-transfer-progress test install + + - name: Build documentation + run: mvn --no-transfer-progress site + + - name: Deploy documentation to Github Pages + # only deploy after merging to master + if: github.repository_owner == 'OneBusAway' && github.event_name == 'push' && github.ref == 'refs/heads/master' + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: target/site/ diff --git a/onebusaway-gtfs-hibernate-cli/pom.xml b/onebusaway-gtfs-hibernate-cli/pom.xml index 798757094..a4823578a 100644 --- a/onebusaway-gtfs-hibernate-cli/pom.xml +++ b/onebusaway-gtfs-hibernate-cli/pom.xml @@ -3,7 +3,7 @@ org.onebusaway onebusaway-gtfs-modules - 1.3.112-openmove-8 + 1.4.15-openmove-1 onebusaway-gtfs-hibernate-cli onebusaway-gtfs-hibernate-cli @@ -28,7 +28,8 @@ org.slf4j - slf4j-log4j12 + slf4j-simple + ${slf4j_version} diff --git a/onebusaway-gtfs-hibernate-cli/src/main/resources/log4j.properties b/onebusaway-gtfs-hibernate-cli/src/main/resources/log4j.properties deleted file mode 100644 index 6df8853de..000000000 --- a/onebusaway-gtfs-hibernate-cli/src/main/resources/log4j.properties +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2008 Brian Ferris -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - - -log4j.rootLogger = INFO, stdout - -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold = DEBUG -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n - - - diff --git a/onebusaway-gtfs-hibernate-cli/src/main/resources/simplelogger.properties b/onebusaway-gtfs-hibernate-cli/src/main/resources/simplelogger.properties new file mode 100644 index 000000000..712780a1e --- /dev/null +++ b/onebusaway-gtfs-hibernate-cli/src/main/resources/simplelogger.properties @@ -0,0 +1,25 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=info +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +org.slf4j.simpleLogger.showDateTime=true +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss +# Set to true if you want to output the current thread name. +# Defaults to true. +org.slf4j.simpleLogger.showThreadName=false +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +org.slf4j.simpleLogger.showShortLogName=true diff --git a/onebusaway-gtfs-hibernate/pom.xml b/onebusaway-gtfs-hibernate/pom.xml index 84c86ce61..c72304fed 100644 --- a/onebusaway-gtfs-hibernate/pom.xml +++ b/onebusaway-gtfs-hibernate/pom.xml @@ -9,7 +9,7 @@ org.onebusaway onebusaway-gtfs-modules - 1.3.112-openmove-8 + 1.4.15-openmove-1 @@ -32,9 +32,9 @@ test - mysql - mysql-connector-java - 5.1.48 + com.mysql + mysql-connector-j + 8.2.0 junit @@ -43,8 +43,8 @@ org.slf4j - slf4j-log4j12 - test + slf4j-simple + ${slf4j_version} com.sun.xml.bind diff --git a/onebusaway-gtfs-hibernate/src/main/java/org/onebusaway/gtfs/impl/HibernateGtfsRelationalDaoImpl.java b/onebusaway-gtfs-hibernate/src/main/java/org/onebusaway/gtfs/impl/HibernateGtfsRelationalDaoImpl.java index f75f59cac..89f7a5881 100644 --- a/onebusaway-gtfs-hibernate/src/main/java/org/onebusaway/gtfs/impl/HibernateGtfsRelationalDaoImpl.java +++ b/onebusaway-gtfs-hibernate/src/main/java/org/onebusaway/gtfs/impl/HibernateGtfsRelationalDaoImpl.java @@ -113,6 +113,16 @@ public List getAllRoutes() { return _ops.find("FROM Route route"); } + @Override + public List getAllRouteStops() { + return _ops.find("FROM RouteStop routeStop"); + } + + @Override + public List getAllRouteShapes() { + return _ops.find("FROM RouteShape routeShape"); + } + @Override public List getAllStops() { return _ops.find("FROM Stop"); @@ -151,6 +161,17 @@ public Collection getAllTransfers() { @Override public Collection getAllRiderships() { return _ops.find("FROM Ridership"); } + + @Override + public Collection getAllDirectionEntries() { + return _ops.find("FROM DirectionEntry"); + } + + @Override + public Collection getAllWrongWayConcurrencies() { + return _ops.find("FROM WrongWayConcurrency"); + } + @Override public Agency getAgencyForId(String id) { return (Agency) _ops.get(Agency.class, id); @@ -182,8 +203,8 @@ public FareProduct getFareProductForId(AgencyAndId id) { } @Override - public Collection getAllFareContainers() { - return _ops.find("FROM FareContainer"); + public Collection getAllFareMedia() { + return _ops.find("FROM FareMedium"); } @Override @@ -266,6 +287,7 @@ public Collection getAllAreas() { return _ops.find("from Area"); } + @Deprecated @Override public Collection getAllLocationGroupElements() { Collection groups = _ops.find("FROM LocationGroup"); @@ -278,11 +300,25 @@ public Collection getAllLocationGroupElements() { })).collect(Collectors.toList()); } + @Override + public Collection getAllStopAreaElements() { + Collection groups = _ops.find("FROM StopArea"); + return groups.stream().flatMap(group -> group.getLocations().stream().map(stopLocation -> { + var stopAreaElement = new StopAreaElement(); + stopAreaElement.setId(group.getId()); + stopAreaElement.setStopLocation(stopLocation); + return stopAreaElement; + })).collect(Collectors.toList()); + } + @Override public Collection getAllLocationGroups() { return _ops.find("FROM LocationGroup"); } - + @Override + public Collection getAllStopAreas() { + return _ops.find("from StopArea"); + } @Override public Collection getAllLocations() { return _ops.find("FROM Location"); @@ -299,8 +335,23 @@ public Collection getAllTranslations() { } @Override - public Collection getAllStopAreas() { - return _ops.find("from StopArea"); + public List getOptionalMetadataFilenames() { + return new ArrayList<>(); + } + + @Override + public boolean hasMetadata(String filename) { + return false; + } + + @Override + public String getMetadata(String filename) { + return null; + } + + @Override + public void addMetadata(String filename, String content) { + } /**** diff --git a/onebusaway-gtfs-hibernate/src/main/resources/org/onebusaway/gtfs/model/GtfsMapping.hibernate.xml b/onebusaway-gtfs-hibernate/src/main/resources/org/onebusaway/gtfs/model/GtfsMapping.hibernate.xml index e70ded90e..d17e6902d 100644 --- a/onebusaway-gtfs-hibernate/src/main/resources/org/onebusaway/gtfs/model/GtfsMapping.hibernate.xml +++ b/onebusaway-gtfs-hibernate/src/main/resources/org/onebusaway/gtfs/model/GtfsMapping.hibernate.xml @@ -83,6 +83,8 @@ + + @@ -206,6 +208,7 @@ + diff --git a/onebusaway-gtfs-hibernate/src/test/resources/log4j.properties b/onebusaway-gtfs-hibernate/src/test/resources/log4j.properties deleted file mode 100644 index 6df8853de..000000000 --- a/onebusaway-gtfs-hibernate/src/test/resources/log4j.properties +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2008 Brian Ferris -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - - -log4j.rootLogger = INFO, stdout - -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold = DEBUG -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n - - - diff --git a/onebusaway-gtfs-hibernate/src/test/resources/simplelogger.properties b/onebusaway-gtfs-hibernate/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..712780a1e --- /dev/null +++ b/onebusaway-gtfs-hibernate/src/test/resources/simplelogger.properties @@ -0,0 +1,25 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=info +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +org.slf4j.simpleLogger.showDateTime=true +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss +# Set to true if you want to output the current thread name. +# Defaults to true. +org.slf4j.simpleLogger.showThreadName=false +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +org.slf4j.simpleLogger.showShortLogName=true diff --git a/onebusaway-gtfs-merge-cli/pom.xml b/onebusaway-gtfs-merge-cli/pom.xml index b9157592d..c19772239 100644 --- a/onebusaway-gtfs-merge-cli/pom.xml +++ b/onebusaway-gtfs-merge-cli/pom.xml @@ -3,7 +3,7 @@ onebusaway-gtfs-modules org.onebusaway - 1.3.112-openmove-8 + 1.4.15-openmove-1 .. onebusaway-gtfs-merge-cli @@ -29,7 +29,8 @@ org.slf4j - slf4j-log4j12 + slf4j-simple + ${slf4j_version} diff --git a/onebusaway-gtfs-merge-cli/src/main/resources/log4j.properties b/onebusaway-gtfs-merge-cli/src/main/resources/log4j.properties deleted file mode 100644 index 2c9757ccc..000000000 --- a/onebusaway-gtfs-merge-cli/src/main/resources/log4j.properties +++ /dev/null @@ -1,9 +0,0 @@ -log4j.rootLogger = INFO, stdout - -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold = DEBUG -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n - - diff --git a/onebusaway-gtfs-merge-cli/src/main/resources/simplelogger.properties b/onebusaway-gtfs-merge-cli/src/main/resources/simplelogger.properties new file mode 100644 index 000000000..712780a1e --- /dev/null +++ b/onebusaway-gtfs-merge-cli/src/main/resources/simplelogger.properties @@ -0,0 +1,25 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=info +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +org.slf4j.simpleLogger.showDateTime=true +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss +# Set to true if you want to output the current thread name. +# Defaults to true. +org.slf4j.simpleLogger.showThreadName=false +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +org.slf4j.simpleLogger.showShortLogName=true diff --git a/onebusaway-gtfs-merge/pom.xml b/onebusaway-gtfs-merge/pom.xml index f4b77f13c..5dba66aa9 100644 --- a/onebusaway-gtfs-merge/pom.xml +++ b/onebusaway-gtfs-merge/pom.xml @@ -3,7 +3,7 @@ onebusaway-gtfs-modules org.onebusaway - 1.3.112-openmove-8 + 1.4.15-openmove-1 .. onebusaway-gtfs-merge @@ -24,8 +24,8 @@ org.slf4j - slf4j-log4j12 - test + slf4j-simple + ${slf4j_version} junit diff --git a/onebusaway-gtfs-merge/src/main/java/org/onebusaway/gtfs_merge/GtfsMerger.java b/onebusaway-gtfs-merge/src/main/java/org/onebusaway/gtfs_merge/GtfsMerger.java index 77be3e311..a5aa02f76 100644 --- a/onebusaway-gtfs-merge/src/main/java/org/onebusaway/gtfs_merge/GtfsMerger.java +++ b/onebusaway-gtfs-merge/src/main/java/org/onebusaway/gtfs_merge/GtfsMerger.java @@ -34,20 +34,7 @@ import org.onebusaway.gtfs.model.Node; import org.onebusaway.gtfs.serialization.GtfsReader; import org.onebusaway.gtfs.serialization.GtfsWriter; -import org.onebusaway.gtfs_merge.strategies.AgencyMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.AreaMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.EntityMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.FareAttributeMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.FareRuleMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.FeedInfoMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.FrequencyMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.RouteMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.ServiceCalendarMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.ShapePointMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.StopMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.TransferMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.TripMergeStrategy; -import org.onebusaway.gtfs_merge.strategies.ZoneMergeStrategy; +import org.onebusaway.gtfs_merge.strategies.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,6 +74,8 @@ public class GtfsMerger { private EntityMergeStrategy _zoneStrategy = new ZoneMergeStrategy(); + private EntityMergeStrategy _metadataStrategy = new MetadataMergeStrategy(); + public void setAgencyStrategy(EntityMergeStrategy agencyStrategy) { _agencyStrategy = agencyStrategy; } @@ -136,7 +125,8 @@ public void setAreaStrategy(AreaMergeStrategy areaStrategy) { public void setZoneStrategy(EntityMergeStrategy zoneStrategy) { _zoneStrategy = zoneStrategy; } - + public void setMetadataStrategy(EntityMergeStrategy metadataStrategy) { _metadataStrategy = metadataStrategy; } + public EntityMergeStrategy getEntityMergeStrategyForEntityType( Class entityType) { List strategies = new ArrayList(); @@ -237,7 +227,7 @@ public void run(List inputPaths, File outputPath) throws IOException { "lastModifiedTime", FileTime.fromMillis(newestFile)); } else { - _log.info("outputPath not a file, skipping"); + _log.info("outputPath not a file, skipping setting lastModified"); } } @@ -262,6 +252,7 @@ private void buildStrategies(List strategies) { strategies.add(_fareRuleStrategy); strategies.add(_feedInfoStrategy); strategies.add(_zoneStrategy); + strategies.add(_metadataStrategy); } } diff --git a/onebusaway-gtfs-merge/src/main/java/org/onebusaway/gtfs_merge/strategies/MetadataMergeStrategy.java b/onebusaway-gtfs-merge/src/main/java/org/onebusaway/gtfs_merge/strategies/MetadataMergeStrategy.java new file mode 100644 index 000000000..5444f3a5b --- /dev/null +++ b/onebusaway-gtfs-merge/src/main/java/org/onebusaway/gtfs_merge/strategies/MetadataMergeStrategy.java @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_merge.strategies; + +import org.onebusaway.gtfs.model.Agency; +import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; +import org.onebusaway.gtfs.services.GtfsRelationalDao; +import org.onebusaway.gtfs_merge.GtfsMergeContext; + +import java.util.Collection; + +/** + * Merge metadata files such as modifications.txt + */ +public class MetadataMergeStrategy implements EntityMergeStrategy { + @Override + public void getEntityTypes(Collection> entityTypes) { + // no-op, metadata is not represented via entityTypes + } + + @Override + public void merge(GtfsMergeContext context) { + GtfsRelationalDao source = context.getSource(); + GtfsMutableRelationalDao target = context.getTarget(); + String agencyStr = getAgencyStr(source); + for (String filename : source.getOptionalMetadataFilenames()) { + if (source.hasMetadata(filename)) { + StringBuffer content = new StringBuffer(); + content.append("\n====== "); + content.append(agencyStr); + content.append(" ======\n"); + content.append(source.getMetadata(filename)); + if (target.hasMetadata(filename)) { + content.append(target.getMetadata(filename)); + } + target.addMetadata(filename, content.toString()); + } + } + } + + private String getAgencyStr(GtfsRelationalDao source) { + int agencyCount = source.getAllAgencies().size(); + if (agencyCount == 0) + return ""; + if (agencyCount == 1) + return source.getAllAgencies().iterator().next().getId(); + StringBuffer sb = new StringBuffer(); + sb.append("["); + for (Agency agency : source.getAllAgencies()) { + sb.append(agency).append(","); + } + return sb.substring(0, sb.length()-2) + "]"; + } +} diff --git a/onebusaway-gtfs-merge/src/test/java/org/onebusaway/gtfs_merge/MergeExpectedFilesTest.java b/onebusaway-gtfs-merge/src/test/java/org/onebusaway/gtfs_merge/MergeExpectedFilesTest.java new file mode 100644 index 000000000..02be0698d --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/java/org/onebusaway/gtfs_merge/MergeExpectedFilesTest.java @@ -0,0 +1,128 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_merge; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onebusaway.gtfs.impl.FileSupport; +import org.onebusaway.gtfs.impl.ZipHandler; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertTrue; + +/** + * Test appending metadata inputs as part of merge. + */ +public class MergeExpectedFilesTest { + + private GtfsMerger _merger; + + private FileSupport _support = new FileSupport(); + + @Before + public void before() throws IOException { + _merger = new GtfsMerger(); + } + + @After + public void after() { + _support.cleanup(); + } + + @Test + public void testDirectoryMerge() throws Exception { + File path0 = new File(getClass().getResource( + "/org/onebusaway/gtfs_merge/testagency").toURI()); + File path1 = new File(getClass().getResource( + "/org/onebusaway/gtfs_merge/testagency1").toURI()); + File path2 = new File(getClass().getResource( + "/org/onebusaway/gtfs_merge/testagency2").toURI()); + + List paths = new ArrayList(); + paths.add(path0); + paths.add(path1); + paths.add(path2); + + File gtfsDirectory = merge(paths, createTempDirectory()); + String modLocation = gtfsDirectory.getAbsolutePath() + File.separator + "modifications.txt"; + File expectedFile = new File(modLocation); + // verify modifications.txt is there!!!! + assertTrue("expected modifications.txt to be present!", expectedFile.exists()); + assertTrue("expected modifications.txt to be a file!", expectedFile.isFile()); + StringBuffer sb = new StringBuffer(); + BufferedReader br = new BufferedReader(new FileReader(expectedFile)); + sb.append(br.lines().collect(Collectors.joining(System.lineSeparator()))); + assertTrue(sb.toString().contains("testagency")); + assertTrue(sb.toString().contains("testagency1")); + assertTrue(sb.toString().contains("testagency2")); + } + + @Test + public void testZipMerge() throws Exception { + File path0 = new File(getClass().getResource( + "/org/onebusaway/gtfs_merge/testagency.zip").toURI()); + File path1 = new File(getClass().getResource( + "/org/onebusaway/gtfs_merge/testagency1.zip").toURI()); + File path2 = new File(getClass().getResource( + "/org/onebusaway/gtfs_merge/testagency2.zip").toURI()); + List paths = new ArrayList(); + paths.add(path0); + paths.add(path1); + paths.add(path2); + + File gtfsZip = merge(paths, createTempFile()); + + ZipHandler zip = new ZipHandler(gtfsZip); + String content = zip.readTextFromFile("modifications.txt"); + assertTrue(content.contains("testagency ")); + assertTrue(content.contains("testagency1")); + assertTrue(content.contains("testagency2")); + + } + + private File createTempDirectory() throws IOException { + File tmpDirectory = File.createTempFile("MergeExpectedFilesTest-", "-tmp"); + if (tmpDirectory.exists()) + _support.deleteFileRecursively(tmpDirectory); + tmpDirectory.mkdirs(); + _support.markForDeletion(tmpDirectory); + return tmpDirectory; + } + + private File createTempFile() throws IOException { + File tmpZipFileDirectory = File.createTempFile("CarryForwardExpectedFilesTestZip-", "-tmp"); + if (tmpZipFileDirectory.exists()) + _support.deleteFileRecursively(tmpZipFileDirectory); + tmpZipFileDirectory.mkdirs(); + + File zipFile = new File(tmpZipFileDirectory.getAbsolutePath() + File.separator + "gtfs.zip"); + _support.markForDeletion(zipFile); + return zipFile; + } + + private File merge(List paths, File destination) throws IOException { + _merger.run(paths, destination); + return destination; + } +} diff --git a/onebusaway-gtfs-merge/src/test/resources/log4j.properties b/onebusaway-gtfs-merge/src/test/resources/log4j.properties deleted file mode 100644 index 2c9757ccc..000000000 --- a/onebusaway-gtfs-merge/src/test/resources/log4j.properties +++ /dev/null @@ -1,9 +0,0 @@ -log4j.rootLogger = INFO, stdout - -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold = DEBUG -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n - - diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency.zip b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency.zip new file mode 100644 index 000000000..a515a6901 Binary files /dev/null and b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency.zip differ diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/agency.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/agency.txt new file mode 100644 index 000000000..31e2a82e4 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/agency.txt @@ -0,0 +1,2 @@ +agency_id,agency_name,agency_url,agency_timezone +agency,Fake Agency,http://fake.example.com,America/New_York diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/calendar.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/calendar.txt new file mode 100644 index 000000000..6b351dffa --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/calendar.txt @@ -0,0 +1,3 @@ +service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date +alldays,1,1,1,1,1,1,1,20090101,20500101 +weekdays,1,1,1,1,1,0,0,20090101,20500101 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/modifications.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/modifications.txt new file mode 100644 index 000000000..9bf255385 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/modifications.txt @@ -0,0 +1 @@ +A simple comment for testagency. diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/routes.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/routes.txt new file mode 100644 index 000000000..0a4dd22de --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/routes.txt @@ -0,0 +1,8 @@ +route_id,route_short_name,route_long_name,route_type +1,1,1,3 +2,2,2,3 +3,3,3,3 +4,4,4,4 +5,5,5,5 +6,6,6,6 +7,7,7,7 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/shapes.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/shapes.txt new file mode 100644 index 000000000..5e0159c3f --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/shapes.txt @@ -0,0 +1,10 @@ +shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled +4,41.0,-75.0,1, +4,42.0,-75.0,2, +4,42.5,-75.3,3, +4,43.0,-75.0,4, +5,41.0,-72.0,1,0 +5,41.5,-72.5,2,1.234 +5,41.0,-73.0,3,17.62 +5,41.5,-73.5,4,35.234 +5,41.0,-74.0,5,52.01 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/stop_times.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/stop_times.txt new file mode 100644 index 000000000..228561b53 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/stop_times.txt @@ -0,0 +1,44 @@ +trip_id,arrival_time,departure_time,stop_id,stop_sequence,shape_dist_traveled,pickup_type,drop_off_type +1.1,00:00:00,00:00:00,A,1,,, +1.1,00:10:00,00:10:00,B,2,,, +1.1,00:20:00,00:20:00,C,3,,, +1.2,00:20:00,00:20:00,A,1,0,, +1.2,,,B,2,,3,2 +1.2,00:40:00,00:40:00,C,3,52.1,, +1.3,08:00:00,08:00:00,A,1,,, +1.3,08:10:00,08:20:00,B,2,,, +1.3,08:30:00,08:30:00,C,3,,, +2.1,00:20:00,00:20:00,B,1,,, +2.1,00:30:00,00:30:00,C,2,,, +2.1,00:40:00,00:40:00,D,3,,, +2.2,00:50:00,00:50:00,B,1,,, +2.2,01:00:00,01:00:00,C,2,,, +2.2,01:10:00,01:10:00,D,3,,, +3.1,00:40:00,00:40:00,B,1,,, +3.1,00:50:00,00:50:00,C,2,,, +3.1,01:00:00,01:00:00,D,3,,, +3.1,01:10:00,01:10:00,E,4,,, +3.2,01:00:00,01:00:00,B,1,,, +3.2,01:10:00,01:10:00,C,2,,, +3.2,01:20:00,01:20:00,D,3,,, +3.2,01:30:00,01:30:00,E,4,,, +4.1,05:00:00,05:00:00,F,1,,, +4.1,05:30:00,05:30:00,G,2,,, +4.1,06:00:00,06:00:00,H,3,,, +4.2,23:00:00,23:00:00,F,1,,, +4.2,23:30:00,23:30:00,G,2,,, +4.2,24:00:00,24:00:00,H,3,,, +4.3,23:40:00,23:40:00,F,1,,, +4.3,24:10:00,24:10:00,G,2,,, +4.3,24:40:00,24:40:00,H,3,,, +5.1,08:00:00,08:00:00,I,1,0,, +5.1,08:10:00,08:10:00,J,2,22.5,, +5.1,08:20:00,08:20:00,K,3,52.01,, +6.1,12:00:00,12:00:00,I,1,,, +6.1,12:10:00,12:10:00,J,2,,, +6.2,13:00:00,13:00:00,I,1,,, +6.2,13:10:00,13:10:00,J,2,,, +7.1,12:20:00,12:20:00,J,1,,, +7.1,12:30:00,12:30:00,K,2,,, +7.2,13:20:00,13:20:00,J,1,,, +7.2,13:30:00,13:30:00,K,2,,, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/stops.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/stops.txt new file mode 100644 index 000000000..37f31d1a3 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/stops.txt @@ -0,0 +1,14 @@ +stop_id,stop_name,stop_lat,stop_lon,wheelchair_boarding +A,A,40,-73,1 +B,B,40,-74,1 +C,C,40,-75,0 +D,D,40,-76,1 +E,E,40,-77,1 +F,F,41,-75, +G,G,42,-75, +H,H,43,-75, +I,I,41,-72, +J,J,41,-73, +K,K,41,-74, +L,L,41.000001,-73.000001, +M,M,41.000002,-73.000002, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/transfers.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/transfers.txt new file mode 100644 index 000000000..f085afa3a --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/transfers.txt @@ -0,0 +1,5 @@ +to_stop_id,from_stop_id,transfer_type,min_transfer_time +K,L,0, +L,K,0, +M,K,3, +K,M,3, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/trips.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/trips.txt new file mode 100644 index 000000000..40f94cba4 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency/trips.txt @@ -0,0 +1,16 @@ +route_id,service_id,trip_id,shape_id,block_id,wheelchair_accessible +1,alldays,1.1,,,1 +1,alldays,1.2,,,1 +1,alldays,1.3,,,1 +2,alldays,2.1,,,0 +2,alldays,2.2,,,0 +3,alldays,3.1,,,1 +3,alldays,3.2,,,1 +4,weekdays,4.1,4,, +4,weekdays,4.2,4,, +4,weekdays,4.3,4,, +5,alldays,5.1,5,, +6,alldays,6.1,,block.1, +7,alldays,7.1,,block.1, +6,alldays,6.2,,block.2, +7,alldays,7.2,,block.2, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1.zip b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1.zip new file mode 100644 index 000000000..92eafb976 Binary files /dev/null and b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1.zip differ diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/agency.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/agency.txt new file mode 100644 index 000000000..eaceaf9df --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/agency.txt @@ -0,0 +1,2 @@ +agency_id,agency_name,agency_url,agency_timezone +agency1,Fake Agency1,http://fake.example.com,America/New_York diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/calendar.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/calendar.txt new file mode 100644 index 000000000..6b351dffa --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/calendar.txt @@ -0,0 +1,3 @@ +service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date +alldays,1,1,1,1,1,1,1,20090101,20500101 +weekdays,1,1,1,1,1,0,0,20090101,20500101 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/modifications.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/modifications.txt new file mode 100644 index 000000000..5ea4b46a3 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/modifications.txt @@ -0,0 +1,5 @@ +This is long text +that forms +the basis + +of testagency1 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/routes.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/routes.txt new file mode 100644 index 000000000..0a4dd22de --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/routes.txt @@ -0,0 +1,8 @@ +route_id,route_short_name,route_long_name,route_type +1,1,1,3 +2,2,2,3 +3,3,3,3 +4,4,4,4 +5,5,5,5 +6,6,6,6 +7,7,7,7 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/shapes.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/shapes.txt new file mode 100644 index 000000000..5e0159c3f --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/shapes.txt @@ -0,0 +1,10 @@ +shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled +4,41.0,-75.0,1, +4,42.0,-75.0,2, +4,42.5,-75.3,3, +4,43.0,-75.0,4, +5,41.0,-72.0,1,0 +5,41.5,-72.5,2,1.234 +5,41.0,-73.0,3,17.62 +5,41.5,-73.5,4,35.234 +5,41.0,-74.0,5,52.01 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/stop_times.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/stop_times.txt new file mode 100644 index 000000000..228561b53 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/stop_times.txt @@ -0,0 +1,44 @@ +trip_id,arrival_time,departure_time,stop_id,stop_sequence,shape_dist_traveled,pickup_type,drop_off_type +1.1,00:00:00,00:00:00,A,1,,, +1.1,00:10:00,00:10:00,B,2,,, +1.1,00:20:00,00:20:00,C,3,,, +1.2,00:20:00,00:20:00,A,1,0,, +1.2,,,B,2,,3,2 +1.2,00:40:00,00:40:00,C,3,52.1,, +1.3,08:00:00,08:00:00,A,1,,, +1.3,08:10:00,08:20:00,B,2,,, +1.3,08:30:00,08:30:00,C,3,,, +2.1,00:20:00,00:20:00,B,1,,, +2.1,00:30:00,00:30:00,C,2,,, +2.1,00:40:00,00:40:00,D,3,,, +2.2,00:50:00,00:50:00,B,1,,, +2.2,01:00:00,01:00:00,C,2,,, +2.2,01:10:00,01:10:00,D,3,,, +3.1,00:40:00,00:40:00,B,1,,, +3.1,00:50:00,00:50:00,C,2,,, +3.1,01:00:00,01:00:00,D,3,,, +3.1,01:10:00,01:10:00,E,4,,, +3.2,01:00:00,01:00:00,B,1,,, +3.2,01:10:00,01:10:00,C,2,,, +3.2,01:20:00,01:20:00,D,3,,, +3.2,01:30:00,01:30:00,E,4,,, +4.1,05:00:00,05:00:00,F,1,,, +4.1,05:30:00,05:30:00,G,2,,, +4.1,06:00:00,06:00:00,H,3,,, +4.2,23:00:00,23:00:00,F,1,,, +4.2,23:30:00,23:30:00,G,2,,, +4.2,24:00:00,24:00:00,H,3,,, +4.3,23:40:00,23:40:00,F,1,,, +4.3,24:10:00,24:10:00,G,2,,, +4.3,24:40:00,24:40:00,H,3,,, +5.1,08:00:00,08:00:00,I,1,0,, +5.1,08:10:00,08:10:00,J,2,22.5,, +5.1,08:20:00,08:20:00,K,3,52.01,, +6.1,12:00:00,12:00:00,I,1,,, +6.1,12:10:00,12:10:00,J,2,,, +6.2,13:00:00,13:00:00,I,1,,, +6.2,13:10:00,13:10:00,J,2,,, +7.1,12:20:00,12:20:00,J,1,,, +7.1,12:30:00,12:30:00,K,2,,, +7.2,13:20:00,13:20:00,J,1,,, +7.2,13:30:00,13:30:00,K,2,,, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/stops.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/stops.txt new file mode 100644 index 000000000..37f31d1a3 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/stops.txt @@ -0,0 +1,14 @@ +stop_id,stop_name,stop_lat,stop_lon,wheelchair_boarding +A,A,40,-73,1 +B,B,40,-74,1 +C,C,40,-75,0 +D,D,40,-76,1 +E,E,40,-77,1 +F,F,41,-75, +G,G,42,-75, +H,H,43,-75, +I,I,41,-72, +J,J,41,-73, +K,K,41,-74, +L,L,41.000001,-73.000001, +M,M,41.000002,-73.000002, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/transfers.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/transfers.txt new file mode 100644 index 000000000..f085afa3a --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/transfers.txt @@ -0,0 +1,5 @@ +to_stop_id,from_stop_id,transfer_type,min_transfer_time +K,L,0, +L,K,0, +M,K,3, +K,M,3, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/trips.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/trips.txt new file mode 100644 index 000000000..40f94cba4 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency1/trips.txt @@ -0,0 +1,16 @@ +route_id,service_id,trip_id,shape_id,block_id,wheelchair_accessible +1,alldays,1.1,,,1 +1,alldays,1.2,,,1 +1,alldays,1.3,,,1 +2,alldays,2.1,,,0 +2,alldays,2.2,,,0 +3,alldays,3.1,,,1 +3,alldays,3.2,,,1 +4,weekdays,4.1,4,, +4,weekdays,4.2,4,, +4,weekdays,4.3,4,, +5,alldays,5.1,5,, +6,alldays,6.1,,block.1, +7,alldays,7.1,,block.1, +6,alldays,6.2,,block.2, +7,alldays,7.2,,block.2, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2.zip b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2.zip new file mode 100644 index 000000000..209caa41b Binary files /dev/null and b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2.zip differ diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/agency.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/agency.txt new file mode 100644 index 000000000..9e71d386f --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/agency.txt @@ -0,0 +1,2 @@ +agency_id,agency_name,agency_url,agency_timezone +agency2,Fake Agency 2,http://fake.example.com,America/New_York diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/calendar.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/calendar.txt new file mode 100644 index 000000000..6b351dffa --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/calendar.txt @@ -0,0 +1,3 @@ +service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date +alldays,1,1,1,1,1,1,1,20090101,20500101 +weekdays,1,1,1,1,1,0,0,20090101,20500101 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/modifications.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/modifications.txt new file mode 100644 index 000000000..821201d3a --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/modifications.txt @@ -0,0 +1,3 @@ +This is long text that forms the basis +of testagency2 + diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/routes.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/routes.txt new file mode 100644 index 000000000..0a4dd22de --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/routes.txt @@ -0,0 +1,8 @@ +route_id,route_short_name,route_long_name,route_type +1,1,1,3 +2,2,2,3 +3,3,3,3 +4,4,4,4 +5,5,5,5 +6,6,6,6 +7,7,7,7 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/shapes.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/shapes.txt new file mode 100644 index 000000000..5e0159c3f --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/shapes.txt @@ -0,0 +1,10 @@ +shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled +4,41.0,-75.0,1, +4,42.0,-75.0,2, +4,42.5,-75.3,3, +4,43.0,-75.0,4, +5,41.0,-72.0,1,0 +5,41.5,-72.5,2,1.234 +5,41.0,-73.0,3,17.62 +5,41.5,-73.5,4,35.234 +5,41.0,-74.0,5,52.01 diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/stop_times.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/stop_times.txt new file mode 100644 index 000000000..228561b53 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/stop_times.txt @@ -0,0 +1,44 @@ +trip_id,arrival_time,departure_time,stop_id,stop_sequence,shape_dist_traveled,pickup_type,drop_off_type +1.1,00:00:00,00:00:00,A,1,,, +1.1,00:10:00,00:10:00,B,2,,, +1.1,00:20:00,00:20:00,C,3,,, +1.2,00:20:00,00:20:00,A,1,0,, +1.2,,,B,2,,3,2 +1.2,00:40:00,00:40:00,C,3,52.1,, +1.3,08:00:00,08:00:00,A,1,,, +1.3,08:10:00,08:20:00,B,2,,, +1.3,08:30:00,08:30:00,C,3,,, +2.1,00:20:00,00:20:00,B,1,,, +2.1,00:30:00,00:30:00,C,2,,, +2.1,00:40:00,00:40:00,D,3,,, +2.2,00:50:00,00:50:00,B,1,,, +2.2,01:00:00,01:00:00,C,2,,, +2.2,01:10:00,01:10:00,D,3,,, +3.1,00:40:00,00:40:00,B,1,,, +3.1,00:50:00,00:50:00,C,2,,, +3.1,01:00:00,01:00:00,D,3,,, +3.1,01:10:00,01:10:00,E,4,,, +3.2,01:00:00,01:00:00,B,1,,, +3.2,01:10:00,01:10:00,C,2,,, +3.2,01:20:00,01:20:00,D,3,,, +3.2,01:30:00,01:30:00,E,4,,, +4.1,05:00:00,05:00:00,F,1,,, +4.1,05:30:00,05:30:00,G,2,,, +4.1,06:00:00,06:00:00,H,3,,, +4.2,23:00:00,23:00:00,F,1,,, +4.2,23:30:00,23:30:00,G,2,,, +4.2,24:00:00,24:00:00,H,3,,, +4.3,23:40:00,23:40:00,F,1,,, +4.3,24:10:00,24:10:00,G,2,,, +4.3,24:40:00,24:40:00,H,3,,, +5.1,08:00:00,08:00:00,I,1,0,, +5.1,08:10:00,08:10:00,J,2,22.5,, +5.1,08:20:00,08:20:00,K,3,52.01,, +6.1,12:00:00,12:00:00,I,1,,, +6.1,12:10:00,12:10:00,J,2,,, +6.2,13:00:00,13:00:00,I,1,,, +6.2,13:10:00,13:10:00,J,2,,, +7.1,12:20:00,12:20:00,J,1,,, +7.1,12:30:00,12:30:00,K,2,,, +7.2,13:20:00,13:20:00,J,1,,, +7.2,13:30:00,13:30:00,K,2,,, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/stops.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/stops.txt new file mode 100644 index 000000000..37f31d1a3 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/stops.txt @@ -0,0 +1,14 @@ +stop_id,stop_name,stop_lat,stop_lon,wheelchair_boarding +A,A,40,-73,1 +B,B,40,-74,1 +C,C,40,-75,0 +D,D,40,-76,1 +E,E,40,-77,1 +F,F,41,-75, +G,G,42,-75, +H,H,43,-75, +I,I,41,-72, +J,J,41,-73, +K,K,41,-74, +L,L,41.000001,-73.000001, +M,M,41.000002,-73.000002, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/transfers.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/transfers.txt new file mode 100644 index 000000000..f085afa3a --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/transfers.txt @@ -0,0 +1,5 @@ +to_stop_id,from_stop_id,transfer_type,min_transfer_time +K,L,0, +L,K,0, +M,K,3, +K,M,3, diff --git a/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/trips.txt b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/trips.txt new file mode 100644 index 000000000..40f94cba4 --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/org/onebusaway/gtfs_merge/testagency2/trips.txt @@ -0,0 +1,16 @@ +route_id,service_id,trip_id,shape_id,block_id,wheelchair_accessible +1,alldays,1.1,,,1 +1,alldays,1.2,,,1 +1,alldays,1.3,,,1 +2,alldays,2.1,,,0 +2,alldays,2.2,,,0 +3,alldays,3.1,,,1 +3,alldays,3.2,,,1 +4,weekdays,4.1,4,, +4,weekdays,4.2,4,, +4,weekdays,4.3,4,, +5,alldays,5.1,5,, +6,alldays,6.1,,block.1, +7,alldays,7.1,,block.1, +6,alldays,6.2,,block.2, +7,alldays,7.2,,block.2, diff --git a/onebusaway-gtfs-merge/src/test/resources/simplelogger.properties b/onebusaway-gtfs-merge/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..712780a1e --- /dev/null +++ b/onebusaway-gtfs-merge/src/test/resources/simplelogger.properties @@ -0,0 +1,25 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=info +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +org.slf4j.simpleLogger.showDateTime=true +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss +# Set to true if you want to output the current thread name. +# Defaults to true. +org.slf4j.simpleLogger.showThreadName=false +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +org.slf4j.simpleLogger.showShortLogName=true diff --git a/onebusaway-gtfs-transformer-cli-aws/pom.xml b/onebusaway-gtfs-transformer-cli-aws/pom.xml index 9db397554..ff4db43f6 100644 --- a/onebusaway-gtfs-transformer-cli-aws/pom.xml +++ b/onebusaway-gtfs-transformer-cli-aws/pom.xml @@ -9,7 +9,7 @@ org.onebusaway onebusaway-gtfs-modules - 1.3.112-openmove-8 + 1.4.15-openmove-1 @@ -27,7 +27,7 @@ org.onebusaway onebusaway-cloud-aws - 0.0.10 + ${onebusaway_cloud_version} commons-cli @@ -36,7 +36,8 @@ org.slf4j - slf4j-log4j12 + slf4j-simple + ${slf4j_version} diff --git a/onebusaway-gtfs-transformer-cli/pom.xml b/onebusaway-gtfs-transformer-cli/pom.xml index 81548cad9..e482d49f9 100644 --- a/onebusaway-gtfs-transformer-cli/pom.xml +++ b/onebusaway-gtfs-transformer-cli/pom.xml @@ -9,7 +9,7 @@ org.onebusaway onebusaway-gtfs-modules - 1.3.112-openmove-8 + 1.4.15-openmove-1 @@ -31,7 +31,8 @@ org.slf4j - slf4j-log4j12 + slf4j-simple + ${slf4j_version} diff --git a/onebusaway-gtfs-transformer-cli/src/main/resources/log4j.properties b/onebusaway-gtfs-transformer-cli/src/main/resources/log4j.properties deleted file mode 100644 index 2c9757ccc..000000000 --- a/onebusaway-gtfs-transformer-cli/src/main/resources/log4j.properties +++ /dev/null @@ -1,9 +0,0 @@ -log4j.rootLogger = INFO, stdout - -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold = DEBUG -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n - - diff --git a/onebusaway-gtfs-transformer-cli/src/main/resources/simplelogger.properties b/onebusaway-gtfs-transformer-cli/src/main/resources/simplelogger.properties new file mode 100644 index 000000000..712780a1e --- /dev/null +++ b/onebusaway-gtfs-transformer-cli/src/main/resources/simplelogger.properties @@ -0,0 +1,25 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=info +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +org.slf4j.simpleLogger.showDateTime=true +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss +# Set to true if you want to output the current thread name. +# Defaults to true. +org.slf4j.simpleLogger.showThreadName=false +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +org.slf4j.simpleLogger.showShortLogName=true diff --git a/onebusaway-gtfs-transformer/pom.xml b/onebusaway-gtfs-transformer/pom.xml index 7567d9712..0e7b7a0b3 100644 --- a/onebusaway-gtfs-transformer/pom.xml +++ b/onebusaway-gtfs-transformer/pom.xml @@ -9,14 +9,14 @@ org.onebusaway onebusaway-gtfs-modules - 1.3.112-openmove-8 + 1.4.15-openmove-1 org.onebusaway onebusaway-gtfs - 1.3.112-openmove-8 + 1.4.15-openmove-1 org.onebusaway @@ -32,11 +32,11 @@ junit test - - org.slf4j - slf4j-log4j12 - test - + + org.slf4j + slf4j-simple + ${slf4j_version} + org.mockito mockito-core @@ -48,10 +48,15 @@ wsf-api 1.0 + + org.onebusaway + onebusaway-cloud-api + ${onebusaway_cloud_version} + org.onebusaway onebusaway-cloud-noop - 0.0.10 + ${onebusaway_cloud_version} javax.xml.bind @@ -84,8 +89,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.8 - 1.8 + 11 + 11 diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/csv/MTAStation.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/csv/MTAStation.java new file mode 100644 index 000000000..ad97e4254 --- /dev/null +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/csv/MTAStation.java @@ -0,0 +1,260 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.csv; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; + +/** + * Metadata about an MTA Station. + * + * See https://new.mta.info/developers/display-elevators-NYCT + */ +public class MTAStation { + + public static final int ADA_NOT_ACCESSIBLE = 0; + public static final int ADA_FULLY_ACCESSIBLE = 1; + public static final int ADA_PARTIALLY_ACCESSIBLE = 2; + + public static final int GTFS_WHEELCHAIR_UNKNOWN = 0; + public static final int GTFS_WHEELCHAIR_ACCESSIBLE = 1; + public static final int GTFS_WHEELCHAIR_NOT_ACCESSIBLE = 2; + public static final int GTFS_WHEELCHAIR_EXPERIMENTAL_PARTIALLY_ACCESSIBLE = 3; + + private static final int MISSING_VALUE = -999; + @CsvField(name = "Station ID") + private int id; + + @CsvField(name = "Complex ID") + private int complexId; + + @CsvField(name = "GTFS Stop ID") + private String stopId; + + @CsvField(name = "Division") + private String division; + + @CsvField(name = "Line") + private String line; + + @CsvField(name = "Stop Name") + private String stopName; + + @CsvField(name = "Borough") + private String borough; + + @CsvField(name = "Daytime Routes") + private String daytimeRoutes; + + @CsvField(name = "Structure") + private String structure; + + @CsvField(name = "GTFS Latitude") + private double lat; + + @CsvField(name = "GTFS Longitude") + private double lon; + + @CsvField(name = "North Direction Label", optional = true) + private String northDirection; + + @CsvField(name = "South Direction Label", optional = true) + private String southDirection; + + /** + * Look at the ADA column. + * + * 0 means it’s not accessible, + * 1 means it is fully accessible, and + * 2 means it is partially accessible. Partially accessible stations are usually accessible in one direction. + */ + @CsvField(name = "ADA") + private int ada; + + @CsvField(name = "ADA Direction Notes", optional = true) + private String adaDirectionNotes; + + /** + * If ADA_PARTIALLY_ACCESSIBLE and this is 1, this + * station is accessible + */ + @CsvField(name = "ADA NB", optional = true) + private int adaNorthBound = MISSING_VALUE; + + /** + * If ADA_PARTIALLY_ACCESSIBLE and this is 1, this + * station is accessible + */ + @CsvField(name = "ADA SB", optional = true) + private int adaSouthBound = MISSING_VALUE; + + @CsvField(name = "Capital Outage NB", optional = true) + private String capitalOutageNB; + + @CsvField(name = "Capital Outage SB", optional = true) + private String capitalOutageSB; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getComplexId() { + return complexId; + } + + public void setComplexId(int complexId) { + this.complexId = complexId; + } + + public String getStopId() { + return stopId; + } + + public void setStopId(String stopId) { + this.stopId = stopId; + } + + public String getDivision() { + return division; + } + + public void setDivision(String division) { + this.division = division; + } + + public String getLine() { + return line; + } + + public void setLine(String line) { + this.line = line; + } + + public String getStopName() { + return stopName; + } + + public void setStopName(String stopName) { + this.stopName = stopName; + } + + public String getBorough() { + return borough; + } + + public void setBorough(String borough) { + this.borough = borough; + } + + public String getDaytimeRoutes() { + return daytimeRoutes; + } + + public void setDaytimeRoutes(String daytimeRoutes) { + this.daytimeRoutes = daytimeRoutes; + } + + public String getStructure() { + return structure; + } + + public void setStructure(String structure) { + this.structure = structure; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getNorthDirection() { + return northDirection; + } + + public void setNorthDirection(String northDirection) { + this.northDirection = northDirection; + } + + public String getSouthDirection() { + return southDirection; + } + + public void setSouthDirection(String southDirection) { + this.southDirection = southDirection; + } + + public int getAda() { + return ada; + } + + public void setAda(int ada) { + this.ada = ada; + } + + public String getAdaDirectionNotes() { + return adaDirectionNotes; + } + + public void setAdaDirectionNotes(String adaDirectionNotes) { + this.adaDirectionNotes = adaDirectionNotes; + } + + public int getAdaNorthBound() { + return adaNorthBound; + } + + public void setAdaNorthBound(int adaNorthBound) { + this.adaNorthBound = adaNorthBound; + } + + public int getAdaSouthBound() { + return adaSouthBound; + } + + public void setAdaSouthBound(int adaSouthBound) { + this.adaSouthBound = adaSouthBound; + } + + public String getCapitalOutageNB() { + return capitalOutageNB; + } + + public void setCapitalOutageNB(String capitalOutageNB) { + this.capitalOutageNB = capitalOutageNB; + } + + public String getCapitalOutageSB() { + return capitalOutageSB; + } + + public void setCapitalOutageSB(String capitalOutageSB) { + this.capitalOutageSB = capitalOutageSB; + } +} diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/AddExtensionFile.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/AddExtensionFile.java new file mode 100644 index 000000000..c4b387d00 --- /dev/null +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/AddExtensionFile.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.impl; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; +import org.onebusaway.gtfs_transformer.services.GtfsTransformStrategy; +import org.onebusaway.gtfs_transformer.services.TransformContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +/** + * Insert a GTFS extension into a GTFS file via a transformation. + * See the unit test for example usage. + */ + +public class AddExtensionFile implements GtfsTransformStrategy { + private static Logger _log = LoggerFactory.getLogger(AddExtensionFile.class); + + + @CsvField(optional = false) + private String extensionFilename; + @CsvField(optional = false) + private String extensionName; + @Override + public String getName() { + return this.getClass().getName(); + } + + public void setExtensionFilename(String extensionFilename) { + this.extensionFilename = extensionFilename; + } + public void setExtensionName(String extensionName) { + this.extensionName = extensionName; + } + + @Override + public void run(TransformContext context, GtfsMutableRelationalDao dao) { + // lookup the file + if (extensionFilename == null) + throw new IllegalStateException("missing required param extensionFilename"); + if (extensionName == null) + throw new IllegalStateException("missing required param extensionName"); + _log.info("AddExtensionFile entered with {} to {}", extensionName, extensionFilename); + File extension = new File(extensionFilename); + if (!extension.exists()) { + throw new IllegalStateException("attempt to add non-existant extension file:" + extension.getName()); + } + String content = null; + try { + content = Files.readString(extension.toPath()); + } catch (IOException e) { + throw new IllegalStateException(e); + } + if (content == null) + throw new IllegalStateException("no content for specified file " + extensionFilename); + + _log.info("AddExtensionFile copying {} to {}", extensionName, extensionFilename); + dao.addMetadata(extensionName, content); + } +} diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/CheckForFutureService.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/CheckForFutureService.java index 5e734168f..23c8883e9 100644 --- a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/CheckForFutureService.java +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/CheckForFutureService.java @@ -17,16 +17,17 @@ import org.onebusaway.cloud.api.ExternalServices; import org.onebusaway.cloud.api.ExternalServicesBridgeFactory; +import org.onebusaway.csv_entities.schema.annotations.CsvField; import org.onebusaway.gtfs.model.*; import org.onebusaway.gtfs.model.calendar.ServiceDate; import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; import org.onebusaway.gtfs_transformer.services.CloudContextService; import org.onebusaway.gtfs_transformer.services.GtfsTransformStrategy; import org.onebusaway.gtfs_transformer.services.TransformContext; +import org.onebusaway.gtfs_transformer.util.CalendarFunctions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Calendar; import java.util.Date; /* Checks the numbers of Trips with service today and next four days @@ -37,6 +38,9 @@ public class CheckForFutureService implements GtfsTransformStrategy { private final Logger _log = LoggerFactory.getLogger(CheckForFutureService.class); + @CsvField(ignore = true) + private CalendarFunctions helper = new CalendarFunctions(); + @Override public String getName() { return this.getClass().getSimpleName(); @@ -49,20 +53,20 @@ public void run(TransformContext context, GtfsMutableRelationalDao dao) { int tripsTomorrow = 0; int tripsNextDay = 0; int tripsDayAfterNext = 0; - Date today = removeTime(new Date()); - Date tomorrow = removeTime(addDays(new Date(), 1)); - Date nextDay = removeTime(addDays(new Date(), 2)); - Date dayAfterNext = removeTime(addDays(new Date(), 3)); + Date today = helper.removeTime(new Date()); + Date tomorrow = helper.removeTime(helper.addDays(new Date(), 1)); + Date nextDay = helper.removeTime(helper.addDays(new Date(), 2)); + Date dayAfterNext = helper.removeTime(helper.addDays(new Date(), 3)); String feed = CloudContextService.getLikelyFeedName(dao); - ExternalServices es = new ExternalServicesBridgeFactory().getExternalServices(); + ExternalServices es = new ExternalServicesBridgeFactory().getExternalServices(); String agency = dao.getAllAgencies().iterator().next().getId(); String agencyName = dao.getAllAgencies().iterator().next().getName(); tripsToday = hasServiceForDate(dao, today); tripsTomorrow = hasServiceForDate(dao, tomorrow); tripsNextDay = hasServiceForDate(dao, nextDay); - tripsDayAfterNext = hasServiceForDate(dao,dayAfterNext); + tripsDayAfterNext = hasServiceForDate(dao, dayAfterNext); _log.info("Feed for metrics: {}, agency id: {}", feed, agencyName); es.publishMetric(CloudContextService.getNamespace(), "TripsToday", "feed", feed, tripsToday); @@ -91,72 +95,13 @@ public void run(TransformContext context, GtfsMutableRelationalDao dao) { } int hasServiceForDate(GtfsMutableRelationalDao dao, Date testDate) { + ServiceDate serviceDate = new ServiceDate(testDate); int numTripsOnDate = 0; for (Trip trip : dao.getAllTrips()) { - //check for service - boolean hasCalDateException = false; - //are there calendar dates? - if (!dao.getCalendarDatesForServiceId(trip.getServiceId()).isEmpty()) { - //calendar dates are not empty - for (ServiceCalendarDate calDate : dao.getCalendarDatesForServiceId(trip.getServiceId())) { - Date date = constructDate(calDate.getDate()); - if (date.equals(testDate)) { - hasCalDateException = true; - if (calDate.getExceptionType() == 1) { - //there is service for date - numTripsOnDate++; - break; - } - if (calDate.getExceptionType() == 2) { - //service has been excluded for date - break; - } - } - } - } - - //if there are no entries in calendarDates, check serviceCalendar - if (!hasCalDateException) { - ServiceCalendar servCal = dao.getCalendarForServiceId(trip.getServiceId()); - if (servCal != null) { - //check for service using calendar - Date start = removeTime(servCal.getStartDate().getAsDate()); - Date end = removeTime(servCal.getEndDate().getAsDate()); - if (testDate.equals(start) || testDate.equals(end) || - (testDate.after(start) && testDate.before(end))) { - numTripsOnDate++; - } - } - } + if (helper.isTripActive(dao, serviceDate, trip, false)) + numTripsOnDate++; } return numTripsOnDate; } - private Date addDays(Date date, int daysToAdd) { - Calendar cal = Calendar.getInstance(); - cal.setTime(date); - cal.add(Calendar.DATE, daysToAdd); - return cal.getTime(); - } - - private Date constructDate(ServiceDate date) { - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.YEAR, date.getYear()); - calendar.set(Calendar.MONTH, date.getMonth()-1); - calendar.set(Calendar.DATE, date.getDay()); - Date date1 = calendar.getTime(); - date1 = removeTime(date1); - return date1; - } - - private Date removeTime(Date date) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - date = calendar.getTime(); - return date; - } } diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/CompareToReferenceService.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/CompareToReferenceService.java new file mode 100644 index 000000000..3fa11c8d5 --- /dev/null +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/CompareToReferenceService.java @@ -0,0 +1,198 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.impl; + +import org.onebusaway.cloud.api.ExternalServices; +import org.onebusaway.cloud.api.ExternalServicesBridgeFactory; +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.gtfs.model.*; +import org.onebusaway.gtfs.model.calendar.ServiceDate; +import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; +import org.onebusaway.gtfs_transformer.services.CloudContextService; +import org.onebusaway.gtfs_transformer.services.GtfsTransformStrategy; +import org.onebusaway.gtfs_transformer.services.TransformContext; + +import org.onebusaway.gtfs_transformer.util.CalendarFunctions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileWriter; +import java.util.*; + +/** + * Compare GTFS trips and report on gaps at a depot level. + * The concept of a depot is inferred from the trip id and is + * currently specific to the MTA. + */ +public class CompareToReferenceService implements GtfsTransformStrategy { + + private static final int MAX_MESSAGE_SIZE = 250 * 1024; + private static final Logger _log = LoggerFactory.getLogger(CompareToReferenceService.class); + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @CsvField(ignore = true) + private String defaultAgencyId = "1"; + + private String s3BasePath = null; + public void setS3BasePath(String path) { + s3BasePath = path; + } + + @CsvField(ignore = true) + private CalendarFunctions helper = new CalendarFunctions(); + @Override + public void run(TransformContext context, GtfsMutableRelationalDao gtfsDao) { + try { + + defaultAgencyId = CloudContextService.getLikelyFeedName(gtfsDao); + String summaryTopic = CloudContextService.getTopic() + "-atis-summary"; + String detailTopic = CloudContextService.getTopic() + "-atis-detail"; + ExternalServices es = new ExternalServicesBridgeFactory().getExternalServices(); + + String summaryHeader = "depot,unmatched_gtfs_trips,unmatched_reference_trips\n"; + String detailHeader = "depot,unmatched_gtfs_trip_ds,unmatched_reference_trip_ids\n"; + + StringBuffer summaryReport = new StringBuffer(); + StringBuffer detailReport = new StringBuffer(); + + GtfsMutableRelationalDao referenceDao = (GtfsMutableRelationalDao) context.getReferenceReader().getEntityStore(); + + // get active trip ids for service date from base GTFS + Map> activeTripsByDepot = getTripsByDepot(context, gtfsDao); + // get active trip ids for service date for reference GTFS + Map> referenceTripsByDepot = getTripsByDepot(context, referenceDao); + String summaryFilename = System.getProperty("java.io.tmpdir") + File.separator + "summary.csv"; + FileWriter summaryFile = new FileWriter(summaryFilename); + summaryFile.write(summaryHeader); + String detailFilename = System.getProperty("java.io.tmpdir") + File.separator + "detail.csv"; + FileWriter detailFile = new FileWriter(detailFilename); + detailFile.write(detailHeader); + + Set allDepots = new HashSet<>(); + allDepots.addAll(activeTripsByDepot.keySet()); + allDepots.addAll(referenceTripsByDepot.keySet()); + + for (String depot : allDepots) { + HashSet gtfsTripIds = new HashSet<>(); + HashSet referenceTripIds = new HashSet<>(); + if (activeTripsByDepot.containsKey(depot)) { + gtfsTripIds.addAll(activeTripsByDepot.get(depot)); + } + if (referenceTripsByDepot.containsKey(depot)) { + referenceTripIds.addAll(referenceTripsByDepot.get(depot)); + } + + // now do some set operations to determine the differences + HashSet unmatchedReferenceTrips = new HashSet<>(referenceTripIds); + HashSet unmatchedGtfsTrips = new HashSet<>(gtfsTripIds); + + unmatchedGtfsTrips.removeAll(referenceTripIds); + + unmatchedReferenceTrips.removeAll(gtfsTripIds); + summaryReport.append(depot).append(",").append(unmatchedGtfsTrips.size()).append(",").append(unmatchedReferenceTrips.size()).append("\n"); + detailReport.append(depot).append(",\"").append(unmatchedGtfsTrips).append("\",\"").append(unmatchedReferenceTrips).append("\"\n"); +// es.publishMessage(detailTopic, truncate(detailReport.toString())); + detailFile.write(detailReport.toString()); + detailReport = new StringBuffer(); + } +// es.publishMessage(summaryTopic, summaryReport.toString()); + summaryFile.write(summaryReport.toString()); + + summaryFile.close(); + detailFile.close(); + + // now copy the reports to an S3 reports directory + Calendar cal = Calendar.getInstance(); + String year = "" + cal.get(Calendar.YEAR); + String month = lpad(cal.get(Calendar.MONTH)+1, 2); + String day = lpad(cal.get(Calendar.DAY_OF_MONTH), 2); + String time = lpad(cal.get(Calendar.HOUR_OF_DAY), 2) + ":" + lpad(cal.get(Calendar.MINUTE),2 ); + String baseurl = s3BasePath + + "/" + year + "/" + month + "/" + day + "/" + time + "-"; + es.putFile(baseurl + "summary.csv", summaryFilename); + es.putFile(baseurl + "detail.csv", detailFilename); + + + _log.error("{} Unmatched Summary", getName()); + _log.error(summaryReport.toString()); + } catch (Throwable t) { + _log.error("{} failed: {}", getName(), t, t); + } + + } + + private String lpad(int numberToFormat, int totalDigits) { + String text = String.valueOf(numberToFormat); + while (text.length() < totalDigits) + text = "0" + text; + return text; + } + + private String truncate(String message) { + if (message.length() > MAX_MESSAGE_SIZE) + return message.substring(0, MAX_MESSAGE_SIZE); + return message; + } + + private String getDepot(String tripId) { + String depot = null; + if (tripId.indexOf("-") < 0) { + depot = "MISSING"; + } else { + depot = tripId.split("-")[1]; + if ("Weekday".equals(depot) || "Saturday".equals(depot) || "Sunday".equals(depot)) + depot = tripId.split("-")[0]; // it moves around! + } + if (depot.length() <= 1) { + depot = "MISSING"; + } + return depot; + } + + + private Map> getTripsByDepot(TransformContext context, GtfsMutableRelationalDao dao) { + Map> tripsByDepot = new HashMap<>(); + for (Trip trip : dao.getAllTrips()) { + if (trip.getServiceId() != null) { + boolean isActive = helper.isTripActive(dao, new ServiceDate(), trip, true); + if (isActive) { + AgencyAndId tripId = trip.getId(); + if (trip.getMtaTripId() != null) { + tripId = new AgencyAndId(trip.getId().getAgencyId(), trip.getMtaTripId()); + } + String depot = getDepot(tripId.getId()); + if (!tripsByDepot.containsKey(depot)) + tripsByDepot.put(depot, new ArrayList<>()); + tripsByDepot.get(depot).add(sanitize(tripId)); + } + } + } + return tripsByDepot; + } + + + + private AgencyAndId sanitize(AgencyAndId tripId) { + if (tripId.getId().contains("-SDon")) { + return new AgencyAndId(defaultAgencyId, tripId.getId().replaceAll("-SDon", "")); + } + return new AgencyAndId(defaultAgencyId, tripId.getId()); + } +} diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/FeedInfoFromAgencyStrategy.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/FeedInfoFromAgencyStrategy.java index 754c09dfb..c45516638 100644 --- a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/FeedInfoFromAgencyStrategy.java +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/FeedInfoFromAgencyStrategy.java @@ -31,6 +31,7 @@ import java.util.Calendar; import java.util.Date; import java.util.TimeZone; +import java.util.stream.Collectors; public class FeedInfoFromAgencyStrategy implements GtfsTransformStrategy { @@ -77,9 +78,13 @@ public void run(TransformContext context, GtfsMutableRelationalDao dao) { } private FeedInfo getFeedInfoFromAgency(GtfsMutableRelationalDao dao, Agency agency) { - FeedInfo info = dao.getFeedInfoForId(agencyId); - if (info == null) { - info = new FeedInfo(); + // cannot just use dao.getFeedInfoFromAgencyForId if it needs to be compatable with "update" SimpleModificationStrategy + FeedInfo info = dao.getAllFeedInfos().stream(). + filter(feed->feed.getId().equals(agencyId)) + .collect(Collectors.toMap(feed->feed.getId(), feed -> feed)) + .get(agency.getId()); + if (info==null) { + info = new FeedInfo(); } info.setId(agencyId); info.setPublisherName(agency.getName()); diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/MTAEntrancesStrategy.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/MTAEntrancesStrategy.java index f7f2781b0..e2eebf49d 100644 --- a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/MTAEntrancesStrategy.java +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/MTAEntrancesStrategy.java @@ -68,8 +68,8 @@ public class MTAEntrancesStrategy implements GtfsTransformStrategy { private static final int LOCATION_TYPE_PAYGATE = 3; private static final int LOCATION_TYPE_GENERIC = 4; - private static final int WHEELCHAIR_ACCESSIBLE = 1; - private static final int NOT_WHEELCHAIR_ACCESSIBLE = 2; + static final int WHEELCHAIR_ACCESSIBLE = 1; + static final int NOT_WHEELCHAIR_ACCESSIBLE = 2; private static final String DEFAULT_MEZZ = "default"; @@ -82,7 +82,10 @@ public class MTAEntrancesStrategy implements GtfsTransformStrategy { @CsvField(ignore = true) private Set stopIdsWithPathways = new HashSet(); - + + @CsvField(ignore = true) + private Map complexStopIds = new HashMap<>(); + @CsvField(ignore = true) private String agencyId; @@ -110,6 +113,10 @@ public class MTAEntrancesStrategy implements GtfsTransformStrategy { private boolean contextualAccessibility; + @CsvField(optional = true) + private boolean markStopsAccessible = false; + + @CsvField(optional = true) private boolean skipStopsWithExistingPathways = true; @@ -160,6 +167,7 @@ public void run(TransformContext context, GtfsMutableRelationalDao dao) { } } + _log.info("elevatorCsv={}, entrancesCsv={}, accessibleComplexFile={}", elevatorsCsv, entrancesCsv, accessibleComplexFile); agencyId = dao.getAllAgencies().iterator().next().getId(); newStops = new HashSet<>(); @@ -226,6 +234,17 @@ public void run(TransformContext context, GtfsMutableRelationalDao dao) { if (elevatorsCsv != null) { readElevatorData(stopGroups, getComplexList(dao)); } + + _log.info("found {} complex stops to mark as accessible and mark={}", + complexStopIds.size(), markStopsAccessible); + if (markStopsAccessible) { + for (String idOnly : complexStopIds.keySet()) { + Stop stop = complexStopIds.get(idOnly); + stop.setWheelchairBoarding(WHEELCHAIR_ACCESSIBLE); + _log.info("marking stop {} as accessible", stop.getId()); + dao.updateEntity(stop); + } + } for (Stop s : newStops) { dao.saveEntity(s); @@ -572,6 +591,7 @@ private Map> getComplexList(GtfsDao dao) { if (stop == null) _log.info("null stop: {}", id); complex.add(stop); + this.complexStopIds.put(id, stop); } complexes.put("complex-" + UUID.randomUUID(), complex); } @@ -584,7 +604,7 @@ private Map> getComplexList(GtfsDao dao) { private Map getStopMap(GtfsDao dao) { Map map = new HashMap<>(); for (Stop stop : dao.getAllStops()) { - if (stop.getLocationType() == 0) { + if (stop.getLocationType() == LOCATION_TYPE_STOP) { map.put(stop.getId().getId(), stop); } } @@ -743,5 +763,9 @@ public void setContextualAccessibility(boolean contextualAccessibility) { private String getNamespace(){ return System.getProperty("cloudwatch.namespace"); } + + public void setMarkStopsAccessible(boolean flag) { + markStopsAccessible = flag; + } } diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/MTAStationAccessibilityStrategy.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/MTAStationAccessibilityStrategy.java new file mode 100644 index 000000000..5b813ec2a --- /dev/null +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/MTAStationAccessibilityStrategy.java @@ -0,0 +1,156 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.impl; + +import org.onebusaway.cloud.api.ExternalServices; +import org.onebusaway.cloud.api.ExternalServicesBridgeFactory; +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.gtfs.model.FeedInfo; +import org.onebusaway.gtfs.model.Stop; +import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; +import org.onebusaway.gtfs_transformer.csv.MTAStation; +import org.onebusaway.gtfs_transformer.services.GtfsTransformStrategy; +import org.onebusaway.gtfs_transformer.services.TransformContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.*; + +import static org.onebusaway.gtfs_transformer.csv.CSVUtil.readCsv; +import static org.onebusaway.gtfs_transformer.csv.MTAStation.*; + +/** + * Based on a CSV of MTAStations set the associated stops accessible as specified. + */ +public class MTAStationAccessibilityStrategy implements GtfsTransformStrategy { + + private static final Logger _log = LoggerFactory.getLogger(MTAStationAccessibilityStrategy.class); + private String stationsCsv; + + @CsvField(ignore = true) + private Set accessibleStops = new HashSet<>(); + + @CsvField(ignore = true) + private Map idToStopMap = new HashMap<>(); + + @Override + public String getName() { + return this.getClass().getName(); + } + + @Override + public void run(TransformContext context, GtfsMutableRelationalDao dao) { + + ExternalServices es = new ExternalServicesBridgeFactory().getExternalServices(); + Collection feedInfos = dao.getAllFeedInfos(); + + // name the feed for logging/reference + String feed = null; + if(feedInfos.size() > 0) + feed = feedInfos.iterator().next().getPublisherName(); + + // stops are unqualified, build up a map of them for lookups + for (Stop stop : dao.getAllStops()) { + idToStopMap.put(stop.getId().getId(), stop); + } + + File stationsFile = new File(stationsCsv); + if (!stationsFile.exists()) { + es.publishMultiDimensionalMetric(getNamespace(), "MissingControlFiles", + new String[]{"feed", "controlFileName"}, + new String[]{feed, stationsCsv}, 1); + throw new IllegalStateException( + "Entrances file does not exist: " + stationsFile.getName()); + } + + // see MTAStationAccessibilityStrategyTest for discussion of how this works + List stations = getStations(); + for (MTAStation station : stations) { + markStopAccessible(dao, station.getStopId(), "", station.getAda()); + if (ADA_NOT_ACCESSIBLE == station.getAda() + || ADA_FULLY_ACCESSIBLE == station.getAda()) { + markStopAccessible(dao, station.getStopId(), "N", station.getAda()); + markStopAccessible(dao, station.getStopId(), "S", station.getAda()); + } else if (ADA_PARTIALLY_ACCESSIBLE == station.getAda()) { + if (station.getAdaNorthBound() < 0) { + markStopAccessible(dao, station.getStopId(), "N", ADA_NOT_ACCESSIBLE); + } else { + markStopAccessible(dao, station.getStopId(), "N", station.getAdaNorthBound()); + } + if (station.getAdaSouthBound() < 0) { + markStopAccessible(dao, station.getStopId(), "S", ADA_NOT_ACCESSIBLE); + } else { + markStopAccessible(dao, station.getStopId(), "S", station.getAdaSouthBound()); + } + } + } + + _log.info("marking {} stops as accessible", accessibleStops.size()); + for (Stop accessibleStop : this.accessibleStops) { + // save the changes + dao.updateEntity(accessibleStop); + } + + } + + private void markStopAccessible(GtfsMutableRelationalDao dao, String stopId, String compassDirection, + int accessibilityQualifier) { + int gtfsValue = convertMTAccessibilityToGTFS(accessibilityQualifier); + String unqualifiedStopId = stopId + compassDirection; + Stop stopForId = idToStopMap.get(unqualifiedStopId); + if (stopForId == null) { + _log.error("no such stop for stopId {}", unqualifiedStopId); + return; + } + stopForId.setWheelchairBoarding(gtfsValue); + this.accessibleStops.add(stopForId); + } + + /** + * MTA 0 -> GTFS 2 + * MTA 1 -> GTFS 1 + * MTA 2 -> GTFS 3 (experimental) + * @param accessibilityQualifier + * @return + */ + public int convertMTAccessibilityToGTFS(int accessibilityQualifier) { + switch (accessibilityQualifier) { + case ADA_NOT_ACCESSIBLE: + return GTFS_WHEELCHAIR_NOT_ACCESSIBLE; + case ADA_FULLY_ACCESSIBLE: + return GTFS_WHEELCHAIR_ACCESSIBLE; + case ADA_PARTIALLY_ACCESSIBLE: + return GTFS_WHEELCHAIR_EXPERIMENTAL_PARTIALLY_ACCESSIBLE; + default: + return GTFS_WHEELCHAIR_UNKNOWN; + } + } + + + private List getStations() { + return readCsv(MTAStation.class, stationsCsv); + } + + public void setStationsCsv(String stationsCsv) { + this.stationsCsv = stationsCsv; + } + + private String getNamespace(){ + return System.getProperty("cloudwatch.namespace"); + } + +} diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateRouteNames.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateRouteNames.java index 26c655f73..1e38518df 100644 --- a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateRouteNames.java +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateRouteNames.java @@ -35,6 +35,9 @@ public String getName() { public void run(TransformContext context, GtfsMutableRelationalDao dao) { for (Route route: dao.getAllRoutes()) { + if(route.getLongName()==null){ + route.setLongName(route.getShortName()); + } if (route.getLongName().endsWith(" Line")) { route.setLongName(route.getLongName().replace(" Line", "")); } diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateStopIdFromControlStrategy.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateStopIdFromControlStrategy.java index e64d5d161..004bd7160 100644 --- a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateStopIdFromControlStrategy.java +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/impl/UpdateStopIdFromControlStrategy.java @@ -163,7 +163,11 @@ public void run(TransformContext context, GtfsMutableRelationalDao dao) { for (AgencyAndId id : stopsToRemove) { Stop stop = dao.getStopForId(id); //removeEntityLibrary.removeStop(dao, stop); - dao.removeEntity(stop); + if (stop != null) { + dao.removeEntity(stop); + } else { + _log.info("expecting stop {} but it was not found", id); + } } } diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/RemoveRepeatedStopTimesStrategy.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/RemoveRepeatedStopTimesStrategy.java index 0d3d1b7dd..11465f2f4 100644 --- a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/RemoveRepeatedStopTimesStrategy.java +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/RemoveRepeatedStopTimesStrategy.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; +import org.onebusaway.collections.tuple.T2; import org.onebusaway.gtfs.model.StopTime; import org.onebusaway.gtfs.model.Trip; import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; @@ -41,7 +42,7 @@ public void run(TransformContext context, GtfsMutableRelationalDao dao) { int removed = 0; int total = 0; - Map> tripsByBlockId = TripsByBlockInSortedOrder.getTripsByBlockInSortedOrder(dao); + Map> tripsByBlockId = TripsByBlockInSortedOrder.getTripsByBlockAndServiceIdInSortedOrder(dao); for (List trips : tripsByBlockId.values()) { diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/TripsByBlockInSortedOrder.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/TripsByBlockInSortedOrder.java index 7f3932417..84a9b5af2 100644 --- a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/TripsByBlockInSortedOrder.java +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/updates/TripsByBlockInSortedOrder.java @@ -22,6 +22,9 @@ import java.util.List; import java.util.Map; +import org.onebusaway.collections.tuple.Pair; +import org.onebusaway.collections.tuple.T2; +import org.onebusaway.gtfs.model.AgencyAndId; import org.onebusaway.gtfs.model.StopTime; import org.onebusaway.gtfs.model.Trip; import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; @@ -91,6 +94,66 @@ public static Map> getTripsByBlockInSortedOrder( return tripsByBlockId; } + public static Map> getTripsByBlockAndServiceIdInSortedOrder( + GtfsMutableRelationalDao dao) { + + Map> tripsByBlockAndServiceId = new HashMap>(); + Map averageStopTimeByTrip = new HashMap(); + + int totalTrips = 0; + int tripsWithoutStopTimes = 0; + + for (Trip trip : dao.getAllTrips()) { + + totalTrips++; + + String blockId = trip.getBlockId(); + + // Generate a random block id if none is present so we get no collisions + if (blockId == null) + blockId = trip.getId() + "-" + Math.random(); + T2 key = new T2Impl(trip.getServiceId(), blockId); + + List trips = tripsByBlockAndServiceId.get(key); + if (trips == null) { + trips = new ArrayList(); + tripsByBlockAndServiceId.put(key, trips); + } + trips.add(trip); + + List stopTimes = dao.getStopTimesForTrip(trip); + if (stopTimes.isEmpty()) { + tripsWithoutStopTimes++; + } else { + + int arrivalTimes = 0; + int arrivalTimeCount = 0; + + for (StopTime stopTime : stopTimes) { + if (stopTime.isArrivalTimeSet()) { + arrivalTimes += stopTime.getArrivalTime(); + arrivalTimeCount++; + } + } + + if (arrivalTimeCount > 0) { + int averageArrivalTime = arrivalTimes / arrivalTimeCount; + averageStopTimeByTrip.put(trip, averageArrivalTime); + } + } + } + + _log.info("trips=" + totalTrips + " withoutStopTimes=" + + tripsWithoutStopTimes); + + TripComparator c = new TripComparator(averageStopTimeByTrip); + + for (List tripsInBlock : tripsByBlockAndServiceId.values()) { + Collections.sort(tripsInBlock, c); + } + return tripsByBlockAndServiceId; + } + private static class TripComparator implements Comparator { private Map _averageArrivalTimesByTrip; @@ -114,4 +177,37 @@ else if (st2 == null) } } + private static class T2Impl implements T2 { + private String first; + private String second; + + public T2Impl(AgencyAndId serviceId, String blockId) { + this.first = null; + if (serviceId != null) + first = serviceId.toString(); + this.second = blockId; + } + + @Override + public Object getFirst() { + return first; + } + + @Override + public Object getSecond() { + return second; + } + + @Override + public int hashCode() { + return first.hashCode() + second.hashCode(); + } + @Override + public boolean equals(Object o) { + if (o == this) return true; + T2 t2 = (T2)o; + return this.first.equals(t2.getFirst()) + && this.second.equals(t2.getSecond()); + } + } } diff --git a/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/util/CalendarFunctions.java b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/util/CalendarFunctions.java new file mode 100644 index 000000000..f917454e5 --- /dev/null +++ b/onebusaway-gtfs-transformer/src/main/java/org/onebusaway/gtfs_transformer/util/CalendarFunctions.java @@ -0,0 +1,122 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.util; + +import org.onebusaway.gtfs.model.ServiceCalendar; +import org.onebusaway.gtfs.model.ServiceCalendarDate; +import org.onebusaway.gtfs.model.Trip; +import org.onebusaway.gtfs.model.calendar.ServiceDate; +import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; + +import java.util.Calendar; +import java.util.Date; + +/** + * Common calendaring functions for Strategies/Transformations. + */ +public class CalendarFunctions { + + public boolean isTripActive(GtfsMutableRelationalDao dao, ServiceDate serviceDate, Trip trip, boolean matchDayInCalendar) { + Date testDate = serviceDate.getAsDate(); + //check for service + boolean hasCalDateException = false; + //are there calendar dates? + if (!dao.getCalendarDatesForServiceId(trip.getServiceId()).isEmpty()) { + //calendar dates are not empty + for (ServiceCalendarDate calDate : dao.getCalendarDatesForServiceId(trip.getServiceId())) { + Date date = constructDate(calDate.getDate()); + if (date.equals(testDate)) { + hasCalDateException = true; + if (calDate.getExceptionType() == 1) { + //there is service for date + return true; + } + } + } + } + //if there are no entries in calendarDates, check serviceCalendar + if (!hasCalDateException) { + ServiceCalendar servCal = dao.getCalendarForServiceId(trip.getServiceId()); + if (servCal == null) { + // do a brute force lookup as agencyIds are tricky + for (ServiceCalendar calendar : dao.getAllCalendars()) { + if (calendar.getServiceId().getId().equals(trip.getServiceId().getId())) { + servCal = calendar; + } + } + + } + if (servCal != null) { + //check for service using calendar + Date start = removeTime(servCal.getStartDate().getAsDate()); + Date end = removeTime(servCal.getEndDate().getAsDate()); + if (testDate.equals(start) || testDate.equals(end) || + (testDate.after(start) && testDate.before(end))) { + Calendar cal = Calendar.getInstance(); + cal.setTime(testDate); + if (!matchDayInCalendar) return true; + switch (cal.get(Calendar.DAY_OF_WEEK)) { + case Calendar.SUNDAY: + return servCal.getSunday() == 1; + case Calendar.MONDAY: + return servCal.getMonday() == 1; + case Calendar.TUESDAY: + return servCal.getTuesday() == 1; + case Calendar.WEDNESDAY: + return servCal.getWednesday() == 1; + case Calendar.THURSDAY: + return servCal.getThursday() == 1; + case Calendar.FRIDAY: + return servCal.getFriday() == 1; + case Calendar.SATURDAY: + return servCal.getSaturday() == 1; + default: + throw new IllegalStateException("unexected value " + cal.get(Calendar.DAY_OF_WEEK)); + } + } + } + } + return false; + } + public Date addDays(Date date, int daysToAdd) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(Calendar.DATE, daysToAdd); + return cal.getTime(); + } + + public Date constructDate(ServiceDate date) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, date.getYear()); + calendar.set(Calendar.MONTH, date.getMonth()-1); + calendar.set(Calendar.DATE, date.getDay()); + Date date1 = calendar.getTime(); + date1 = removeTime(date1); + return date1; + } + + public Date removeTime(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + date = calendar.getTime(); + return date; + } + +} diff --git a/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/impl/AddExtensionFileTest.java b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/impl/AddExtensionFileTest.java new file mode 100644 index 000000000..c4e816503 --- /dev/null +++ b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/impl/AddExtensionFileTest.java @@ -0,0 +1,98 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.impl; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onebusaway.gtfs.impl.FileSupport; +import org.onebusaway.gtfs.impl.GtfsRelationalDaoImpl; +import org.onebusaway.gtfs.serialization.GtfsWriter; +import org.onebusaway.gtfs.services.GtfsRelationalDao; +import org.onebusaway.gtfs_transformer.AbstractTestSupport; +import org.onebusaway.gtfs_transformer.services.TransformContext; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.junit.Assert.*; + +/** + * test we can insert an extension into a GTFS file via a transformation. + */ +public class AddExtensionFileTest extends AbstractTestSupport { + + private static final String TXT_STRING = "route_id,stop_id,direction_id,name\n"; + private FileSupport _support = new FileSupport(); + private GtfsRelationalDaoImpl dao = new GtfsRelationalDaoImpl(); + private AddExtensionFile test = new AddExtensionFile(); + private TransformContext context = new TransformContext(); + private GtfsWriter writer = new GtfsWriter(); + + @Before + public void setup() { + _gtfs.putAgencies(1); + _gtfs.putStops(1); + _gtfs.putRoutes(1); + _gtfs.putTrips(1, "r0", "sid0"); + _gtfs.putStopTimes("t0", "s0"); + + } + @After + public void teardown() { + _support.cleanup(); + } + + @Test + public void run() throws IOException { + File extensionFile = File.createTempFile("subwayRouteStop-", ".csv"); + if (extensionFile.exists()) + extensionFile.deleteOnExit(); + + String extensionFilename = extensionFile.getAbsolutePath();; + BufferedWriter bwriter = new BufferedWriter(new FileWriter(extensionFilename)); + bwriter.write(TXT_STRING); + bwriter.close(); + + String extensionName = "route_stop.txt"; + test.setExtensionFilename(extensionFilename); + test.setExtensionName(extensionName); + + test.run(context, dao); + + File tmpFileDirectory = File.createTempFile("AddExtensionFileTest-", "-tmp"); + if (tmpFileDirectory.exists()) + _support.deleteFileRecursively(tmpFileDirectory); + tmpFileDirectory.mkdirs(); + _support.markForDeletion(tmpFileDirectory); + writer.setOutputLocation(tmpFileDirectory); + writer.run(dao); + writer.close(); + + String modLocation = tmpFileDirectory.getAbsolutePath() + File.separator + extensionName; + File expectedFile = new File(modLocation); + // verify file is there + assertTrue("expected extension to be present!", expectedFile.exists()); + assertTrue("expected extension to be a file!", expectedFile.isFile()); + String actualText = Files.readString(Path.of(modLocation)); + assertEquals(TXT_STRING, actualText); + + } +} \ No newline at end of file diff --git a/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/CarryForwardExpectedFilesTest.java b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/CarryForwardExpectedFilesTest.java new file mode 100644 index 000000000..8fcef1bcd --- /dev/null +++ b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/CarryForwardExpectedFilesTest.java @@ -0,0 +1,109 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.updates; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onebusaway.gtfs.impl.FileSupport; +import org.onebusaway.gtfs.impl.GtfsRelationalDaoImpl; +import org.onebusaway.gtfs.impl.ZipHandler; +import org.onebusaway.gtfs.serialization.GtfsReader; +import org.onebusaway.gtfs.serialization.GtfsWriter; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; + +import static org.junit.Assert.assertTrue; + +/** + * Ensure metadata files are still present in typical read/write cycle. + */ +public class CarryForwardExpectedFilesTest { + + private GtfsRelationalDaoImpl _dao; + private File _tmpFileDirectory; + + private File _tmpZipFileDirectory; + + private FileSupport _support = new FileSupport(); + + @Before + public void setup() throws IOException, URISyntaxException { + _dao = new GtfsRelationalDaoImpl(); + } + + @After + public void teardown() { + _support.cleanup(); + } + + @Test + public void testFile() throws Exception { + GtfsReader reader = new GtfsReader(); + File path = new File(getClass().getResource( + "/org/onebusaway/gtfs_transformer/testagency").toURI()); + reader.setInputLocation(path); + reader.setEntityStore(_dao); + reader.run(); + + _tmpFileDirectory = File.createTempFile("CarryForwardExpectedFilesTest-", "-tmp"); + if (_tmpFileDirectory.exists()) + _support.deleteFileRecursively(_tmpFileDirectory); + _tmpFileDirectory.mkdirs(); + _support.markForDeletion(_tmpFileDirectory); + + // write out the file + GtfsWriter writer = new GtfsWriter(); + writer.setOutputLocation(_tmpFileDirectory); + writer.run(_dao); + writer.close(); + String modLocation = _tmpFileDirectory.getAbsolutePath() + File.separator + "modifications.txt"; + File expectedFile = new File(modLocation); + // verify modifications.txt is there!!!! + assertTrue("expected modifications.txt to be present!", expectedFile.exists()); + assertTrue("expected modifications.txt to be a file!", expectedFile.isFile()); + } + + @Test + public void testZipFile() throws Exception { + GtfsReader reader = new GtfsReader(); + File inputZipFile = new File(getClass().getResource( + "/org/onebusaway/gtfs_transformer/testagency.zip").toURI()); + reader.setInputLocation(inputZipFile); + reader.setEntityStore(_dao); + reader.run(); + + _tmpZipFileDirectory = File.createTempFile("CarryForwardExpectedFilesTestZip-", "-tmp"); + if (_tmpZipFileDirectory.exists()) + _support.deleteFileRecursively(_tmpZipFileDirectory); + _tmpZipFileDirectory.mkdirs(); + _support.markForDeletion(_tmpZipFileDirectory); + + String zipFileName = _tmpZipFileDirectory.getAbsolutePath() + File.separator + "gtfs.zip"; + // write out the file + GtfsWriter writer = new GtfsWriter(); + writer.setOutputLocation(new File(zipFileName)); + writer.run(_dao); + writer.close(); + + ZipHandler zip = new ZipHandler(new File(zipFileName)); + String content = zip.readTextFromFile("modifications.txt"); + // look for some content inside file to verify its correct + assertTrue(content.contains("characters")); + } +} diff --git a/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/MTAStationAccessibilityStrategyTest.java b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/MTAStationAccessibilityStrategyTest.java new file mode 100644 index 000000000..176e8eceb --- /dev/null +++ b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/MTAStationAccessibilityStrategyTest.java @@ -0,0 +1,102 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.updates; + +import org.junit.Before; +import org.junit.Test; +import org.onebusaway.gtfs.model.AgencyAndId; +import org.onebusaway.gtfs.model.Stop; +import org.onebusaway.gtfs.services.GtfsRelationalDao; +import org.onebusaway.gtfs_transformer.AbstractTestSupport; + +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.onebusaway.gtfs_transformer.csv.MTAStation.*; + +/** + * Document and test partial and fully accessible MTAStations. + */ +public class MTAStationAccessibilityStrategyTest extends AbstractTestSupport { + + @Before + public void setup() throws Exception { + File stations_csv = new File(getClass().getResource( + "/org/onebusaway/gtfs_transformer/stations/stations.csv").toURI()); + addModification("{\"op\": \"transform\", \"class\":\"org.onebusaway.gtfs_transformer.impl.MTAStationAccessibilityStrategy\", \"stations_csv\": \""+stations_csv+"\"}"); + } + + @Test + public void testStations() throws Exception { + _gtfs.putAgencies(1); + _gtfs.putNamedStops("R15,49 St", "A25,50 St", "233,Hoyt St", "626,86 St", + "R15N,49 St", "A25N,50 St", "233N,Hoyt St", "626N,86 St", + "R15S,49 St", "A25S,50 St", "233S,Hoyt St", "626S,86 St"); + _gtfs.putRoutes(1); + _gtfs.putTrips(12, "r0", "sid0"); + _gtfs.putStopTimes("t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11", "R15,A25,233,626,R15N,A25N,233N,626N,R15S,A25S,233S,626S"); + _gtfs.putCalendars(1, "start_date=20120903", "end_date=20120916"); + + GtfsRelationalDao dao = transform(); + assertStation(dao, "R15", 2, 1, 0); // 49 St (ADA=2, ADA NB=1, ADA SB=0) + assertStation(dao, "A25", 2, 0, 1); // 50 St (ADA=2, ADA NB=0, ADA SB=1 + assertStation(dao, "233", 2, null, null); // Hoyt St (ADA=2, ADA NB=blank, ADA SB=blank) + assertStation(dao, "626", 2, 2, 0); // 86 St (ADA=2, ADA NB=2, ADA SB=0) + } + + private void assertStation(GtfsRelationalDao dao, String stopId, int ada, Integer northBoundFlag, Integer southBoundFlag) { + Stop parentStop = dao.getStopForId(new AgencyAndId("a0", stopId)); + assertNotNull(parentStop); + Stop nStop = dao.getStopForId(new AgencyAndId("a0", stopId+"N")); + assertNotNull(nStop); + Stop sStop = dao.getStopForId(new AgencyAndId("a0", stopId+"S")); + assertNotNull(sStop); + + assertEquals("expecting ada flag to match wheelchairBoarding flag for stop " + parentStop.getId(), + ada, converGTFSccessibilityToMTA(parentStop.getWheelchairBoarding())); + if (northBoundFlag == null) { + assertEquals("expecting N/A wheelchairBoarding for northbound stop " + nStop,0, converGTFSccessibilityToMTA(nStop.getWheelchairBoarding())); // default is 0 + } else { + assertEquals("expecting northBoundFlag to match wheelchairBoarding flag for stop" + nStop, northBoundFlag.intValue(), converGTFSccessibilityToMTA(nStop.getWheelchairBoarding())); + } + if (southBoundFlag == null) { + assertEquals("expecting N/A wheelchairBoarding for southbound stop " + sStop,0, converGTFSccessibilityToMTA(sStop.getWheelchairBoarding())); + } else { + assertEquals("expecting southBoundFlag to match wheelchairBoarding flag for stop" + sStop, southBoundFlag.intValue(), converGTFSccessibilityToMTA(sStop.getWheelchairBoarding())); + } + } + + /** + * GTFS 1 -> MTA 1 + * GTFS 2 -> MTA 0 + * GTFS 3 -> MTA 2 + * @param gtfsValue + * @return + */ + private int converGTFSccessibilityToMTA(int gtfsValue) { + switch (gtfsValue) { + case 1: + return ADA_FULLY_ACCESSIBLE; + case 2: + return ADA_NOT_ACCESSIBLE; + case 3: + return ADA_PARTIALLY_ACCESSIBLE; + default: + return 0;// unknown + } + } +} diff --git a/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/RemoveRepeatedStopTimesStrategyTest.java b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/RemoveRepeatedStopTimesStrategyTest.java new file mode 100644 index 000000000..c7cf84b9f --- /dev/null +++ b/onebusaway-gtfs-transformer/src/test/java/org/onebusaway/gtfs_transformer/updates/RemoveRepeatedStopTimesStrategyTest.java @@ -0,0 +1,123 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs_transformer.updates; + +import org.junit.Before; +import org.junit.Test; +import org.onebusaway.collections.tuple.T2; +import org.onebusaway.gtfs.impl.GtfsRelationalDaoImpl; +import org.onebusaway.gtfs.model.AgencyAndId; +import org.onebusaway.gtfs.model.StopTime; +import org.onebusaway.gtfs.model.Trip; +import org.onebusaway.gtfs.serialization.GtfsReader; +import org.onebusaway.gtfs.services.GenericMutableDao; +import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; +import org.onebusaway.gtfs_transformer.services.TransformContext; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.onebusaway.gtfs_transformer.updates.TripsByBlockInSortedOrder.getTripsByBlockAndServiceIdInSortedOrder; + +/** + * test removing repeated stops when blocks are not distinct across service ids. + */ +public class RemoveRepeatedStopTimesStrategyTest { + + private GtfsRelationalDaoImpl _dao; + private TransformContext _context = new TransformContext(); + @Before + public void before() throws IOException { + _dao = new GtfsRelationalDaoImpl(); + } + + @Test + public void testSort() throws Exception { + GtfsReader reader = new GtfsReader(); + File path0 = new File(getClass().getResource( + "/org/onebusaway/gtfs_transformer/updates/cut.zip").toURI()); + reader.setInputLocation(path0); + reader.setEntityStore(_dao); + reader.run(); + + Map> trips = getTripsByBlockAndServiceIdInSortedOrder(_dao); + boolean case1 = false; + for (List partitionedTrips : trips.values()) { + int tripIndex = -1; + for (Trip trip : partitionedTrips) { + tripIndex++; + if ("10514090".equals(trip.getId().getId())) { + // ensure sort worked! + assertEquals("SM-62", partitionedTrips.get(tripIndex).getBlockId()); + assertEquals("10514090", partitionedTrips.get(tripIndex).getId().getId()); + assertEquals("SM-62", partitionedTrips.get(tripIndex+1).getBlockId()); + assertEquals("7438090", partitionedTrips.get(tripIndex+1).getId().getId()); + assertEquals("SM-62", partitionedTrips.get(tripIndex+2).getBlockId()); + assertEquals("6986090", partitionedTrips.get(tripIndex+2).getId().getId()); + assertEquals("SM-62", partitionedTrips.get(tripIndex+3).getBlockId()); + assertEquals("32069090", partitionedTrips.get(tripIndex+3).getId().getId()); + assertEquals("SM-62", partitionedTrips.get(tripIndex+4).getBlockId()); + assertEquals("682090", partitionedTrips.get(tripIndex+4).getId().getId()); + case1 = true; + } + } + + } + + assertTrue(case1); + } + + @Test + public void test() throws Exception { + GtfsReader reader = new GtfsReader(); + File path0 = new File(getClass().getResource( + "/org/onebusaway/gtfs_transformer/updates/cut.zip").toURI()); + reader.setInputLocation(path0); + reader.setEntityStore(_dao); + reader.run(); + GenericMutableDao dao = reader.getEntityStore(); + RemoveRepeatedStopTimesStrategy strat = new RemoveRepeatedStopTimesStrategy(); + strat.run(_context, (GtfsMutableRelationalDao) dao); + + boolean case1 = false; + boolean case2 = false; + for (Trip trip : ((GtfsMutableRelationalDao) dao).getAllTrips()) { + if ("7438090".equals(trip.getId().getId())) { + // confirm the last stop on the trip was removed + // and the first stop on the next trip has arrival modified + // block SM-62 + List stopTimesForTrip = ((GtfsMutableRelationalDao) dao).getStopTimesForTrip(trip); + StopTime lastStopTrip1 = stopTimesForTrip.get(stopTimesForTrip.size()-1); + assertEquals("4128", lastStopTrip1.getStop().getId().getId()); // if this is 18938 we failed! + case1 = true; + } else if ("6986090".equals(trip.getId().getId())) { + // block SM-62 + List stopTimesForTrip = ((GtfsMutableRelationalDao) dao).getStopTimesForTrip(trip); + StopTime firstStopTrip2 = stopTimesForTrip.get(0); + assertEquals("18938", firstStopTrip2.getStop().getId().getId()); + assertEquals(23400, firstStopTrip2.getArrivalTime()); // arrival is now that of previous removed stops + assertEquals(24300, firstStopTrip2.getDepartureTime()); + case2 = true; + } + } + assertTrue(case1); + assertTrue(case2); + } +} diff --git a/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/stations/stations.csv b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/stations/stations.csv new file mode 100644 index 000000000..fa95d282e --- /dev/null +++ b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/stations/stations.csv @@ -0,0 +1,5 @@ +Station ID,Complex ID,GTFS Stop ID,Division,Line,Stop Name,Borough,Daytime Routes,Structure,GTFS Latitude,GTFS Longitude,North Direction Label,South Direction Label,ADA,ADA Direction Notes,ADA NB,ADA SB,Capital Outage NB,Capital Outage SB +10,10,R15,BMT,Broadway - Brighton,49 St,M,N R W,Subway,40.759901,-73.984139,Uptown & Queens,Downtown & Brooklyn,2,Uptown & Queens,1,0,, +162,162,A25,IND,8th Av - Fulton St,50 St,M,C E,Subway,40.762456,-73.985984,Uptown - Queens,Downtown & Brooklyn,2,Downtown & Brooklyn only,0,1,, +336,336,233,IRT,Eastern Pky,Hoyt St,Bk,2 3,Subway,40.690545,-73.985065,Manhattan,Flatbush - New Lots,2,,,,, +397,397,626,IRT,Lexington Av,86 St,M,4 5 6,Subway,40.779492,-73.955589,Uptown & The Bronx,Downtown & Brooklyn,2,Uptown & The Bronx local only,2,0,, diff --git a/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/testagency.zip b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/testagency.zip new file mode 100644 index 000000000..cd6480431 Binary files /dev/null and b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/testagency.zip differ diff --git a/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/testagency/modifications.txt b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/testagency/modifications.txt new file mode 100644 index 000000000..7ebc39357 --- /dev/null +++ b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/testagency/modifications.txt @@ -0,0 +1,5 @@ +# this is free form text belonging to Fake Agency (agency) +This text may have commas, but we can't expect it. +This text may include: +* bullets +\ and lots of other characters diff --git a/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/updates/cut.zip b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/updates/cut.zip new file mode 100644 index 000000000..df90a2acc Binary files /dev/null and b/onebusaway-gtfs-transformer/src/test/resources/org/onebusaway/gtfs_transformer/updates/cut.zip differ diff --git a/onebusaway-gtfs/pom.xml b/onebusaway-gtfs/pom.xml index b9487c292..2ec9d470a 100644 --- a/onebusaway-gtfs/pom.xml +++ b/onebusaway-gtfs/pom.xml @@ -9,28 +9,39 @@ org.onebusaway onebusaway-gtfs-modules - 1.3.112-openmove-8 + 1.4.15-openmove-1 org.onebusaway onebusaway-csv-entities + + + slf4j-api + org.slf4j + + + + + org.slf4j + slf4j-api + ${slf4j_version} com.fasterxml.jackson.core jackson-databind - 2.12.0 + 2.14.0 de.grundid.opendatalab geojson-jackson - 1.8.1 + 1.14 org.slf4j - slf4j-log4j12 - test + slf4j-simple + ${slf4j_version} junit diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/FileSupport.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/FileSupport.java new file mode 100644 index 000000000..4b9805229 --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/FileSupport.java @@ -0,0 +1,57 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.impl; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class FileSupport { + + private List toDelete = new ArrayList<>(); + public FileSupport() { + } + + public void markForDeletion(File file) { + toDelete.add(file); + } + + public void cleanup() { + for (File file : toDelete) { + deleteFileRecursively(file); + } + toDelete.clear(); + } + + public void deleteFileRecursively(File file) { + if (file == null) + return; + + if (!file.exists()) + return; + + if (file.isDirectory()) { + File[] files = file.listFiles(); + if (files != null) { + for (File child : files) + deleteFileRecursively(child); + } + } + + file.delete(); + } + +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDaoImpl.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDaoImpl.java index 7d10aea1a..89d411605 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDaoImpl.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDaoImpl.java @@ -16,8 +16,7 @@ package org.onebusaway.gtfs.impl; import java.io.Serializable; -import java.util.Collection; -import java.util.Map; +import java.util.*; import org.onebusaway.gtfs.model.*; import org.onebusaway.gtfs.services.GenericMutableDao; @@ -26,6 +25,7 @@ public class GtfsDaoImpl extends GenericDaoImpl implements GtfsMutableDao { + public static final String[] OPTIONAL_FILE_NAMES = {"modifications.txt"}; private StopTimeArray stopTimes = new StopTimeArray(); private ShapePointArray shapePoints = new ShapePointArray(); @@ -34,6 +34,19 @@ public class GtfsDaoImpl extends GenericDaoImpl implements GtfsMutableDao { private boolean packShapePoints = false; + private List _optionalMetadataFilenames = null; + + private Map metadataByFilename = new HashMap<>(); + + public GtfsDaoImpl() { + _optionalMetadataFilenames = new ArrayList<>(); + if (OPTIONAL_FILE_NAMES != null) { + for (String optionalFileName : OPTIONAL_FILE_NAMES) { + _optionalMetadataFilenames.add(optionalFileName); + } + } + } + public boolean isPackStopTimes() { return packStopTimes; } @@ -95,6 +108,14 @@ public Collection getAllRoutes() { return getAllEntitiesForType(Route.class); } + public Collection getAllRouteStops() { + return getAllEntitiesForType(RouteStop.class); + } + + public Collection getAllRouteShapes() { + return getAllEntitiesForType(RouteShape.class); + } + public Collection getAllShapePoints() { if (packShapePoints) { return shapePoints; @@ -163,8 +184,8 @@ public FareProduct getFareProductForId(AgencyAndId id) { } @Override - public Collection getAllFareContainers() { - return getAllEntitiesForType(FareContainer.class); + public Collection getAllFareMedia() { + return getAllEntitiesForType(FareMedium.class); } @Override @@ -239,7 +260,11 @@ public Level getLevelForId(AgencyAndId id) { public FacilityPropertyDefinition getFacilityPropertiesDefinitionsForId(AgencyAndId id) { return getEntityForId(FacilityPropertyDefinition.class, id);} public RouteNameException getRouteNameExceptionForId(AgencyAndId id) { return getEntityForId(RouteNameException.class, id);} public DirectionNameException getDirectionNameExceptionForId(AgencyAndId id) { return getEntityForId(DirectionNameException.class, id);} + public AlternateStopNameException getAlternateStopNameExceptionForId(AgencyAndId id) { return getEntityForId(AlternateStopNameException.class, id);} + public Collection getAllDirectionEntries() { + return getAllEntitiesForType(DirectionEntry.class); + } public Collection getAllFacilities() { return getAllEntitiesForType(Facility.class); } @@ -255,7 +280,13 @@ public Collection getAllRouteNameExceptions() { public Collection getAllDirectionNameExceptions() { return getAllEntitiesForType(DirectionNameException.class); } + public Collection getAllAlternateStopNameExceptions(){ + return getAllEntitiesForType(AlternateStopNameException.class); + } + public Collection getAllWrongWayConcurrencies() { + return getAllEntitiesForType(WrongWayConcurrency.class); + } public Collection getAllAreas() { return getAllEntitiesForType(Area.class); } @@ -268,6 +299,16 @@ public Collection getAllLocationGroups() { return getAllEntitiesForType(LocationGroup.class); } + @Override + public Collection getAllStopAreaElements() { + return getAllEntitiesForType(StopAreaElement.class); + } + + @Override + public Collection getAllStopAreas() { + return getAllEntitiesForType(StopArea.class); + } + public Collection getAllLocations() { return getAllEntitiesForType(Location.class); } @@ -280,11 +321,6 @@ public Collection getAllTranslations() { return getAllEntitiesForType(Translation.class); } - @Override - public Collection getAllStopAreas() { - return getAllEntitiesForType(StopArea.class); - } - /**** * {@link GenericMutableDao} Interface ****/ @@ -364,6 +400,26 @@ public void close() { super.close(); } + @Override + public List getOptionalMetadataFilenames() { + return _optionalMetadataFilenames; + } + @Override + public boolean hasMetadata(String filename) { + return metadataByFilename.containsKey(filename); + } + @Override + public String getMetadata(String filename) { + return metadataByFilename.get(filename); + } + @Override + public void addMetadata(String filename, String content) { + metadataByFilename.put(filename, content); + if (!_optionalMetadataFilenames.contains(filename)) + _optionalMetadataFilenames.add(filename); + } + + /**** * Private Methods ****/ diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDataServiceImpl.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDataServiceImpl.java index 460bf903e..033eb3976 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDataServiceImpl.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsDataServiceImpl.java @@ -105,8 +105,8 @@ public FareProduct getFareProductForId(AgencyAndId id) { } @Override - public Collection getAllFareContainers() { - return _dao.getAllFareContainers(); + public Collection getAllFareMedia() { + return _dao.getAllFareMedia(); } @Override @@ -224,6 +224,15 @@ public Collection getAllRoutes() { return _dao.getAllRoutes(); } + @Override + public Collection getAllRouteStops() { + return _dao.getAllRouteStops(); + } + + @Override + public Collection getAllRouteShapes() { + return _dao.getAllRouteShapes(); + } @Override public Route getRouteForId(AgencyAndId id) { return _dao.getRouteForId(id); @@ -354,6 +363,16 @@ public Collection getAllLocationGroupElements() { return _dao.getAllLocationGroupElements(); } + @Override + public Collection getAllStopAreaElements() { + return _dao.getAllStopAreaElements(); + } + + @Override + public Collection getAllStopAreas() { + return _dao.getAllStopAreas(); + } + @Override public Collection getAllLocationGroups() { return _dao.getAllLocationGroups(); @@ -375,8 +394,23 @@ public Collection getAllTranslations() { } @Override - public Collection getAllStopAreas() { - return _dao.getAllStopAreas(); + public List getOptionalMetadataFilenames() { + return _dao.getOptionalMetadataFilenames(); + } + + @Override + public boolean hasMetadata(String filename) { + return _dao.hasMetadata(filename); + } + + @Override + public String getMetadata(String filename) { + return _dao.getMetadata(filename); + } + + @Override + public void addMetadata(String filename, String content) { + _dao.addMetadata(filename, content); } @Override @@ -444,6 +478,12 @@ public List getServiceDateArrivalsWithinRange(LocalizedServiceId serviceId return _calendarService.getServiceDateArrivalsWithinRange(serviceId, interval, from, to); } + @Override + public boolean isLocalizedServiceIdActiveInRange(LocalizedServiceId serviceId, + ServiceInterval scheduledService, + AgencyServiceInterval serviceInterval) { + return _calendarService.isLocalizedServiceIdActiveInRange(serviceId, scheduledService, serviceInterval); + } @Override public Map> getServiceDateArrivalsWithinRange(ServiceIdIntervals serviceIdIntervals, Date from, Date to) { return _calendarService.getServiceDateArrivalsWithinRange(serviceIdIntervals, from, to); @@ -479,7 +519,7 @@ public void setData(CalendarServiceData data) { public FacilityPropertyDefinition getFacilityPropertiesDefinitionsForId(AgencyAndId id) { return getEntityForId(FacilityPropertyDefinition.class, id);} public RouteNameException getRouteNameExceptionForId(AgencyAndId id) { return getEntityForId(RouteNameException.class, id);} public DirectionNameException getDirectionNameExceptionForId(AgencyAndId id) { return getEntityForId(DirectionNameException.class, id);} - + public AlternateStopNameException getAlternateStopNameExceptionForId(AgencyAndId id) { return getEntityForId(AlternateStopNameException.class, id);} public Collection getAllFacilities() { return getAllEntitiesForType(Facility.class); } @@ -495,4 +535,13 @@ public Collection getAllRouteNameExceptions() { public Collection getAllDirectionNameExceptions() { return getAllEntitiesForType(DirectionNameException.class); } + public Collection getAllAlternateStopNameExceptions(){ + return getAllEntitiesForType(AlternateStopNameException.class); + } + public Collection getAllDirectionEntries() { + return _dao.getAllDirectionEntries(); + } + public Collection getAllWrongWayConcurrencies() { + return _dao.getAllWrongWayConcurrencies(); + } } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsRelationalDaoImpl.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsRelationalDaoImpl.java index 3b5881f8a..78c1abd39 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsRelationalDaoImpl.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/GtfsRelationalDaoImpl.java @@ -29,19 +29,7 @@ import org.onebusaway.csv_entities.exceptions.EntityInstantiationException; import org.onebusaway.csv_entities.schema.BeanWrapper; import org.onebusaway.csv_entities.schema.BeanWrapperFactory; -import org.onebusaway.gtfs.model.Agency; -import org.onebusaway.gtfs.model.AgencyAndId; -import org.onebusaway.gtfs.model.FareAttribute; -import org.onebusaway.gtfs.model.FareRule; -import org.onebusaway.gtfs.model.Frequency; -import org.onebusaway.gtfs.model.Ridership; -import org.onebusaway.gtfs.model.Route; -import org.onebusaway.gtfs.model.ServiceCalendar; -import org.onebusaway.gtfs.model.ServiceCalendarDate; -import org.onebusaway.gtfs.model.ShapePoint; -import org.onebusaway.gtfs.model.Stop; -import org.onebusaway.gtfs.model.StopTime; -import org.onebusaway.gtfs.model.Trip; +import org.onebusaway.gtfs.model.*; import org.onebusaway.gtfs.services.GtfsMutableRelationalDao; /** diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/StopTimeArray.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/StopTimeArray.java index 3de5ab0d4..a2a73f1be 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/StopTimeArray.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/StopTimeArray.java @@ -258,11 +258,31 @@ public StopLocation getStop() { return stops[index]; } + @Override + public StopLocation getLocation() { + return stops[index]; + } + + @Override + public StopLocation getLocationGroup() { + return stops[index]; + } + @Override public void setStop(StopLocation stop) { stops[index] = stop; } + @Override + public void setLocation(StopLocation location) { + stops[index] = location; + } + + @Override + public void setLocationGroup(StopLocation group) { + stops[index] = group; + } + @Override public boolean isArrivalTimeSet() { return arrivalTimes[index] != StopTime.MISSING_VALUE; diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/ZipHandler.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/ZipHandler.java new file mode 100644 index 000000000..5185be452 --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/ZipHandler.java @@ -0,0 +1,93 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.impl; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.HashMap; +import java.util.stream.Collectors; + +/** + * Zip file support. + */ +public class ZipHandler { + + public static final String ZIP_SCHEME = "jar:file:"; + + private File zipFile; + + public ZipHandler(File zipFile) { + this.zipFile = zipFile; + } + + /** + * read metadata files from a text file. + * @param fileInZip + * @return + * @throws IOException + */ + public String readTextFromFile(String fileInZip) throws IOException { + final StringBuffer content = new StringBuffer(); + FileSystem zipFileSystem = null; + try { + URI uri = URI.create(ZIP_SCHEME + zipFile.getAbsolutePath()); + // java 7 introduced native support for zip files + zipFileSystem = FileSystems.newFileSystem(uri, new HashMap<>()); + Path root = zipFileSystem.getPath(fileInZip); + + Files.walkFileTree(root, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + content.append(Files.lines(file).collect(Collectors.joining(System.lineSeparator()))); + return FileVisitResult.TERMINATE; + } + }); + return content.toString(); + } finally { + if (zipFileSystem != null) { + zipFileSystem.close(); + } + } + } + + /** + * write metatdata files to an existing zip file. + * @param fileInZip + * @param content + * @throws IOException + */ + public void writeTextToFile(String fileInZip, String content) throws IOException { + FileSystem zipFileSystem = null; + try { + URI uri = URI.create(ZIP_SCHEME + zipFile.toURI().getPath()); + // java 7 introduced native support for zip files + zipFileSystem = FileSystems.newFileSystem(uri, new HashMap<>()); + Path newZipEntry = zipFileSystem.getPath(fileInZip); + Writer writer = Files.newBufferedWriter(newZipEntry, StandardCharsets.UTF_8, StandardOpenOption.CREATE); + writer.write(content); + writer.close(); + } finally { + if (zipFileSystem != null) { + zipFileSystem.close(); + } + } + } +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImpl.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImpl.java index e6d8db2be..4336f4381 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImpl.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImpl.java @@ -27,11 +27,7 @@ import java.util.TimeZone; import org.onebusaway.gtfs.model.AgencyAndId; -import org.onebusaway.gtfs.model.calendar.CalendarServiceData; -import org.onebusaway.gtfs.model.calendar.LocalizedServiceId; -import org.onebusaway.gtfs.model.calendar.ServiceDate; -import org.onebusaway.gtfs.model.calendar.ServiceIdIntervals; -import org.onebusaway.gtfs.model.calendar.ServiceInterval; +import org.onebusaway.gtfs.model.calendar.*; import org.onebusaway.gtfs.services.calendar.CalendarService; import org.onebusaway.gtfs.services.calendar.CalendarServiceDataFactory; @@ -126,6 +122,34 @@ public boolean isLocalizedServiceIdActiveOnDate( return Collections.binarySearch(dates, serviceDate) >= 0; } + /** + * test if the given calendar servieId is active in the union of the activeService + * window and the agencyServiceInterval. + * @param localizedServiceId + * @param activeService + * @param agencyServiceInterval + * @return + */ + public boolean isLocalizedServiceIdActiveInRange(LocalizedServiceId localizedServiceId, + ServiceInterval activeService, + AgencyServiceInterval agencyServiceInterval) { + if (agencyServiceInterval == null || agencyServiceInterval.getServiceDate() == null) { + throw new IllegalStateException("agencyServiceInterval cannot be null"); + } + ServiceInterval serviceInterval = agencyServiceInterval.getServiceInterval(localizedServiceId.getId().getAgencyId()); + + boolean active = isLocalizedServiceIdActiveOnDate(localizedServiceId, agencyServiceInterval.getServiceDate().getAsDate()); + if (active) { + // even if a match is found enforce overlap in service intervals + if (Math.max(activeService.getMinArrival(), serviceInterval.getMinArrival()) + <= Math.min(activeService.getMaxDeparture(), serviceInterval.getMaxDeparture())) { + return true; + } + } + + return false; + } + @Override public List getServiceDateArrivalsWithinRange( LocalizedServiceId serviceId, ServiceInterval interval, Date from, Date to) { diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/translation/TranslationServiceDataFactoryImpl.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/translation/TranslationServiceDataFactoryImpl.java index 5728bcca9..34afea4c3 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/translation/TranslationServiceDataFactoryImpl.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/impl/translation/TranslationServiceDataFactoryImpl.java @@ -55,6 +55,12 @@ public class TranslationServiceDataFactoryImpl implements TranslationServiceData private static final String FACILITY_PROPERTY_DEFINITION_TABLE_NAME = "facilities_properties_definitions"; + private static final String WRONG_WAY_TABLE_NAME = "wrong_way_concurrencies"; + + private static final String DIRECTION_ENTRY_TABLE_NAME = "direction_entry"; + + private static final String ALTERNATE_STOP_NAME_EXCEPTION_TABLE_NAME = "alternate_stop_name_exception"; + private GtfsRelationalDao _dao; public static TranslationService getTranslationService(GtfsRelationalDao dao) { @@ -128,6 +134,12 @@ private Class getEntityTypeForTableName(String name) { return FacilityProperty.class; case FACILITY_PROPERTY_DEFINITION_TABLE_NAME: return FacilityPropertyDefinition.class; + case WRONG_WAY_TABLE_NAME: + return WrongWayConcurrency.class; + case DIRECTION_ENTRY_TABLE_NAME: + return DirectionEntry.class; + case ALTERNATE_STOP_NAME_EXCEPTION_TABLE_NAME: + return AlternateStopNameException.class; } return null; } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/AlternateStopNameException.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/AlternateStopNameException.java new file mode 100644 index 000000000..4dd04882f --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/AlternateStopNameException.java @@ -0,0 +1,92 @@ +/** + * Copyright (C) 2022 Cambridge Systematics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onebusaway.gtfs.model; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.csv_entities.schema.annotations.CsvFields; + +@CsvFields(filename = "alternate_stop_names_exceptions.txt", required = false) +public class AlternateStopNameException extends IdentityBean { + + @CsvField(ignore = true) + private int id; + + @CsvField(optional = true) + int routeId; + + @CsvField(optional = true) + int directionId; + + @CsvField(optional = true) + int stopId; + + @CsvField(optional = true) + String alternateStopName; + + public AlternateStopNameException() { + } + + public AlternateStopNameException(AlternateStopNameException asne) { + this.routeId = asne.routeId; + this.directionId = asne.directionId; + this.stopId = asne.stopId; + this.alternateStopName = asne.alternateStopName; + } + + + @Override + public Integer getId() { + return id; + } + + @Override + public void setId(Integer id) { + this.id = id; + } + + public int getRouteId() { + return routeId; + } + + public void setRouteId(int routeId) { + this.routeId = routeId; + } + + public int getDirectionId() { + return directionId; + } + + public void setDirectionId(int directionId) { + this.directionId = directionId; + } + + public int getStopId() { + return stopId; + } + + public void setStopId(int stopId) { + this.stopId = stopId; + } + + public String getAlternateStopName() { + return alternateStopName; + } + + public void setAlternateStopName(String alternateStopName) { + this.alternateStopName = alternateStopName; + } +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/AlternateStopNamesExceptions.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/AlternateStopNamesExceptions.java new file mode 100644 index 000000000..ab2093779 --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/AlternateStopNamesExceptions.java @@ -0,0 +1,29 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.csv_entities.schema.annotations.CsvFields; + +@CsvFields(filename = "alternate_stop_names_exceptions.txt", required = false) +public class AlternateStopNamesExceptions { + + @CsvField(ignore = true) + private int id; + + @CsvField(optional = true) + int routeId; +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Area.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Area.java index 5f7426db7..b09828c10 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Area.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Area.java @@ -30,6 +30,7 @@ public final class Area extends IdentityBean { @CsvField(name="area_name", optional = true) private String name; + @CsvField(name="wkt", optional = true) private String wkt; public Area() { diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/DirectionEntry.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/DirectionEntry.java new file mode 100644 index 000000000..0637fe52d --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/DirectionEntry.java @@ -0,0 +1,146 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.csv_entities.schema.annotations.CsvFields; + +@CsvFields(filename = "direction_names.txt", required = false) +public class DirectionEntry extends IdentityBean { + + @CsvField(ignore = true) + private int id; + + @CsvField(name="agency_id") + private String agencyId; + + @CsvField(name="station_id") + private String stationId; + + @CsvField(name="stop_id_0") + private String gtfsStopIdDirection0; + + @CsvField(name="stop_id_1") + private String gtfsStopIdDirection1; + + @CsvField(name="line") + private String line; + + @CsvField(name="stop_name") + private String stopName; + + @CsvField(name="daytime_routes") + private String daytimeRoutes; + + @CsvField(name="headsign_direction_0", optional = true) + private String headsignDirection0; + + @CsvField(name="headsign_direction_1", optional = true) + private String headsignDirection1; + + @CsvField(name="notes", ignore=true) + private String notes; + + @Override + public Integer getId() { + return id; + } + + @Override + public void setId(Integer id) { + this.id = id; + } + + public String getAgencyId() { + return agencyId; + } + + public void setAgencyId(String agencyId) { + this.agencyId = agencyId; + } + + public String getStationId() { + return stationId; + } + + public void setStationId(String stationId) { + this.stationId = stationId; + } + + public String getGtfsStopIdDirection0() { + return gtfsStopIdDirection0; + } + + public void setGtfsStopIdDirection0(String gtfsStopIdDirection0) { + this.gtfsStopIdDirection0 = gtfsStopIdDirection0; + } + + public String getGtfsStopIdDirection1() { + return gtfsStopIdDirection1; + } + + public void setGtfsStopIdDirection1(String gtfsStopIdDirection1) { + this.gtfsStopIdDirection1 = gtfsStopIdDirection1; + } + + public String getLine() { + return line; + } + + public void setLine(String line) { + this.line = line; + } + + public String getStopName() { + return stopName; + } + + public void setStopName(String stopName) { + this.stopName = stopName; + } + + public String getDaytimeRoutes() { + return daytimeRoutes; + } + + public void setDaytimeRoutes(String daytimeRoutes) { + this.daytimeRoutes = daytimeRoutes; + } + + public String getHeadsignDirection0() { + return headsignDirection0; + } + + public void setHeadsignDirection0(String headsignDirection0) { + this.headsignDirection0 = headsignDirection0; + } + + public String getHeadsignDirection1() { + return headsignDirection1; + } + + public void setHeadsignDirection1(String headsignDirection1) { + this.headsignDirection1 = headsignDirection1; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Facility.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Facility.java index 3a6ff1a05..c9c5d5a78 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Facility.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Facility.java @@ -41,7 +41,7 @@ public class Facility extends IdentityBean{ @CsvField(optional = true) private String facilityType; - @CsvField(name = "stop_id", mapping = EntityFieldMappingFactory.class) + @CsvField(name = "stop_id", mapping = EntityFieldMappingFactory.class, optional = true) private Stop stop; @CsvField(optional = true) diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareLegRule.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareLegRule.java index 2f30dc25d..620fd6064 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareLegRule.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareLegRule.java @@ -15,58 +15,64 @@ */ package org.onebusaway.gtfs.model; -import java.util.Optional; import org.onebusaway.csv_entities.schema.annotations.CsvField; import org.onebusaway.csv_entities.schema.annotations.CsvFields; +import org.onebusaway.gtfs.serialization.mappings.DefaultAgencyIdFieldMappingFactory; import org.onebusaway.gtfs.serialization.mappings.EntityFieldMappingFactory; -import org.onebusaway.gtfs.serialization.mappings.FareProductFieldMappingFactory; + +import java.util.Optional; @CsvFields(filename = "fare_leg_rules.txt", required = false) public final class FareLegRule extends IdentityBean { - - @CsvField(name = "fare_product_id", mapping = FareProductFieldMappingFactory.class) - private FareProduct fareProduct; - - @CsvField(optional = true, name = "leg_group_id") - private String legGroupId; + @CsvField(optional = true, name = "leg_group_id", mapping = DefaultAgencyIdFieldMappingFactory.class) + private AgencyAndId legGroupId; @CsvField(optional = true, name = "network_id") private String networkId; - @CsvField(optional = true, name = "from_area_id") - private String fromAreaId; + @CsvField(optional = true, name = "from_area_id", mapping = EntityFieldMappingFactory.class) + private Area fromArea; - @CsvField(optional = true, name = "to_area_id") - private String toAreaId; + @CsvField(optional = true, name = "to_area_id", mapping = EntityFieldMappingFactory.class) + private Area toArea; - @CsvField(name = "fare_container_id", optional = true, mapping = EntityFieldMappingFactory.class) - private FareContainer fareContainer; + @CsvField(name = "min_distance", optional = true) + private Double minDistance; - @CsvField(name = "rider_category_id", optional = true, mapping = EntityFieldMappingFactory.class) - private RiderCategory riderCategory; + @CsvField(name = "max_distance", optional = true) + private Double maxDistance; - public String getLegGroupId() { + @CsvField(name = "distance_type", optional = true) + private Integer distanceType; + + @CsvField( + name = "fare_product_id", + mapping = DefaultAgencyIdFieldMappingFactory .class + ) + private AgencyAndId fareProductId; + + public AgencyAndId getLegGroupId() { return legGroupId; } - public void setLegGroupId(String legGroupId) { + public void setLegGroupId(AgencyAndId legGroupId) { this.legGroupId = legGroupId; } - public String getFromAreaId() { - return fromAreaId; + public Area getFromArea() { + return fromArea; } - public void setFromAreaId(String fromAreaId) { - this.fromAreaId = fromAreaId; + public void setFromArea(Area fromArea) { + this.fromArea = fromArea; } - public String getToAreaId() { - return toAreaId; + public Area getToArea() { + return toArea; } - public void setToAreaId(String toAreaId) { - this.toAreaId = toAreaId; + public void setToArea(Area toArea) { + this.toArea = toArea; } public String getNetworkId() { @@ -79,11 +85,13 @@ public void setNetworkId(String networkId) { @Override public String getId() { - String containerId = Optional.ofNullable(fareContainer).map(c -> c.getId().getId()).orElse(null); - String categoryId = Optional.ofNullable(riderCategory).map(c -> c.getId().getId()).orElse(null); + String fromAreaId = Optional.ofNullable(fromArea).map(Area::getAreaId).orElse(null); + String toAreaId = Optional.ofNullable(toArea).map(Area::getAreaId).orElse(null); + String baseLegGroupId = Optional.ofNullable(legGroupId).map(AgencyAndId::getId).orElse(null); + String baseProductId = Optional.ofNullable(fareProductId).map(AgencyAndId::getId).orElse(null); return String.format( - "id=%s|network=%s|fromArea=%s|toArea=%s|container=%s|category=%s", - fareProduct.getFareProductId().getId(), networkId, fromAreaId, toAreaId, containerId, categoryId + "groupId=%s|product=%s|network=%s|fromArea=%s|toArea=%s", + baseLegGroupId, baseProductId, networkId, fromAreaId, toAreaId ); } @@ -91,27 +99,34 @@ public String getId() { public void setId(String id) { } - public FareProduct getFareProduct() { - return fareProduct; + public AgencyAndId getFareProductId() { + return fareProductId; } - public void setFareProduct(FareProduct fareProduct) { - this.fareProduct = fareProduct; + public void setFareProductId(AgencyAndId fareProductId) { + this.fareProductId = fareProductId; + } + + public void setMinDistance(Double minDistance) { + this.minDistance = minDistance; + } + public Double getMinDistance() { + return minDistance; } - public FareContainer getFareContainer() { - return fareContainer; + public Double getMaxDistance() { + return maxDistance; } - public void setFareContainer(FareContainer fareContainer) { - this.fareContainer = fareContainer; + public void setMaxDistance(Double maxDistance) { + this.maxDistance = maxDistance; } - public RiderCategory getRiderCategory() { - return riderCategory; + public Integer getDistanceType() { + return distanceType; } - public void setRiderCategory(RiderCategory riderCategory) { - this.riderCategory = riderCategory; + public void setDistanceType(Integer distanceType) { + this.distanceType = distanceType; } } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareContainer.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareMedium.java similarity index 61% rename from onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareContainer.java rename to onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareMedium.java index 9d0bdfc29..70507d6c6 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareContainer.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareMedium.java @@ -20,53 +20,22 @@ import org.onebusaway.gtfs.serialization.mappings.DefaultAgencyIdFieldMappingFactory; import org.onebusaway.gtfs.serialization.mappings.EntityFieldMappingFactory; -/** - * As of July 2022 this file is not yet part of the main GTFS spec. - */ -@CsvFields(filename = "fare_containers.txt", required = false) -public final class FareContainer extends IdentityBean { +@CsvFields(filename = "fare_media.txt", required = false) +public final class FareMedium extends IdentityBean { public static final int MISSING_VALUE = -999; - @CsvField(name = "fare_container_id", mapping = DefaultAgencyIdFieldMappingFactory.class) + @CsvField(name = "fare_media_id", mapping = DefaultAgencyIdFieldMappingFactory.class) private AgencyAndId id; - @CsvField(name = "fare_container_name") - private String name; - @CsvField(name = "rider_category_id", optional = true, mapping = EntityFieldMappingFactory.class) - private RiderCategory riderCategory; - - @CsvField(optional = true) - private String currency; - - @CsvField(optional = true) - private float amount = MISSING_VALUE; - - @CsvField(optional = true) - private float minimumInitialPurchase = MISSING_VALUE; - - public String getCurrency() { - return currency; - } - - public void setCurrency(String currency) { - this.currency = currency; - } - public float getAmount() { - return amount; - } - - public void setAmount(float amount) { - this.amount = amount; - } + @CsvField(name = "fare_media_name", optional = true) + private String name; - public float getMinimumInitialPurchase() { - return minimumInitialPurchase; - } + @CsvField + private int fareMediaType; - public void setMinimumInitialPurchase(float minimumInitialPurchase) { - this.minimumInitialPurchase = minimumInitialPurchase; - } + @CsvField(name = "rider_category_id", optional = true, mapping = EntityFieldMappingFactory.class) + private RiderCategory riderCategory; public String getName() { return name; @@ -86,6 +55,14 @@ public void setId(AgencyAndId id) { this.id = id; } + public int getFareMediaType() { + return fareMediaType; + } + + public void setFareMediaType(int fareMediaType) { + this.fareMediaType = fareMediaType; + } + public RiderCategory getRiderCategory() { return riderCategory; } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareProduct.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareProduct.java index 158c8e0ca..4bd6397c1 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareProduct.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareProduct.java @@ -32,30 +32,25 @@ public final class FareProduct extends IdentityBean { private AgencyAndId fareProductId; @CsvField(optional = true, name = "fare_product_name") private String name; - @CsvField(optional = true) + @CsvField private float amount = MISSING_VALUE; - @CsvField(optional = true) + @CsvField private String currency; - // not in the main GTFS spec yet (as of June 2022) @CsvField(optional = true) private int durationAmount = MISSING_VALUE; - // not in the main GTFS spec yet (as of June 2022) @CsvField(optional = true) private int durationUnit = MISSING_VALUE; - // not in the main GTFS spec yet (as of June 2022) @CsvField(optional = true) private int durationType = MISSING_VALUE; - // not in the main GTFS spec yet (as of June 2022) @CsvField(name = "rider_category_id", optional = true, mapping = EntityFieldMappingFactory.class) private RiderCategory riderCategory; - // not in the main GTFS spec yet (as of June 2022) - @CsvField(name = "fare_container_id", optional = true, mapping = EntityFieldMappingFactory.class) - private FareContainer fareContainer; + @CsvField(name = "fare_media_id", optional = true, mapping = EntityFieldMappingFactory.class) + private FareMedium fareMedium; public AgencyAndId getFareProductId() { return fareProductId; @@ -67,10 +62,14 @@ public void setFareProductId(AgencyAndId fareProductId) { public FareContainer getFareContainer() { return fareContainer; + +} + public FareMedium getFareMedium() { + return fareMedium; } - public void setFareContainer(FareContainer fareContainer) { - this.fareContainer = fareContainer; + public void setFareMedium(FareMedium fareMedium) { + this.fareMedium = fareMedium; } public int getDurationAmount() { @@ -124,8 +123,13 @@ public void setCurrency(String currency) { @Override public AgencyAndId getId() { String riderCategoryId = Optional.ofNullable(riderCategory).map(c -> c.getId().getId()).orElse(null); - String fareContainerId = Optional.ofNullable(fareContainer).map(c -> c.getId().getId()).orElse(null); - return FareProductFieldMappingFactory.fareProductId(fareProductId.getAgencyId(), fareProductId.getId(), riderCategoryId, fareContainerId); + String fareMediumId = Optional.ofNullable(fareMedium).map(c -> c.getId().getId()).orElse(null); + return FareProductFieldMappingFactory.fareProductId( + fareProductId.getAgencyId(), + fareProductId.getId(), + riderCategoryId, + fareMediumId + ); } @Override @@ -139,4 +143,16 @@ public RiderCategory getRiderCategory() { public void setRiderCategory(RiderCategory riderCategory) { this.riderCategory = riderCategory; } + + public boolean isDurationUnitSet() { + return durationUnit != MISSING_VALUE; + } + + public boolean isDurationTypeSet() { + return durationType != MISSING_VALUE; + } + + public boolean isDurationAmountSet() { + return durationAmount != MISSING_VALUE; + } } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareTransferRule.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareTransferRule.java index e3154d6ed..76e031693 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareTransferRule.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FareTransferRule.java @@ -109,4 +109,19 @@ public String getId() { public void setId(String id) { } + public boolean isTransferCountSet() { + return transferCount != MISSING_VALUE; + } + + public boolean isDurationLimitSet() { + return durationLimit != MISSING_VALUE; + } + + public boolean isDurationLimitTypeSet() { + return durationLimitType != MISSING_VALUE; + } + + public boolean isFareTransferTypeSet() { + return fareTransferType != MISSING_VALUE; + } } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FeedInfo.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FeedInfo.java index 9b1404d18..073389103 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FeedInfo.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/FeedInfo.java @@ -46,6 +46,12 @@ public final class FeedInfo extends IdentityBean { @CsvField(optional = true, name = "default_lang") private String defaultLang; + @CsvField(optional = true) + private String contactEmail; + + @CsvField(optional = true) + private String contactUrl; + public FeedInfo() { } @@ -58,6 +64,8 @@ public FeedInfo(FeedInfo fi) { this.endDate = fi.endDate; this.version = fi.version; this.defaultLang = fi.defaultLang; + this.contactEmail = fi.contactEmail; + this.contactUrl = fi.contactUrl; } public String getPublisherName() { @@ -116,6 +124,22 @@ public void setDefaultLang(String defaultLang) { this.defaultLang = defaultLang; } + public String getContactEmail() { + return contactEmail; + } + + public void setContactEmail(String contactEmail) { + this.contactEmail = contactEmail; + } + + public String getContactUrl() { + return contactUrl; + } + + public void setContactUrl(String contactUrl) { + this.contactUrl = contactUrl; + } + /**** * {@link IdentityBean} Interface ****/ diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/LocationGroupElement.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/LocationGroupElement.java index 05cba1665..f12f17c08 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/LocationGroupElement.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/LocationGroupElement.java @@ -31,7 +31,7 @@ public class LocationGroupElement extends IdentityBean { @CsvField(name = "location_group_id", mapping = DefaultAgencyIdFieldMappingFactory.class) private AgencyAndId locationGroupId; - @CsvField(name = "location_id", mapping = StopLocationFieldMappingFactory.class) + @CsvField(name = "stop_id", mapping = StopLocationFieldMappingFactory.class) private StopLocation location; @CsvField(optional = true) diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RiderCategory.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RiderCategory.java index 4c645eb6e..36b4ab774 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RiderCategory.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RiderCategory.java @@ -80,4 +80,12 @@ public AgencyAndId getId() { public void setId(AgencyAndId id) { this.id = id; } + + public boolean isMinAgeSet() { + return minAge != MISSING_VALUE; + } + + public boolean isMaxAgeSet() { + return maxAge != MISSING_VALUE; + } } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Route.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Route.java index 0912b7fef..b2451d6c9 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Route.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Route.java @@ -56,7 +56,7 @@ public final class Route extends IdentityBean { @CsvField(name = "network_id", optional = true) private String networkId; - @CsvField(name = "eligibility_restricted", optional = true) + @CsvField(name = "eligibility_restricted", optional = true, defaultValue = "-999") private int eligibilityRestricted = MISSING_VALUE; @Deprecated diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RouteShape.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RouteShape.java new file mode 100644 index 000000000..62c2c30dd --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RouteShape.java @@ -0,0 +1,83 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.csv_entities.schema.annotations.CsvFields; + +/** + * experimental support for canonical/idealized route shapes such + * as a map's representation of service + */ +@CsvFields(filename = "route_shape.txt", required = false) +public final class RouteShape extends IdentityBean { + private static final long serialVersionUID = 1L; + + @CsvField(ignore = true) + private int id; + + @CsvField + private String routeId; + @CsvField(optional = true) + private String directionId; + @CsvField + private String type; + @CsvField + private String encodedShape; + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public String getDirectionId() { + return directionId; + } + + public void setDirectionId(String directionId) { + this.directionId = directionId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getEncodedShape() { + return encodedShape; + } + + public void setEncodedShape(String encodedShape) { + this.encodedShape = encodedShape; + } + + @Override + public Integer getId() { + return id; + } + + @Override + public void setId(Integer id) { + this.id = id; + } + +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RouteStop.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RouteStop.java new file mode 100644 index 000000000..44ac241ab --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/RouteStop.java @@ -0,0 +1,98 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.csv_entities.schema.annotations.CsvFields; + +/** + * experimental support for canonical/idealized route stops such + * as a strip map's representation of service + */ +@CsvFields(filename = "route_stop.txt", required = false) +public final class RouteStop extends IdentityBean { + + private static final long serialVersionUID = 1L; + + @CsvField(ignore = true) + private int id; + + @CsvField(name = "route_id") + private String routeId; + + @CsvField(name = "stop_id") + private String stopId; + + @CsvField(name = "stop_sequence") + private int stopSequence; + + @CsvField(optional = true, defaultValue = "") + private String directionId; + + @CsvField(optional = true, defaultValue = "") + private String name; + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public String getStopId() { + return stopId; + } + + public void setStopId(String stopId) { + this.stopId = stopId; + } + + public int getStopSequence() { + return stopSequence; + } + + public void setStopSequence(int stopSequence) { + this.stopSequence = stopSequence; + } + + public String getDirectionId() { + return directionId; + } + + public void setDirectionId(String directionId) { + this.directionId = directionId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public Integer getId() { + return id; + } + + @Override + public void setId(Integer id) { + this.id = id; + } + +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Stop.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Stop.java index 499e33b70..099943b89 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Stop.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/Stop.java @@ -96,6 +96,8 @@ public final class Stop extends IdentityBean implements StopLocatio @CsvField(optional = true, name = "regional_fare_card", defaultValue = "0") private int regionalFareCardAccepted; + @CsvField(optional = true, name = "tts_stop_name") + private String ttsStopName; public Stop() { @@ -120,6 +122,7 @@ public Stop(Stop obj) { this.level = obj.level; this.mtaStopId = obj.mtaStopId; this.regionalFareCardAccepted = obj.regionalFareCardAccepted; + this.ttsStopName = obj.ttsStopName; } public AgencyAndId getId() { @@ -290,4 +293,12 @@ public int getRegionalFareCardAccepted() { public void setRegionalFareCardAccepted(int regionalFareCardAccepted) { this.regionalFareCardAccepted = regionalFareCardAccepted; } + + public String getTtsStopName() { + return ttsStopName; + } + + public void setTtsStopName(String ttsStopName) { + this.ttsStopName = ttsStopName; + } } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopArea.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopArea.java index a81576cfd..2d2d74a64 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopArea.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopArea.java @@ -1,5 +1,5 @@ /** - * Copyright (C) 2022 Leonard Ehrenfried + * Copyright (C) 2023 Leonard Ehrenfried * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,40 +15,48 @@ */ package org.onebusaway.gtfs.model; -import org.onebusaway.csv_entities.schema.annotations.CsvField; -import org.onebusaway.csv_entities.schema.annotations.CsvFields; +import java.util.HashSet; +import java.util.Set; -@CsvFields(filename = "stop_areas.txt", required = false) -public final class StopArea extends IdentityBean { +public class StopArea extends IdentityBean implements StopLocation { - @CsvField(name = "area_id") - private String areaId; - @CsvField(name = "stop_id") - private String stopId; + private static final long serialVersionUID = 1L; - public String getAreaId() { - return areaId; + private Area area; + + private Set stops = new HashSet<>(); + + @Override + public AgencyAndId getId() { + return area.getId(); } - public void setAreaId(String areaId) { - this.areaId = areaId; + @Override + public void setId(AgencyAndId id) { } - public String getStopId() { - return stopId; + public void setArea(Area area) { + this.area = area; } - public void setStopId(String stopId) { - this.stopId = stopId; + public Set getLocations() { + return stops; } - @Override - public String getId() { - return String.format("%s_%s", areaId, stopId); + private void setLocations(Set stops) { + this.stops = stops; + } + + public void addLocation(StopLocation location) { + this.stops.add(location); + } + + public String getName() { + return area.getName(); } @Override - public void setId(String id) { + public void setName(String name) { } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopAreaElement.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopAreaElement.java new file mode 100644 index 000000000..b0ee1cf61 --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopAreaElement.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2022 Leonard Ehrenfried + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.csv_entities.schema.annotations.CsvFields; +import org.onebusaway.gtfs.serialization.mappings.EntityFieldMappingFactory; +import org.onebusaway.gtfs.serialization.mappings.StopLocationFieldMappingFactory; + +@CsvFields(filename = "stop_areas.txt", required = false) +public final class StopAreaElement extends IdentityBean { + + @CsvField(name = "area_id", mapping = EntityFieldMappingFactory.class) + private Area area; + @CsvField(name = "stop_id", mapping = StopLocationFieldMappingFactory.class) + private StopLocation stopLocation; + + public void setArea(Area area) { + this.area = area; + } + + public Area getArea() { + return area; + } + + @Override + public AgencyAndId getId() { + return new AgencyAndId(getArea().getId().getAgencyId(), String.format("%s_%s", area.getId().getId(), stopLocation.getId().getId())); + } + + @Override + public void setId(AgencyAndId id) { + + } + + public void setStopLocation(StopLocation stopLocation) { + this.stopLocation = stopLocation; + } + + public StopLocation getStopLocation() { + return stopLocation; + } +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTime.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTime.java index a774ce25a..7e9bb9a72 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTime.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTime.java @@ -21,11 +21,15 @@ import org.onebusaway.gtfs.serialization.mappings.EntityFieldMappingFactory; import org.onebusaway.gtfs.serialization.mappings.StopTimeFieldMappingFactory; import org.onebusaway.gtfs.serialization.mappings.StopLocationFieldMappingFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @CsvFields(filename = "stop_times.txt") public final class StopTime extends IdentityBean implements Comparable, StopTimeProxy { + private static Logger _log = LoggerFactory.getLogger(StopTime.class); + private static final long serialVersionUID =2L; public static final int MISSING_VALUE = -999; @@ -38,9 +42,19 @@ public final class StopTime extends IdentityBean implements @CsvField(name = "trip_id", mapping = EntityFieldMappingFactory.class) private Trip trip; - @CsvField(name = "stop_id", mapping = StopLocationFieldMappingFactory.class) + /** + * This is optional because in flex you can also have location_id and location_group_id. + */ + @CsvField(name = "stop_id", optional = true, mapping = StopLocationFieldMappingFactory.class) private StopLocation stop; + @CsvField(name = "location_id", optional = true, mapping = StopLocationFieldMappingFactory.class) + private StopLocation location; + + @CsvField(name = "location_group_id", optional = true, mapping = StopLocationFieldMappingFactory.class) + private StopLocation locationGroup; + + @CsvField(optional = true, mapping = StopTimeFieldMappingFactory.class) private int arrivalTime = MISSING_VALUE; @@ -52,24 +66,40 @@ public final class StopTime extends IdentityBean implements * GTFS-Flex v2.1 renamed this field. Use {@link #startPickupDropOffWindow} instead. */ @Deprecated - @CsvField(optional = true, mapping = StopTimeFieldMappingFactory.class) + @CsvField(optional = true, mapping = StopTimeFieldMappingFactory.class, defaultValue = "-999") private int minArrivalTime = MISSING_VALUE; - @CsvField(optional = true, name = "start_pickup_dropoff_window", mapping = StopTimeFieldMappingFactory.class) + @CsvField(optional = true, name = "start_pickup_drop_off_window", mapping = StopTimeFieldMappingFactory.class, defaultValue = "-999") private int startPickupDropOffWindow = MISSING_VALUE; + /** + * @deprecated + * GTFS-Flex v2.1 renamed "dropoff" to "drop off": https://github.com/MobilityData/gtfs-flex/commit/547200dfb580771265ae14b07d9bfd7b91c16ed2 + */ + @Deprecated + @CsvField(optional = true, name = "start_pickup_dropoff_window", mapping = StopTimeFieldMappingFactory.class, defaultValue = "-999") + public int oldSpellingOfStartPickupDropOffWindow = MISSING_VALUE; + /** * @deprecated * GTFS-Flex v2.1 renamed this field. Use {@link #endPickupDropOffWindow} instead. */ @Deprecated - @CsvField(optional = true, mapping = StopTimeFieldMappingFactory.class) + @CsvField(optional = true, mapping = StopTimeFieldMappingFactory.class, defaultValue = "-999") private int maxDepartureTime = MISSING_VALUE; - @CsvField(optional = true, name = "end_pickup_dropoff_window", mapping = StopTimeFieldMappingFactory.class) + @CsvField(optional = true, name = "end_pickup_drop_off_window", mapping = StopTimeFieldMappingFactory.class, defaultValue = "-999") private int endPickupDropOffWindow = MISSING_VALUE; - @CsvField(optional = true) + /** + * @deprecated + * GTFS-Flex v2.1 renamed "dropoff" to "drop off": https://github.com/MobilityData/gtfs-flex/commit/547200dfb580771265ae14b07d9bfd7b91c16ed2 + */ + @Deprecated + @CsvField(optional = true, name = "end_pickup_dropoff_window", mapping = StopTimeFieldMappingFactory.class, defaultValue = "-999") + public int oldSpellingOfEndPickupDropOffWindow = MISSING_VALUE; + + @CsvField(optional = true, defaultValue = "-999") private int timepoint = MISSING_VALUE; private int stopSequence; @@ -89,13 +119,13 @@ public final class StopTime extends IdentityBean implements @CsvField(optional = true, defaultValue = "0") private int dropOffType; - @CsvField(optional = true) + @CsvField(optional = true, defaultValue = "-999") private double shapeDistTraveled = MISSING_VALUE; - @CsvField(optional = true) + @CsvField(optional = true, defaultValue = "1") private int continuousPickup = MISSING_FLEX_VALUE; - @CsvField(optional = true) + @CsvField(optional = true, defaultValue = "1") private int continuousDropOff = MISSING_FLEX_VALUE; @CsvField(optional = true, name = "start_service_area_id", mapping = EntityFieldMappingFactory.class, order = -2) @@ -104,10 +134,10 @@ public final class StopTime extends IdentityBean implements @CsvField(optional = true, name = "end_service_area_id", mapping = EntityFieldMappingFactory.class, order = -2) private Area endServiceArea; - @CsvField(optional = true) + @CsvField(optional = true, defaultValue = "-999.0")/*note defaultValue quirk for non-proxied comparison*/ private double startServiceAreaRadius = MISSING_VALUE; - @CsvField(optional = true) + @CsvField(optional = true, defaultValue = "-999.0")/*note defaultValue quirk for non-proxied comparison*/ private double endServiceAreaRadius = MISSING_VALUE; @CsvField(ignore = true) @@ -125,7 +155,7 @@ public final class StopTime extends IdentityBean implements private String farePeriodId; /** Extension to support departure buffer https://groups.google.com/forum/#!msg/gtfs-changes/sHTyliLgMQk/gfpaGkI_AgAJ */ - @CsvField(optional = true, defaultValue = "-1") + @CsvField(optional = true, defaultValue = "-999") private int departureBuffer; /** Support track extension */ @@ -137,16 +167,16 @@ public final class StopTime extends IdentityBean implements private Note note; // See https://github.com/MobilityData/gtfs-flex/blob/master/spec/reference.md - @CsvField(optional = true, name = "mean_duration_factor") + @CsvField(optional = true, name = "mean_duration_factor", defaultValue = "-999.0")/*note defaultValue quirk for non-proxied comparison*/ private double meanDurationFactor = MISSING_VALUE; - @CsvField(optional = true, name = "mean_duration_offset") + @CsvField(optional = true, name = "mean_duration_offset", defaultValue = "-999.0")/*note defaultValue quirk for non-proxied comparison*/ private double meanDurationOffset = MISSING_VALUE; - @CsvField(optional = true, name = "safe_duration_factor") + @CsvField(optional = true, name = "safe_duration_factor", defaultValue = "-999.0")/*note defaultValue quirk for non-proxied comparison*/ private double safeDurationFactor = MISSING_VALUE; - @CsvField(optional = true, name = "safe_duration_offset") + @CsvField(optional = true, name = "safe_duration_offset", defaultValue = "-999.0") private double safeDurationOffset = MISSING_VALUE; @CsvField(optional = true, name = "free_running_flag") @@ -172,6 +202,8 @@ public StopTime(StopTime st) { this.shapeDistTraveled = st.shapeDistTraveled; this.farePeriodId = st.farePeriodId; this.stop = st.stop; + this.location = st.location; + this.locationGroup = st.locationGroup; this.stopHeadsign = st.stopHeadsign; this.stopSequence = st.stopSequence; this.toStopSequence = st.toStopSequence; @@ -246,6 +278,7 @@ public void setToStopSequence(Integer toStopSequence) { this.toStopSequence = toStopSequence; } + @Override public StopLocation getStop() { if (proxy != null) { return proxy.getStop(); @@ -253,6 +286,41 @@ public StopLocation getStop() { return stop; } + @Override + public StopLocation getLocation() { + if (proxy != null) { + return proxy.getLocation(); + } + return location; + } + + @Override + public StopLocation getLocationGroup() { + if (proxy != null) { + return proxy.getLocationGroup(); + } + return locationGroup; + } + + /** + * Returns possible entity for the stop location in this order: + * - stop + * - location + * - location group + */ + public StopLocation getStopLocation(){ + if(stop != null){ + return stop; + } + else if(location != null) { + return location; + } + else if(locationGroup != null){ + return locationGroup; + } + return null; + } + public void setStop(StopLocation stop) { if (proxy != null) { proxy.setStop(stop); @@ -261,6 +329,22 @@ public void setStop(StopLocation stop) { this.stop = stop; } + public void setLocation(StopLocation location) { + if (proxy != null) { + proxy.setLocation(location); + return; + } + this.location = location; + } + + public void setLocationGroup(StopLocation group) { + if (proxy != null) { + proxy.setLocationGroup(group); + return; + } + this.locationGroup = group; + } + public boolean isArrivalTimeSet() { if (proxy != null) { return proxy.isArrivalTimeSet(); @@ -340,6 +424,8 @@ public void setMinArrivalTime(int minArrivalTime) { public int getStartPickupDropOffWindow() { if (startPickupDropOffWindow != MISSING_VALUE) { return startPickupDropOffWindow; + } else if(oldSpellingOfStartPickupDropOffWindow != MISSING_VALUE){ + return oldSpellingOfStartPickupDropOffWindow; } else { return minArrivalTime; } @@ -362,7 +448,11 @@ public void setMaxDepartureTime(int maxDepartureTime) { public int getEndPickupDropOffWindow() { if (endPickupDropOffWindow != MISSING_VALUE) { return endPickupDropOffWindow; - } else { + } + else if (oldSpellingOfEndPickupDropOffWindow != MISSING_VALUE) { + return oldSpellingOfEndPickupDropOffWindow; + } + else { return maxDepartureTime; } } @@ -648,7 +738,7 @@ public String displayArrival() { @Override public String toString() { - return "StopTime(seq=" + getStopSequence() + " stop=" + (getStop()==null?"NuLl":getStop().getId()) + return "StopTime(seq=" + getStopSequence() + " stop=" + (getStopLocation()==null?"NuLl":getStop().getId()) + " trip=" + (getTrip()==null?"NuLl":getTrip().getId()) + " times=" + StopTimeFieldMappingFactory.getSecondsAsString(getArrivalTime()) + "-" @@ -716,4 +806,30 @@ public void setFreeRunningFlag(String freeRunningFlag) { } this.freeRunningFlag = freeRunningFlag; } + @Deprecated + public void setOldSpellingOfStartPickupDropOffWindow(int time) { + oldDropOffSpellingWarning("start"); + this.oldSpellingOfStartPickupDropOffWindow = time; + } + + @Deprecated + public void setOldSpellingOfEndPickupDropOffWindow(int time) { + oldDropOffSpellingWarning("end"); + this.oldSpellingOfEndPickupDropOffWindow = time; + } + + private static void oldDropOffSpellingWarning(String type) { + _log.warn("This feed uses the old spelling of '{}_pickup_drop_off_window' ('dropoff' instead of 'drop_off'). " + + "Compatibility will be removed in the future, so please update your feed to be in line with the latest Flex V2 spec:" + + " https://github.com/MobilityData/gtfs-flex/commit/547200dfb", type); + } + @Deprecated + public int getOldSpellingOfStartPickupDropOffWindow() { + return this.oldSpellingOfStartPickupDropOffWindow; + } + + @Deprecated + public int getOldSpellingOfEndPickupDropOffWindow() { + return oldSpellingOfEndPickupDropOffWindow; + } } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTimeProxy.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTimeProxy.java index 8d8b29179..21f8f5251 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTimeProxy.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/StopTimeProxy.java @@ -45,8 +45,15 @@ public interface StopTimeProxy { public StopLocation getStop(); + public StopLocation getLocation(); + public StopLocation getLocationGroup(); + public void setStop(StopLocation stop); + public void setLocation(StopLocation stop); + + public void setLocationGroup(StopLocation stop); + public boolean isArrivalTimeSet(); public int getArrivalTime(); @@ -122,4 +129,5 @@ public interface StopTimeProxy { public String getFreeRunningFlag(); public void setFreeRunningFlag(String freeRunningFlag); + } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/WrongWayConcurrency.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/WrongWayConcurrency.java new file mode 100644 index 000000000..5d99702c5 --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/WrongWayConcurrency.java @@ -0,0 +1,85 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import org.onebusaway.csv_entities.schema.annotations.CsvField; +import org.onebusaway.csv_entities.schema.annotations.CsvFields; +import org.onebusaway.gtfs.serialization.mappings.DefaultAgencyIdFieldMappingFactory; +import org.onebusaway.gtfs.serialization.mappings.EntityFieldMappingFactory; + +/** + * An GTFS extension that allows for re-mapping of route + direction + stop + * tuples to a replacement stop. The specific use case example is for + * Subway real-time service that reports an invalid stop and needs to be + * corrected to an appropriate stop. Not to be confused with stop consolidation! + */ +@CsvFields(filename = "wrong_way_concurrencies.txt", required = false) +public class WrongWayConcurrency extends IdentityBean { + + + @CsvField(ignore = true) + private int id; + @CsvField(name = "route_id") + private String routeId; + @CsvField(name = "direction_id") + private String directionId; + @CsvField(name = "from_stop_id", mapping = DefaultAgencyIdFieldMappingFactory.class) + private AgencyAndId fromStopId; + @CsvField(name = "to_stop_id", mapping = DefaultAgencyIdFieldMappingFactory.class) + private AgencyAndId toStopId; + + @Override + public Integer getId() { + return id; + } + + @Override + public void setId(Integer id) { + this.id = id; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public String getDirectionId() { + return directionId; + } + + public void setDirectionId(String directionId) { + this.directionId = directionId; + } + + public AgencyAndId getFromStopId() { + return fromStopId; + } + + public void setFromStopId(AgencyAndId fromStopId) { + this.fromStopId = fromStopId; + } + + public AgencyAndId getToStopId() { + return toStopId; + } + + public void setToStopId(AgencyAndId toStopId) { + this.toStopId = toStopId; + } +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/calendar/AgencyServiceInterval.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/calendar/AgencyServiceInterval.java new file mode 100644 index 000000000..4d10844d3 --- /dev/null +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/model/calendar/AgencyServiceInterval.java @@ -0,0 +1,125 @@ +/** + * Copyright (C) 2024 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model.calendar; + +import java.io.Serializable; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Represent a service interval (a period of defined transit both scheduled and dynamic) + * that exists on a given service date and window relative to that date. The times may differ + * based on the specified agency. The net effect is that the period of consideration can + * be smaller for more frequent service (such as a subway/BRT provider) vs a traditional + * fixed bus service. + */ +public class AgencyServiceInterval implements Serializable { + + public static final int SECONDS_IN_DAY = 24 * 60 * 60; + + private final long _referenceTime; + private final ServiceDate _serviceDate; + + /** + * Map of overrides that have a different window of applicability of service relative + * to the reference time. The default is the entire service date. Values should be + * AGENCY_ID, MINUTES_AFTER_REFERENCE_TIME. + * + */ + private final Map _overridesByAgencyId = new HashMap<>(); + + + public AgencyServiceInterval(long referenceTime) { + _referenceTime = referenceTime; + _serviceDate = new ServiceDate(new Date(referenceTime)); + } + + public AgencyServiceInterval(ServiceDate serviceDate) { + _referenceTime = serviceDate.getAsDate().getTime(); + _serviceDate = serviceDate; + } + + public AgencyServiceInterval(long referenceTime, Map agencyIdOverrides) { + _referenceTime = referenceTime; + _serviceDate = new ServiceDate(new Date(referenceTime)); + if (agencyIdOverrides != null) + _overridesByAgencyId.putAll(agencyIdOverrides); + } + + public ServiceDate getServiceDate() { + return _serviceDate; + } + + public ServiceInterval getServiceInterval(String agencyId) { + + if (_overridesByAgencyId.containsKey(agencyId)) { + // override will be referenceTime, referenceTime+window (in minutes) + ServiceDate serviceDate = new ServiceDate(new Date(_referenceTime)); + int startSecondsIntoDay = Math.toIntExact(_referenceTime - serviceDate.getAsDate().getTime()) / 1000; + int endSecondsIntoDay = startSecondsIntoDay + (_overridesByAgencyId.get(agencyId) * 60); + return new ServiceInterval(startSecondsIntoDay, endSecondsIntoDay); + } + // default will be 0, endOfDay (aka entire service day) + return new ServiceInterval(0, SECONDS_IN_DAY); + } + public Date getFrom(String agencyId) { + if (_overridesByAgencyId.containsKey(agencyId)) + return new Date(_referenceTime); + return new Date(_referenceTime); + } + + public Date getTo(String agencyId) { + if (_overridesByAgencyId.containsKey(agencyId)) + return new Date(_referenceTime + _overridesByAgencyId.get(agencyId) * 60 * 1000); + return endOfDay(_serviceDate); + + } + + private Date endOfDay(ServiceDate serviceDate) { + final Calendar cal = Calendar.getInstance(); + cal.setTime(serviceDate.getAsDate()); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + return cal.getTime(); + } + private Date startOfDay(ServiceDate serviceDate) { + final Calendar cal = Calendar.getInstance(); + cal.setTime(serviceDate.getAsDate()); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 000); + return cal.getTime(); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof AgencyServiceInterval)) { + return false; + } + AgencyServiceInterval that = (AgencyServiceInterval) other; + return that._referenceTime == _referenceTime; + } + + @Override + public int hashCode() { + return new Long(_referenceTime).hashCode(); + } +} diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsEntitySchemaFactory.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsEntitySchemaFactory.java index 3bd9fd0dd..fa954a31e 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsEntitySchemaFactory.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsEntitySchemaFactory.java @@ -42,9 +42,11 @@ public static List> getEntityClasses() { entityClasses.add(BookingRule.class); entityClasses.add(ShapePoint.class); entityClasses.add(Route.class); + entityClasses.add(RouteStop.class); + entityClasses.add(RouteShape.class); entityClasses.add(Level.class); entityClasses.add(Stop.class); - entityClasses.add(StopArea.class); + entityClasses.add(StopAreaElement.class); entityClasses.add(LocationGroupElement.class); entityClasses.add(Trip.class); entityClasses.add(Note.class); @@ -52,7 +54,7 @@ public static List> getEntityClasses() { entityClasses.add(ServiceCalendar.class); entityClasses.add(ServiceCalendarDate.class); entityClasses.add(RiderCategory.class); - entityClasses.add(FareContainer.class); + entityClasses.add(FareMedium.class); entityClasses.add(FareProduct.class); entityClasses.add(FareLegRule.class); entityClasses.add(FareAttribute.class); @@ -71,6 +73,9 @@ public static List> getEntityClasses() { entityClasses.add(DirectionNameException.class); entityClasses.add(Zone.class); entityClasses.add(Node.class); + entityClasses.add(WrongWayConcurrency.class); + entityClasses.add(DirectionEntry.class); + entityClasses.add(AlternateStopNameException.class); return entityClasses; } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsReader.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsReader.java index 0b57455be..14c22680f 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsReader.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsReader.java @@ -16,13 +16,10 @@ */ package org.onebusaway.gtfs.serialization; -import java.io.IOException; -import java.io.Reader; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.*; import org.onebusaway.csv_entities.CsvEntityContext; import org.onebusaway.csv_entities.CsvEntityReader; @@ -32,6 +29,7 @@ import org.onebusaway.csv_entities.exceptions.CsvEntityIOException; import org.onebusaway.csv_entities.schema.DefaultEntitySchemaFactory; import org.onebusaway.gtfs.impl.GtfsDaoImpl; +import org.onebusaway.gtfs.impl.ZipHandler; import org.onebusaway.gtfs.model.*; import org.onebusaway.gtfs.services.GenericMutableDao; import org.slf4j.Logger; @@ -60,6 +58,8 @@ public class GtfsReader extends CsvEntityReader { private boolean _overwriteDuplicates = false; + private File _inputLocation = null; + public GtfsReader() { _entityClasses.add(Agency.class); @@ -69,18 +69,20 @@ public GtfsReader() { _entityClasses.add(Area.class); _entityClasses.add(BookingRule.class); _entityClasses.add(Route.class); + _entityClasses.add(RouteStop.class); + _entityClasses.add(RouteShape.class); _entityClasses.add(Level.class); _entityClasses.add(Stop.class); _entityClasses.add(Location.class); _entityClasses.add(LocationGroupElement.class); _entityClasses.add(Trip.class); - _entityClasses.add(StopArea.class); + _entityClasses.add(StopAreaElement.class); _entityClasses.add(StopTime.class); _entityClasses.add(ServiceCalendar.class); _entityClasses.add(Zone.class); _entityClasses.add(ServiceCalendarDate.class); _entityClasses.add(RiderCategory.class); - _entityClasses.add(FareContainer.class); + _entityClasses.add(FareMedium.class); _entityClasses.add(FareProduct.class); _entityClasses.add(FareLegRule.class); _entityClasses.add(FareAttribute.class); @@ -99,6 +101,9 @@ public GtfsReader() { _entityClasses.add(FacilityProperty.class); _entityClasses.add(RouteNameException.class); _entityClasses.add(DirectionNameException.class); + _entityClasses.add(WrongWayConcurrency.class); + _entityClasses.add(DirectionEntry.class); + _entityClasses.add(AlternateStopNameException.class); CsvTokenizerStrategy tokenizerStrategy = new CsvTokenizerStrategy(); tokenizerStrategy.getCsvParser().setTrimInitialWhitespace(true); @@ -118,6 +123,11 @@ public GtfsReader() { addEntityHandler(new EntityHandlerImpl()); } + public void setInputLocation(File path) throws IOException { + super.setInputLocation(path); + _inputLocation = path; + } + public void setLastModifiedTime(Long lastModifiedTime) { if (lastModifiedTime != null) getContext().put("lastModifiedTime", lastModifiedTime); @@ -202,6 +212,54 @@ public void run(CsvInputSource source) throws IOException { } _entityStore.close(); + + // support metadata files that are not CSV + // but only if we have a GtfsDao + if (_entityStore instanceof GtfsDaoImpl) { + List filenames = ((GtfsDaoImpl) _entityStore).getOptionalMetadataFilenames(); + if (filenames != null) { + for (String metaFile : filenames) { + if (source.hasResource(metaFile)) { + _log.info("reading metadata file: " + metaFile); + ((GtfsDaoImpl) _entityStore).addMetadata(metaFile, readContent(_inputLocation, metaFile)); + } + } + } + } + } + + private String readContent(File inputLocation, String filename) { + if (inputLocation.getAbsoluteFile().getName().endsWith(".zip")) { + // zip file + return readContentFromZip(inputLocation, + filename); + } else { + // file in directory + return readContentFromFile(new File(inputLocation.getAbsolutePath() + + File.separator + + filename)); + } + } + + private String readContentFromFile(File filePath) { + StringBuffer sb = new StringBuffer(); + try { + byte[] bytes = Files.readAllBytes(filePath.toPath()); + sb.append(new String(bytes, StandardCharsets.UTF_8)); + } catch (IOException e) { + System.err.println("issue reading content from " + filePath); + } + return sb.toString(); + } + + private String readContentFromZip(File zipFilePath, String zipEntryName) { + try { + ZipHandler zip = new ZipHandler(zipFilePath); + return zip.readTextFromFile(zipEntryName); + } catch (IOException e) { + System.err.println("issue reading content from " + zipFilePath + ":" + zipEntryName); + } + return null; } /**** @@ -285,9 +343,9 @@ public void handleEntity(Object entity) { } else if (entity instanceof FareProduct) { FareProduct product = (FareProduct) entity; registerAgencyId(FareProduct.class, product.getId()); - } else if (entity instanceof FareContainer) { - FareContainer container = (FareContainer) entity; - registerAgencyId(FareContainer.class, container.getId()); + } else if (entity instanceof FareMedium) { + FareMedium medium = (FareMedium) entity; + registerAgencyId(FareMedium.class, medium.getId()); } else if (entity instanceof RiderCategory) { RiderCategory category = (RiderCategory) entity; registerAgencyId(RiderCategory.class, category.getId()); @@ -300,6 +358,7 @@ public void handleEntity(Object entity) { } else if (entity instanceof Area) { Area area = (Area) entity; registerAgencyId(Area.class, area.getId()); + } else if (entity instanceof Location) { Location location = (Location) entity; registerAgencyId(Location.class, location.getId()); @@ -313,6 +372,15 @@ public void handleEntity(Object entity) { _entityStore.saveEntity(locationGroup); } locationGroup.addLocation(locationGroupElement.getLocation()); + } else if (entity instanceof StopAreaElement) { + var stopAreaElement = (StopAreaElement) entity; + var stopArea = _entityStore.getEntityForId(StopArea.class, stopAreaElement.getArea().getId()); + if (stopArea == null) { + stopArea = new StopArea(); + stopArea.setArea(stopAreaElement.getArea()); + _entityStore.saveEntity(stopArea); + } + stopArea.addLocation(stopAreaElement.getStopLocation()); } else if (entity instanceof Vehicle) { Vehicle vehicle = (Vehicle) entity; registerAgencyId(Vehicle.class, vehicle.getId()); diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsWriter.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsWriter.java index 9e807e3f9..174805354 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsWriter.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/GtfsWriter.java @@ -15,6 +15,8 @@ */ package org.onebusaway.gtfs.serialization; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -23,9 +25,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import org.onebusaway.csv_entities.CsvEntityWriter; import org.onebusaway.csv_entities.schema.DefaultEntitySchemaFactory; +import org.onebusaway.gtfs.impl.ZipHandler; import org.onebusaway.gtfs.services.GtfsDao; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +41,13 @@ public class GtfsWriter extends CsvEntityWriter { private List> _entityClasses = new ArrayList>(); + private File _outputLocation = null; + + public void setOutputLocation(File path) { + super.setOutputLocation(path); + _outputLocation = path; + } + private Map, Comparator> _entityComparators = new HashMap, Comparator>(); public GtfsWriter() { @@ -75,8 +84,47 @@ public void run(GtfsDao dao) throws IOException { } close(); + + // now copy any metadata files + List filenames = dao.getOptionalMetadataFilenames(); + for (String metadataFile : filenames) { + if (dao.hasMetadata(metadataFile)) { + _log.info("writing metadata file : " + metadataFile); + writeContent(metadataFile, dao.getMetadata(metadataFile)); + } + } + } + + private void writeContent(String srcFilename, String content) { + if (content == null) { + return; + } + // outputLocation may be a zip file! + if (_outputLocation.getName().endsWith(".zip")) { + copyToZipFile(srcFilename, content); + } else { + try { + String location = _outputLocation.getAbsolutePath() + File.separator + srcFilename; + FileWriter fw = new FileWriter(location); + fw.write(content); + fw.close(); + } catch (IOException e) { + // don't let metadata issue kill the entire process + System.err.println("issue copying metadata: "+ e); + } + } } + private void copyToZipFile(String srcFilename, String content) { + try { + new ZipHandler(_outputLocation).writeTextToFile(srcFilename, content); + } catch (IOException e) { + // don't let metadata issue kill the entire process + System.err.println("issue copying metadata to zipfile: "+ e); + } + } + + @SuppressWarnings("unchecked") private Collection sortEntities(Class entityClass, Collection entities) { diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/FareProductFieldMappingFactory.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/FareProductFieldMappingFactory.java index 8e8225347..5f3a9b44e 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/FareProductFieldMappingFactory.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/FareProductFieldMappingFactory.java @@ -31,7 +31,7 @@ * Fare products have a composite primary key of * * - fare product id - * - fare container id (nullable) + * - fare medium id (nullable) * - rider category id (nullable) * * So if you want this library to look up the fare product instance you need to supply all of these, @@ -47,13 +47,13 @@ public FieldMapping createFieldMapping(EntitySchemaFactory schemaFactory, return new FareProductFieldMapping(entityType, csvFieldName, objFieldName, required); } - public static AgencyAndId fareProductId(String agencyId, String fareProductId, String riderCategoryId, String fareContainerId) { - String primaryKey = fareProductIdPrimaryKey(fareProductId, riderCategoryId, fareContainerId); + public static AgencyAndId fareProductId(String agencyId, String fareProductId, String riderCategoryId, String fareMediumId) { + String primaryKey = fareProductPrimaryKey(fareProductId, riderCategoryId, fareMediumId); return new AgencyAndId(agencyId, primaryKey); } - static String fareProductIdPrimaryKey(String fareProductId, String riderCategoryId, String fareContainerId) { - return String.format("id=%s|category=%s|container=%s", fareProductId, riderCategoryId, fareContainerId); + static String fareProductPrimaryKey(String fareProductId, String riderCategoryId, String fareMediumId) { + return String.format("id=%s|category=%s|medium=%s", fareProductId, riderCategoryId, fareMediumId); } private static class FareProductFieldMapping extends AbstractFieldMapping { @@ -71,12 +71,12 @@ public void translateFromCSVToObject(CsvEntityContext context, String productId = (String) csvValues.get("fare_product_id"); String categoryId = blankToNull(csvValues, "rider_category_id"); - String containerId = blankToNull(csvValues, "fare_container_id"); + String mediumId = blankToNull(csvValues, "fare_medium_id"); - String primaryKey = fareProductIdPrimaryKey(productId, categoryId, containerId); + String primaryKey = fareProductPrimaryKey(productId, categoryId, mediumId); String agencyId = ctx.getAgencyForEntity(FareProduct.class, primaryKey); - AgencyAndId id = FareProductFieldMappingFactory.fareProductId(agencyId, productId, categoryId, containerId); + AgencyAndId id = FareProductFieldMappingFactory.fareProductId(agencyId, productId, categoryId, mediumId); FareProduct fareProduct = (FareProduct) ctx.getEntity(FareProduct.class, id); diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/StopLocationFieldMappingImpl.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/StopLocationFieldMappingImpl.java index bdb3e8833..d53199b13 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/StopLocationFieldMappingImpl.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/serialization/mappings/StopLocationFieldMappingImpl.java @@ -35,7 +35,7 @@ public Converter create(CsvEntityContext context) { private class ConverterImpl implements Converter { - private GtfsReaderContext _context; + private final GtfsReaderContext _context; public ConverterImpl(GtfsReaderContext context) { _context = context; @@ -55,8 +55,10 @@ public Object convert(@SuppressWarnings("rawtypes") Class type, Object value) { if (stop != null) return stop; Object location = _context.getEntity(Location.class, id); if (location != null) return location; - Object locationGroup = _context.getEntity(LocationGroup.class, id); + Object locationGroup = _context.getEntity(LocationGroup.class, id); if (locationGroup != null) return locationGroup; + Object stopArea = _context.getEntity(StopArea.class, id); + if (stopArea != null) return stopArea; return null; } // we fell through -- unexpected situation diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsDao.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsDao.java index 1c9bc170b..f701b4ab5 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsDao.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsDao.java @@ -17,6 +17,7 @@ import java.util.Collection; +import java.util.List; import java.util.stream.Stream; import org.onebusaway.gtfs.model.*; @@ -74,9 +75,9 @@ public interface GtfsDao extends GenericDao { FareProduct getFareProductForId(AgencyAndId id); /**** - * {@link FareContainer } Methods + * {@link FareMedium } Methods ***/ - Collection getAllFareContainers(); + Collection getAllFareMedia(); /**** * {@link RiderCategory} Methods @@ -131,6 +132,10 @@ public interface GtfsDao extends GenericDao { public Collection getAllRoutes(); + public Collection getAllRouteStops(); + + public Collection getAllRouteShapes(); + public Route getRouteForId(AgencyAndId id); /**** @@ -185,10 +190,15 @@ public interface GtfsDao extends GenericDao { public Collection getAllAreas(); + @Deprecated public Collection getAllLocationGroupElements(); public Collection getAllLocationGroups(); + public Collection getAllStopAreaElements(); + + public Collection getAllStopAreas(); + public Collection getAllLocations(); public Collection getAllBookingRules(); @@ -199,7 +209,9 @@ public interface GtfsDao extends GenericDao { public Collection getAllTranslations(); - Collection getAllStopAreas(); + public Collection getAllDirectionEntries(); + + public Collection getAllWrongWayConcurrencies(); default boolean hasFaresV1() { return Stream.of(getAllFareAttributes(), getAllFareRules()).flatMap(Collection::stream).findAny().isPresent(); @@ -211,4 +223,13 @@ default boolean hasFaresV2() { .findAny() .isPresent(); } + + List getOptionalMetadataFilenames(); + + boolean hasMetadata(String filename); + + String getMetadata(String filename); + + void addMetadata(String filename, String content); + } diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsRelationalDao.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsRelationalDao.java index 6db031427..aedac9a10 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsRelationalDao.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/GtfsRelationalDao.java @@ -17,20 +17,7 @@ */ package org.onebusaway.gtfs.services; -import org.onebusaway.gtfs.model.Agency; -import org.onebusaway.gtfs.model.AgencyAndId; -import org.onebusaway.gtfs.model.Block; -import org.onebusaway.gtfs.model.FareAttribute; -import org.onebusaway.gtfs.model.FareRule; -import org.onebusaway.gtfs.model.Frequency; -import org.onebusaway.gtfs.model.Ridership; -import org.onebusaway.gtfs.model.Route; -import org.onebusaway.gtfs.model.ServiceCalendar; -import org.onebusaway.gtfs.model.ServiceCalendarDate; -import org.onebusaway.gtfs.model.ShapePoint; -import org.onebusaway.gtfs.model.Stop; -import org.onebusaway.gtfs.model.StopTime; -import org.onebusaway.gtfs.model.Trip; +import org.onebusaway.gtfs.model.*; import java.util.List; diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/MockGtfs.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/MockGtfs.java index 268274a53..844cb3dfc 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/MockGtfs.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/MockGtfs.java @@ -164,6 +164,36 @@ public void putStops(int numberOfRows, String... columns) { putFile("stops.txt", b.build()); } + /** + * specify stop_id and stop_name, have stop generated with fake lat/lon + * @param rows + */ + public void putNamedStops(String...rows) { + int numberOfRows = rows.length; + List stopIds = new ArrayList<>(); + List stopNames = new ArrayList<>(); + List stopLats = new ArrayList(); + List stopLons = new ArrayList(); + TableBuilder b = new TableBuilder(numberOfRows); + for (String column : rows) { + String[] parts = column.split(","); + stopIds.add(parts[0]); + stopNames.add(parts[1]); + } + for (int i = 0; i < numberOfRows; ++i) { + double lat = 47.65383950857904 + 0.004 * i; + double lon = -122.30782950811766; + stopLats.add(Double.toString(lat)); + stopLons.add(Double.toString(lon)); + } + + b.addColumnSpec("stop_id", stopIds); + b.addColumnSpec("stop_name", stopNames); + b.addColumnSpec("stop_lat", stopLats); + b.addColumnSpec("stop_lon", stopLons); + putFile("stops.txt", b.build()); + } + public void putDefaultStops() { putDefaultAgencies(); putLines("stops.txt", "stop_id,stop_name,stop_lat,stop_lon", diff --git a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/calendar/CalendarService.java b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/calendar/CalendarService.java index 4982ec744..43d467036 100644 --- a/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/calendar/CalendarService.java +++ b/onebusaway-gtfs/src/main/java/org/onebusaway/gtfs/services/calendar/CalendarService.java @@ -27,11 +27,7 @@ import org.onebusaway.gtfs.model.ServiceCalendarDate; import org.onebusaway.gtfs.model.StopTime; import org.onebusaway.gtfs.model.Trip; -import org.onebusaway.gtfs.model.calendar.CalendarServiceData; -import org.onebusaway.gtfs.model.calendar.LocalizedServiceId; -import org.onebusaway.gtfs.model.calendar.ServiceDate; -import org.onebusaway.gtfs.model.calendar.ServiceIdIntervals; -import org.onebusaway.gtfs.model.calendar.ServiceInterval; +import org.onebusaway.gtfs.model.calendar.*; /** * While the set of {@link ServiceCalendar} and {@link ServiceCalendarDate} @@ -129,6 +125,9 @@ public LocalizedServiceId getLocalizedServiceIdForAgencyAndServiceId( public boolean isLocalizedServiceIdActiveOnDate( LocalizedServiceId localizedServiceId, Date serviceDate); + public boolean isLocalizedServiceIdActiveInRange( + LocalizedServiceId localizedServiceId, ServiceInterval activeService, AgencyServiceInterval serviceInterval); + /** * Given the specified localized service id, which has a corresponding set of * localized service dates, determine the sublist of service dates that, when diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/GtfsTestData.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/GtfsTestData.java index b49d78730..4e21dea45 100644 --- a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/GtfsTestData.java +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/GtfsTestData.java @@ -29,19 +29,29 @@ public class GtfsTestData { - public static final String CALTRAIN_GTFS = "org/onebusaway/gtfs/caltrain_20090308_1937.zip"; + private static String gtfsPath(String name) { + return String.format("org/onebusaway/gtfs/%s",name); + } + + public static final String CALTRAIN_GTFS = gtfsPath("caltrain_20090308_1937.zip"); - public static final String ISLAND_GTFS = "org/onebusaway/gtfs/island-transit_20090312_0314.zip"; + public static final String ISLAND_GTFS = gtfsPath("island-transit_20090312_0314.zip"); - public static final String BART_GTFS = "org/onebusaway/gtfs/bart.zip"; + public static final String BART_GTFS = gtfsPath("bart.zip"); - public static final String TEST_AGENCY_GTFS = "org/onebusaway/gtfs/testagency"; + public static final String TEST_AGENCY_GTFS = gtfsPath("testagency"); + + public static final String TURLOCK_FARES_V2 = gtfsPath("turlock-fares-v2"); - public static final String TURLOCK_FARES_V2 = "org/onebusaway/gtfs/turlock-fares-v2"; + public static final String MDOT_FARES_V2 = gtfsPath("mdot-metro-fares-v2"); - public static final String MDOT_FARES_V2 = "org/onebusaway/gtfs/mdot-metro-fares-v2"; + public static final String PIERCE_TRANSIT_FLEX = gtfsPath("piercetransit-stop-areas-flex"); - public static final String LOCATIONS_GEOJSON = "org/onebusaway/gtfs/locations.geojson"; + public static final String BROWN_COUNTY_FLEX = gtfsPath("brown-county-flex"); + + public static final String AUBURN_TRANSIT_FLEX = gtfsPath("auburn-transit-flex"); + + public static final String LOCATIONS_GEOJSON = gtfsPath("locations.geojson"); public static File getCaltrainGtfs() { return getResourceAsTemporaryFile(CALTRAIN_GTFS); @@ -72,6 +82,18 @@ public static File getMdotMetroFaresV2() { return new File("src/test/resources", MDOT_FARES_V2); } + public static File getPierceTransitFlex() { + return new File("src/test/resources", PIERCE_TRANSIT_FLEX); + } + + public static File getBrownCountyFlex() { + return new File("src/test/resources", BROWN_COUNTY_FLEX); + } + + public static File getAuburnTransitFlex() { + return new File("src/test/resources", AUBURN_TRANSIT_FLEX); + } + public static void readGtfs(T entityStore, File resourcePath, String defaultAgencyId) throws IOException { diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImplSyntheticTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImplSyntheticTest.java index 79f4c8eb9..cb8294a16 100644 --- a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImplSyntheticTest.java +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/impl/calendar/CalendarServiceImplSyntheticTest.java @@ -22,24 +22,19 @@ import static org.onebusaway.gtfs.DateSupport.date; import static org.onebusaway.gtfs.DateSupport.hourToSec; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TimeZone; +import java.util.*; import org.junit.Before; import org.junit.Test; import org.onebusaway.gtfs.model.AgencyAndId; -import org.onebusaway.gtfs.model.calendar.CalendarServiceData; -import org.onebusaway.gtfs.model.calendar.LocalizedServiceId; -import org.onebusaway.gtfs.model.calendar.ServiceDate; -import org.onebusaway.gtfs.model.calendar.ServiceIdIntervals; +import org.onebusaway.gtfs.model.calendar.*; public class CalendarServiceImplSyntheticTest { + static { + // avoid timezone conversions + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + } private TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); private ServiceDate d1 = new ServiceDate(2010, 02, 01); @@ -447,6 +442,71 @@ public void testGetPreviousArrivalServiceDates05() { assertTrue(dates.contains(d1.getAsDate(tz))); } + @Test + public void testAgencyOverrideOverlap() { + long baseTime = d1.getAsDate().getTime(); + + Map oneHourOverride = new HashMap<>(); + oneHourOverride.put("A", 60); // 60 minute window instead of entire service day + + Map twoHourOverride = new HashMap<>(); + twoHourOverride.put("A", 120); // 2 hour window instead of entire service day + + // active service 6:00 -> 7:00 + // 6:00 + 1 service interval + ServiceInterval sixOclockScheudledService = new ServiceInterval(hourToSec(6), hourToSec(7)); + AgencyServiceInterval sixOclock1HourQuery = new AgencyServiceInterval(baseTime + hourToSec(6)*1000, oneHourOverride); + boolean active = service.isLocalizedServiceIdActiveInRange(lsid1, sixOclockScheudledService, sixOclock1HourQuery); + assertTrue(active); // this should be an exact match + + // active service 6:00 -> 7:00 + // 5 + 1 service interval + AgencyServiceInterval fiveOclock1HourQuery = new AgencyServiceInterval(baseTime + hourToSec(5)*1000, oneHourOverride); + active = service.isLocalizedServiceIdActiveInRange(lsid1, sixOclockScheudledService, fiveOclock1HourQuery); + assertTrue(active); + + // active service 6:00 -> 7:00 + // 7 + 1 service interval + AgencyServiceInterval sevenOclock1HourQuery = new AgencyServiceInterval(baseTime + hourToSec(7)*1000, oneHourOverride); + active = service.isLocalizedServiceIdActiveInRange(lsid1, sixOclockScheudledService, sevenOclock1HourQuery); + assertTrue(active); + + // active service 6:00 -> 7:00 + // 5 + 2 service interval + AgencyServiceInterval fiveOclock2HourQuery = new AgencyServiceInterval(baseTime + hourToSec(5)*1000, twoHourOverride); + active = service.isLocalizedServiceIdActiveInRange(lsid1, sixOclockScheudledService, fiveOclock2HourQuery); + assertTrue(active); + + // active service 6:00 -> 25:00 + // 12 + 1 + AgencyServiceInterval lunchInterval1HourOverride = new AgencyServiceInterval(baseTime + hourToSec(12)*1000, oneHourOverride); + ServiceInterval exactMatchInterval = new ServiceInterval(hourToSec(6), hourToSec(25)); + active = service.isLocalizedServiceIdActiveInRange(lsid1, exactMatchInterval, lunchInterval1HourOverride); + assertTrue(active); + + // point in time + AgencyServiceInterval stopCheck = new AgencyServiceInterval(baseTime + 43200, oneHourOverride); + ServiceInterval stopInterval = new ServiceInterval(43230,43230); + active = service.isLocalizedServiceIdActiveInRange(lsid1, stopInterval, lunchInterval1HourOverride); + assertTrue(active); + + } + + @Test + public void testOverlapNoOverride() { + long baseTime = d1.getAsDate().getTime(); + AgencyServiceInterval defaultInterval = new AgencyServiceInterval(baseTime); + // active service 6:00 -> 7:00 + ServiceInterval sixOclockScheudledService = new ServiceInterval(hourToSec(6), hourToSec(7)); + boolean active = service.isLocalizedServiceIdActiveInRange(lsid1, sixOclockScheudledService, defaultInterval); + assertTrue(active); + + long yesterday = d1.getAsDate().getTime() - hourToSec(24) * 1000; + AgencyServiceInterval tomorrowInterval = new AgencyServiceInterval(yesterday); + active = service.isLocalizedServiceIdActiveInRange(lsid1, sixOclockScheudledService, tomorrowInterval); + assertFalse(active); + } + /**** * Private Methods ****/ diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/model/MissingValueTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/model/MissingValueTest.java new file mode 100644 index 000000000..bbe6f6613 --- /dev/null +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/model/MissingValueTest.java @@ -0,0 +1,224 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import java.io.File; +import java.io.IOException; +import java.util.Scanner; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onebusaway.gtfs.serialization.GtfsWriter; +import org.onebusaway.gtfs.serialization.GtfsWriterTest; +import org.onebusaway.gtfs.services.MockGtfs; +import org.onebusaway.gtfs.services.GtfsRelationalDao; + +import static org.junit.Assert.*; + +/** + * Optional flex fields in stop times should not be present + * if not in use. As stop_times is one of the biggest files, + * not only is it annoying it affects the overall GTFS size. + */ +public class MissingValueTest { + + private MockGtfs _gtfs; + + private File _tmpDirectory; + + @Before + public void before() throws IOException { + _gtfs = MockGtfs.create(); + + //make temp directory for gtfs writing output + _tmpDirectory = File.createTempFile("GtfsWriterMissingValueTest-", "-tmp"); + if (_tmpDirectory.exists()) + GtfsWriterTest.deleteFileRecursively(_tmpDirectory); + _tmpDirectory.mkdirs(); + } + + @Test + public void test() throws IOException { + _gtfs.putMinimal(); + _gtfs.putDefaultTrips(); + _gtfs.putDefaultStops(); + _gtfs.putLines("stop_times.txt", + "trip_id,stop_id,stop_sequence,arrival_time,departure_time,mean_duration_factor", + "T10-0,100,0,,08:00:00,", "T10-0,200,1,05:55:55,09:00:00,"); + + GtfsRelationalDao dao = _gtfs.read(); + assertEquals(2, dao.getAllStopTimes().size()); + + GtfsWriter writer = new GtfsWriter(); + writer.setOutputLocation(_tmpDirectory); + writer.run(dao); + + Scanner scan = new Scanner(new File(_tmpDirectory + "/stop_times.txt")); + boolean foundEmptyColumn = false; + boolean foundProperArrivalTime = false; + boolean foundShapeDist = false; + String headerLine = null; + while(scan.hasNext()){ + String line = scan.nextLine(); + if (headerLine == null) headerLine = line; + + if(line.contains("mean_duration_factor")){ + foundEmptyColumn = true; + } + if(line.contains("arrival_time")){ + foundProperArrivalTime = true; + } + // this is an old bug just uncovered -- shape dist traveled is a double + // and the default comparison is quirky due to that + if (line.contains("shape_dist_traveled")) { + foundShapeDist = true; + } + } + assertFalse("Empty Column not properly removed in line " + headerLine, foundEmptyColumn); + assertTrue("Column unexpectedly removed in line " + headerLine, foundProperArrivalTime); + assertFalse("Not expecting shapeDistTraveled in line " + headerLine, foundShapeDist); + } + + @Test + public void testStartingWithMissingValue() throws IOException { + _gtfs.putMinimal(); + _gtfs.putDefaultTrips(); + _gtfs.putDefaultStops(); + _gtfs.putLines("stop_times.txt", + "trip_id,stop_id,stop_sequence,arrival_time,departure_time,timepoint", + "T10-0,100,0,,08:00:00,-999", "T10-0,200,1,05:55:55,09:00:00,-999"); + + GtfsRelationalDao dao = _gtfs.read(); + assertEquals(2, dao.getAllStopTimes().size()); + + GtfsWriter writer = new GtfsWriter(); + writer.setOutputLocation(_tmpDirectory); + writer.run(dao); + + Scanner scan = new Scanner(new File(_tmpDirectory + "/stop_times.txt")); + boolean foundTimepoint = false; + while(scan.hasNext()){ + String line = scan.nextLine(); + if(line.contains("timepoint")){ + foundTimepoint = true; + } + } + assertFalse("Empty Column not properly removed", foundTimepoint); + } + + /** + * Non-proxied double fields have a quirk where the defaultValue needs to be + * -999.0 for the string-based comparison to work. + * @throws IOException + */ + @Test + public void testStartingWithMissingDoubleValue() throws IOException { + _gtfs.putMinimal(); + _gtfs.putDefaultTrips(); + _gtfs.putDefaultStops(); + _gtfs.putLines("stop_times.txt", + "trip_id,stop_id,stop_sequence,arrival_time,departure_time,timepoint,shape_dist_traveled,start_service_area_radius,end_service_area_radius,mean_duration_factor,mean_duration_offset,safe_duration_factor,safe_duration_offset", + "T10-0,100,0,,08:00:00,-999,-999,-999,-999,-999,-999,-999,-999", "T10-0,200,1,05:55:55,09:00:00,-999,-999,-999,-999,-999,-999,-999,-999"); + + GtfsRelationalDao dao = _gtfs.read(); + assertEquals(2, dao.getAllStopTimes().size()); + + GtfsWriter writer = new GtfsWriter(); + writer.setOutputLocation(_tmpDirectory); + writer.run(dao); + + Scanner scan = new Scanner(new File(_tmpDirectory + "/stop_times.txt")); + boolean foundTimepoint = false; + boolean foundShapeDist = false; + boolean foundStartServiceArea = false; + boolean foundEndServiceArea = false; + boolean foundMeanDurationFactor = false; + boolean foundMeanDurationOffset = false; + boolean foundSafeDurationFactor = false; + boolean foundSafeDurationOffset = false; + + String headerLine = null; + while(scan.hasNext()){ + String line = scan.nextLine(); + if (headerLine == null) headerLine = line; + + if(line.contains("timepoint")){ + foundTimepoint = true; + } + if (line.contains("shape_dist_traveled")) { + foundShapeDist = true; + } + if (line.contains("start_service_area_radius")) { + foundStartServiceArea = true; + } + if (line.contains("end_service_area_radius")) { + foundEndServiceArea = true; + } + if (line.contains("mean_duration_factor")) { + foundMeanDurationFactor = true; + } + if (line.contains("mean_duration_offset")) { + foundMeanDurationOffset = true; + } + if (line.contains("safe_duration_factor")) { + foundSafeDurationFactor = true; + } + if (line.contains("safe_duration_offset")) { + foundSafeDurationOffset = true; + } + + } + assertFalse("Empty Column not properly removed", foundTimepoint); + assertFalse("Not expecting shapeDistTraveled in line " + headerLine, foundShapeDist); + assertFalse("Not expecting start service area radius in line " + headerLine, foundStartServiceArea); + assertFalse("Not expecting end service area radius in line " + headerLine, foundEndServiceArea); + assertFalse("Not expecting mean duration factor in line " + headerLine, foundMeanDurationFactor); + assertFalse("Not expecting mean duration offset in line " + headerLine, foundMeanDurationOffset); + assertFalse("Not expecting safe duration factor in line " + headerLine, foundSafeDurationFactor); + assertFalse("Not expecting safe duration offset in line " + headerLine, foundSafeDurationOffset); + } + + @Test + public void testPutMinimal() throws IOException { + _gtfs.putMinimal(); + // Just make sure it parses without throwing an error. + _gtfs.read(); + } + + @After + public void teardown() { + deleteFileRecursively(_tmpDirectory); + } + + public static void deleteFileRecursively(File file) { + + if (!file.exists()) + return; + + if (file.isDirectory()) { + File[] files = file.listFiles(); + if (files != null) { + for (File child : files) + deleteFileRecursively(child); + } + } + + file.delete(); + } + +} + diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/model/StopTimeWithUnderscoreTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/model/StopTimeWithUnderscoreTest.java new file mode 100644 index 000000000..9a5240a7e --- /dev/null +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/model/StopTimeWithUnderscoreTest.java @@ -0,0 +1,134 @@ +/** + * Copyright (C) 2023 Cambridge Systematics, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.model; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onebusaway.gtfs.serialization.GtfsWriter; +import org.onebusaway.gtfs.serialization.GtfsWriterTest; +import org.onebusaway.gtfs.services.MockGtfs; +import org.onebusaway.gtfs.services.GtfsRelationalDao; + +import static org.junit.Assert.*; + +public class StopTimeWithUnderscoreTest { + + private MockGtfs _gtfs; + + private File _tmpDirectory; + + @Before + public void before() throws IOException { + _gtfs = MockGtfs.create(); + + //make temp directory for gtfs writing output + _tmpDirectory = File.createTempFile("GtfsWriterStopTimeWithUnderScoreTest-", "-tmp"); + if (_tmpDirectory.exists()) + GtfsWriterTest.deleteFileRecursively(_tmpDirectory); + _tmpDirectory.mkdirs(); + } + + @Test + public void testWithUnderScore() throws IOException { + _gtfs.putMinimal(); + _gtfs.putDefaultTrips(); + _gtfs.putDefaultStops(); + _gtfs.putLines("stop_times.txt", + "trip_id,stop_id,stop_sequence,arrival_time,departure_time,end_pickup_drop_off_window", + "T10-0,100,0,05:55:55,08:00:00,08:23:23", "T10-0,200,1,05:55:55,09:00:00,08:44:44"); + + GtfsRelationalDao dao = _gtfs.read(); + assertEquals(2, dao.getAllStopTimes().size()); + + GtfsWriter writer = new GtfsWriter(); + writer.setOutputLocation(_tmpDirectory); + writer.run(dao); + + Scanner scan = new Scanner(new File(_tmpDirectory + "/stop_times.txt")); + boolean foundUnderscoreParam = false; + while(scan.hasNext()){ + String line = scan.nextLine(); + if(line.contains("end_pickup_drop_off_window")){ + foundUnderscoreParam = true; + } + } + // if the underscore version was input use it as output + assertTrue("Column without underscore was not found", foundUnderscoreParam); + } + + @Test + public void testWithoutUnderscore() throws IOException { + _gtfs.putMinimal(); + _gtfs.putDefaultTrips(); + _gtfs.putDefaultStops(); + _gtfs.putLines("stop_times.txt", + "trip_id,stop_id,stop_sequence,arrival_time,departure_time,end_pickup_dropoff_window", + "T10-0,100,0,05:55:55,08:00:00,08:23:23", "T10-0,200,1,05:55:55,09:00:00,08:44:44"); + + GtfsRelationalDao dao = _gtfs.read(); + assertEquals(2, dao.getAllStopTimes().size()); + + GtfsWriter writer = new GtfsWriter(); + writer.setOutputLocation(_tmpDirectory); + writer.run(dao); + + Scanner scan = new Scanner(new File(_tmpDirectory + "/stop_times.txt")); + boolean foundUnderscoreParam = false; + while(scan.hasNext()){ + String line = scan.nextLine(); + if(line.contains("end_pickup_dropoff_window")){ + foundUnderscoreParam = true; + } + } + // if the new spec was used as input ensure it is output + assertTrue("Column without underscore was not found", foundUnderscoreParam); + } + + @Test + public void testPutMinimal() throws IOException { + _gtfs.putMinimal(); + // Just make sure it parses without throwing an error. + _gtfs.read(); + } + + @After + public void teardown() { + deleteFileRecursively(_tmpDirectory); + } + + public static void deleteFileRecursively(File file) { + + if (!file.exists()) + return; + + if (file.isDirectory()) { + File[] files = file.listFiles(); + if (files != null) { + for (File child : files) + deleteFileRecursively(child); + } + } + + file.delete(); + } + +} + diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/BaseGtfsTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/BaseGtfsTest.java new file mode 100644 index 000000000..aa869093f --- /dev/null +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/BaseGtfsTest.java @@ -0,0 +1,43 @@ +/** + * Copyright (C) 2022 Leonard Ehrenfried + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.serialization; + +import java.io.File; +import java.io.IOException; +import org.onebusaway.gtfs.impl.GtfsRelationalDaoImpl; +import org.onebusaway.gtfs.services.GtfsRelationalDao; + +public class BaseGtfsTest { + + public static GtfsRelationalDao processFeed( + File resourcePath, String agencyId, + boolean internStrings + ) throws IOException { + + GtfsReader reader = new GtfsReader(); + reader.setDefaultAgencyId(agencyId); + reader.setInternStrings(internStrings); + + reader.setInputLocation(resourcePath); + + GtfsRelationalDaoImpl entityStore = new GtfsRelationalDaoImpl(); + entityStore.setGenerateIds(true); + reader.setEntityStore(entityStore); + + reader.run(); + return entityStore; + } +} diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FaresV2ReaderTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FaresV2ReaderTest.java new file mode 100644 index 000000000..dfaf49d7b --- /dev/null +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FaresV2ReaderTest.java @@ -0,0 +1,165 @@ +/** + * Copyright (C) 2023 Leonard Ehrenfried + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.serialization; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import org.junit.Test; +import org.onebusaway.csv_entities.exceptions.CsvEntityIOException; +import org.onebusaway.gtfs.GtfsTestData; +import org.onebusaway.gtfs.model.Agency; +import org.onebusaway.gtfs.model.AgencyAndId; +import org.onebusaway.gtfs.model.FareLegRule; +import org.onebusaway.gtfs.model.FareMedium; +import org.onebusaway.gtfs.model.FareProduct; +import org.onebusaway.gtfs.model.FareTransferRule; +import org.onebusaway.gtfs.model.RiderCategory; +import org.onebusaway.gtfs.model.Route; +import org.onebusaway.gtfs.model.StopAreaElement; +import org.onebusaway.gtfs.services.GtfsRelationalDao; +import org.onebusaway.gtfs.services.MockGtfs; + +public class FaresV2ReaderTest extends BaseGtfsTest { + + @Test + public void turlockFaresV2() throws CsvEntityIOException, IOException { + String agencyId = "1642"; + GtfsRelationalDao dao = processFeed(GtfsTestData.getTurlockFaresV2(), + agencyId, false); + + Agency agency = dao.getAgencyForId(agencyId); + assertEquals(agencyId, agency.getId()); + assertEquals("Turlock Transit", agency.getName()); + assertEquals("http://www.turlocktransit.com/", agency.getUrl()); + assertEquals("America/Los_Angeles", agency.getTimezone()); + + List fareProducts = new ArrayList<>(dao.getAllFareProducts()); + assertEquals(12, fareProducts.size()); + + FareProduct fp = fareProducts.stream().sorted(Comparator.comparing(FareProduct::getId)).findFirst().get(); + assertEquals("id=31-day_disabled|category=disabled|medium=null", fp.getId().getId()); + assertEquals("31-Day Pass Persons with Disabilities", fp.getName()); + assertEquals("USD", fp.getCurrency()); + assertEquals(15.0, fp.getAmount(), 0); + assertEquals(3, fp.getDurationUnit()); + assertEquals(31, fp.getDurationAmount()); + assertEquals(2, fp.getDurationType()); + RiderCategory cat = fp.getRiderCategory(); + assertEquals("Persons with Disabilities", cat.getName()); + assertEquals("disabled", cat.getId().getId()); + + + List fareLegRules = new ArrayList<>(dao.getAllFareLegRules()); + assertEquals(12, fareLegRules.size()); + + FareLegRule flr = fareLegRules.stream().sorted(Comparator.comparing(FareLegRule::getId)).findFirst().get(); + assertEquals("groupId=Turlock|product=31-day_disabled|network=null|fromArea=null|toArea=null", flr.getId()); + assertEquals("Turlock", flr.getLegGroupId().getId()); + + List riderCats = new ArrayList<>(dao.getAllRiderCategories()); + assertEquals(5, riderCats.size()); + + RiderCategory riderCat = riderCats.stream().sorted(Comparator.comparing(RiderCategory::getId)).filter(c -> c.getId().getId().equals("youth")).findAny().get(); + assertEquals("youth", riderCat.getId().getId()); + assertEquals("Youth Age 18 and Under", riderCat.getName()); + assertEquals(18, riderCat.getMaxAge()); + assertEquals(RiderCategory.MISSING_VALUE, riderCat.getMinAge()); + assertEquals("http://www.turlocktransit.com/fares.html", riderCat.getEligibilityUrl()); + + assertTrue(dao.hasFaresV1()); + assertTrue(dao.hasFaresV2()); + } + @Test + public void mdotMetroFaresV2() throws CsvEntityIOException, IOException { + String agencyId = "1"; + GtfsRelationalDao dao = processFeed(GtfsTestData.getMdotMetroFaresV2(), + agencyId, false); + + Agency agency = dao.getAgencyForId(agencyId); + assertEquals(agencyId, agency.getId()); + assertEquals("Maryland Transit Administration Metro Subway", agency.getName()); + + List fareProducts = new ArrayList<>(dao.getAllFareProducts()); + assertEquals(21, fareProducts.size()); + + FareProduct fp = fareProducts.stream().sorted(Comparator.comparing(FareProduct::getId)).findFirst().get(); + assertEquals("id=core_local_1_day_fare|category=null|medium=charmcard", fp.getId().getId()); + assertEquals("1-Day Pass - Core Service", fp.getName()); + assertEquals("USD", fp.getCurrency()); + assertEquals(4.6, fp.getAmount(), 0.01); + + List fareLegRules = new ArrayList<>(dao.getAllFareLegRules()); + assertEquals(7, fareLegRules.size()); + + FareLegRule flr = fareLegRules.stream().sorted(Comparator.comparing(FareLegRule::getId)).findFirst().get(); + assertEquals("groupId=core_local_one_way_trip|product=core_local_1_day_fare|network=core|fromArea=null|toArea=null", flr.getId()); + assertEquals("core_local_one_way_trip", flr.getLegGroupId().getId()); + + List fareTransferRules = new ArrayList<>(dao.getAllFareTransferRules()); + assertEquals(3, fareTransferRules.size()); + + FareTransferRule ftr = fareTransferRules.stream().sorted(Comparator.comparing(FareTransferRule::getId)).findFirst().get(); + assertEquals("1_core_express_one_way_trip_1_core_express_one_way_trip_null_-999_5400", ftr.getId()); + assertEquals(new AgencyAndId("1", "core_express_one_way_trip"), ftr.getFromLegGroupId()); + assertEquals(-999, ftr.getTransferCount()); + assertEquals(5400, ftr.getDurationLimit()); + + List media = new ArrayList<>(dao.getAllFareMedia()); + assertEquals(3, fareTransferRules.size()); + + FareMedium medium = media.stream().filter(c -> c.getId().getId().equals("charmcard_senior")).findFirst().get(); + assertEquals("charmcard_senior", medium.getId().getId()); + assertEquals("Senior CharmCard", medium.getName()); + + List stopAreaElements = new ArrayList<>(dao.getAllStopAreaElements()); + assertEquals(0, stopAreaElements.size()); + + List routes = new ArrayList<>(dao.getAllRoutes()); + assertEquals(1, routes.size()); + assertEquals("core", routes.get(0).getNetworkId()); + + assertFalse(dao.hasFaresV1()); + assertTrue(dao.hasFaresV2()); + } + + + @Test + public void testFaresV2Distance() throws IOException{ + MockGtfs gtfs = MockGtfs.create(); + gtfs.putMinimal(); + gtfs.putLines("fare_products.txt", "fare_product_id, amount, currency", "" + + "fare_1,5,EUR"); + gtfs.putLines("fare_leg_rules.txt", "network_id,min_distance,max_distance,distance_type,fare_product_id", + "bus,0,3,1,fare_1" + ); + GtfsRelationalDao dao = processFeed(gtfs.getPath(), "1", false); + assertTrue(dao.getAllFareLegRules().stream().map(fareLegRule -> fareLegRule.getMaxDistance()).findFirst().get() == 3.0); + assertTrue(dao.getAllFareLegRules().stream().map(fareLegRule -> fareLegRule.getMinDistance()).findFirst().get() == 0.0); + assertTrue(dao.getAllFareLegRules().stream().map(fareLegRule -> fareLegRule.getDistanceType()).findFirst().get() == 1); + } + +} diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FlexDropOffSpellingTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FlexDropOffSpellingTest.java new file mode 100644 index 000000000..d5bb63ad7 --- /dev/null +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FlexDropOffSpellingTest.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2022 Leonard Ehrenfried + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.serialization; + +import static junit.framework.Assert.assertEquals; +import static org.onebusaway.gtfs.serialization.GtfsReaderTest.processFeed; + +import java.io.IOException; +import java.time.LocalTime; +import java.util.ArrayList; +import org.junit.Test; +import org.onebusaway.gtfs.model.StopTime; +import org.onebusaway.gtfs.services.GtfsRelationalDao; +import org.onebusaway.gtfs.services.MockGtfs; + +/** + * The commit https://github.com/MobilityData/gtfs-flex/commit/547200dfb580771265ae14b07d9bfd7b91c16ed2 + * of the flex V2 spec changes the following spellings : + * + * - start_pickup_dropoff_window -> start_pickup_drop_off_window + * - end_pickup_dropoff_window -> start_pickup_drop_off_window + * + * Since it's hard to spot: the change is in the word "dropoff" vs "drop_off". + * + * This test makes sure that both spellings are understood. + */ +public class FlexDropOffSpellingTest { + + @Test + public void oldSpelling() throws IOException { + testFlexStopTimeWithSpelling("dropoff"); + } + + @Test + public void newSpelling() throws IOException { + testFlexStopTimeWithSpelling("drop_off"); + } + + private static void testFlexStopTimeWithSpelling(String dropOffSpelling) throws IOException { + MockGtfs gtfs = MockGtfs.create(); + gtfs.putMinimal(); + gtfs.putDefaultTrips(); + + String rows = + String.format( + "trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_booking_rule_id,drop_off_booking_rule_id,start_pickup_%s_window,end_pickup_%s_window", + dropOffSpelling, dropOffSpelling + ); + + gtfs.putLines( + "stop_times.txt", + rows, + "T10-0,,,location-123,0,headsign-1,,,10:00:00,18:00:00" + ); + GtfsRelationalDao dao = processFeed(gtfs.getPath(), "1", false); + + assertEquals(1, dao.getAllStopTimes().size()); + + StopTime stopTime = new ArrayList<>(dao.getAllStopTimes()).get(0); + + assertEquals("1_T10-0", stopTime.getTrip().getId().toString()); + assertEquals(LocalTime.parse("10:00").toSecondOfDay(), stopTime.getStartPickupDropOffWindow()); + assertEquals(LocalTime.parse("18:00").toSecondOfDay(), stopTime.getEndPickupDropOffWindow()); + } +} diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FlexReaderTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FlexReaderTest.java new file mode 100644 index 000000000..79557807a --- /dev/null +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/FlexReaderTest.java @@ -0,0 +1,125 @@ +/** + * Copyright (C) 2023 Leonard Ehrenfried + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onebusaway.gtfs.serialization; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +import java.io.IOException; +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.junit.Test; +import org.onebusaway.csv_entities.exceptions.CsvEntityIOException; +import org.onebusaway.gtfs.GtfsTestData; +import org.onebusaway.gtfs.model.Location; +import org.onebusaway.gtfs.model.LocationGroup; +import org.onebusaway.gtfs.model.Stop; +import org.onebusaway.gtfs.model.StopArea; +import org.onebusaway.gtfs.model.StopLocation; +import org.onebusaway.gtfs.model.StopTime; + +public class FlexReaderTest extends BaseGtfsTest { + + private static final String AGENCY_ID = "1"; + + @Test + public void pierceTransitStopAreas() throws CsvEntityIOException, IOException { + var dao = processFeed(GtfsTestData.getPierceTransitFlex(), AGENCY_ID, false); + + var areaElements = List.copyOf(dao.getAllStopAreaElements()); + assertEquals(15, areaElements.size()); + + var first = areaElements.get(0); + assertEquals("1_4210813", first.getArea().getId().toString()); + var stop = first.getStopLocation(); + assertEquals("4210806", stop.getId().getId()); + assertEquals("Bridgeport Way & San Francisco Ave SW (Northbound)", stop.getName()); + assertSame(Stop.class, stop.getClass()); + + var areaWithLocation = areaElements.stream().filter(a -> a.getId().toString().equals("1_4210800_area_1076")).findFirst().get(); + + var location = areaWithLocation.getStopLocation(); + assertSame(Location.class, location.getClass()); + + var stopAreas = List.copyOf(dao.getAllStopAreas()); + assertEquals(2, stopAreas.size()); + + var area = getArea(stopAreas, "1_4210813"); + assertEquals(12, area.getLocations().size()); + var stop2 = area.getLocations().stream().min(Comparator.comparing(StopLocation::getName)).get(); + assertEquals("Barnes Blvd & D St SW", stop2.getName()); + + var area2 = getArea(stopAreas, "1_4210800"); + assertEquals(3, area2.getLocations().size()); + + var names = area2.getLocations().stream().map(s -> s.getId().toString()).collect(Collectors.toSet()); + + assertEquals(Set.of("1_area_1075", "1_area_1074", "1_area_1076"), names); + + var trips = dao.getAllTrips(); + assertEquals(7, trips.size()); + + var trip = trips.stream().filter(t -> t.getId().getId().equals("t_5586096_b_80376_tn_0")).findFirst().get(); + var stopTimes = dao.getStopTimesForTrip(trip); + + var classes = stopTimes.stream().map(st -> st.getStop().getClass()).collect(Collectors.toList()); + assertEquals(List.of(StopArea.class, StopArea.class), classes); + + assertEquals("JBLM Stops", area.getName()); + + } + + @Test + public void locationIdAsASeparateColumn() throws CsvEntityIOException, IOException { + var dao = processFeed(GtfsTestData.getBrownCountyFlex(), AGENCY_ID, false); + var trip = dao.getAllTrips().stream().filter(t -> t.getId().getId().equals("t_5374696_b_77497_tn_0")).findAny().get(); + var stopTimes = dao.getStopTimesForTrip(trip); + stopTimes.forEach(st -> assertNotNull(st.getStopLocation())); + + var stopLocations = stopTimes.stream().map(StopTime::getStopLocation).collect(Collectors.toList()); + var first = stopLocations.get(0); + assertEquals("4149546", first.getId().getId()); + assertEquals(Stop.class, first.getClass()); + + var second = stopLocations.get(1); + assertEquals("radius_300_s_4149546_s_4149547", second.getId().getId()); + assertEquals(Location.class, second.getClass()); + } + + @Test + public void locationGroupIdAsSeparateColumn() throws CsvEntityIOException, IOException { + var dao = processFeed(GtfsTestData.getAuburnTransitFlex(), AGENCY_ID, false); + var trip = dao.getAllTrips().stream().filter(t -> t.getId().getId().equals("t_5756013_b_33000_tn_0")).findAny().get(); + var stopTimes = dao.getStopTimesForTrip(trip); + stopTimes.forEach(st -> assertNotNull(st.getStopLocation())); + + var stopLocations = stopTimes.stream().map(StopTime::getStopLocation).collect(Collectors.toList()); + var first = stopLocations.get(0); + assertEquals("4230479", first.getId().getId()); + assertEquals(LocationGroup.class, first.getClass()); + + var second = stopLocations.get(1); + assertEquals("4230479", second.getId().getId()); + assertEquals(LocationGroup.class, second.getClass()); + } + + private static StopArea getArea(List stopAreas, String id) { + return stopAreas.stream().filter(a -> a.getId().toString().equals(id)).findAny().get(); + } +} diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsReaderTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsReaderTest.java index 1d098cbc3..ea3bd1ffe 100644 --- a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsReaderTest.java +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsReaderTest.java @@ -50,7 +50,7 @@ import org.onebusaway.gtfs.services.GtfsRelationalDao; import org.onebusaway.gtfs.services.MockGtfs; -public class GtfsReaderTest { +public class GtfsReaderTest extends BaseGtfsTest { @Test public void testAllFields() throws IOException { @@ -68,8 +68,8 @@ public void testAllFields() throws IOException { gtfs.putLines( "stops.txt", "stop_id,stop_name,stop_lat,stop_lon,stop_desc,stop_code,stop_direction,location_type,parent_station," - + "stop_url,wheelchair_boarding,zone_id,stop_timezone,vehicle_type,platform_code,level_id", - "S1,Stop,47.0,-122.0,description,123,N,1,1234,http://agency.gov/stop,1,Z,America/New_York,2,9 3/4,L1"); + + "stop_url,wheelchair_boarding,zone_id,stop_timezone,vehicle_type,platform_code,level_id,tts_stop_name", + "S1,Stop,47.0,-122.0,description,123,N,1,1234,http://agency.gov/stop,1,Z,America/New_York,2,9 3/4,L1,southwest one hundred twenty fifth & longhorn"); gtfs.putLines( "routes.txt", "agency_id,route_id,route_short_name,route_long_name,route_type,route_desc,route_color,route_text_color," @@ -111,8 +111,8 @@ public void testAllFields() throws IOException { "S1,R1,T1,S1,R1,T1,2,60"); gtfs.putLines( "feed_info.txt", - "feed_publisher_name,feed_publisher_url,feed_lang,feed_start_date,feed_end_date,feed_version", - "Test,http://agency.gov/,en,20120110,20120217,2.0"); + "feed_publisher_name,feed_publisher_url,feed_lang,feed_start_date,feed_end_date,feed_version,feed_contact_email,feed_contact_url", + "Test,http://agency.gov/,en,20120110,20120217,2.0,agency@email.com,http://agency.gov/"); gtfs.putLines( "pathways.txt", "pathway_id,pathway_mode,is_bidirectional,from_stop_id,to_stop_id,traversal_time", @@ -186,6 +186,8 @@ public void testAllFields() throws IOException { assertEquals(2, stop.getVehicleType()); assertEquals("9 3/4", stop.getPlatformCode()); assertEquals(level, stop.getLevel()); + assertEquals("southwest one hundred twenty fifth & longhorn",stop.getTtsStopName()); + Route route = dao.getRouteForId(new AgencyAndId("1", "R1")); assertEquals(new AgencyAndId("1", "R1"), route.getId()); @@ -303,6 +305,8 @@ public void testAllFields() throws IOException { assertEquals(new ServiceDate(2012, 1, 10), feedInfo.getStartDate()); assertEquals(new ServiceDate(2012, 2, 17), feedInfo.getEndDate()); assertEquals("2.0", feedInfo.getVersion()); + assertEquals("agency@email.com",feedInfo.getContactEmail()); + assertEquals("http://agency.gov/",feedInfo.getContactUrl()); Pathway pathway = dao.getAllPathways().iterator().next(); assertEquals(new AgencyAndId("1", "P1"), pathway.getId()); @@ -394,7 +398,7 @@ public void testIslandTransit() throws IOException { } @Test - public void testCaltrain() throws IOException, ParseException { + public void testCaltrain() throws IOException { File resourcePath = GtfsTestData.getCaltrainGtfs(); String agencyId = "Caltrain"; @@ -555,7 +559,7 @@ public void testCaltrain() throws IOException, ParseException { } @Test - public void testBart() throws IOException, ParseException { + public void testBart() throws IOException { File resourcePath = GtfsTestData.getBartGtfs(); String agencyId = "BART"; @@ -577,7 +581,7 @@ public void testBart() throws IOException, ParseException { } @Test - public void testIntern() throws IOException, ParseException { + public void testIntern() throws IOException { File resourcePath; String agencyId; GtfsDao entityStore; @@ -697,8 +701,7 @@ public void testTestAgency() throws IOException { } @Test - public void testUtf8() throws IOException, ParseException, - InterruptedException { + public void testUtf8() throws IOException { MockGtfs mockGtfs = MockGtfs.create(); mockGtfs.putDefaultStopTimes(); @@ -716,8 +719,7 @@ public void testUtf8() throws IOException, ParseException, } @Test - public void testBom() throws IOException, ParseException, - InterruptedException { + public void testBom() throws IOException { MockGtfs mockGtfs = MockGtfs.create(); mockGtfs.putDefaultStopTimes(); @@ -777,108 +779,6 @@ public void testFrequency() throws CsvEntityIOException, IOException { assertSame(trip, frequency.getTrip()); } - @Test - public void turlockFaresV2() throws CsvEntityIOException, IOException { - String agencyId = "1642"; - GtfsRelationalDao dao = processFeed(GtfsTestData.getTurlockFaresV2(), - agencyId, false); - - Agency agency = dao.getAgencyForId(agencyId); - assertEquals(agencyId, agency.getId()); - assertEquals("Turlock Transit", agency.getName()); - assertEquals("http://www.turlocktransit.com/", agency.getUrl()); - assertEquals("America/Los_Angeles", agency.getTimezone()); - - List fareProducts = new ArrayList<>(dao.getAllFareProducts()); - assertEquals(12, fareProducts.size()); - - FareProduct fp = fareProducts.stream().sorted(Comparator.comparing(FareProduct::getId)).findFirst().get(); - assertEquals("id=31-day_disabled|category=disabled|container=null", fp.getId().getId()); - assertEquals("31-Day Pass Persons with Disabilities", fp.getName()); - assertEquals("USD", fp.getCurrency()); - assertEquals(15.0, fp.getAmount(), 0); - assertEquals(3, fp.getDurationUnit()); - assertEquals(31, fp.getDurationAmount()); - assertEquals(2, fp.getDurationType()); - RiderCategory cat = fp.getRiderCategory(); - assertEquals("Persons with Disabilities", cat.getName()); - assertEquals("disabled", cat.getId().getId()); - - - List fareLegRules = new ArrayList<>(dao.getAllFareLegRules()); - assertEquals(12, fareLegRules.size()); - - FareLegRule flr = fareLegRules.stream().sorted(Comparator.comparing(FareLegRule::getId)).findFirst().get(); - assertEquals("id=31-day_disabled|network=null|fromArea=null|toArea=null|container=null|category=disabled", flr.getId()); - assertEquals("Turlock", flr.getLegGroupId()); - assertEquals("Persons with Disabilities", flr.getRiderCategory().getName()); - - List riderCats = new ArrayList<>(dao.getAllRiderCategories()); - assertEquals(5, riderCats.size()); - - RiderCategory riderCat = riderCats.stream().sorted(Comparator.comparing(RiderCategory::getId)).filter(c -> c.getId().getId().equals("youth")).findAny().get(); - assertEquals("youth", riderCat.getId().getId()); - assertEquals("Youth Age 18 and Under", riderCat.getName()); - assertEquals(18, riderCat.getMaxAge()); - assertEquals(RiderCategory.MISSING_VALUE, riderCat.getMinAge()); - assertEquals("http://www.turlocktransit.com/fares.html", riderCat.getEligibilityUrl()); - - assertTrue(dao.hasFaresV1()); - assertTrue(dao.hasFaresV2()); - } - @Test - public void mdotMetroFaresV2() throws CsvEntityIOException, IOException { - String agencyId = "1"; - GtfsRelationalDao dao = processFeed(GtfsTestData.getMdotMetroFaresV2(), - agencyId, false); - - Agency agency = dao.getAgencyForId(agencyId); - assertEquals(agencyId, agency.getId()); - assertEquals("Maryland Transit Administration Metro Subway", agency.getName()); - - List fareProducts = new ArrayList<>(dao.getAllFareProducts()); - assertEquals(21, fareProducts.size()); - - FareProduct fp = fareProducts.stream().sorted(Comparator.comparing(FareProduct::getId)).findFirst().get(); - assertEquals("id=core_local_1_day_fare|category=null|container=charmcard", fp.getId().getId()); - assertEquals("1-Day Pass - Core Service", fp.getName()); - assertEquals("USD", fp.getCurrency()); - assertEquals(4.6, fp.getAmount(), 0.01); - - List fareLegRules = new ArrayList<>(dao.getAllFareLegRules()); - assertEquals(21, fareLegRules.size()); - - FareLegRule flr = fareLegRules.stream().sorted(Comparator.comparing(FareLegRule::getId)).findFirst().get(); - assertEquals("id=core_local_1_day_fare|network=core|fromArea=null|toArea=null|container=charmcard|category=null", flr.getId()); - assertEquals("core_local_one_way_trip", flr.getLegGroupId()); - - List fareTransferRules = new ArrayList<>(dao.getAllFareTransferRules()); - assertEquals(3, fareTransferRules.size()); - - FareTransferRule ftr = fareTransferRules.stream().sorted(Comparator.comparing(FareTransferRule::getId)).findFirst().get(); - assertEquals("1_core_express_one_way_trip_1_core_express_one_way_trip_null_-999_5400", ftr.getId()); - assertEquals(new AgencyAndId("1", "core_express_one_way_trip"), ftr.getFromLegGroupId()); - assertEquals(-999, ftr.getTransferCount()); - assertEquals(5400, ftr.getDurationLimit()); - - List containers = new ArrayList<>(dao.getAllFareContainers()); - assertEquals(3, fareTransferRules.size()); - - FareContainer container = containers.stream().filter(c -> c.getId().getId().equals("charmcard_senior")).findFirst().get(); - assertEquals("charmcard_senior", container.getId().getId()); - assertEquals("Senior CharmCard", container.getName()); - - List stopAreas = new ArrayList<>(dao.getAllStopAreas()); - assertEquals(0, stopAreas.size()); - - List routes = new ArrayList<>(dao.getAllRoutes()); - assertEquals(1, routes.size()); - assertEquals("core", routes.get(0).getNetworkId()); - - assertFalse(dao.hasFaresV1()); - assertTrue(dao.hasFaresV2()); - } - @Test public void testFeedInfo() throws CsvEntityIOException, IOException { @@ -1030,27 +930,6 @@ public void testCsvParser() throws CsvEntityIOException, IOException { assertEquals("Ten, Ten", route.getLongName()); } - /**** - * Private Methods - ****/ - - private GtfsRelationalDao processFeed(File resourcePath, String agencyId, - boolean internStrings) throws IOException { - - GtfsReader reader = new GtfsReader(); - reader.setDefaultAgencyId(agencyId); - reader.setInternStrings(internStrings); - - reader.setInputLocation(resourcePath); - - GtfsRelationalDaoImpl entityStore = new GtfsRelationalDaoImpl(); - entityStore.setGenerateIds(true); - reader.setEntityStore(entityStore); - - reader.run(); - return entityStore; - } - private ShapePoint getShapePoint(Iterable shapePoints, AgencyAndId shapeId, int sequence) { for (ShapePoint shapePoint : shapePoints) { diff --git a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsWriterTest.java b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsWriterTest.java index 76d44a04d..b8c47d6b5 100644 --- a/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsWriterTest.java +++ b/onebusaway-gtfs/src/test/java/org/onebusaway/gtfs/serialization/GtfsWriterTest.java @@ -23,24 +23,27 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.onebusaway.gtfs.impl.FileSupport; import org.onebusaway.gtfs.impl.GtfsRelationalDaoImpl; import org.onebusaway.gtfs.model.Agency; public class GtfsWriterTest { + private FileSupport _support = new FileSupport(); private File _tmpDirectory; @Before public void setup() throws IOException { _tmpDirectory = File.createTempFile("GtfsWriterTest-", "-tmp"); if (_tmpDirectory.exists()) - deleteFileRecursively(_tmpDirectory); + _support.deleteFileRecursively(_tmpDirectory); _tmpDirectory.mkdirs(); + _support.markForDeletion(_tmpDirectory); } @After public void teardown() { - deleteFileRecursively(_tmpDirectory); + _support.cleanup(); } @Test diff --git a/onebusaway-gtfs/src/test/resources/log4j.properties b/onebusaway-gtfs/src/test/resources/log4j.properties deleted file mode 100644 index 6df8853de..000000000 --- a/onebusaway-gtfs/src/test/resources/log4j.properties +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2008 Brian Ferris -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - - -log4j.rootLogger = INFO, stdout - -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold = DEBUG -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n - - - diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/agency.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/agency.txt new file mode 100644 index 000000000..98b463871 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/agency.txt @@ -0,0 +1,2 @@ +agency_id,agency_url,agency_lang,agency_name,agency_phone,agency_timezone,agency_fare_url,tts_agency_name +1593,https://www.auburn.ca.gov/192/Transit-Services,en,Auburn Transit,(530) 906-3700,America/Los_Angeles,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/booking_rules.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/booking_rules.txt new file mode 100644 index 000000000..e9ef19c28 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/booking_rules.txt @@ -0,0 +1,2 @@ +booking_rule_id,booking_type,prior_notice_duration_min,prior_notice_duration_max,prior_notice_start_day,prior_notice_start_time,prior_notice_last_day,prior_notice_last_time,prior_notice_service_id,message,pickup_message,drop_off_message,phone_number,info_url,booking_url +booking_route_32372,0,,,,,,,,"Auburn Transit provides transportation to and from any Auburn Loop bus stop as well as deviations up to ½ mile throughout the City and parts of surrounding Placer County. To request a ride, call 530-906-3171. Booking through the TransLoc app is available as well.",,,530-906-3171,https://www.auburn.ca.gov/584/Auburn-Loop, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/calendar.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/calendar.txt new file mode 100644 index 000000000..3cd13126d --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/calendar.txt @@ -0,0 +1,2 @@ +service_id,service_name,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date +c_23810_b_33000_d_63,Loop year round (No Sunday),1,1,1,1,1,1,0,20231001,20241001 diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/feed_info.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/feed_info.txt new file mode 100644 index 000000000..ae3fc4403 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/feed_info.txt @@ -0,0 +1,2 @@ +feed_publisher_url,feed_publisher_name,feed_lang,feed_version,feed_license,feed_contact_email,feed_contact_url,feed_start_date,feed_end_date,feed_id +http://www.trilliumtransit.com,"Trillium Solutions, Inc.",en,UTC: 27-Nov-2023 16:52,,support+test+auburntransit-ca-us@trilliumtransit.com,http://support.trilliumtransit.com,20231127,20241001,auburntransit-ca-us diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/location_groups.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/location_groups.txt new file mode 100644 index 000000000..7fcf9b6d2 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/location_groups.txt @@ -0,0 +1,31 @@ +location_group_id,stop_id,location_group_name +4230479,2583236,Aurburn Loop Stops +4230479,2583237,Aurburn Loop Stops +4230479,2583238,Aurburn Loop Stops +4230479,2583242,Aurburn Loop Stops +4230479,2583244,Aurburn Loop Stops +4230479,2583246,Aurburn Loop Stops +4230479,2583249,Aurburn Loop Stops +4230479,2583250,Aurburn Loop Stops +4230479,2583251,Aurburn Loop Stops +4230479,2583252,Aurburn Loop Stops +4230479,2583253,Aurburn Loop Stops +4230479,2583254,Aurburn Loop Stops +4230479,2583255,Aurburn Loop Stops +4230479,2583256,Aurburn Loop Stops +4230479,2583259,Aurburn Loop Stops +4230479,2583260,Aurburn Loop Stops +4230479,2583262,Aurburn Loop Stops +4230479,2583263,Aurburn Loop Stops +4230479,2583266,Aurburn Loop Stops +4230479,2583268,Aurburn Loop Stops +4230479,2583271,Aurburn Loop Stops +4230479,2583276,Aurburn Loop Stops +4230479,2583280,Aurburn Loop Stops +4230479,2583281,Aurburn Loop Stops +4230479,2583282,Aurburn Loop Stops +4230479,2583284,Aurburn Loop Stops +4230479,2583285,Aurburn Loop Stops +4230479,2751414,Aurburn Loop Stops +4230479,3446932,Aurburn Loop Stops +4230479,3446933,Aurburn Loop Stops diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/routes.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/routes.txt new file mode 100644 index 000000000..6db29bf1c --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/routes.txt @@ -0,0 +1,2 @@ +agency_id,route_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color,route_sort_order,min_headway_minutes,eligibility_restricted,continuous_pickup,continuous_drop_off,tts_route_short_name,tts_route_long_name +1593,32372,,Auburn Loop,,3,https://www.auburn.ca.gov/584/Auburn-Loop,bf3c39,ffffff,0,60,0,1,1,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/stop_times.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/stop_times.txt new file mode 100644 index 000000000..c8394e636 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/stop_times.txt @@ -0,0 +1,3 @@ +trip_id,arrival_time,departure_time,stop_id,location_id,location_group_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled,timepoint,continuous_pickup,continuous_drop_off,pickup_booking_rule_id,drop_off_booking_rule_id,start_pickup_drop_off_window,end_pickup_drop_off_window,mean_duration_factor,mean_duration_offset,safe_duration_factor,safe_duration_offset,tts_stop_headsign +t_5756013_b_33000_tn_0,,,,,4230479,1,,2,1,,0,1,1,booking_route_32372,booking_route_32372,09:00:00,17:00:00,1,5.0,1,10.0, +t_5756013_b_33000_tn_0,,,,,4230479,2,,1,2,,0,1,1,booking_route_32372,booking_route_32372,09:00:00,17:00:00,1,5.0,1,10.0, \ No newline at end of file diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/stops.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/stops.txt new file mode 100644 index 000000000..00a4bfcec --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/stops.txt @@ -0,0 +1,31 @@ +stop_id,stop_code,platform_code,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url,location_type,parent_station,stop_timezone,position,direction,wheelchair_boarding,tts_stop_name +2583236,,,East Street,,38.89778,-121.07521,,,0,,America/Los_Angeles,,,0, +2583237,,,Auburn Palms,,38.9115,-121.07476,,,0,,America/Los_Angeles,,,0, +2583238,,,Luther Road/Teal Court,,38.92783,-121.07329,,,0,,America/Los_Angeles,,,0, +2583242,,,Auburn Townhomes,,38.91388,-121.06111,,,0,,America/Los_Angeles,,,0, +2583244,,,Boardman Street,,38.89948,-121.06572,,,0,,America/Los_Angeles,,,0, +2583246,,,Grocery Outlet,,38.90537,-121.07483,,,0,,America/Los_Angeles,,,0, +2583249,,,Nevada Station,,38.90333,-121.08272,,,0,,America/Los_Angeles,,,0, +2583250,,,Monkey Cat Restaurant,,38.90056,-121.0677,,,0,,America/Los_Angeles,,,0, +2583251,,,Savemart Shopping Center,,38.90575,-121.07379,,,0,,America/Los_Angeles,,,0, +2583252,,,Dairy Road/Incline Drive,,38.92185,-121.07193,,,0,,America/Los_Angeles,,,0, +2583253,,,Auburn Ravine Road/Dairy Road,,38.91524,-121.07249,,,0,,America/Los_Angeles,,,0, +2583254,,,Alta Vista School,,38.90957,-121.06419,,,0,,America/Los_Angeles,,,0, +2583255,,,Vista Care/Bowman Road,,38.93206,-121.05636,,,0,,America/Los_Angeles,,,0, +2583256,,,Valley Oaks,,38.91028,-121.07434,,,0,,America/Los_Angeles,,,0, +2583259,,,Dairy Road/Dairy Lane,,38.92483,-121.07223,,,0,,America/Los_Angeles,,,0, +2583260,,,Auburn Crossing,,38.92175,-121.05712,,,0,,America/Los_Angeles,,,0, +2583262,,,Macauley Meadows,,38.87837,-121.0796,,,0,,America/Los_Angeles,,,0, +2583263,,,Luther Road/Garth Lane,,38.92821,-121.05809,,,0,,America/Los_Angeles,,,0, +2583266,,,Sacramento/Pacific,,38.88622,-121.0759,,,0,,America/Los_Angeles,,,0, +2583268,,,Borland Avenue,,38.89978,-121.0646,,,0,,America/Los_Angeles,,,0, +2583271,,,Raley's Shopping Center,,38.92357,-121.05455,,,0,,America/Los_Angeles,,,0, +2583276,,,Courthouse,,38.89712,-121.07753,,,0,,America/Los_Angeles,,,0, +2583280,,,Sacramento Street 7-11,,38.8897,-121.07612,,,0,,America/Los_Angeles,,,0, +2583281,,,Reamer Street/High Street,,38.90169,-121.06872,,,0,,America/Los_Angeles,,,0, +2583282,,,Old Town,,38.8957,-121.07827,,,0,,America/Los_Angeles,,,0, +2583284,,,Elders,,38.89871,-121.07141,,,0,,America/Los_Angeles,,,0, +2583285,,,Foothill Market,,38.91602,-121.06076,,,0,,America/Los_Angeles,,,0, +2751414,,,Gold Country Fairgrounds,,38.8936,-121.07532,,,0,,America/Los_Angeles,,,0, +3446932,,,Roadway Inn,,38.92748,-121.05575,,,0,,America/Los_Angeles,,,0, +3446933,,,Depot Bay,,38.90066,-121.0691,,,0,,America/Los_Angeles,,,0, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/trips.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/trips.txt new file mode 100644 index 000000000..d97b19cfa --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/auburn-transit-flex/trips.txt @@ -0,0 +1,2 @@ +route_id,service_id,trip_id,trip_short_name,trip_headsign,direction_id,block_id,shape_id,bikes_allowed,wheelchair_accessible,trip_type,continuous_pickup_message,continuous_drop_off_message,tts_trip_headsign,tts_trip_short_name +32372,c_23810_b_33000_d_63,t_5756013_b_33000_tn_0,,,0,,,,,,,,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/agency.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/agency.txt new file mode 100644 index 000000000..466541b28 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/agency.txt @@ -0,0 +1,2 @@ +agency_id,agency_url,agency_lang,agency_name,agency_phone,agency_timezone,agency_fare_url,tts_agency_name +4870,https://www.co.brown.mn.us/heartland-express-transit?view=category&id=56,en,Brown County Heartland Express,,America/Chicago,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/booking_rules.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/booking_rules.txt new file mode 100644 index 000000000..6dfd2b494 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/booking_rules.txt @@ -0,0 +1,3 @@ +booking_rule_id,booking_type,prior_notice_duration_min,prior_notice_duration_max,prior_notice_start_day,prior_notice_start_time,prior_notice_last_day,prior_notice_last_time,prior_notice_service_id,message,pickup_message,drop_off_message,phone_number,info_url,booking_url +booking_route_74362,2,,,14,08:00:00,1,15:00:00,,"Brown County Heartland Express provides door-to-door on-demand transportation. To request a ride, call 1-507-359-2717 or 1-800-707-2717 by 3pm at least one business day ahead of your trip. ",,,(507) 359-2717,https://www.co.brown.mn.us/heartland-express-transit, +booking_route_74513,0,,,,,,,,Hermann Express may deviate 1-2 blocks from the route to drop off passengers. Please coordinate with the driver to request a deviated drop-off; deviations are limited to keep the bus on schedule.,,,(507) 359-2717,https://www.co.brown.mn.us/heartland-express-transit, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/feed_info.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/feed_info.txt new file mode 100644 index 000000000..d993cd78d --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/feed_info.txt @@ -0,0 +1,2 @@ +feed_publisher_url,feed_publisher_name,feed_lang,feed_version,feed_license,feed_contact_email,feed_contact_url,feed_start_date,feed_end_date,feed_id +http://www.trilliumtransit.com,"Trillium Solutions, Inc.",en,UTC: 03-Oct-2023 15:38,,support+browncounty-mn-us@trilliumtransit.com,http://support.trilliumtransit.com,20231003,20241001,browncounty-mn-us diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/locations.geojson b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/locations.geojson new file mode 100644 index 000000000..598735a34 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/locations.geojson @@ -0,0 +1,19671 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "id": "area_708", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.7805702, + 44.4560958 + ], + [ + -94.7805608, + 44.4559928 + ], + [ + -94.7805218, + 44.4559649 + ], + [ + -94.7804656, + 44.4559248 + ], + [ + -94.7804138, + 44.4558089 + ], + [ + -94.7802098, + 44.4553527 + ], + [ + -94.7802107, + 44.4548268 + ], + [ + -94.7803706, + 44.4544388 + ], + [ + -94.7805938, + 44.4542099 + ], + [ + -94.7810727, + 44.4539818 + ], + [ + -94.7820938, + 44.4538218 + ], + [ + -94.7838178, + 44.4540968 + ], + [ + -94.7843598, + 44.4541198 + ], + [ + -94.784807, + 44.4540508 + ], + [ + -94.7851309, + 44.4539463 + ], + [ + -94.785131, + 44.4539463 + ], + [ + -94.7854457, + 44.4538447 + ], + [ + -94.7857969, + 44.4536168 + ], + [ + -94.7862437, + 44.4532507 + ], + [ + -94.7866588, + 44.4526797 + ], + [ + -94.7868817, + 44.4521998 + ], + [ + -94.7868187, + 44.4517418 + ], + [ + -94.786691, + 44.4515598 + ], + [ + -94.786468, + 44.4514217 + ], + [ + -94.7855428, + 44.4509878 + ], + [ + -94.785095, + 44.4508985 + ], + [ + -94.785095, + 44.4508985 + ], + [ + -94.7832445, + 44.4505298 + ], + [ + -94.7817445, + 44.4500498 + ], + [ + -94.7804687, + 44.4494777 + ], + [ + -94.7797347, + 44.4488827 + ], + [ + -94.7794797, + 44.4486998 + ], + [ + -94.7790005, + 44.4482198 + ], + [ + -94.7774695, + 44.4468707 + ], + [ + -94.7771506, + 44.4466878 + ], + [ + -94.7762896, + 44.4465038 + ], + [ + -94.7759064, + 44.4464808 + ], + [ + -94.7732254, + 44.4471207 + ], + [ + -94.7716933, + 44.4472118 + ], + [ + -94.7703535, + 44.4470739 + ], + [ + -94.7683102, + 44.4467529 + ], + [ + -94.7680551, + 44.4466159 + ], + [ + -94.7676411, + 44.4462729 + ], + [ + -94.7675773, + 44.4461128 + ], + [ + -94.7674492, + 44.4459529 + ], + [ + -94.7673861, + 44.4449699 + ], + [ + -94.7676103, + 44.4445129 + ], + [ + -94.7677063, + 44.4443748 + ], + [ + -94.7678662, + 44.4440778 + ], + [ + -94.7678984, + 44.4435298 + ], + [ + -94.76777, + 44.4433239 + ], + [ + -94.7671961, + 44.4430718 + ], + [ + -94.7661113, + 44.4428428 + ], + [ + -94.7654092, + 44.4429108 + ], + [ + -94.7649664, + 44.442926 + ], + [ + -94.7634312, + 44.4429788 + ], + [ + -94.7631119, + 44.4430698 + ], + [ + -94.7623449, + 44.4435498 + ], + [ + -94.761291, + 44.4446009 + ], + [ + -94.7593749, + 44.4459718 + ], + [ + -94.7581621, + 44.4466349 + ], + [ + -94.7570131, + 44.4471369 + ], + [ + -94.7548741, + 44.4477079 + ], + [ + -94.7529581, + 44.448553 + ], + [ + -94.7502648, + 44.449385 + ], + [ + -94.7492327, + 44.449533 + ], + [ + -94.7489777, + 44.4495559 + ], + [ + -94.7483709, + 44.449305 + ], + [ + -94.7458798, + 44.4477289 + ], + [ + -94.7449538, + 44.447295 + ], + [ + -94.7448308, + 44.4472617 + ], + [ + -94.7448247, + 44.44726 + ], + [ + -94.7435817, + 44.44693 + ], + [ + -94.7421124, + 44.446359 + ], + [ + -94.7400694, + 44.445674 + ], + [ + -94.7392075, + 44.44524 + ], + [ + -94.7385043, + 44.444692 + ], + [ + -94.7382175, + 44.4443029 + ], + [ + -94.7378014, + 44.443343 + ], + [ + -94.7371622, + 44.442314 + ], + [ + -94.7367473, + 44.442017 + ], + [ + -94.7364868, + 44.4419407 + ], + [ + -94.7364867, + 44.4419407 + ], + [ + -94.7362042, + 44.441858 + ], + [ + -94.7337988, + 44.4419865 + ], + [ + -94.7337962, + 44.4419866 + ], + [ + -94.73362, + 44.4419961 + ], + [ + -94.733576, + 44.4419903 + ], + [ + -94.7335755, + 44.4419903 + ], + [ + -94.7325663, + 44.441859 + ], + [ + -94.731673, + 44.441585 + ], + [ + -94.7312582, + 44.441288 + ], + [ + -94.731162, + 44.441128 + ], + [ + -94.7311301, + 44.440808 + ], + [ + -94.7310021, + 44.440488 + ], + [ + -94.730969, + 44.440008 + ], + [ + -94.7308739, + 44.439779 + ], + [ + -94.7308408, + 44.439391 + ], + [ + -94.7307132, + 44.439071 + ], + [ + -94.7306181, + 44.439002 + ], + [ + -94.7304899, + 44.438705 + ], + [ + -94.7300431, + 44.4381339 + ], + [ + -94.7294999, + 44.437745 + ], + [ + -94.7280957, + 44.4372659 + ], + [ + -94.727681, + 44.4369689 + ], + [ + -94.7276797, + 44.4364199 + ], + [ + -94.7277759, + 44.4361 + ], + [ + -94.7277748, + 44.435025 + ], + [ + -94.7276789, + 44.434957 + ], + [ + -94.7276788, + 44.43482 + ], + [ + -94.7275188, + 44.434545 + ], + [ + -94.7268488, + 44.4340879 + ], + [ + -94.7264979, + 44.433974 + ], + [ + -94.7253117, + 44.4338083 + ], + [ + -94.7253116, + 44.4338083 + ], + [ + -94.7250297, + 44.433769 + ], + [ + -94.7219348, + 44.433701 + ], + [ + -94.7212646, + 44.433702 + ], + [ + -94.7178825, + 44.43352 + ], + [ + -94.7172165, + 44.43356 + ], + [ + -94.7163825, + 44.4336111 + ], + [ + -94.7148515, + 44.433703 + ], + [ + -94.7135431, + 44.433727 + ], + [ + -94.7118203, + 44.4341611 + ], + [ + -94.7099384, + 44.4346881 + ], + [ + -94.7090763, + 44.4347331 + ], + [ + -94.7080551, + 44.434574 + ], + [ + -94.7067791, + 44.434162 + ], + [ + -94.7061411, + 44.433705 + ], + [ + -94.7055661, + 44.433202 + ], + [ + -94.7048383, + 44.4327006 + ], + [ + -94.7047039, + 44.432608 + ], + [ + -94.7041299, + 44.4323111 + ], + [ + -94.701035, + 44.4301171 + ], + [ + -94.7001409, + 44.429614 + ], + [ + -94.6993117, + 44.429317 + ], + [ + -94.6982588, + 44.4291571 + ], + [ + -94.6974605, + 44.4289511 + ], + [ + -94.6962485, + 44.428745 + ], + [ + -94.6958337, + 44.428631 + ], + [ + -94.6953225, + 44.428357 + ], + [ + -94.6950996, + 44.428037 + ], + [ + -94.6950354, + 44.427854 + ], + [ + -94.6948764, + 44.4275801 + ], + [ + -94.6948332, + 44.4274698 + ], + [ + -94.6946525, + 44.4270081 + ], + [ + -94.6946525, + 44.425636 + ], + [ + -94.6948754, + 44.42463 + ], + [ + -94.6961836, + 44.4224349 + ], + [ + -94.6966616, + 44.422024 + ], + [ + -94.6973637, + 44.421635 + ], + [ + -94.6994687, + 44.420812 + ], + [ + -94.7000748, + 44.420377 + ], + [ + -94.7002344, + 44.420103 + ], + [ + -94.7002975, + 44.419326 + ], + [ + -94.7002016, + 44.4192569 + ], + [ + -94.7002015, + 44.419143 + ], + [ + -94.7000424, + 44.4188679 + ], + [ + -94.7000423, + 44.418 + ], + [ + -94.7001056, + 44.41784 + ], + [ + -94.7005204, + 44.4176339 + ], + [ + -94.7017965, + 44.4174279 + ], + [ + -94.7023385, + 44.4172219 + ], + [ + -94.7026574, + 44.4169709 + ], + [ + -94.7028807, + 44.4166049 + ], + [ + -94.7029124, + 44.4163989 + ], + [ + -94.7027526, + 44.4160329 + ], + [ + -94.7012853, + 44.4150728 + ], + [ + -94.7000735, + 44.4145929 + ], + [ + -94.6996585, + 44.414387 + ], + [ + -94.6991803, + 44.4140449 + ], + [ + -94.6991484, + 44.4137698 + ], + [ + -94.6993394, + 44.4135639 + ], + [ + -94.7006476, + 44.4129928 + ], + [ + -94.7007304, + 44.4129244 + ], + [ + -94.7007305, + 44.4129243 + ], + [ + -94.7010616, + 44.4126499 + ], + [ + -94.7010614, + 44.4121699 + ], + [ + -94.7006785, + 44.4119869 + ], + [ + -94.7001684, + 44.4119639 + ], + [ + -94.6997534, + 44.4120559 + ], + [ + -94.6988922, + 44.4123529 + ], + [ + -94.6979994, + 44.4125589 + ], + [ + -94.6971704, + 44.412559 + ], + [ + -94.6966284, + 44.4123989 + ], + [ + -94.6957983, + 44.411667 + ], + [ + -94.695065, + 44.4113929 + ], + [ + -94.6943952, + 44.4113699 + ], + [ + -94.6939483, + 44.4115529 + ], + [ + -94.6935342, + 44.4120559 + ], + [ + -94.6935342, + 44.412696 + ], + [ + -94.6936707, + 44.41287 + ], + [ + -94.6936708, + 44.4128701 + ], + [ + -94.6938211, + 44.413062 + ], + [ + -94.6946824, + 44.4138389 + ], + [ + -94.6954164, + 44.4144109 + ], + [ + -94.6957032, + 44.4147309 + ], + [ + -94.6959581, + 44.4149139 + ], + [ + -94.6963094, + 44.415279 + ], + [ + -94.6963093, + 44.415371 + ], + [ + -94.6963735, + 44.4154169 + ], + [ + -94.6964373, + 44.41624 + ], + [ + -94.6960225, + 44.4169479 + ], + [ + -94.6957993, + 44.4171309 + ], + [ + -94.6953212, + 44.4174289 + ], + [ + -94.6946831, + 44.417612 + ], + [ + -94.6928012, + 44.417703 + ], + [ + -94.690026, + 44.417543 + ], + [ + -94.689196, + 44.41736 + ], + [ + -94.6887821, + 44.4171769 + ], + [ + -94.6884632, + 44.4169259 + ], + [ + -94.6881442, + 44.416629 + ], + [ + -94.687952, + 44.416034 + ], + [ + -94.687857, + 44.4159659 + ], + [ + -94.6877292, + 44.4155769 + ], + [ + -94.6873461, + 44.415006 + ], + [ + -94.6862941, + 44.4138169 + ], + [ + -94.686134, + 44.413451 + ], + [ + -94.6859427, + 44.413199 + ], + [ + -94.685879, + 44.4130159 + ], + [ + -94.6857341, + 44.4128084 + ], + [ + -94.685734, + 44.4128084 + ], + [ + -94.6855601, + 44.4125589 + ], + [ + -94.685369, + 44.4120559 + ], + [ + -94.6853368, + 44.411142 + ], + [ + -94.6855918, + 44.4103869 + ], + [ + -94.6858787, + 44.4099759 + ], + [ + -94.6868039, + 44.409176 + ], + [ + -94.687729, + 44.4086039 + ], + [ + -94.6885897, + 44.4083299 + ], + [ + -94.6899609, + 44.4080549 + ], + [ + -94.691301, + 44.4079638 + ], + [ + -94.6919071, + 44.4080099 + ], + [ + -94.6948091, + 44.4086489 + ], + [ + -94.6960852, + 44.4090609 + ], + [ + -94.6965312, + 44.4091749 + ], + [ + -94.6970421, + 44.4091979 + ], + [ + -94.6972013, + 44.4091519 + ], + [ + -94.6974563, + 44.4088779 + ], + [ + -94.6974883, + 44.4081919 + ], + [ + -94.6974243, + 44.4077579 + ], + [ + -94.6971051, + 44.4069798 + ], + [ + -94.696276, + 44.4057918 + ], + [ + -94.6957019, + 44.4050369 + ], + [ + -94.695702, + 44.4049459 + ], + [ + -94.6952551, + 44.4043509 + ], + [ + -94.6952552, + 44.4041908 + ], + [ + -94.6948399, + 44.4034829 + ], + [ + -94.6942021, + 44.4026368 + ], + [ + -94.6935009, + 44.4024078 + ], + [ + -94.6930537, + 44.4023618 + ], + [ + -94.6927668, + 44.4024539 + ], + [ + -94.6923528, + 44.4027278 + ], + [ + -94.6915879, + 44.4035968 + ], + [ + -94.691269, + 44.4039169 + ], + [ + -94.6909499, + 44.4040768 + ], + [ + -94.6909499, + 44.4042138 + ], + [ + -94.689834, + 44.4051059 + ], + [ + -94.6894509, + 44.4054718 + ], + [ + -94.6892599, + 44.4060209 + ], + [ + -94.6891638, + 44.4060659 + ], + [ + -94.689164, + 44.4061808 + ], + [ + -94.688909, + 44.4066609 + ], + [ + -94.6884618, + 44.4069809 + ], + [ + -94.6878249, + 44.4070269 + ], + [ + -94.6869629, + 44.4066379 + ], + [ + -94.6859107, + 44.4059289 + ], + [ + -94.6856235, + 44.4058379 + ], + [ + -94.6854007, + 44.4058148 + ], + [ + -94.6850817, + 44.4059519 + ], + [ + -94.6850819, + 44.4064779 + ], + [ + -94.6851459, + 44.4066149 + ], + [ + -94.6850498, + 44.4071639 + ], + [ + -94.6847949, + 44.407484 + ], + [ + -94.6844461, + 44.4077338 + ], + [ + -94.684446, + 44.4077338 + ], + [ + -94.6837415, + 44.4082379 + ], + [ + -94.6830728, + 44.4085809 + ], + [ + -94.6818608, + 44.408924 + ], + [ + -94.6809986, + 44.409061 + ], + [ + -94.6797238, + 44.4090609 + ], + [ + -94.6794435, + 44.4090189 + ], + [ + -94.6785117, + 44.408878 + ], + [ + -94.6768844, + 44.408466 + ], + [ + -94.6754175, + 44.407963 + ], + [ + -94.6749715, + 44.407643 + ], + [ + -94.6745884, + 44.4072549 + ], + [ + -94.6742383, + 44.406774 + ], + [ + -94.6740464, + 44.406637 + ], + [ + -94.6740783, + 44.4065459 + ], + [ + -94.6731222, + 44.4056079 + ], + [ + -94.6714642, + 44.404579 + ], + [ + -94.6708901, + 44.4040299 + ], + [ + -94.6705392, + 44.403367 + ], + [ + -94.670475, + 44.4028639 + ], + [ + -94.6706991, + 44.4025209 + ], + [ + -94.6714, + 44.4019959 + ], + [ + -94.6730271, + 44.4004869 + ], + [ + -94.6737294, + 44.399984 + ], + [ + -94.6743672, + 44.3996179 + ], + [ + -94.6758971, + 44.3989559 + ], + [ + -94.6768046, + 44.3983863 + ], + [ + -94.6768046, + 44.3983863 + ], + [ + -94.6769183, + 44.3983148 + ], + [ + -94.6772694, + 44.3979269 + ], + [ + -94.6773331, + 44.3974239 + ], + [ + -94.6771092, + 44.3970579 + ], + [ + -94.6765673, + 44.3966458 + ], + [ + -94.6757702, + 44.3963949 + ], + [ + -94.674112, + 44.3962579 + ], + [ + -94.6713379, + 44.3954109 + ], + [ + -94.6696808, + 44.3948169 + ], + [ + -94.668405, + 44.394451 + ], + [ + -94.667226, + 44.3942899 + ], + [ + -94.6665239, + 44.3942449 + ], + [ + -94.6657908, + 44.3943359 + ], + [ + -94.6656946, + 44.3944039 + ], + [ + -94.6648658, + 44.3946099 + ], + [ + -94.6641557, + 44.3946588 + ], + [ + -94.6638766, + 44.394678 + ], + [ + -94.6634947, + 44.3947699 + ], + [ + -94.6630798, + 44.3949748 + ], + [ + -94.6626016, + 44.3953639 + ], + [ + -94.6623459, + 44.3957979 + ], + [ + -94.6622818, + 44.3969869 + ], + [ + -94.6623777, + 44.3974219 + ], + [ + -94.6624728, + 44.3975359 + ], + [ + -94.6625049, + 44.3978789 + ], + [ + -94.6626319, + 44.3981079 + ], + [ + -94.6626319, + 44.3984133 + ], + [ + -94.6626318, + 44.398702 + ], + [ + -94.6624728, + 44.398908 + ], + [ + -94.6621215, + 44.3991819 + ], + [ + -94.6617389, + 44.3992499 + ], + [ + -94.6606229, + 44.39925 + ], + [ + -94.6596026, + 44.399044 + ], + [ + -94.6589007, + 44.3987699 + ], + [ + -94.6582652, + 44.3983898 + ], + [ + -94.6579447, + 44.3981979 + ], + [ + -94.6574027, + 44.398015 + ], + [ + -94.6569877, + 44.3979919 + ], + [ + -94.6567645, + 44.3980379 + ], + [ + -94.6565735, + 44.3982199 + ], + [ + -94.6564932, + 44.3983802 + ], + [ + -94.6564134, + 44.39854 + ], + [ + -94.6563185, + 44.398586 + ], + [ + -94.6562856, + 44.399615 + ], + [ + -94.6561895, + 44.400049 + ], + [ + -94.6560615, + 44.400392 + ], + [ + -94.6558067, + 44.4005979 + ], + [ + -94.6552646, + 44.400758 + ], + [ + -94.6548505, + 44.400712 + ], + [ + -94.6544996, + 44.4006429 + ], + [ + -94.6542125, + 44.400369 + ], + [ + -94.6540213, + 44.399546 + ], + [ + -94.6543554, + 44.3983685 + ], + [ + -94.6544044, + 44.3981969 + ], + [ + -94.6544373, + 44.397877 + ], + [ + -94.6545646, + 44.3976029 + ], + [ + -94.6545655, + 44.3968019 + ], + [ + -94.6547254, + 44.396002 + ], + [ + -94.6550765, + 44.3951339 + ], + [ + -94.6556822, + 44.394379 + ], + [ + -94.6556825, + 44.3942649 + ], + [ + -94.6557785, + 44.3942189 + ], + [ + -94.6558104, + 44.3935559 + ], + [ + -94.6554914, + 44.3933049 + ], + [ + -94.6552684, + 44.3932589 + ], + [ + -94.6543754, + 44.3932589 + ], + [ + -94.6536742, + 44.393441 + ], + [ + -94.6507073, + 44.395178 + ], + [ + -94.6485701, + 44.396526 + ], + [ + -94.6473261, + 44.3970519 + ], + [ + -94.6455722, + 44.3974619 + ], + [ + -94.6444882, + 44.3975539 + ], + [ + -94.6437844, + 44.3975534 + ], + [ + -94.6433082, + 44.3975531 + ], + [ + -94.6413631, + 44.397232 + ], + [ + -94.6398007, + 44.396774 + ], + [ + -94.6390038, + 44.3963851 + ], + [ + -94.6380479, + 44.3956531 + ], + [ + -94.6379846, + 44.395425 + ], + [ + -94.6381448, + 44.394922 + ], + [ + -94.6383998, + 44.394693 + ], + [ + -94.6395477, + 44.394419 + ], + [ + -94.6401857, + 44.394168 + ], + [ + -94.6407598, + 44.393665 + ], + [ + -94.6409838, + 44.3933679 + ], + [ + -94.6417498, + 44.391448 + ], + [ + -94.6418147, + 44.390808 + ], + [ + -94.6417189, + 44.390625 + ], + [ + -94.6415279, + 44.390488 + ], + [ + -94.6411446, + 44.3903499 + ], + [ + -94.6405077, + 44.3904419 + ], + [ + -94.6395826, + 44.3907839 + ], + [ + -94.6392957, + 44.390921 + ], + [ + -94.6377647, + 44.3914689 + ], + [ + -94.6359148, + 44.391949 + ], + [ + -94.6345757, + 44.3921771 + ], + [ + -94.6334596, + 44.3921991 + ], + [ + -94.6327894, + 44.392084 + ], + [ + -94.6321524, + 44.39181 + ], + [ + -94.6313553, + 44.3915349 + ], + [ + -94.6293144, + 44.391625 + ], + [ + -94.6284863, + 44.3914651 + ], + [ + -94.6274663, + 44.390664 + ], + [ + -94.62702, + 44.389978 + ], + [ + -94.626798, + 44.389315 + ], + [ + -94.6266083, + 44.3883321 + ], + [ + -94.6266093, + 44.387051 + ], + [ + -94.626673, + 44.3867999 + ], + [ + -94.6271852, + 44.385406 + ], + [ + -94.6271851, + 44.3846969 + ], + [ + -94.6269622, + 44.384468 + ], + [ + -94.6256084, + 44.3836207 + ], + [ + -94.625259, + 44.383402 + ], + [ + -94.624254, + 44.382924 + ], + [ + -94.6238017, + 44.3827411 + ], + [ + -94.6236629, + 44.382685 + ], + [ + -94.623476, + 44.38261 + ], + [ + -94.6224948, + 44.3823659 + ], + [ + -94.621431, + 44.382355 + ], + [ + -94.6206697, + 44.38283 + ], + [ + -94.6199336, + 44.3836354 + ], + [ + -94.6198308, + 44.383748 + ], + [ + -94.6191119, + 44.384312 + ], + [ + -94.6175598, + 44.385077 + ], + [ + -94.6161838, + 44.3854581 + ], + [ + -94.6144206, + 44.3856251 + ], + [ + -94.6126067, + 44.3855171 + ], + [ + -94.6107516, + 44.385256 + ], + [ + -94.6088315, + 44.384937 + ], + [ + -94.6075895, + 44.3848271 + ], + [ + -94.6064555, + 44.3849041 + ], + [ + -94.6048541, + 44.3853381 + ], + [ + -94.6031941, + 44.3858931 + ], + [ + -94.6020112, + 44.386138 + ], + [ + -94.6002753, + 44.3860871 + ], + [ + -94.5976421, + 44.3855432 + ], + [ + -94.5961928, + 44.385165 + ], + [ + -94.5952318, + 44.3845511 + ], + [ + -94.5946227, + 44.3837649 + ], + [ + -94.5946226, + 44.3837649 + ], + [ + -94.5944259, + 44.3835111 + ], + [ + -94.5938179, + 44.3816511 + ], + [ + -94.5935726, + 44.380102 + ], + [ + -94.5932939, + 44.3795591 + ], + [ + -94.5934348, + 44.3782631 + ], + [ + -94.5934568, + 44.3777561 + ], + [ + -94.5931767, + 44.3772781 + ], + [ + -94.5928298, + 44.3771436 + ], + [ + -94.5923437, + 44.376955 + ], + [ + -94.5911467, + 44.376861 + ], + [ + -94.5894463, + 44.3771971 + ], + [ + -94.5884374, + 44.377211 + ], + [ + -94.5879036, + 44.3770121 + ], + [ + -94.5872764, + 44.3765051 + ], + [ + -94.5871792, + 44.375828 + ], + [ + -94.5874794, + 44.3749621 + ], + [ + -94.5875873, + 44.3743971 + ], + [ + -94.5872195, + 44.3740661 + ], + [ + -94.5867371, + 44.374057 + ], + [ + -94.5862092, + 44.3742741 + ], + [ + -94.5857133, + 44.3747091 + ], + [ + -94.5855182, + 44.374962 + ], + [ + -94.5844573, + 44.3772651 + ], + [ + -94.5839854, + 44.3778321 + ], + [ + -94.5833624, + 44.3780911 + ], + [ + -94.5828784, + 44.3781821 + ], + [ + -94.5820564, + 44.3778671 + ], + [ + -94.5812731, + 44.3773191 + ], + [ + -94.5805242, + 44.376747 + ], + [ + -94.5801009, + 44.3761061 + ], + [ + -94.5797701, + 44.3753851 + ], + [ + -94.5796681, + 44.3749621 + ], + [ + -94.5790709, + 44.3730191 + ], + [ + -94.5787549, + 44.37206 + ], + [ + -94.5784178, + 44.371674 + ], + [ + -94.5783757, + 44.371555 + ], + [ + -94.5767219, + 44.372248 + ], + [ + -94.5757238, + 44.3735381 + ], + [ + -94.5738737, + 44.3749621 + ], + [ + -94.573157, + 44.3754581 + ], + [ + -94.5728599, + 44.3755422 + ], + [ + -94.5728598, + 44.3755423 + ], + [ + -94.5709118, + 44.3760942 + ], + [ + -94.5684226, + 44.3766392 + ], + [ + -94.5667248, + 44.3768871 + ], + [ + -94.5652897, + 44.3769112 + ], + [ + -94.5641146, + 44.3768101 + ], + [ + -94.5633333, + 44.3761972 + ], + [ + -94.5630026, + 44.3754601 + ], + [ + -94.5628466, + 44.3749622 + ], + [ + -94.5624573, + 44.3736892 + ], + [ + -94.5617483, + 44.3723842 + ], + [ + -94.5612873, + 44.3718042 + ], + [ + -94.5606464, + 44.3714502 + ], + [ + -94.5596571, + 44.3713871 + ], + [ + -94.558265, + 44.3716222 + ], + [ + -94.5574341, + 44.3720581 + ], + [ + -94.5570751, + 44.3730011 + ], + [ + -94.5570851, + 44.3749623 + ], + [ + -94.5569692, + 44.3756192 + ], + [ + -94.5565241, + 44.3759773 + ], + [ + -94.5560074, + 44.3760192 + ], + [ + -94.5553922, + 44.3759562 + ], + [ + -94.5550143, + 44.3758311 + ], + [ + -94.554463, + 44.3754542 + ], + [ + -94.5543123, + 44.3751712 + ], + [ + -94.554284, + 44.3749622 + ], + [ + -94.5535259, + 44.3732461 + ], + [ + -94.5529858, + 44.3724481 + ], + [ + -94.5528421, + 44.3723183 + ], + [ + -94.5524691, + 44.3719811 + ], + [ + -94.5500187, + 44.3706701 + ], + [ + -94.5493896, + 44.3702432 + ], + [ + -94.5492317, + 44.3696105 + ], + [ + -94.5492317, + 44.3696105 + ], + [ + -94.5488146, + 44.3679392 + ], + [ + -94.5487125, + 44.3668191 + ], + [ + -94.5480608, + 44.3655872 + ], + [ + -94.5472174, + 44.3649431 + ], + [ + -94.5449486, + 44.3645092 + ], + [ + -94.5412824, + 44.3650332 + ], + [ + -94.5394452, + 44.3652952 + ], + [ + -94.5321707, + 44.3651601 + ], + [ + -94.5306728, + 44.3651322 + ], + [ + -94.5266517, + 44.3652723 + ], + [ + -94.5233156, + 44.3653873 + ], + [ + -94.5219447, + 44.3658792 + ], + [ + -94.5209904, + 44.3669513 + ], + [ + -94.5200927, + 44.3696033 + ], + [ + -94.5200415, + 44.3696551 + ], + [ + -94.5200415, + 44.3696552 + ], + [ + -94.5193845, + 44.3703213 + ], + [ + -94.5184525, + 44.3706523 + ], + [ + -94.5179244, + 44.3702974 + ], + [ + -94.5176095, + 44.3697663 + ], + [ + -94.5176066, + 44.3696565 + ], + [ + -94.5176066, + 44.3696565 + ], + [ + -94.5175767, + 44.3684523 + ], + [ + -94.5177554, + 44.3674293 + ], + [ + -94.5184745, + 44.3663162 + ], + [ + -94.5192266, + 44.3649622 + ], + [ + -94.5200013, + 44.3635753 + ], + [ + -94.5204274, + 44.3620363 + ], + [ + -94.5206296, + 44.3608033 + ], + [ + -94.5203824, + 44.3598443 + ], + [ + -94.5177092, + 44.3579843 + ], + [ + -94.5149801, + 44.3572922 + ], + [ + -94.5122728, + 44.3561889 + ], + [ + -94.5122726, + 44.3561888 + ], + [ + -94.5115648, + 44.3559003 + ], + [ + -94.5093472, + 44.3551911 + ], + [ + -94.5093472, + 44.3551911 + ], + [ + -94.5091507, + 44.3551282 + ], + [ + -94.5065766, + 44.3551992 + ], + [ + -94.5064584, + 44.355206 + ], + [ + -94.5064565, + 44.3552061 + ], + [ + -94.5061949, + 44.3552213 + ], + [ + -94.5042175, + 44.3561122 + ], + [ + -94.5041216, + 44.3562723 + ], + [ + -94.5038666, + 44.3565463 + ], + [ + -94.5037715, + 44.3565692 + ], + [ + -94.5035795, + 44.3568663 + ], + [ + -94.5026868, + 44.3574832 + ], + [ + -94.5021134, + 44.3575743 + ], + [ + -94.5016035, + 44.3570943 + ], + [ + -94.5016046, + 44.3565683 + ], + [ + -94.5017327, + 44.3560882 + ], + [ + -94.502133, + 44.3552284 + ], + [ + -94.502133, + 44.3552284 + ], + [ + -94.5021475, + 44.3551972 + ], + [ + -94.5025625, + 44.3545112 + ], + [ + -94.5026904, + 44.3541453 + ], + [ + -94.5027544, + 44.3535053 + ], + [ + -94.5026276, + 44.3532083 + ], + [ + -94.5024364, + 44.3530022 + ], + [ + -94.5022133, + 44.3528193 + ], + [ + -94.5016405, + 44.3525902 + ], + [ + -94.5007194, + 44.3524062 + ], + [ + -94.5002533, + 44.3523942 + ], + [ + -94.4993472, + 44.3524732 + ], + [ + -94.4973415, + 44.3532983 + ], + [ + -94.4966084, + 44.3536413 + ], + [ + -94.4962581, + 44.3539613 + ], + [ + -94.4960995, + 44.3542133 + ], + [ + -94.4960992, + 44.3544643 + ], + [ + -94.4962591, + 44.3546013 + ], + [ + -94.4962912, + 44.3548764 + ], + [ + -94.4964872, + 44.3552574 + ], + [ + -94.4964872, + 44.3552574 + ], + [ + -94.4965144, + 44.3553104 + ], + [ + -94.4966105, + 44.3553564 + ], + [ + -94.4966105, + 44.3554474 + ], + [ + -94.4969615, + 44.3557444 + ], + [ + -94.4970254, + 44.3558364 + ], + [ + -94.4979185, + 44.3564753 + ], + [ + -94.4982373, + 44.3568413 + ], + [ + -94.4990025, + 44.3575723 + ], + [ + -94.4990033, + 44.3576643 + ], + [ + -94.4991303, + 44.3577554 + ], + [ + -94.4995136, + 44.3582354 + ], + [ + -94.4995455, + 44.3585323 + ], + [ + -94.4996417, + 44.3586013 + ], + [ + -94.4996415, + 44.3587153 + ], + [ + -94.4997374, + 44.3587843 + ], + [ + -94.4997775, + 44.3592643 + ], + [ + -94.4996744, + 44.3598814 + ], + [ + -94.4992926, + 44.3604073 + ], + [ + -94.4985287, + 44.3612083 + ], + [ + -94.4978917, + 44.3616653 + ], + [ + -94.4975098, + 44.3618034 + ], + [ + -94.4973095, + 44.3617953 + ], + [ + -94.4969366, + 44.3617804 + ], + [ + -94.4949277, + 44.3614614 + ], + [ + -94.4938754, + 44.3611194 + ], + [ + -94.4927605, + 44.3606394 + ], + [ + -94.492105, + 44.3601922 + ], + [ + -94.4919763, + 44.3601044 + ], + [ + -94.4913885, + 44.3597034 + ], + [ + -94.4910064, + 44.3593144 + ], + [ + -94.4909745, + 44.3591544 + ], + [ + -94.4908783, + 44.3590865 + ], + [ + -94.4907503, + 44.3587884 + ], + [ + -94.4907503, + 44.3582174 + ], + [ + -94.4910882, + 44.3574095 + ], + [ + -94.4914902, + 44.3562814 + ], + [ + -94.4915392, + 44.3552789 + ], + [ + -94.4916871, + 44.3522564 + ], + [ + -94.491267, + 44.3512304 + ], + [ + -94.490934, + 44.3509003 + ], + [ + -94.4907111, + 44.3506953 + ], + [ + -94.489977, + 44.3504434 + ], + [ + -94.4880341, + 44.3502845 + ], + [ + -94.487046, + 44.3501255 + ], + [ + -94.4854518, + 44.3494624 + ], + [ + -94.4850379, + 44.3492344 + ], + [ + -94.4845909, + 44.3488915 + ], + [ + -94.4838577, + 44.3480234 + ], + [ + -94.4837619, + 44.3475655 + ], + [ + -94.4836649, + 44.3462395 + ], + [ + -94.4834417, + 44.3456914 + ], + [ + -94.4833456, + 44.3455994 + ], + [ + -94.4832497, + 44.3454625 + ], + [ + -94.4825488, + 44.3448915 + ], + [ + -94.4816247, + 44.3444574 + ], + [ + -94.4807314, + 44.3441374 + ], + [ + -94.4801587, + 44.3440465 + ], + [ + -94.4794575, + 44.3440236 + ], + [ + -94.4785336, + 44.3440925 + ], + [ + -94.4777375, + 44.3442985 + ], + [ + -94.4765663, + 44.3442795 + ], + [ + -94.4750413, + 44.3437666 + ], + [ + -94.4742715, + 44.3429576 + ], + [ + -94.4737742, + 44.3417786 + ], + [ + -94.4728481, + 44.3407746 + ], + [ + -94.4727887, + 44.3407292 + ], + [ + -94.471831, + 44.3399978 + ], + [ + -94.4664211, + 44.3358656 + ], + [ + -94.4653307, + 44.3343937 + ], + [ + -94.4637757, + 44.3333077 + ], + [ + -94.4617027, + 44.3325427 + ], + [ + -94.4604214, + 44.3324817 + ], + [ + -94.4577325, + 44.3328608 + ], + [ + -94.4538906, + 44.3340099 + ], + [ + -94.4525424, + 44.3338919 + ], + [ + -94.4521229, + 44.3335631 + ], + [ + -94.4521227, + 44.333563 + ], + [ + -94.4515923, + 44.3331468 + ], + [ + -94.4512762, + 44.3319359 + ], + [ + -94.4514073, + 44.3295478 + ], + [ + -94.45198, + 44.3281219 + ], + [ + -94.4519972, + 44.3280925 + ], + [ + -94.4519973, + 44.3280923 + ], + [ + -94.4529532, + 44.3264408 + ], + [ + -94.4530622, + 44.3262538 + ], + [ + -94.4530864, + 44.3262121 + ], + [ + -94.4537911, + 44.3249978 + ], + [ + -94.4537563, + 44.3247448 + ], + [ + -94.45361, + 44.3236817 + ], + [ + -94.453099, + 44.3229538 + ], + [ + -94.4520099, + 44.3226029 + ], + [ + -94.4513051, + 44.3223758 + ], + [ + -94.4510589, + 44.3221968 + ], + [ + -94.450554, + 44.3223339 + ], + [ + -94.4502668, + 44.3224478 + ], + [ + -94.4476237, + 44.3230659 + ], + [ + -94.4466998, + 44.3234549 + ], + [ + -94.444695, + 44.3241039 + ], + [ + -94.4434698, + 44.324083 + ], + [ + -94.4425527, + 44.3235399 + ], + [ + -94.4420967, + 44.322861 + ], + [ + -94.4410455, + 44.319388 + ], + [ + -94.4409517, + 44.3185 + ], + [ + -94.4419433, + 44.316672 + ], + [ + -94.4430766, + 44.3154899 + ], + [ + -94.4448115, + 44.3149228 + ], + [ + -94.4461477, + 44.3150969 + ], + [ + -94.4471535, + 44.3158109 + ], + [ + -94.4477985, + 44.3166518 + ], + [ + -94.448464, + 44.3206638 + ], + [ + -94.4491097, + 44.3213919 + ], + [ + -94.4500288, + 44.3218229 + ], + [ + -94.4505739, + 44.3218698 + ], + [ + -94.4508928, + 44.3218979 + ], + [ + -94.4520296, + 44.3213237 + ], + [ + -94.4520296, + 44.3213236 + ], + [ + -94.4527321, + 44.3209688 + ], + [ + -94.4532308, + 44.3204698 + ], + [ + -94.4532051, + 44.3193968 + ], + [ + -94.4523019, + 44.3175288 + ], + [ + -94.452095, + 44.317101 + ], + [ + -94.452095, + 44.3171009 + ], + [ + -94.4518336, + 44.3165609 + ], + [ + -94.4514549, + 44.3162068 + ], + [ + -94.4492237, + 44.3141228 + ], + [ + -94.4468105, + 44.311837 + ], + [ + -94.4468104, + 44.3118369 + ], + [ + -94.4442153, + 44.3093789 + ], + [ + -94.4429293, + 44.308624 + ], + [ + -94.4418252, + 44.308433 + ], + [ + -94.4410611, + 44.308639 + ], + [ + -94.4401383, + 44.3093709 + ], + [ + -94.4395963, + 44.309942 + ], + [ + -94.4393733, + 44.310262 + ], + [ + -94.437982, + 44.311786 + ], + [ + -94.437946, + 44.3118141 + ], + [ + -94.4379459, + 44.3118142 + ], + [ + -94.4366592, + 44.312814 + ], + [ + -94.4356112, + 44.3131731 + ], + [ + -94.4342761, + 44.3129751 + ], + [ + -94.4326419, + 44.3121461 + ], + [ + -94.432329, + 44.3117993 + ], + [ + -94.432329, + 44.3117993 + ], + [ + -94.4320604, + 44.3115017 + ], + [ + -94.4320603, + 44.3115016 + ], + [ + -94.4317068, + 44.3111101 + ], + [ + -94.431772, + 44.3099241 + ], + [ + -94.4320415, + 44.3093469 + ], + [ + -94.4320416, + 44.3093468 + ], + [ + -94.4322758, + 44.308845 + ], + [ + -94.4330781, + 44.3082751 + ], + [ + -94.4341361, + 44.308005 + ], + [ + -94.4393593, + 44.308216 + ], + [ + -94.4404502, + 44.3080749 + ], + [ + -94.4414543, + 44.3075459 + ], + [ + -94.4416302, + 44.3066029 + ], + [ + -94.440475, + 44.3050249 + ], + [ + -94.4397088, + 44.304311 + ], + [ + -94.4391359, + 44.303778 + ], + [ + -94.4376598, + 44.3029499 + ], + [ + -94.436628, + 44.3013329 + ], + [ + -94.4364218, + 44.300429 + ], + [ + -94.4350238, + 44.2982381 + ], + [ + -94.4339251, + 44.29736 + ], + [ + -94.4335835, + 44.297087 + ], + [ + -94.4335267, + 44.297053 + ], + [ + -94.4325445, + 44.29647 + ], + [ + -94.4319325, + 44.2962947 + ], + [ + -94.4315465, + 44.296184 + ], + [ + -94.4308055, + 44.2962381 + ], + [ + -94.4292843, + 44.2967171 + ], + [ + -94.4284716, + 44.2973527 + ], + [ + -94.4281656, + 44.2975921 + ], + [ + -94.4267266, + 44.2991202 + ], + [ + -94.4259034, + 44.2994722 + ], + [ + -94.4250963, + 44.2992431 + ], + [ + -94.4249212, + 44.2986292 + ], + [ + -94.4249311, + 44.2974682 + ], + [ + -94.424954, + 44.2973461 + ], + [ + -94.424954, + 44.2973461 + ], + [ + -94.4251541, + 44.2962742 + ], + [ + -94.4257911, + 44.2953412 + ], + [ + -94.4265472, + 44.2949401 + ], + [ + -94.4284134, + 44.2946971 + ], + [ + -94.4312804, + 44.2944571 + ], + [ + -94.4319235, + 44.2941553 + ], + [ + -94.4320135, + 44.2941131 + ], + [ + -94.4321884, + 44.293314 + ], + [ + -94.4319187, + 44.2930057 + ], + [ + -94.4315872, + 44.292627 + ], + [ + -94.4300224, + 44.291629 + ], + [ + -94.427739, + 44.290572 + ], + [ + -94.426766, + 44.290393 + ], + [ + -94.4257482, + 44.2905301 + ], + [ + -94.425429, + 44.2908042 + ], + [ + -94.4252653, + 44.2909181 + ], + [ + -94.425152, + 44.2910631 + ], + [ + -94.4248232, + 44.2914572 + ], + [ + -94.4245172, + 44.2917951 + ], + [ + -94.4241841, + 44.2922591 + ], + [ + -94.424108, + 44.2923661 + ], + [ + -94.4238241, + 44.2927762 + ], + [ + -94.4232941, + 44.2929201 + ], + [ + -94.4226432, + 44.2928772 + ], + [ + -94.4222182, + 44.2926822 + ], + [ + -94.4218741, + 44.2922052 + ], + [ + -94.4216159, + 44.2907762 + ], + [ + -94.42115, + 44.2901202 + ], + [ + -94.4209049, + 44.2898453 + ], + [ + -94.4197539, + 44.2891882 + ], + [ + -94.4184206, + 44.2886993 + ], + [ + -94.4172987, + 44.2885653 + ], + [ + -94.4161538, + 44.2884323 + ], + [ + -94.4156726, + 44.2881963 + ], + [ + -94.4150478, + 44.2877833 + ], + [ + -94.4144116, + 44.2872243 + ], + [ + -94.4140897, + 44.2869003 + ], + [ + -94.4139697, + 44.2864723 + ], + [ + -94.4140277, + 44.2861653 + ], + [ + -94.4144324, + 44.2857443 + ], + [ + -94.4145715, + 44.2856014 + ], + [ + -94.4146877, + 44.2854643 + ], + [ + -94.4147535, + 44.2853853 + ], + [ + -94.4148927, + 44.2848373 + ], + [ + -94.4141414, + 44.2833343 + ], + [ + -94.4136754, + 44.2829346 + ], + [ + -94.4130826, + 44.2824262 + ], + [ + -94.4118819, + 44.2817749 + ], + [ + -94.4118817, + 44.2817748 + ], + [ + -94.4117961, + 44.2817284 + ], + [ + -94.4114275, + 44.2813133 + ], + [ + -94.4113632, + 44.2811304 + ], + [ + -94.4114594, + 44.2808334 + ], + [ + -94.4118413, + 44.2803764 + ], + [ + -94.411894, + 44.2802907 + ], + [ + -94.411894, + 44.2802906 + ], + [ + -94.4119683, + 44.2801703 + ], + [ + -94.4119691, + 44.2794843 + ], + [ + -94.4119011, + 44.2794363 + ], + [ + -94.411901, + 44.2794362 + ], + [ + -94.4118731, + 44.2794163 + ], + [ + -94.4115153, + 44.2790973 + ], + [ + -94.4112844, + 44.2786284 + ], + [ + -94.4111651, + 44.2780473 + ], + [ + -94.411327, + 44.2774663 + ], + [ + -94.4115333, + 44.2770233 + ], + [ + -94.4119232, + 44.2767378 + ], + [ + -94.4119234, + 44.2767377 + ], + [ + -94.4122341, + 44.2765103 + ], + [ + -94.4132831, + 44.2759173 + ], + [ + -94.4137363, + 44.2754993 + ], + [ + -94.4137953, + 44.2751523 + ], + [ + -94.4137533, + 44.2749352 + ], + [ + -94.4135941, + 44.2746833 + ], + [ + -94.4133073, + 44.2743633 + ], + [ + -94.4126081, + 44.2737683 + ], + [ + -94.4121301, + 44.2735622 + ], + [ + -94.4119503, + 44.2734742 + ], + [ + -94.4119502, + 44.2734742 + ], + [ + -94.411487, + 44.2732474 + ], + [ + -94.4097168, + 44.2726113 + ], + [ + -94.408945, + 44.2723343 + ], + [ + -94.407857, + 44.2720294 + ], + [ + -94.4063129, + 44.2715984 + ], + [ + -94.4038337, + 44.2712265 + ], + [ + -94.4020275, + 44.2710174 + ], + [ + -94.4010176, + 44.2709815 + ], + [ + -94.4005467, + 44.2709075 + ], + [ + -94.4002626, + 44.2706336 + ], + [ + -94.4001356, + 44.2690786 + ], + [ + -94.4000404, + 44.2690095 + ], + [ + -94.4000405, + 44.2689185 + ], + [ + -94.3996273, + 44.2685975 + ], + [ + -94.3993724, + 44.2684654 + ], + [ + -94.3990544, + 44.2683005 + ], + [ + -94.3982272, + 44.2680255 + ], + [ + -94.3960002, + 44.2675676 + ], + [ + -94.3933273, + 44.2673387 + ], + [ + -94.3917708, + 44.2670879 + ], + [ + -94.3900502, + 44.2668107 + ], + [ + -94.3865499, + 44.2666958 + ], + [ + -94.3850869, + 44.2664208 + ], + [ + -94.3844829, + 44.2661918 + ], + [ + -94.384197, + 44.2658708 + ], + [ + -94.3841339, + 44.2648878 + ], + [ + -94.3841349, + 44.2636307 + ], + [ + -94.3840077, + 44.2630818 + ], + [ + -94.3839127, + 44.2630358 + ], + [ + -94.3839129, + 44.2629448 + ], + [ + -94.3836585, + 44.2626018 + ], + [ + -94.3808277, + 44.2616399 + ], + [ + -94.3801595, + 44.2615249 + ], + [ + -94.3792045, + 44.2616389 + ], + [ + -94.3786636, + 44.2618449 + ], + [ + -94.3783136, + 44.2620958 + ], + [ + -94.3779626, + 44.2626899 + ], + [ + -94.3780264, + 44.2630559 + ], + [ + -94.3781847, + 44.2634449 + ], + [ + -94.3785667, + 44.2638108 + ], + [ + -94.3786617, + 44.2640398 + ], + [ + -94.3786927, + 44.2646109 + ], + [ + -94.3783748, + 44.2649769 + ], + [ + -94.3781196, + 44.2651819 + ], + [ + -94.3764646, + 44.2659359 + ], + [ + -94.3760507, + 44.2660499 + ], + [ + -94.3752467, + 44.265992 + ], + [ + -94.3745685, + 44.265888 + ], + [ + -94.3742816, + 44.265774 + ], + [ + -94.3741547, + 44.265637 + ], + [ + -94.3733904, + 44.26518 + ], + [ + -94.3727537, + 44.264723 + ], + [ + -94.3720534, + 44.264426 + ], + [ + -94.3717943, + 44.2643664 + ], + [ + -94.3717943, + 44.2643664 + ], + [ + -94.371767, + 44.2538304 + ], + [ + -94.3717325, + 44.2394257 + ], + [ + -94.3717844, + 44.2249657 + ], + [ + -94.3716982, + 44.2104805 + ], + [ + -94.3716736, + 44.1959511 + ], + [ + -94.3691084, + 44.1959584 + ], + [ + -94.3688795, + 44.1812174 + ], + [ + -94.3688082, + 44.1667949 + ], + [ + -94.3689225, + 44.15228 + ], + [ + -94.3688877, + 44.1378029 + ], + [ + -94.3688645, + 44.1232806 + ], + [ + -94.3688018, + 44.1086688 + ], + [ + -94.3890452, + 44.1086942 + ], + [ + -94.4091882, + 44.1086993 + ], + [ + -94.4292047, + 44.1086394 + ], + [ + -94.4492734, + 44.1086744 + ], + [ + -94.4694683, + 44.1087583 + ], + [ + -94.4888762, + 44.1088488 + ], + [ + -94.5089699, + 44.108873 + ], + [ + -94.5292637, + 44.1088912 + ], + [ + -94.5493058, + 44.1088371 + ], + [ + -94.5696117, + 44.1088389 + ], + [ + -94.5896453, + 44.10894 + ], + [ + -94.6193989, + 44.1089721 + ], + [ + -94.6394534, + 44.10892 + ], + [ + -94.6595083, + 44.1088825 + ], + [ + -94.6795633, + 44.1088504 + ], + [ + -94.6997329, + 44.1088941 + ], + [ + -94.7198134, + 44.1088815 + ], + [ + -94.7383577, + 44.1088978 + ], + [ + -94.758559, + 44.1087506 + ], + [ + -94.7786658, + 44.1083852 + ], + [ + -94.7987047, + 44.1082605 + ], + [ + -94.8191092, + 44.1082434 + ], + [ + -94.8391861, + 44.1081379 + ], + [ + -94.859724, + 44.1079944 + ], + [ + -94.879665, + 44.107947 + ], + [ + -94.899703, + 44.1078046 + ], + [ + -94.9198087, + 44.1078285 + ], + [ + -94.939952, + 44.1078572 + ], + [ + -94.9600055, + 44.1078119 + ], + [ + -94.9801971, + 44.1077877 + ], + [ + -95.0000437, + 44.10791 + ], + [ + -95.0201865, + 44.1079246 + ], + [ + -95.0403185, + 44.1079898 + ], + [ + -95.0603989, + 44.1080073 + ], + [ + -95.0808564, + 44.1080865 + ], + [ + -95.100236, + 44.1080738 + ], + [ + -95.1004227, + 44.1225116 + ], + [ + -95.1005235, + 44.1369869 + ], + [ + -95.1007273, + 44.1515414 + ], + [ + -95.100767, + 44.1660448 + ], + [ + -95.1008289, + 44.1804667 + ], + [ + -95.1009218, + 44.1950501 + ], + [ + -95.1086159, + 44.1951447 + ], + [ + -95.1084073, + 44.2094972 + ], + [ + -95.1081841, + 44.2239333 + ], + [ + -95.1079163, + 44.2385232 + ], + [ + -95.1078896, + 44.2528476 + ], + [ + -95.1076942, + 44.2673552 + ], + [ + -95.1075092, + 44.2817995 + ], + [ + -95.0876726, + 44.281849 + ], + [ + -95.067428, + 44.2820554 + ], + [ + -95.0471421, + 44.2825201 + ], + [ + -95.0269614, + 44.2824121 + ], + [ + -95.006976, + 44.2825132 + ], + [ + -94.9867979, + 44.2825601 + ], + [ + -94.9669104, + 44.2823283 + ], + [ + -94.9467064, + 44.2822064 + ], + [ + -94.9266927, + 44.2820598 + ], + [ + -94.906573, + 44.2821545 + ], + [ + -94.8864967, + 44.2822719 + ], + [ + -94.8662628, + 44.2822804 + ], + [ + -94.866291, + 44.2967388 + ], + [ + -94.8663722, + 44.3112144 + ], + [ + -94.8663117, + 44.3257373 + ], + [ + -94.8662921, + 44.3403225 + ], + [ + -94.8661563, + 44.3547025 + ], + [ + -94.8660504, + 44.369181 + ], + [ + -94.8660154, + 44.3833972 + ], + [ + -94.8659449, + 44.3978751 + ], + [ + -94.8657646, + 44.4124177 + ], + [ + -94.8657096, + 44.4269943 + ], + [ + -94.865629, + 44.4415082 + ], + [ + -94.8655019, + 44.4560589 + ], + [ + -94.8655457, + 44.4705257 + ], + [ + -94.8655607, + 44.48502 + ], + [ + -94.8655936, + 44.4980438 + ], + [ + -94.8653127, + 44.4979564 + ], + [ + -94.8650898, + 44.4978195 + ], + [ + -94.8648017, + 44.4974994 + ], + [ + -94.8645455, + 44.4969734 + ], + [ + -94.8644167, + 44.4962875 + ], + [ + -94.8642884, + 44.4961965 + ], + [ + -94.8641604, + 44.4958305 + ], + [ + -94.8640006, + 44.4956255 + ], + [ + -94.8633936, + 44.4953505 + ], + [ + -94.8625953, + 44.4951915 + ], + [ + -94.8585385, + 44.4948045 + ], + [ + -94.8574203, + 44.4948056 + ], + [ + -94.8562982, + 44.4949565 + ], + [ + -94.8562391, + 44.4949656 + ], + [ + -94.8546102, + 44.4954466 + ], + [ + -94.8538432, + 44.4956015 + ], + [ + -94.8533652, + 44.4956986 + ], + [ + -94.8524391, + 44.4955845 + ], + [ + -94.8518953, + 44.4951955 + ], + [ + -94.8518953, + 44.4946475 + ], + [ + -94.8521823, + 44.4941675 + ], + [ + -94.8525012, + 44.4938236 + ], + [ + -94.8533631, + 44.4933896 + ], + [ + -94.8548643, + 44.4928626 + ], + [ + -94.8552153, + 44.4925885 + ], + [ + -94.8553422, + 44.4921535 + ], + [ + -94.8552144, + 44.4915825 + ], + [ + -94.8545113, + 44.4903945 + ], + [ + -94.8538722, + 44.4899825 + ], + [ + -94.8530412, + 44.4897545 + ], + [ + -94.8513481, + 44.4897555 + ], + [ + -94.8511339, + 44.4898055 + ], + [ + -94.850678, + 44.4899156 + ], + [ + -94.850135, + 44.4901215 + ], + [ + -94.849848, + 44.4904415 + ], + [ + -94.8499439, + 44.4908756 + ], + [ + -94.8500401, + 44.4909216 + ], + [ + -94.8500402, + 44.4911726 + ], + [ + -94.8496572, + 44.4916535 + ], + [ + -94.8491142, + 44.4918826 + ], + [ + -94.8463359, + 44.4924316 + ], + [ + -94.8461319, + 44.4924429 + ], + [ + -94.8461318, + 44.4924429 + ], + [ + -94.8434298, + 44.4925926 + ], + [ + -94.8414819, + 44.4921817 + ], + [ + -94.8402679, + 44.4917476 + ], + [ + -94.8394369, + 44.4911307 + ], + [ + -94.8390538, + 44.4905597 + ], + [ + -94.8389579, + 44.4901477 + ], + [ + -94.8390527, + 44.4891876 + ], + [ + -94.8388929, + 44.4888676 + ], + [ + -94.8387008, + 44.4887306 + ], + [ + -94.8384457, + 44.4886166 + ], + [ + -94.8380306, + 44.4886166 + ], + [ + -94.8378678, + 44.4887246 + ], + [ + -94.8370406, + 44.4892797 + ], + [ + -94.8366576, + 44.4894857 + ], + [ + -94.8361147, + 44.4896686 + ], + [ + -94.8349967, + 44.4897607 + ], + [ + -94.8334316, + 44.4895317 + ], + [ + -94.8329848, + 44.4893947 + ], + [ + -94.8323456, + 44.4890517 + ], + [ + -94.8323138, + 44.4889146 + ], + [ + -94.8318985, + 44.4887546 + ], + [ + -94.8310367, + 44.4879547 + ], + [ + -94.8302057, + 44.4872697 + ], + [ + -94.8295024, + 44.4865837 + ], + [ + -94.8292476, + 44.4861036 + ], + [ + -94.8291516, + 44.4857837 + ], + [ + -94.8290887, + 44.4850814 + ], + [ + -94.8290555, + 44.4847087 + ], + [ + -94.8289915, + 44.4844347 + ], + [ + -94.8288953, + 44.4843887 + ], + [ + -94.8287996, + 44.4839546 + ], + [ + -94.8285434, + 44.4835657 + ], + [ + -94.8281286, + 44.4831547 + ], + [ + -94.8276812, + 44.4829486 + ], + [ + -94.8271704, + 44.4829257 + ], + [ + -94.8269745, + 44.4830557 + ], + [ + -94.8267554, + 44.4832007 + ], + [ + -94.8266274, + 44.4835207 + ], + [ + -94.8265325, + 44.4835897 + ], + [ + -94.8265003, + 44.4837267 + ], + [ + -94.8260214, + 44.4842977 + ], + [ + -94.8259253, + 44.4843437 + ], + [ + -94.8257975, + 44.4845037 + ], + [ + -94.8257417, + 44.4845492 + ], + [ + -94.8250954, + 44.4850757 + ], + [ + -94.8250718, + 44.4850869 + ], + [ + -94.8247125, + 44.4852588 + ], + [ + -94.8240732, + 44.4853266 + ], + [ + -94.8236585, + 44.4852356 + ], + [ + -94.823305, + 44.4850849 + ], + [ + -94.8233049, + 44.4850849 + ], + [ + -94.8206563, + 44.4839557 + ], + [ + -94.8194742, + 44.4833847 + ], + [ + -94.8186442, + 44.4831557 + ], + [ + -94.8182293, + 44.4831328 + ], + [ + -94.8177502, + 44.4832708 + ], + [ + -94.8173351, + 44.4835448 + ], + [ + -94.8167603, + 44.4840937 + ], + [ + -94.8163132, + 44.4844138 + ], + [ + -94.8156431, + 44.4845508 + ], + [ + -94.8153231, + 44.4844588 + ], + [ + -94.8148441, + 44.4840938 + ], + [ + -94.8147481, + 44.4838877 + ], + [ + -94.8147171, + 44.4834307 + ], + [ + -94.8148759, + 44.4830418 + ], + [ + -94.815132, + 44.4827447 + ], + [ + -94.8156111, + 44.4824698 + ], + [ + -94.816664, + 44.4821958 + ], + [ + -94.8175902, + 44.4818527 + ], + [ + -94.8180369, + 44.4815097 + ], + [ + -94.8181651, + 44.4812587 + ], + [ + -94.818165, + 44.4802067 + ], + [ + -94.8179409, + 44.4797727 + ], + [ + -94.8176541, + 44.4794067 + ], + [ + -94.817302, + 44.4791548 + ], + [ + -94.8170152, + 44.4790408 + ], + [ + -94.8164401, + 44.4791097 + ], + [ + -94.8156101, + 44.4794988 + ], + [ + -94.814173, + 44.4805727 + ], + [ + -94.8138861, + 44.4809157 + ], + [ + -94.8133429, + 44.4813047 + ], + [ + -94.8127372, + 44.4816017 + ], + [ + -94.812066, + 44.4816928 + ], + [ + -94.8115869, + 44.4813958 + ], + [ + -94.811332, + 44.4810078 + ], + [ + -94.8113319, + 44.4809158 + ], + [ + -94.8111718, + 44.4806188 + ], + [ + -94.8109479, + 44.4796817 + ], + [ + -94.8109159, + 44.4791557 + ], + [ + -94.8108209, + 44.4788808 + ], + [ + -94.810725, + 44.4777377 + ], + [ + -94.8106608, + 44.4773267 + ], + [ + -94.8106608, + 44.4764118 + ], + [ + -94.8106931, + 44.4761838 + ], + [ + -94.810597, + 44.4761147 + ], + [ + -94.8104689, + 44.4756577 + ], + [ + -94.810405, + 44.4756118 + ], + [ + -94.8104369, + 44.4750407 + ], + [ + -94.8107567, + 44.4746978 + ], + [ + -94.8112988, + 44.4740348 + ], + [ + -94.8112987, + 44.4737147 + ], + [ + -94.8111399, + 44.4733947 + ], + [ + -94.811044, + 44.4730747 + ], + [ + -94.8109797, + 44.4730287 + ], + [ + -94.810852, + 44.4726857 + ], + [ + -94.8106287, + 44.4723887 + ], + [ + -94.8105329, + 44.4721137 + ], + [ + -94.8104687, + 44.4720687 + ], + [ + -94.8101497, + 44.4714737 + ], + [ + -94.8098629, + 44.4711308 + ], + [ + -94.8094476, + 44.4709027 + ], + [ + -94.8090427, + 44.470553 + ], + [ + -94.8082027, + 44.4698278 + ], + [ + -94.8058077, + 44.4687077 + ], + [ + -94.8056006, + 44.4686395 + ], + [ + -94.8042117, + 44.4681818 + ], + [ + -94.8022324, + 44.4677708 + ], + [ + -94.8013705, + 44.4677477 + ], + [ + -94.8003804, + 44.4678618 + ], + [ + -94.7997425, + 44.4682498 + ], + [ + -94.7994866, + 44.4686158 + ], + [ + -94.7994546, + 44.4691188 + ], + [ + -94.7993267, + 44.4693928 + ], + [ + -94.7990714, + 44.4695758 + ], + [ + -94.7987203, + 44.4696448 + ], + [ + -94.7984333, + 44.4694848 + ], + [ + -94.7982734, + 44.4691648 + ], + [ + -94.7982094, + 44.4685017 + ], + [ + -94.7983053, + 44.4682727 + ], + [ + -94.7984013, + 44.4682268 + ], + [ + -94.7984336, + 44.4681127 + ], + [ + -94.7990085, + 44.4676327 + ], + [ + -94.7999015, + 44.4670838 + ], + [ + -94.8001765, + 44.4669678 + ], + [ + -94.8012106, + 44.4665358 + ], + [ + -94.8019773, + 44.4663528 + ], + [ + -94.8030305, + 44.4662847 + ], + [ + -94.8037323, + 44.4664448 + ], + [ + -94.8044996, + 44.4667648 + ], + [ + -94.8051696, + 44.4669477 + ], + [ + -94.8055791, + 44.4669618 + ], + [ + -94.8058398, + 44.4669708 + ], + [ + -94.8061905, + 44.4668787 + ], + [ + -94.8065107, + 44.4666507 + ], + [ + -94.8065428, + 44.4663527 + ], + [ + -94.8063824, + 44.4660328 + ], + [ + -94.8061275, + 44.4658047 + ], + [ + -94.8058385, + 44.4656308 + ], + [ + -94.8055598, + 44.4654624 + ], + [ + -94.8055206, + 44.4654387 + ], + [ + -94.8048504, + 44.4652327 + ], + [ + -94.8033184, + 44.4653018 + ], + [ + -94.8022645, + 44.4651408 + ], + [ + -94.8014984, + 44.4649358 + ], + [ + -94.8003493, + 44.4644097 + ], + [ + -94.7999663, + 44.4641577 + ], + [ + -94.7985615, + 44.4630838 + ], + [ + -94.7967423, + 44.4620087 + ], + [ + -94.7955932, + 44.4615968 + ], + [ + -94.7938061, + 44.4610027 + ], + [ + -94.793455, + 44.4607508 + ], + [ + -94.7933592, + 44.4606368 + ], + [ + -94.7934553, + 44.4603617 + ], + [ + -94.7939022, + 44.4598598 + ], + [ + -94.7941251, + 44.4594938 + ], + [ + -94.794196, + 44.4592038 + ], + [ + -94.7942532, + 44.4589678 + ], + [ + -94.7937751, + 44.4584418 + ], + [ + -94.7927212, + 44.4576188 + ], + [ + -94.791445, + 44.4567727 + ], + [ + -94.7909661, + 44.4565667 + ], + [ + -94.7901361, + 44.4562697 + ], + [ + -94.7895618, + 44.4561777 + ], + [ + -94.7889868, + 44.4561548 + ], + [ + -94.7868809, + 44.4566117 + ], + [ + -94.7852869, + 44.4568838 + ], + [ + -94.7851701, + 44.456904 + ], + [ + -94.78517, + 44.456904 + ], + [ + -94.7846137, + 44.4569999 + ], + [ + -94.7835288, + 44.4572968 + ], + [ + -94.7820288, + 44.4575709 + ], + [ + -94.7815179, + 44.4574338 + ], + [ + -94.7812628, + 44.4571818 + ], + [ + -94.7812309, + 44.4569988 + ], + [ + -94.7809439, + 44.4566559 + ], + [ + -94.7809437, + 44.4565188 + ], + [ + -94.7806566, + 44.4561988 + ], + [ + -94.7805702, + 44.4560958 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "area_715", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4962085, + 44.3076417 + ], + [ + -94.4962407, + 44.3076416 + ], + [ + -94.4968175, + 44.3087321 + ], + [ + -94.503745, + 44.3172523 + ], + [ + -94.5073574, + 44.317302 + ], + [ + -94.5072537, + 44.3217514 + ], + [ + -94.5079354, + 44.3226374 + ], + [ + -94.5123111, + 44.3226556 + ], + [ + -94.5134525, + 44.3226603 + ], + [ + -94.5134309, + 44.3253398 + ], + [ + -94.513622, + 44.3253406 + ], + [ + -94.5136186, + 44.3257613 + ], + [ + -94.5140248, + 44.3260821 + ], + [ + -94.5167679, + 44.3260492 + ], + [ + -94.5167681, + 44.3262513 + ], + [ + -94.5167697, + 44.3298889 + ], + [ + -94.5122669, + 44.3299378 + ], + [ + -94.5071974, + 44.3299271 + ], + [ + -94.5071788, + 44.3335482 + ], + [ + -94.5021089, + 44.3335267 + ], + [ + -94.4958674, + 44.3335056 + ], + [ + -94.4958591, + 44.3362229 + ], + [ + -94.495523, + 44.3360903 + ], + [ + -94.4952257, + 44.3359499 + ], + [ + -94.4949786, + 44.3358142 + ], + [ + -94.4947756, + 44.3356875 + ], + [ + -94.4945594, + 44.335542 + ], + [ + -94.4941451, + 44.3351847 + ], + [ + -94.493095, + 44.3340829 + ], + [ + -94.4923693, + 44.3344764 + ], + [ + -94.4923047, + 44.3345118 + ], + [ + -94.4922312, + 44.3345592 + ], + [ + -94.4921559, + 44.334617 + ], + [ + -94.4921055, + 44.3346628 + ], + [ + -94.4920571, + 44.3347148 + ], + [ + -94.4920034, + 44.334784 + ], + [ + -94.4919637, + 44.3348488 + ], + [ + -94.4919314, + 44.3349158 + ], + [ + -94.4919103, + 44.3349765 + ], + [ + -94.4918936, + 44.3350463 + ], + [ + -94.4918864, + 44.3351086 + ], + [ + -94.491883, + 44.3355602 + ], + [ + -94.4918787, + 44.3367002 + ], + [ + -94.4931843, + 44.3370479 + ], + [ + -94.4969199, + 44.3379491 + ], + [ + -94.4988417, + 44.3384119 + ], + [ + -94.499269, + 44.33907 + ], + [ + -94.4995537, + 44.3392995 + ], + [ + -94.5001277, + 44.3395952 + ], + [ + -94.5003849, + 44.3398063 + ], + [ + -94.5005154, + 44.3399494 + ], + [ + -94.5005489, + 44.3400843 + ], + [ + -94.5005367, + 44.3401407 + ], + [ + -94.5006382, + 44.3402747 + ], + [ + -94.5008065, + 44.3404024 + ], + [ + -94.5011734, + 44.3407298 + ], + [ + -94.5012484, + 44.3408219 + ], + [ + -94.4929145, + 44.3408212 + ], + [ + -94.4929255, + 44.3384549 + ], + [ + -94.4918721, + 44.3384548 + ], + [ + -94.4918631, + 44.3408211 + ], + [ + -94.4918795, + 44.3425734 + ], + [ + -94.4939044, + 44.3425469 + ], + [ + -94.4931472, + 44.3433659 + ], + [ + -94.4936467, + 44.3436037 + ], + [ + -94.4928, + 44.3445196 + ], + [ + -94.4935518, + 44.3448776 + ], + [ + -94.4931122, + 44.3453531 + ], + [ + -94.4919001, + 44.344776 + ], + [ + -94.4919719, + 44.3524584 + ], + [ + -94.491488, + 44.3516015 + ], + [ + -94.4913893, + 44.3514619 + ], + [ + -94.4913626, + 44.3513781 + ], + [ + -94.4912881, + 44.3512634 + ], + [ + -94.4912129, + 44.3511712 + ], + [ + -94.4911339, + 44.3510839 + ], + [ + -94.4910472, + 44.3509895 + ], + [ + -94.4909538, + 44.3509 + ], + [ + -94.4908609, + 44.3508159 + ], + [ + -94.4907588, + 44.3507317 + ], + [ + -94.4906517, + 44.3506525 + ], + [ + -94.4905429, + 44.3505826 + ], + [ + -94.49043, + 44.3505275 + ], + [ + -94.4902934, + 44.3504738 + ], + [ + -94.4901562, + 44.3504279 + ], + [ + -94.4900133, + 44.3503881 + ], + [ + -94.4898667, + 44.3503535 + ], + [ + -94.4897151, + 44.3503214 + ], + [ + -94.4895684, + 44.3502963 + ], + [ + -94.4894251, + 44.3502773 + ], + [ + -94.4892771, + 44.3502625 + ], + [ + -94.4891278, + 44.3502514 + ], + [ + -94.4889777, + 44.3502429 + ], + [ + -94.4888312, + 44.3502366 + ], + [ + -94.4886757, + 44.3502306 + ], + [ + -94.4885245, + 44.3502247 + ], + [ + -94.4883735, + 44.3502179 + ], + [ + -94.488223, + 44.350209 + ], + [ + -94.4880733, + 44.3501973 + ], + [ + -94.4879188, + 44.3501813 + ], + [ + -94.4877755, + 44.3501652 + ], + [ + -94.4876253, + 44.3501483 + ], + [ + -94.4874744, + 44.3501318 + ], + [ + -94.487324, + 44.3501133 + ], + [ + -94.487174, + 44.3500934 + ], + [ + -94.4870252, + 44.3500715 + ], + [ + -94.4868779, + 44.3500471 + ], + [ + -94.4867328, + 44.350019 + ], + [ + -94.4865952, + 44.3499882 + ], + [ + -94.4864524, + 44.3499485 + ], + [ + -94.4863169, + 44.3499055 + ], + [ + -94.4861815, + 44.3498596 + ], + [ + -94.4860422, + 44.3498101 + ], + [ + -94.4859108, + 44.3497605 + ], + [ + -94.4857709, + 44.3497054 + ], + [ + -94.485645, + 44.3496491 + ], + [ + -94.4855208, + 44.3495897 + ], + [ + -94.485393, + 44.3495238 + ], + [ + -94.4852715, + 44.3494574 + ], + [ + -94.4851531, + 44.3493892 + ], + [ + -94.4850396, + 44.349318 + ], + [ + -94.4849316, + 44.349244 + ], + [ + -94.4848281, + 44.3491684 + ], + [ + -94.4847324, + 44.3490928 + ], + [ + -94.4846327, + 44.3490096 + ], + [ + -94.4845385, + 44.3489262 + ], + [ + -94.4844519, + 44.348836 + ], + [ + -94.4843665, + 44.3487458 + ], + [ + -94.4842824, + 44.3486543 + ], + [ + -94.4842023, + 44.3485607 + ], + [ + -94.4841248, + 44.3484657 + ], + [ + -94.4840505, + 44.3483694 + ], + [ + -94.4839782, + 44.3482726 + ], + [ + -94.4839149, + 44.3481721 + ], + [ + -94.4838502, + 44.3480732 + ], + [ + -94.4837852, + 44.3479745 + ], + [ + -94.4837297, + 44.3478746 + ], + [ + -94.4837026, + 44.3478231 + ], + [ + -94.4836771, + 44.3477747 + ], + [ + -94.4836292, + 44.3476747 + ], + [ + -94.4835909, + 44.3475724 + ], + [ + -94.4835611, + 44.3474681 + ], + [ + -94.4835354, + 44.3473423 + ], + [ + -94.4835226, + 44.3472541 + ], + [ + -94.4835118, + 44.3471452 + ], + [ + -94.4835031, + 44.3470356 + ], + [ + -94.4834958, + 44.3469257 + ], + [ + -94.4834863, + 44.3468161 + ], + [ + -94.4834741, + 44.346707 + ], + [ + -94.4834578, + 44.346599 + ], + [ + -94.4834371, + 44.3464918 + ], + [ + -94.4834165, + 44.3463835 + ], + [ + -94.4833989, + 44.346274 + ], + [ + -94.4833841, + 44.3461684 + ], + [ + -94.4833625, + 44.3460544 + ], + [ + -94.4833388, + 44.3459457 + ], + [ + -94.4833065, + 44.3458393 + ], + [ + -94.4833016, + 44.3457274 + ], + [ + -94.4832701, + 44.3456221 + ], + [ + -94.483232, + 44.3455194 + ], + [ + -94.4831859, + 44.3454198 + ], + [ + -94.4831306, + 44.3453239 + ], + [ + -94.4830621, + 44.3452324 + ], + [ + -94.4829778, + 44.3451458 + ], + [ + -94.4828803, + 44.3450637 + ], + [ + -94.4827724, + 44.3449856 + ], + [ + -94.4826568, + 44.344911 + ], + [ + -94.4825362, + 44.3448396 + ], + [ + -94.4824134, + 44.344771 + ], + [ + -94.4822911, + 44.3447047 + ], + [ + -94.4821711, + 44.34464 + ], + [ + -94.4820493, + 44.3445761 + ], + [ + -94.481925, + 44.3445132 + ], + [ + -94.4817983, + 44.3444521 + ], + [ + -94.4816693, + 44.3443934 + ], + [ + -94.481538, + 44.3443377 + ], + [ + -94.4814046, + 44.3442856 + ], + [ + -94.4812693, + 44.3442378 + ], + [ + -94.481132, + 44.344195 + ], + [ + -94.4809929, + 44.3441577 + ], + [ + -94.4808515, + 44.3441259 + ], + [ + -94.4807071, + 44.3440983 + ], + [ + -94.4805602, + 44.3440748 + ], + [ + -94.4804113, + 44.344055 + ], + [ + -94.4802608, + 44.3440387 + ], + [ + -94.4801094, + 44.3440255 + ], + [ + -94.4799574, + 44.3440153 + ], + [ + -94.4798054, + 44.3440077 + ], + [ + -94.4796528, + 44.3440048 + ], + [ + -94.4795111, + 44.3439995 + ], + [ + -94.479354, + 44.3439995 + ], + [ + -94.4792052, + 44.3440056 + ], + [ + -94.4790575, + 44.3440176 + ], + [ + -94.4789078, + 44.3440341 + ], + [ + -94.4787592, + 44.3440531 + ], + [ + -94.4786108, + 44.3440795 + ], + [ + -94.4784621, + 44.3441015 + ], + [ + -94.4783132, + 44.3441212 + ], + [ + -94.4781641, + 44.3441367 + ], + [ + -94.4780147, + 44.3441514 + ], + [ + -94.4778652, + 44.3441663 + ], + [ + -94.4777154, + 44.3441808 + ], + [ + -94.4775656, + 44.3441939 + ], + [ + -94.4774158, + 44.3442051 + ], + [ + -94.4772623, + 44.3441993 + ], + [ + -94.4771144, + 44.3442109 + ], + [ + -94.4769654, + 44.3442161 + ], + [ + -94.476818, + 44.344216 + ], + [ + -94.4766643, + 44.3442093 + ], + [ + -94.4765132, + 44.3442005 + ], + [ + -94.476363, + 44.3441877 + ], + [ + -94.476214, + 44.3441715 + ], + [ + -94.4760668, + 44.3441517 + ], + [ + -94.4759205, + 44.3441272 + ], + [ + -94.4757729, + 44.3440994 + ], + [ + -94.4756353, + 44.3440669 + ], + [ + -94.4754874, + 44.3440214 + ], + [ + -94.4753538, + 44.3439716 + ], + [ + -94.4752296, + 44.3439141 + ], + [ + -94.4751163, + 44.3438536 + ], + [ + -94.4749948, + 44.3437797 + ], + [ + -94.4748822, + 44.3437051 + ], + [ + -94.4747744, + 44.3436265 + ], + [ + -94.4746726, + 44.3435442 + ], + [ + -94.4745781, + 44.3434588 + ], + [ + -94.4744923, + 44.3433704 + ], + [ + -94.4744118, + 44.3432805 + ], + [ + -94.4743482, + 44.3431851 + ], + [ + -94.4742926, + 44.3430859 + ], + [ + -94.4742435, + 44.342984 + ], + [ + -94.4741941, + 44.3428818 + ], + [ + -94.4741617, + 44.3427732 + ], + [ + -94.4741199, + 44.3426677 + ], + [ + -94.4740758, + 44.3425631 + ], + [ + -94.474027, + 44.3424601 + ], + [ + -94.4739524, + 44.3423627 + ], + [ + -94.4739078, + 44.3422603 + ], + [ + -94.4738562, + 44.3421585 + ], + [ + -94.4738016, + 44.3420571 + ], + [ + -94.4737446, + 44.341956 + ], + [ + -94.4736905, + 44.3418545 + ], + [ + -94.4736375, + 44.3417527 + ], + [ + -94.4735815, + 44.3416521 + ], + [ + -94.4735223, + 44.3415526 + ], + [ + -94.4734608, + 44.3414554 + ], + [ + -94.4733904, + 44.3413607 + ], + [ + -94.4733151, + 44.3412683 + ], + [ + -94.4732388, + 44.3411764 + ], + [ + -94.4731578, + 44.3410867 + ], + [ + -94.4730755, + 44.3409973 + ], + [ + -94.4729873, + 44.3409104 + ], + [ + -94.4729018, + 44.3408219 + ], + [ + -94.4728117, + 44.3407356 + ], + [ + -94.4727178, + 44.3406509 + ], + [ + -94.4726222, + 44.340567 + ], + [ + -94.4725182, + 44.3404805 + ], + [ + -94.4724212, + 44.3404048 + ], + [ + -94.4723167, + 44.340326 + ], + [ + -94.4722121, + 44.3402473 + ], + [ + -94.4721064, + 44.3401698 + ], + [ + -94.4720006, + 44.3400928 + ], + [ + -94.4718946, + 44.3400166 + ], + [ + -94.4717879, + 44.3399407 + ], + [ + -94.4716778, + 44.3398673 + ], + [ + -94.4715673, + 44.3397941 + ], + [ + -94.4714559, + 44.3397216 + ], + [ + -94.4713425, + 44.3396505 + ], + [ + -94.4712293, + 44.3395792 + ], + [ + -94.4711156, + 44.3395082 + ], + [ + -94.470996, + 44.3394337 + ], + [ + -94.4708875, + 44.3393668 + ], + [ + -94.4707733, + 44.3392961 + ], + [ + -94.4706596, + 44.3392252 + ], + [ + -94.4705465, + 44.3391537 + ], + [ + -94.4704343, + 44.3390817 + ], + [ + -94.4703228, + 44.3390091 + ], + [ + -94.4702108, + 44.3389367 + ], + [ + -94.4700983, + 44.3388645 + ], + [ + -94.4699854, + 44.3387926 + ], + [ + -94.4698723, + 44.3387207 + ], + [ + -94.4697591, + 44.3386488 + ], + [ + -94.469646, + 44.3385769 + ], + [ + -94.4695331, + 44.3385048 + ], + [ + -94.4694205, + 44.3384326 + ], + [ + -94.4693084, + 44.3383601 + ], + [ + -94.4691969, + 44.3382872 + ], + [ + -94.4690861, + 44.3382139 + ], + [ + -94.4689763, + 44.3381401 + ], + [ + -94.4688676, + 44.3380658 + ], + [ + -94.4687644, + 44.3379935 + ], + [ + -94.468655, + 44.3379138 + ], + [ + -94.4685513, + 44.3378365 + ], + [ + -94.4684492, + 44.3377582 + ], + [ + -94.4683574, + 44.3376768 + ], + [ + -94.4682804, + 44.3375804 + ], + [ + -94.4682095, + 44.3374838 + ], + [ + -94.4681535, + 44.3373798 + ], + [ + -94.4680849, + 44.3372826 + ], + [ + -94.4680048, + 44.3371923 + ], + [ + -94.4679069, + 44.3371129 + ], + [ + -94.4677923, + 44.3370441 + ], + [ + -94.4676678, + 44.3369815 + ], + [ + -94.467537, + 44.3369231 + ], + [ + -94.467415, + 44.3368569 + ], + [ + -94.4673049, + 44.3367854 + ], + [ + -94.4672032, + 44.3367066 + ], + [ + -94.4671056, + 44.3366247 + ], + [ + -94.467013, + 44.3365389 + ], + [ + -94.4669224, + 44.3364547 + ], + [ + -94.4668376, + 44.3363615 + ], + [ + -94.4667547, + 44.336271 + ], + [ + -94.4666737, + 44.33618 + ], + [ + -94.4665947, + 44.3360881 + ], + [ + -94.4665182, + 44.3359951 + ], + [ + -94.4664425, + 44.3359017 + ], + [ + -94.4663655, + 44.3358092 + ], + [ + -94.4663004, + 44.3357102 + ], + [ + -94.4662272, + 44.3356154 + ], + [ + -94.4661536, + 44.3355209 + ], + [ + -94.4660793, + 44.3354268 + ], + [ + -94.4660037, + 44.3353334 + ], + [ + -94.4659263, + 44.3352408 + ], + [ + -94.4658467, + 44.3351493 + ], + [ + -94.4657644, + 44.3350591 + ], + [ + -94.465663, + 44.3349767 + ], + [ + -94.4655842, + 44.3348856 + ], + [ + -94.4655, + 44.3347961 + ], + [ + -94.4654136, + 44.3347071 + ], + [ + -94.4653272, + 44.334618 + ], + [ + -94.4652835, + 44.3345732 + ], + [ + -94.46524, + 44.334529 + ], + [ + -94.465151, + 44.3344395 + ], + [ + -94.4650591, + 44.3343538 + ], + [ + -94.4649709, + 44.3342728 + ], + [ + -94.4648709, + 44.3341834 + ], + [ + -94.464775, + 44.3340995 + ], + [ + -94.4646786, + 44.3340161 + ], + [ + -94.4645798, + 44.3339345 + ], + [ + -94.4644805, + 44.3338535 + ], + [ + -94.4643786, + 44.3337745 + ], + [ + -94.4642751, + 44.3336971 + ], + [ + -94.4641689, + 44.333622 + ], + [ + -94.4640617, + 44.333548 + ], + [ + -94.4639574, + 44.3334817 + ], + [ + -94.4638356, + 44.3334087 + ], + [ + -94.4637176, + 44.3333417 + ], + [ + -94.4635965, + 44.3332767 + ], + [ + -94.4634733, + 44.3332133 + ], + [ + -94.4633481, + 44.3331515 + ], + [ + -94.4632205, + 44.3330918 + ], + [ + -94.4630913, + 44.3330339 + ], + [ + -94.4629606, + 44.3329778 + ], + [ + -94.4628941, + 44.3329501 + ], + [ + -94.4628289, + 44.3329241 + ], + [ + -94.4626951, + 44.3328728 + ], + [ + -94.4625605, + 44.3328233 + ], + [ + -94.4624256, + 44.3327756 + ], + [ + -94.4622904, + 44.3327297 + ], + [ + -94.4621469, + 44.332683 + ], + [ + -94.4620157, + 44.332644 + ], + [ + -94.4618738, + 44.332605 + ], + [ + -94.4617303, + 44.3325672 + ], + [ + -94.4615851, + 44.3325316 + ], + [ + -94.4614385, + 44.3324988 + ], + [ + -94.461291, + 44.3324684 + ], + [ + -94.4611428, + 44.3324414 + ], + [ + -94.4609948, + 44.3324163 + ], + [ + -94.4608467, + 44.3323949 + ], + [ + -94.4606965, + 44.3323759 + ], + [ + -94.4605568, + 44.3323634 + ], + [ + -94.4604059, + 44.3323564 + ], + [ + -94.4602598, + 44.332356 + ], + [ + -94.4601125, + 44.3323645 + ], + [ + -94.4599626, + 44.3323808 + ], + [ + -94.4598162, + 44.3324032 + ], + [ + -94.4596687, + 44.3324362 + ], + [ + -94.4595219, + 44.3324713 + ], + [ + -94.4593765, + 44.3325092 + ], + [ + -94.4592329, + 44.3325486 + ], + [ + -94.4590917, + 44.3325879 + ], + [ + -94.4589523, + 44.3326275 + ], + [ + -94.4588138, + 44.3326689 + ], + [ + -94.4586761, + 44.3327118 + ], + [ + -94.4585391, + 44.3327561 + ], + [ + -94.4584026, + 44.3328014 + ], + [ + -94.4582567, + 44.3328364 + ], + [ + -94.4581243, + 44.3328866 + ], + [ + -94.4579919, + 44.3329375 + ], + [ + -94.4578574, + 44.3329864 + ], + [ + -94.4577211, + 44.3330327 + ], + [ + -94.4575862, + 44.3330812 + ], + [ + -94.4574513, + 44.3331295 + ], + [ + -94.4573137, + 44.3331739 + ], + [ + -94.4571781, + 44.3332212 + ], + [ + -94.4570423, + 44.3332679 + ], + [ + -94.4569051, + 44.3333121 + ], + [ + -94.4567681, + 44.3333566 + ], + [ + -94.4566291, + 44.3333981 + ], + [ + -94.4564889, + 44.333438 + ], + [ + -94.45635, + 44.3334797 + ], + [ + -94.4562118, + 44.3335225 + ], + [ + -94.4560724, + 44.3335633 + ], + [ + -94.4559324, + 44.3336031 + ], + [ + -94.455792, + 44.333642 + ], + [ + -94.4556433, + 44.3336827 + ], + [ + -94.4555109, + 44.3337165 + ], + [ + -94.4553665, + 44.333741 + ], + [ + -94.4552274, + 44.3337902 + ], + [ + -94.4550842, + 44.3338254 + ], + [ + -94.45494, + 44.3338621 + ], + [ + -94.454795, + 44.3338991 + ], + [ + -94.4546493, + 44.333935 + ], + [ + -94.4545032, + 44.3339686 + ], + [ + -94.4543569, + 44.3339987 + ], + [ + -94.4542106, + 44.3340238 + ], + [ + -94.4540644, + 44.3340429 + ], + [ + -94.4539186, + 44.3340544 + ], + [ + -94.4537731, + 44.3340571 + ], + [ + -94.4536269, + 44.3340484 + ], + [ + -94.45348, + 44.3340297 + ], + [ + -94.4533331, + 44.3340027 + ], + [ + -94.4531866, + 44.3339695 + ], + [ + -94.453041, + 44.3339319 + ], + [ + -94.4529005, + 44.3338757 + ], + [ + -94.4527551, + 44.33385 + ], + [ + -94.4526851, + 44.3338316 + ], + [ + -94.4526133, + 44.3338107 + ], + [ + -94.4524742, + 44.3337683 + ], + [ + -94.4523334, + 44.333722 + ], + [ + -94.4521958, + 44.3336715 + ], + [ + -94.4520665, + 44.3336144 + ], + [ + -94.4519477, + 44.3335512 + ], + [ + -94.4518492, + 44.3334851 + ], + [ + -94.4517513, + 44.3333959 + ], + [ + -94.4516659, + 44.333306 + ], + [ + -94.4515885, + 44.3332106 + ], + [ + -94.4515194, + 44.3331113 + ], + [ + -94.451459, + 44.3330094 + ], + [ + -94.4514077, + 44.3329066 + ], + [ + -94.4513656, + 44.332804 + ], + [ + -94.4513284, + 44.3327003 + ], + [ + -94.4512952, + 44.3325951 + ], + [ + -94.4512658, + 44.3324887 + ], + [ + -94.4512406, + 44.3323813 + ], + [ + -94.4512195, + 44.3322732 + ], + [ + -94.4512026, + 44.3321647 + ], + [ + -94.45119, + 44.332056 + ], + [ + -94.4511818, + 44.3319474 + ], + [ + -94.4511781, + 44.3318391 + ], + [ + -94.4511788, + 44.3317313 + ], + [ + -94.4511817, + 44.3316237 + ], + [ + -94.4511852, + 44.3315159 + ], + [ + -94.4511892, + 44.3314079 + ], + [ + -94.4511938, + 44.3312998 + ], + [ + -94.4511992, + 44.3311915 + ], + [ + -94.4512053, + 44.3310832 + ], + [ + -94.4512123, + 44.3309747 + ], + [ + -94.4512202, + 44.3308663 + ], + [ + -94.451229, + 44.3307579 + ], + [ + -94.451239, + 44.3306495 + ], + [ + -94.4512501, + 44.3305412 + ], + [ + -94.4512624, + 44.3304329 + ], + [ + -94.451276, + 44.3303249 + ], + [ + -94.4512909, + 44.330217 + ], + [ + -94.4513073, + 44.3301093 + ], + [ + -94.4513251, + 44.3300018 + ], + [ + -94.4513445, + 44.3298946 + ], + [ + -94.4513563, + 44.3297858 + ], + [ + -94.451383, + 44.3296803 + ], + [ + -94.4514088, + 44.3295743 + ], + [ + -94.4514349, + 44.3294686 + ], + [ + -94.4514634, + 44.3293633 + ], + [ + -94.4514947, + 44.3292585 + ], + [ + -94.4515302, + 44.3291544 + ], + [ + -94.451568, + 44.3290506 + ], + [ + -94.451595, + 44.3289467 + ], + [ + -94.4516611, + 44.3288454 + ], + [ + -94.4517092, + 44.3287431 + ], + [ + -94.4517595, + 44.3286411 + ], + [ + -94.4518022, + 44.3285361 + ], + [ + -94.4518574, + 44.3284354 + ], + [ + -94.4519146, + 44.328335 + ], + [ + -94.4519724, + 44.3282346 + ], + [ + -94.4520293, + 44.3281339 + ], + [ + -94.4520864, + 44.3280332 + ], + [ + -94.4521412, + 44.3279319 + ], + [ + -94.4521974, + 44.3278311 + ], + [ + -94.4522497, + 44.3277293 + ], + [ + -94.452303, + 44.327628 + ], + [ + -94.4523561, + 44.327527 + ], + [ + -94.4524084, + 44.3274257 + ], + [ + -94.4524624, + 44.3273248 + ], + [ + -94.4525169, + 44.3272241 + ], + [ + -94.4525707, + 44.327123 + ], + [ + -94.4526259, + 44.3270224 + ], + [ + -94.4526807, + 44.3269185 + ], + [ + -94.4527383, + 44.3268217 + ], + [ + -94.4527939, + 44.3267212 + ], + [ + -94.4528495, + 44.3266207 + ], + [ + -94.4529051, + 44.3265201 + ], + [ + -94.4529603, + 44.3264196 + ], + [ + -94.4530153, + 44.3263189 + ], + [ + -94.4530577, + 44.3262384 + ], + [ + -94.4531238, + 44.3261174 + ], + [ + -94.4531772, + 44.3260165 + ], + [ + -94.4532267, + 44.3259143 + ], + [ + -94.4532788, + 44.3258132 + ], + [ + -94.4533295, + 44.3257118 + ], + [ + -94.4533805, + 44.325606 + ], + [ + -94.4534199, + 44.3255082 + ], + [ + -94.4534501, + 44.3254036 + ], + [ + -94.4534772, + 44.3252978 + ], + [ + -94.4535025, + 44.325191 + ], + [ + -94.4535423, + 44.3249758 + ], + [ + -94.4535898, + 44.3246767 + ], + [ + -94.4536264, + 44.3244095 + ], + [ + -94.4536356, + 44.324301 + ], + [ + -94.4536431, + 44.3241893 + ], + [ + -94.4536401, + 44.3240853 + ], + [ + -94.4536379, + 44.3239773 + ], + [ + -94.4536228, + 44.3238709 + ], + [ + -94.4536012, + 44.3237629 + ], + [ + -94.4535745, + 44.3236532 + ], + [ + -94.4535396, + 44.3235446 + ], + [ + -94.4534935, + 44.3234397 + ], + [ + -94.4534333, + 44.3233413 + ], + [ + -94.453356, + 44.3232522 + ], + [ + -94.4532623, + 44.3231645 + ], + [ + -94.4531696, + 44.323085 + ], + [ + -94.4530669, + 44.3230034 + ], + [ + -94.4530143, + 44.3229644 + ], + [ + -94.4529593, + 44.3229238 + ], + [ + -94.4528474, + 44.322847 + ], + [ + -94.4527288, + 44.3227715 + ], + [ + -94.452608, + 44.3227073 + ], + [ + -94.4524882, + 44.3226503 + ], + [ + -94.4523547, + 44.3225938 + ], + [ + -94.4522249, + 44.3225462 + ], + [ + -94.4520885, + 44.3225057 + ], + [ + -94.4519478, + 44.3224723 + ], + [ + -94.451802, + 44.3224446 + ], + [ + -94.4516467, + 44.3224252 + ], + [ + -94.4514934, + 44.3224104 + ], + [ + -94.4513399, + 44.3223989 + ], + [ + -94.4511877, + 44.32239 + ], + [ + -94.4510385, + 44.3223829 + ], + [ + -94.4508898, + 44.3223874 + ], + [ + -94.4507409, + 44.3224012 + ], + [ + -94.4505919, + 44.322423 + ], + [ + -94.4504435, + 44.3224493 + ], + [ + -94.4502962, + 44.3224768 + ], + [ + -94.4501502, + 44.322503 + ], + [ + -94.4500048, + 44.3225305 + ], + [ + -94.4498598, + 44.3225592 + ], + [ + -94.4497151, + 44.322589 + ], + [ + -94.4495708, + 44.3226197 + ], + [ + -94.4494267, + 44.3226512 + ], + [ + -94.4492829, + 44.3226833 + ], + [ + -94.4491392, + 44.3227156 + ], + [ + -94.4485654, + 44.3228464 + ], + [ + -94.4484221, + 44.3228796 + ], + [ + -94.448279, + 44.3229132 + ], + [ + -94.4481362, + 44.3229474 + ], + [ + -94.4479937, + 44.3229823 + ], + [ + -94.4478518, + 44.3230181 + ], + [ + -94.4477103, + 44.3230549 + ], + [ + -94.4475696, + 44.3230927 + ], + [ + -94.4474294, + 44.3231318 + ], + [ + -94.4472896, + 44.3231719 + ], + [ + -94.4471503, + 44.3232131 + ], + [ + -94.4470117, + 44.3232556 + ], + [ + -94.4468739, + 44.3232994 + ], + [ + -94.446737, + 44.3233445 + ], + [ + -94.4466012, + 44.323391 + ], + [ + -94.4464665, + 44.3234391 + ], + [ + -94.4463332, + 44.3234889 + ], + [ + -94.4462024, + 44.3235425 + ], + [ + -94.446074, + 44.3235995 + ], + [ + -94.445947, + 44.3236588 + ], + [ + -94.4456942, + 44.3237787 + ], + [ + -94.4455668, + 44.3238369 + ], + [ + -94.4454378, + 44.323892 + ], + [ + -94.4453063, + 44.323943 + ], + [ + -94.4451715, + 44.3239886 + ], + [ + -94.4450326, + 44.3240282 + ], + [ + -94.44489, + 44.3240629 + ], + [ + -94.4447444, + 44.3240929 + ], + [ + -94.4445969, + 44.3241189 + ], + [ + -94.4444481, + 44.3241412 + ], + [ + -94.444299, + 44.3241604 + ], + [ + -94.4441505, + 44.3241769 + ], + [ + -94.4440015, + 44.3241899 + ], + [ + -94.4438483, + 44.3241949 + ], + [ + -94.443695, + 44.3241896 + ], + [ + -94.443546, + 44.3241722 + ], + [ + -94.4434049, + 44.3241412 + ], + [ + -94.4432595, + 44.3240962 + ], + [ + -94.4431226, + 44.3240532 + ], + [ + -94.4429968, + 44.3239963 + ], + [ + -94.4428696, + 44.3239367 + ], + [ + -94.4427563, + 44.3238646 + ], + [ + -94.4426421, + 44.3237936 + ], + [ + -94.4425299, + 44.323718 + ], + [ + -94.4424197, + 44.3236341 + ], + [ + -94.44233, + 44.3235515 + ], + [ + -94.4422494, + 44.3234606 + ], + [ + -94.4421824, + 44.3233628 + ], + [ + -94.4421262, + 44.3232673 + ], + [ + -94.4420758, + 44.3231669 + ], + [ + -94.4420533, + 44.3231182 + ], + [ + -94.4420285, + 44.3230651 + ], + [ + -94.4419836, + 44.3229621 + ], + [ + -94.441941, + 44.3228582 + ], + [ + -94.4419003, + 44.3227535 + ], + [ + -94.4418615, + 44.3226483 + ], + [ + -94.4418241, + 44.3225426 + ], + [ + -94.4417879, + 44.3224366 + ], + [ + -94.4417527, + 44.3223306 + ], + [ + -94.4417182, + 44.3222249 + ], + [ + -94.4416705, + 44.3220776 + ], + [ + -94.4416505, + 44.3220136 + ], + [ + -94.4416204, + 44.321908 + ], + [ + -94.4415944, + 44.3218017 + ], + [ + -94.4415714, + 44.3216949 + ], + [ + -94.4415509, + 44.3215878 + ], + [ + -94.4415189, + 44.3213721 + ], + [ + -94.4414998, + 44.3212647 + ], + [ + -94.4414786, + 44.3211577 + ], + [ + -94.441454, + 44.3210512 + ], + [ + -94.4414249, + 44.3209454 + ], + [ + -94.441389, + 44.3208404 + ], + [ + -94.441343, + 44.3207361 + ], + [ + -94.4412891, + 44.3206322 + ], + [ + -94.4412301, + 44.3205287 + ], + [ + -94.4411049, + 44.320323 + ], + [ + -94.4410471, + 44.3202153 + ], + [ + -94.440998, + 44.3201163 + ], + [ + -94.4409545, + 44.3200131 + ], + [ + -94.4409233, + 44.3199155 + ], + [ + -94.4409033, + 44.3198063 + ], + [ + -94.4408989, + 44.3196966 + ], + [ + -94.4409078, + 44.319598 + ], + [ + -94.4409028, + 44.3194947 + ], + [ + -94.4409421, + 44.3193873 + ], + [ + -94.4409609, + 44.3192815 + ], + [ + -94.4409815, + 44.3191755 + ], + [ + -94.4410039, + 44.3190691 + ], + [ + -94.441028, + 44.3189625 + ], + [ + -94.4410538, + 44.3188558 + ], + [ + -94.4410813, + 44.3187489 + ], + [ + -94.4411104, + 44.318642 + ], + [ + -94.4411411, + 44.318535 + ], + [ + -94.4411733, + 44.3184281 + ], + [ + -94.441207, + 44.3183212 + ], + [ + -94.4412423, + 44.3182145 + ], + [ + -94.4412789, + 44.3181079 + ], + [ + -94.441317, + 44.3180015 + ], + [ + -94.4413565, + 44.3178953 + ], + [ + -94.4413973, + 44.3177895 + ], + [ + -94.4414394, + 44.317684 + ], + [ + -94.4414827, + 44.3175789 + ], + [ + -94.4415273, + 44.3174743 + ], + [ + -94.4415731, + 44.3173701 + ], + [ + -94.44162, + 44.3172665 + ], + [ + -94.4416681, + 44.3171634 + ], + [ + -94.4417172, + 44.317061 + ], + [ + -94.4417484, + 44.3169517 + ], + [ + -94.4418095, + 44.3168547 + ], + [ + -94.4418652, + 44.3167559 + ], + [ + -94.4419197, + 44.316657 + ], + [ + -94.4419757, + 44.3165587 + ], + [ + -94.4420385, + 44.3164629 + ], + [ + -94.4421151, + 44.3163661 + ], + [ + -94.4421913, + 44.3162764 + ], + [ + -94.4422753, + 44.3161858 + ], + [ + -94.4423641, + 44.3160968 + ], + [ + -94.4424559, + 44.3160087 + ], + [ + -94.4425533, + 44.3159232 + ], + [ + -94.4426527, + 44.3158388 + ], + [ + -94.4427595, + 44.3157517 + ], + [ + -94.4428588, + 44.3156756 + ], + [ + -94.4429652, + 44.3155971 + ], + [ + -94.4430723, + 44.3155204 + ], + [ + -94.4431793, + 44.3154453 + ], + [ + -94.4432871, + 44.3153721 + ], + [ + -94.4433991, + 44.3153022 + ], + [ + -94.4435186, + 44.3152334 + ], + [ + -94.4436453, + 44.3151713 + ], + [ + -94.4437744, + 44.3151115 + ], + [ + -94.4439069, + 44.3150553 + ], + [ + -94.4440406, + 44.3150002 + ], + [ + -94.4441782, + 44.3149534 + ], + [ + -94.4443231, + 44.3149085 + ], + [ + -94.4444545, + 44.314871 + ], + [ + -94.4445965, + 44.3148358 + ], + [ + -94.4447379, + 44.314813 + ], + [ + -94.4448875, + 44.3147997 + ], + [ + -94.4450399, + 44.3148034 + ], + [ + -94.4451993, + 44.3148141 + ], + [ + -94.4453511, + 44.3148294 + ], + [ + -94.4454978, + 44.3148488 + ], + [ + -94.445645, + 44.314873 + ], + [ + -94.4457931, + 44.3149026 + ], + [ + -94.4459427, + 44.3149379 + ], + [ + -94.4460838, + 44.3149753 + ], + [ + -94.4462202, + 44.3150236 + ], + [ + -94.4463477, + 44.3150793 + ], + [ + -94.4464645, + 44.3151426 + ], + [ + -94.4465759, + 44.3152128 + ], + [ + -94.4466829, + 44.3152888 + ], + [ + -94.4467852, + 44.3153698 + ], + [ + -94.4468826, + 44.315455 + ], + [ + -94.4469745, + 44.3155436 + ], + [ + -94.4470608, + 44.3156347 + ], + [ + -94.447141, + 44.3157275 + ], + [ + -94.4472148, + 44.3158212 + ], + [ + -94.4472838, + 44.315916 + ], + [ + -94.4473496, + 44.3160127 + ], + [ + -94.4474123, + 44.316111 + ], + [ + -94.4474719, + 44.3162107 + ], + [ + -94.4475283, + 44.3163117 + ], + [ + -94.4475814, + 44.3164138 + ], + [ + -94.4476312, + 44.3165168 + ], + [ + -94.4476583, + 44.3166276 + ], + [ + -94.4477135, + 44.3167235 + ], + [ + -94.4477507, + 44.3168304 + ], + [ + -94.447785, + 44.3169353 + ], + [ + -94.4478216, + 44.3170397 + ], + [ + -94.4478539, + 44.3171447 + ], + [ + -94.4478798, + 44.3172507 + ], + [ + -94.4479038, + 44.317357 + ], + [ + -94.4479262, + 44.3174636 + ], + [ + -94.4479472, + 44.3175705 + ], + [ + -94.4479633, + 44.3176781 + ], + [ + -94.4479766, + 44.3177861 + ], + [ + -94.4479931, + 44.3178938 + ], + [ + -94.4480475, + 44.3182164 + ], + [ + -94.4480642, + 44.3183241 + ], + [ + -94.4480828, + 44.3184316 + ], + [ + -94.4481006, + 44.318539 + ], + [ + -94.4481234, + 44.318646 + ], + [ + -94.4482351, + 44.3191807 + ], + [ + -94.4482812, + 44.3193946 + ], + [ + -94.4483051, + 44.3195015 + ], + [ + -94.4483296, + 44.3196082 + ], + [ + -94.448355, + 44.3197148 + ], + [ + -94.4483814, + 44.3198211 + ], + [ + -94.44841, + 44.3199271 + ], + [ + -94.4484385, + 44.320033 + ], + [ + -94.4484693, + 44.3201384 + ], + [ + -94.4484986, + 44.3202436 + ], + [ + -94.4485435, + 44.3203477 + ], + [ + -94.44858, + 44.3204535 + ], + [ + -94.4486182, + 44.3205602 + ], + [ + -94.4486589, + 44.3206669 + ], + [ + -94.4487028, + 44.3207729 + ], + [ + -94.4487482, + 44.3208785 + ], + [ + -94.4488055, + 44.3209827 + ], + [ + -94.4488638, + 44.3210782 + ], + [ + -94.4489297, + 44.3211732 + ], + [ + -94.449002, + 44.3212639 + ], + [ + -94.4490792, + 44.3213417 + ], + [ + -94.4491936, + 44.3214238 + ], + [ + -94.4493152, + 44.3214923 + ], + [ + -94.4494459, + 44.3215543 + ], + [ + -94.4495742, + 44.3216062 + ], + [ + -94.4497197, + 44.3216546 + ], + [ + -94.4498575, + 44.3216926 + ], + [ + -94.4500023, + 44.3217237 + ], + [ + -94.4501486, + 44.3217425 + ], + [ + -94.4503049, + 44.3217551 + ], + [ + -94.4504576, + 44.321762 + ], + [ + -94.4506081, + 44.321764 + ], + [ + -94.4507571, + 44.3217603 + ], + [ + -94.4508998, + 44.321749 + ], + [ + -94.451058, + 44.3217263 + ], + [ + -94.4512048, + 44.3216964 + ], + [ + -94.4513457, + 44.3216587 + ], + [ + -94.4514802, + 44.3216136 + ], + [ + -94.4516111, + 44.321561 + ], + [ + -94.4517386, + 44.3215025 + ], + [ + -94.4518528, + 44.3214245 + ], + [ + -94.4519817, + 44.3213702 + ], + [ + -94.4521014, + 44.3213041 + ], + [ + -94.4522028, + 44.3212438 + ], + [ + -94.4523212, + 44.3211657 + ], + [ + -94.4524349, + 44.3210862 + ], + [ + -94.4525403, + 44.3210083 + ], + [ + -94.4526424, + 44.3209284 + ], + [ + -94.4527407, + 44.3208466 + ], + [ + -94.4528343, + 44.320764 + ], + [ + -94.4529345, + 44.3206771 + ], + [ + -94.4530322, + 44.3205878 + ], + [ + -94.4531209, + 44.3204955 + ], + [ + -94.4531917, + 44.3204 + ], + [ + -94.4532362, + 44.3203008 + ], + [ + -94.4532524, + 44.3201981 + ], + [ + -94.4532587, + 44.3200934 + ], + [ + -94.4532576, + 44.319987 + ], + [ + -94.45325, + 44.3198794 + ], + [ + -94.4532367, + 44.3197709 + ], + [ + -94.4532185, + 44.3196618 + ], + [ + -94.4531963, + 44.3195525 + ], + [ + -94.4531711, + 44.3194433 + ], + [ + -94.4531436, + 44.3193345 + ], + [ + -94.4531147, + 44.3192267 + ], + [ + -94.4530852, + 44.31912 + ], + [ + -94.4530545, + 44.3190148 + ], + [ + -94.4530153, + 44.3189111 + ], + [ + -94.4529683, + 44.3188087 + ], + [ + -94.4529159, + 44.3187072 + ], + [ + -94.45286, + 44.3186062 + ], + [ + -94.4528029, + 44.3185055 + ], + [ + -94.4527264, + 44.3184079 + ], + [ + -94.4526844, + 44.318305 + ], + [ + -94.4526378, + 44.3182026 + ], + [ + -94.4525895, + 44.318101 + ], + [ + -94.4525398, + 44.3179982 + ], + [ + -94.4524919, + 44.3178953 + ], + [ + -94.4523453, + 44.3175872 + ], + [ + -94.4522967, + 44.3174846 + ], + [ + -94.4522464, + 44.3173824 + ], + [ + -94.4521952, + 44.3172806 + ], + [ + -94.4521441, + 44.3171789 + ], + [ + -94.4520907, + 44.317078 + ], + [ + -94.4520348, + 44.3169779 + ], + [ + -94.4519783, + 44.3168782 + ], + [ + -94.4519189, + 44.3167795 + ], + [ + -94.4518573, + 44.3166818 + ], + [ + -94.451793, + 44.316585 + ], + [ + -94.4517261, + 44.3164897 + ], + [ + -94.451652, + 44.316396 + ], + [ + -94.4515748, + 44.3163036 + ], + [ + -94.4514945, + 44.3162123 + ], + [ + -94.4514156, + 44.3161265 + ], + [ + -94.4513266, + 44.3160325 + ], + [ + -94.4512398, + 44.3159438 + ], + [ + -94.4511514, + 44.3158558 + ], + [ + -94.4510555, + 44.3157708 + ], + [ + -94.4509636, + 44.3156845 + ], + [ + -94.450694, + 44.3154224 + ], + [ + -94.4505985, + 44.3153398 + ], + [ + -94.4505065, + 44.3152544 + ], + [ + -94.4504123, + 44.3151703 + ], + [ + -94.4503179, + 44.3150863 + ], + [ + -94.4502223, + 44.315003 + ], + [ + -94.4501262, + 44.3149199 + ], + [ + -94.4500246, + 44.3148321 + ], + [ + -94.4498361, + 44.3146715 + ], + [ + -94.4495327, + 44.3144168 + ], + [ + -94.449347, + 44.3142609 + ], + [ + -94.4491519, + 44.3140965 + ], + [ + -94.4489476, + 44.3139391 + ], + [ + -94.4487704, + 44.3137619 + ], + [ + -94.4486741, + 44.3136789 + ], + [ + -94.4483841, + 44.3134303 + ], + [ + -94.4482877, + 44.3133473 + ], + [ + -94.4481917, + 44.313264 + ], + [ + -94.4480964, + 44.3131804 + ], + [ + -94.4480019, + 44.3130964 + ], + [ + -94.4479084, + 44.3130119 + ], + [ + -94.447816, + 44.3129267 + ], + [ + -94.447725, + 44.3128408 + ], + [ + -94.4476357, + 44.312754 + ], + [ + -94.4475483, + 44.3126662 + ], + [ + -94.4474625, + 44.3125776 + ], + [ + -94.4473781, + 44.3124882 + ], + [ + -94.4472946, + 44.3123983 + ], + [ + -94.4472119, + 44.312308 + ], + [ + -94.4469647, + 44.3120366 + ], + [ + -94.4468817, + 44.3119464 + ], + [ + -94.4467977, + 44.3118567 + ], + [ + -94.4466274, + 44.3116786 + ], + [ + -94.4463712, + 44.3114118 + ], + [ + -94.4461998, + 44.3112342 + ], + [ + -94.4460275, + 44.3110571 + ], + [ + -94.445854, + 44.3108806 + ], + [ + -94.4457667, + 44.3107926 + ], + [ + -94.445679, + 44.3107049 + ], + [ + -94.4455027, + 44.3105298 + ], + [ + -94.4452386, + 44.3102667 + ], + [ + -94.4450619, + 44.3100915 + ], + [ + -94.444973, + 44.3100042 + ], + [ + -94.4448836, + 44.3099172 + ], + [ + -94.4447937, + 44.3098305 + ], + [ + -94.444703, + 44.3097443 + ], + [ + -94.4446115, + 44.3096586 + ], + [ + -94.444519, + 44.3095735 + ], + [ + -94.4444256, + 44.309489 + ], + [ + -94.4443309, + 44.3094053 + ], + [ + -94.4442351, + 44.3093222 + ], + [ + -94.4441378, + 44.3092389 + ], + [ + -94.4440387, + 44.309156 + ], + [ + -94.4439372, + 44.3090742 + ], + [ + -94.443833, + 44.3089946 + ], + [ + -94.4437256, + 44.3089179 + ], + [ + -94.4436146, + 44.3088452 + ], + [ + -94.4434995, + 44.3087771 + ], + [ + -94.4433797, + 44.3087147 + ], + [ + -94.4432535, + 44.308658 + ], + [ + -94.4431204, + 44.3086067 + ], + [ + -94.4429821, + 44.3085607 + ], + [ + -94.44284, + 44.3085197 + ], + [ + -94.4426955, + 44.3084836 + ], + [ + -94.4425501, + 44.3084523 + ], + [ + -94.4424044, + 44.3084284 + ], + [ + -94.4422588, + 44.3084135 + ], + [ + -94.4421076, + 44.3084043 + ], + [ + -94.4419542, + 44.3084029 + ], + [ + -94.4418014, + 44.3084088 + ], + [ + -94.4416521, + 44.3084193 + ], + [ + -94.4415103, + 44.3084394 + ], + [ + -94.4414327, + 44.3084532 + ], + [ + -94.4413621, + 44.3084703 + ], + [ + -94.4412284, + 44.3085089 + ], + [ + -94.4410833, + 44.308559 + ], + [ + -94.4409503, + 44.3086115 + ], + [ + -94.440824, + 44.3086686 + ], + [ + -94.4407031, + 44.3087314 + ], + [ + -94.4405844, + 44.3088009 + ], + [ + -94.4404778, + 44.3088751 + ], + [ + -94.4403677, + 44.3089586 + ], + [ + -94.4402711, + 44.3090349 + ], + [ + -94.4401716, + 44.3091163 + ], + [ + -94.4400736, + 44.309198 + ], + [ + -94.4399769, + 44.3092808 + ], + [ + -94.4398816, + 44.3093646 + ], + [ + -94.439788, + 44.3094495 + ], + [ + -94.4396962, + 44.3095354 + ], + [ + -94.4396063, + 44.3096223 + ], + [ + -94.4395158, + 44.3097128 + ], + [ + -94.4394334, + 44.3097989 + ], + [ + -94.4393477, + 44.3098915 + ], + [ + -94.4392711, + 44.3099805 + ], + [ + -94.4391944, + 44.3100733 + ], + [ + -94.4391192, + 44.3101668 + ], + [ + -94.4390461, + 44.3102613 + ], + [ + -94.4389726, + 44.3103556 + ], + [ + -94.438751, + 44.3106382 + ], + [ + -94.4386782, + 44.3107328 + ], + [ + -94.4386073, + 44.3108282 + ], + [ + -94.438554, + 44.3108932 + ], + [ + -94.4385069, + 44.3109569 + ], + [ + -94.4384564, + 44.3110191 + ], + [ + -94.438268, + 44.3112744 + ], + [ + -94.4382191, + 44.3113374 + ], + [ + -94.4381697, + 44.3114002 + ], + [ + -94.43812, + 44.3114627 + ], + [ + -94.4380696, + 44.311525 + ], + [ + -94.4380184, + 44.3115869 + ], + [ + -94.4379665, + 44.3116483 + ], + [ + -94.4379136, + 44.3117094 + ], + [ + -94.4378596, + 44.3117699 + ], + [ + -94.4377493, + 44.311891 + ], + [ + -94.4376931, + 44.3119522 + ], + [ + -94.4376355, + 44.312013 + ], + [ + -94.437576, + 44.3120726 + ], + [ + -94.437514, + 44.3121304 + ], + [ + -94.437449, + 44.3121856 + ], + [ + -94.4373804, + 44.3122377 + ], + [ + -94.4373077, + 44.3122859 + ], + [ + -94.4372304, + 44.3123295 + ], + [ + -94.4370682, + 44.3124153 + ], + [ + -94.4369846, + 44.3124587 + ], + [ + -94.4368994, + 44.3125016 + ], + [ + -94.4368128, + 44.3125438 + ], + [ + -94.4367248, + 44.3125846 + ], + [ + -94.4366357, + 44.3126237 + ], + [ + -94.4365453, + 44.3126606 + ], + [ + -94.436454, + 44.3126947 + ], + [ + -94.4363617, + 44.3127257 + ], + [ + -94.4362686, + 44.3127529 + ], + [ + -94.4361748, + 44.3127761 + ], + [ + -94.4360804, + 44.3127946 + ], + [ + -94.4359855, + 44.312808 + ], + [ + -94.4358807, + 44.3128009 + ], + [ + -94.4357929, + 44.3128194 + ], + [ + -94.4357015, + 44.3128248 + ], + [ + -94.4355961, + 44.3128311 + ], + [ + -94.4355, + 44.3128276 + ], + [ + -94.4354009, + 44.3128245 + ], + [ + -94.4353008, + 44.3128208 + ], + [ + -94.4352007, + 44.3128145 + ], + [ + -94.4351002, + 44.3128069 + ], + [ + -94.4349994, + 44.3127981 + ], + [ + -94.4348983, + 44.3127883 + ], + [ + -94.4348024, + 44.312778 + ], + [ + -94.4346957, + 44.3127655 + ], + [ + -94.4345888, + 44.312752 + ], + [ + -94.4344932, + 44.3127391 + ], + [ + -94.4343922, + 44.3127249 + ], + [ + -94.4342914, + 44.3127099 + ], + [ + -94.434191, + 44.3126944 + ], + [ + -94.434091, + 44.3126784 + ], + [ + -94.4339915, + 44.312662 + ], + [ + -94.4338927, + 44.3126452 + ], + [ + -94.4337899, + 44.3126277 + ], + [ + -94.4336017, + 44.3125885 + ], + [ + -94.4335083, + 44.3125679 + ], + [ + -94.4334158, + 44.3125431 + ], + [ + -94.4333246, + 44.3125139 + ], + [ + -94.4332348, + 44.3124809 + ], + [ + -94.4331469, + 44.3124441 + ], + [ + -94.4330611, + 44.312404 + ], + [ + -94.4329769, + 44.3123618 + ], + [ + -94.4328945, + 44.3123181 + ], + [ + -94.4328137, + 44.3122739 + ], + [ + -94.4327397, + 44.3122314 + ], + [ + -94.4326585, + 44.3121839 + ], + [ + -94.4325775, + 44.3121476 + ], + [ + -94.4325137, + 44.3120835 + ], + [ + -94.4324428, + 44.3120316 + ], + [ + -94.4323646, + 44.3119818 + ], + [ + -94.4323025, + 44.3119254 + ], + [ + -94.4322393, + 44.3118685 + ], + [ + -94.4321775, + 44.311811 + ], + [ + -94.4321187, + 44.3117523 + ], + [ + -94.4320626, + 44.3116926 + ], + [ + -94.4320096, + 44.3116323 + ], + [ + -94.4319599, + 44.3115708 + ], + [ + -94.4319094, + 44.3115103 + ], + [ + -94.4318734, + 44.3114404 + ], + [ + -94.4318321, + 44.3113743 + ], + [ + -94.4317728, + 44.3113082 + ], + [ + -94.4317531, + 44.3112397 + ], + [ + -94.4317212, + 44.3111708 + ], + [ + -94.4316906, + 44.3110994 + ], + [ + -94.4316631, + 44.311032 + ], + [ + -94.4316368, + 44.3109625 + ], + [ + -94.4316124, + 44.3108932 + ], + [ + -94.4315907, + 44.3108234 + ], + [ + -94.4315725, + 44.3107526 + ], + [ + -94.4315577, + 44.310681 + ], + [ + -94.431546, + 44.310609 + ], + [ + -94.4315372, + 44.3105366 + ], + [ + -94.4315315, + 44.3104674 + ], + [ + -94.4315272, + 44.3103921 + ], + [ + -94.4315247, + 44.3103168 + ], + [ + -94.4315308, + 44.3102474 + ], + [ + -94.4315394, + 44.3101775 + ], + [ + -94.4315521, + 44.3101049 + ], + [ + -94.43157, + 44.3100341 + ], + [ + -94.4315857, + 44.3099622 + ], + [ + -94.4316048, + 44.3098908 + ], + [ + -94.4316294, + 44.3098208 + ], + [ + -94.4316594, + 44.3097522 + ], + [ + -94.4317244, + 44.3096163 + ], + [ + -94.4317575, + 44.309548 + ], + [ + -94.4317936, + 44.3094801 + ], + [ + -94.431828, + 44.3094116 + ], + [ + -94.431863, + 44.3093432 + ], + [ + -94.4318987, + 44.309275 + ], + [ + -94.431939, + 44.3092079 + ], + [ + -94.4319821, + 44.3091418 + ], + [ + -94.4320225, + 44.3090752 + ], + [ + -94.4320614, + 44.3090086 + ], + [ + -94.4321034, + 44.3089432 + ], + [ + -94.4321479, + 44.308879 + ], + [ + -94.4321942, + 44.3088158 + ], + [ + -94.4322416, + 44.3087535 + ], + [ + -94.4322886, + 44.3086961 + ], + [ + -94.4323414, + 44.308636 + ], + [ + -94.4324043, + 44.3085752 + ], + [ + -94.4324642, + 44.3085215 + ], + [ + -94.4325348, + 44.3084628 + ], + [ + -94.4326083, + 44.308406 + ], + [ + -94.4326779, + 44.308356 + ], + [ + -94.4327533, + 44.3083056 + ], + [ + -94.4328324, + 44.308255 + ], + [ + -94.4329137, + 44.3082136 + ], + [ + -94.4329953, + 44.3081753 + ], + [ + -94.4330827, + 44.308139 + ], + [ + -94.4331687, + 44.3081067 + ], + [ + -94.4332572, + 44.3080775 + ], + [ + -94.4333496, + 44.3080527 + ], + [ + -94.4334452, + 44.3080317 + ], + [ + -94.4335428, + 44.3080132 + ], + [ + -94.4336411, + 44.3079976 + ], + [ + -94.4337429, + 44.3079838 + ], + [ + -94.4338419, + 44.3079732 + ], + [ + -94.433949, + 44.3079675 + ], + [ + -94.4340511, + 44.3079633 + ], + [ + -94.4341573, + 44.3079603 + ], + [ + -94.4342519, + 44.3079583 + ], + [ + -94.4343515, + 44.3079574 + ], + [ + -94.4344512, + 44.3079575 + ], + [ + -94.4345511, + 44.3079586 + ], + [ + -94.4346511, + 44.3079606 + ], + [ + -94.4347511, + 44.3079634 + ], + [ + -94.4348513, + 44.3079668 + ], + [ + -94.4349515, + 44.3079709 + ], + [ + -94.4350519, + 44.3079755 + ], + [ + -94.4351522, + 44.3079806 + ], + [ + -94.4353574, + 44.3079918 + ], + [ + -94.4355725, + 44.3080045 + ], + [ + -94.435654, + 44.3080096 + ], + [ + -94.4358545, + 44.3080218 + ], + [ + -94.4359546, + 44.3080276 + ], + [ + -94.4362546, + 44.3080441 + ], + [ + -94.4365544, + 44.3080615 + ], + [ + -94.4368542, + 44.3080796 + ], + [ + -94.437154, + 44.3080984 + ], + [ + -94.438053, + 44.308156 + ], + [ + -94.4382817, + 44.3081705 + ], + [ + -94.4384525, + 44.3081796 + ], + [ + -94.4385526, + 44.3081863 + ], + [ + -94.4386529, + 44.3081938 + ], + [ + -94.4387531, + 44.3082005 + ], + [ + -94.4390556, + 44.3082385 + ], + [ + -94.4391561, + 44.308248 + ], + [ + -94.4392564, + 44.3082564 + ], + [ + -94.4393565, + 44.3082636 + ], + [ + -94.4394562, + 44.3082692 + ], + [ + -94.4395555, + 44.3082727 + ], + [ + -94.4396543, + 44.3082738 + ], + [ + -94.4397526, + 44.3082722 + ], + [ + -94.4398502, + 44.3082672 + ], + [ + -94.4399472, + 44.3082551 + ], + [ + -94.4400434, + 44.3082358 + ], + [ + -94.4401385, + 44.3082107 + ], + [ + -94.4402324, + 44.3081813 + ], + [ + -94.4403248, + 44.3081486 + ], + [ + -94.4404156, + 44.3081143 + ], + [ + -94.4405046, + 44.3080796 + ], + [ + -94.4405911, + 44.3080443 + ], + [ + -94.440673, + 44.3080032 + ], + [ + -94.4407509, + 44.3079571 + ], + [ + -94.4408256, + 44.3079079 + ], + [ + -94.4409697, + 44.3078067 + ], + [ + -94.4411149, + 44.307706 + ], + [ + -94.4411849, + 44.307652 + ], + [ + -94.4412492, + 44.3075968 + ], + [ + -94.4413142, + 44.3075418 + ], + [ + -94.4413727, + 44.3074845 + ], + [ + -94.4414176, + 44.3074215 + ], + [ + -94.4414583, + 44.3073561 + ], + [ + -94.4415009, + 44.3072906 + ], + [ + -94.4415414, + 44.307224 + ], + [ + -94.4415745, + 44.3071604 + ], + [ + -94.4416086, + 44.3070861 + ], + [ + -94.4416344, + 44.3070153 + ], + [ + -94.4416561, + 44.3069444 + ], + [ + -94.4416735, + 44.3068738 + ], + [ + -94.4416862, + 44.3068038 + ], + [ + -94.4416912, + 44.3067327 + ], + [ + -94.4416874, + 44.3066603 + ], + [ + -94.4416755, + 44.3065874 + ], + [ + -94.4416564, + 44.3065149 + ], + [ + -94.4416308, + 44.3064437 + ], + [ + -94.4415997, + 44.3063745 + ], + [ + -94.441564, + 44.3063079 + ], + [ + -94.441526, + 44.3062419 + ], + [ + -94.4414859, + 44.3061762 + ], + [ + -94.4414441, + 44.3061108 + ], + [ + -94.4414004, + 44.3060458 + ], + [ + -94.441355, + 44.3059812 + ], + [ + -94.4413081, + 44.3059171 + ], + [ + -94.4412597, + 44.3058534 + ], + [ + -94.4412099, + 44.3057903 + ], + [ + -94.4411588, + 44.3057278 + ], + [ + -94.4411065, + 44.305666 + ], + [ + -94.4410531, + 44.3056048 + ], + [ + -94.4409987, + 44.3055442 + ], + [ + -94.4408886, + 44.3054241 + ], + [ + -94.4407219, + 44.305244 + ], + [ + -94.4406098, + 44.3051242 + ], + [ + -94.4404966, + 44.3050047 + ], + [ + -94.4403823, + 44.3048857 + ], + [ + -94.4403247, + 44.3048264 + ], + [ + -94.4402087, + 44.3047084 + ], + [ + -94.4401501, + 44.3046496 + ], + [ + -94.4400319, + 44.3045328 + ], + [ + -94.4399723, + 44.3044748 + ], + [ + -94.4399122, + 44.304417 + ], + [ + -94.4398518, + 44.3043596 + ], + [ + -94.4397909, + 44.3043023 + ], + [ + -94.4397296, + 44.3042455 + ], + [ + -94.4396678, + 44.3041889 + ], + [ + -94.4396056, + 44.3041327 + ], + [ + -94.4395429, + 44.3040768 + ], + [ + -94.4394797, + 44.3040214 + ], + [ + -94.439416, + 44.3039663 + ], + [ + -94.4393513, + 44.303912 + ], + [ + -94.4392822, + 44.3038607 + ], + [ + -94.439209, + 44.3038122 + ], + [ + -94.4391323, + 44.3037661 + ], + [ + -94.4390531, + 44.3037217 + ], + [ + -94.4389721, + 44.3036785 + ], + [ + -94.438808, + 44.3035934 + ], + [ + -94.4387265, + 44.3035504 + ], + [ + -94.4386464, + 44.3035063 + ], + [ + -94.4385684, + 44.3034606 + ], + [ + -94.4384935, + 44.3034128 + ], + [ + -94.4382708, + 44.3032669 + ], + [ + -94.4381968, + 44.3032178 + ], + [ + -94.4381231, + 44.3031685 + ], + [ + -94.43805, + 44.3031188 + ], + [ + -94.4379775, + 44.3030686 + ], + [ + -94.4379059, + 44.3030179 + ], + [ + -94.4378352, + 44.3029667 + ], + [ + -94.4377658, + 44.3029147 + ], + [ + -94.4376977, + 44.302862 + ], + [ + -94.437631, + 44.3028086 + ], + [ + -94.4375661, + 44.3027542 + ], + [ + -94.4375028, + 44.3026989 + ], + [ + -94.4374321, + 44.3026452 + ], + [ + -94.437376, + 44.302586 + ], + [ + -94.4373182, + 44.3025266 + ], + [ + -94.4372629, + 44.3024657 + ], + [ + -94.4372096, + 44.3024039 + ], + [ + -94.4371584, + 44.3023412 + ], + [ + -94.4371098, + 44.3022777 + ], + [ + -94.4370638, + 44.3022136 + ], + [ + -94.4370196, + 44.3021517 + ], + [ + -94.4369837, + 44.3020819 + ], + [ + -94.4369485, + 44.302015 + ], + [ + -94.4369182, + 44.301947 + ], + [ + -94.4368905, + 44.3018782 + ], + [ + -94.4368648, + 44.3018088 + ], + [ + -94.4368408, + 44.3017387 + ], + [ + -94.436818, + 44.3016684 + ], + [ + -94.4367535, + 44.3014559 + ], + [ + -94.4367311, + 44.3013852 + ], + [ + -94.4367079, + 44.3013148 + ], + [ + -94.4366832, + 44.3012447 + ], + [ + -94.4366568, + 44.3011752 + ], + [ + -94.4366299, + 44.3011058 + ], + [ + -94.4366035, + 44.3010361 + ], + [ + -94.4365777, + 44.3009662 + ], + [ + -94.4365241, + 44.3008222 + ], + [ + -94.4364312, + 44.3005441 + ], + [ + -94.4363802, + 44.3004038 + ], + [ + -94.436354, + 44.3003339 + ], + [ + -94.436327, + 44.3002642 + ], + [ + -94.4362992, + 44.3001947 + ], + [ + -94.4362705, + 44.3001256 + ], + [ + -94.4362406, + 44.3000569 + ], + [ + -94.4362095, + 44.2999885 + ], + [ + -94.4361771, + 44.2999206 + ], + [ + -94.4361432, + 44.2998532 + ], + [ + -94.4361077, + 44.2997863 + ], + [ + -94.4360704, + 44.29972 + ], + [ + -94.4360313, + 44.2996544 + ], + [ + -94.4359901, + 44.2995894 + ], + [ + -94.435947, + 44.299525 + ], + [ + -94.4359027, + 44.299461 + ], + [ + -94.4358574, + 44.2993973 + ], + [ + -94.4358109, + 44.299334 + ], + [ + -94.4357635, + 44.2992709 + ], + [ + -94.4357151, + 44.2992082 + ], + [ + -94.4356659, + 44.2991457 + ], + [ + -94.4356157, + 44.2990835 + ], + [ + -94.4355648, + 44.2990216 + ], + [ + -94.435513, + 44.2989599 + ], + [ + -94.4354606, + 44.2988984 + ], + [ + -94.4354076, + 44.2988371 + ], + [ + -94.4353539, + 44.2987761 + ], + [ + -94.4352996, + 44.2987153 + ], + [ + -94.4352449, + 44.2986546 + ], + [ + -94.435134, + 44.2985337 + ], + [ + -94.4350779, + 44.2984735 + ], + [ + -94.434965, + 44.2983535 + ], + [ + -94.4347941, + 44.2981743 + ], + [ + -94.4345083, + 44.2978769 + ], + [ + -94.4343382, + 44.2976988 + ], + [ + -94.4342796, + 44.2976405 + ], + [ + -94.4342192, + 44.2975832 + ], + [ + -94.4341571, + 44.2975268 + ], + [ + -94.4340936, + 44.297471 + ], + [ + -94.4340291, + 44.2974158 + ], + [ + -94.4339639, + 44.297361 + ], + [ + -94.4337621, + 44.2971996 + ], + [ + -94.4336975, + 44.2971447 + ], + [ + -94.4336386, + 44.2970946 + ], + [ + -94.4335672, + 44.2970358 + ], + [ + -94.4333513, + 44.2968709 + ], + [ + -94.4332395, + 44.2967858 + ], + [ + -94.433173, + 44.2967382 + ], + [ + -94.4331077, + 44.2966832 + ], + [ + -94.4330329, + 44.296642 + ], + [ + -94.4329777, + 44.2966055 + ], + [ + -94.4329224, + 44.2965691 + ], + [ + -94.432867, + 44.2965328 + ], + [ + -94.4327528, + 44.2964627 + ], + [ + -94.4326275, + 44.296388 + ], + [ + -94.4324231, + 44.2962666 + ], + [ + -94.4321551, + 44.2961142 + ], + [ + -94.4320854, + 44.2935981 + ], + [ + -94.4320838, + 44.2934417 + ], + [ + -94.432021, + 44.28981 + ], + [ + -94.4296362, + 44.287411 + ], + [ + -94.4291414, + 44.2875146 + ], + [ + -94.4317964, + 44.2901858 + ], + [ + -94.4308689, + 44.2901742 + ], + [ + -94.4300504, + 44.289751 + ], + [ + -94.4293007, + 44.2894259 + ], + [ + -94.4284526, + 44.289093 + ], + [ + -94.4275988, + 44.2887768 + ], + [ + -94.4268351, + 44.2885241 + ], + [ + -94.4263216, + 44.2883747 + ], + [ + -94.4244014, + 44.288407 + ], + [ + -94.4244325, + 44.2917461 + ], + [ + -94.4244009, + 44.2918005 + ], + [ + -94.4243604, + 44.2918664 + ], + [ + -94.4243302, + 44.2919158 + ], + [ + -94.4242998, + 44.2919653 + ], + [ + -94.4242592, + 44.2920311 + ], + [ + -94.4242189, + 44.2920946 + ], + [ + -94.4241737, + 44.2921607 + ], + [ + -94.4241293, + 44.2922261 + ], + [ + -94.4240846, + 44.2922922 + ], + [ + -94.4240565, + 44.2923679 + ], + [ + -94.4240163, + 44.2924367 + ], + [ + -94.4239685, + 44.2924995 + ], + [ + -94.4239089, + 44.292553 + ], + [ + -94.4238354, + 44.2925959 + ], + [ + -94.4237534, + 44.2926336 + ], + [ + -94.4236648, + 44.2926675 + ], + [ + -94.4235759, + 44.2927013 + ], + [ + -94.423476, + 44.2927264 + ], + [ + -94.4233745, + 44.2927489 + ], + [ + -94.4232777, + 44.2927685 + ], + [ + -94.4231792, + 44.2927863 + ], + [ + -94.4230825, + 44.292802 + ], + [ + -94.4229831, + 44.2928104 + ], + [ + -94.4228757, + 44.292809 + ], + [ + -94.4227755, + 44.2927996 + ], + [ + -94.4226819, + 44.2927792 + ], + [ + -94.4225916, + 44.2927503 + ], + [ + -94.4225036, + 44.2927134 + ], + [ + -94.4224406, + 44.2926816 + ], + [ + -94.4223821, + 44.2926465 + ], + [ + -94.4223145, + 44.2925926 + ], + [ + -94.4222475, + 44.2925387 + ], + [ + -94.4221798, + 44.2924839 + ], + [ + -94.4221245, + 44.2924434 + ], + [ + -94.422078, + 44.2923999 + ], + [ + -94.4220193, + 44.2923432 + ], + [ + -94.4219616, + 44.2922804 + ], + [ + -94.4219099, + 44.2922185 + ], + [ + -94.4218654, + 44.2921548 + ], + [ + -94.4218285, + 44.2920895 + ], + [ + -94.4217991, + 44.2920223 + ], + [ + -94.4217724, + 44.2919545 + ], + [ + -94.4217507, + 44.2918891 + ], + [ + -94.4217319, + 44.2918157 + ], + [ + -94.421716, + 44.291745 + ], + [ + -94.4217018, + 44.2916736 + ], + [ + -94.421689, + 44.2916019 + ], + [ + -94.4216773, + 44.2915298 + ], + [ + -94.4216663, + 44.2914574 + ], + [ + -94.4216556, + 44.2913849 + ], + [ + -94.4216448, + 44.2913124 + ], + [ + -94.4216338, + 44.2912399 + ], + [ + -94.4216219, + 44.2911675 + ], + [ + -94.421609, + 44.2910954 + ], + [ + -94.4215946, + 44.2910237 + ], + [ + -94.4215783, + 44.290951 + ], + [ + -94.4215575, + 44.2908827 + ], + [ + -94.4215333, + 44.2908124 + ], + [ + -94.4215089, + 44.2907419 + ], + [ + -94.4214808, + 44.2906718 + ], + [ + -94.4214468, + 44.290603 + ], + [ + -94.4214117, + 44.2905343 + ], + [ + -94.4214, + 44.2904583 + ], + [ + -94.4213595, + 44.2903924 + ], + [ + -94.4213121, + 44.2903298 + ], + [ + -94.4212372, + 44.2902778 + ], + [ + -94.4211869, + 44.2902184 + ], + [ + -94.4211311, + 44.2901609 + ], + [ + -94.4210703, + 44.2901038 + ], + [ + -94.4210096, + 44.2900525 + ], + [ + -94.420941, + 44.2899966 + ], + [ + -94.4208744, + 44.2899431 + ], + [ + -94.4208069, + 44.28989 + ], + [ + -94.4207388, + 44.2898371 + ], + [ + -94.4206699, + 44.2897846 + ], + [ + -94.4206004, + 44.2897323 + ], + [ + -94.4205302, + 44.2896803 + ], + [ + -94.4204596, + 44.2896286 + ], + [ + -94.4203885, + 44.2895771 + ], + [ + -94.4203169, + 44.2895258 + ], + [ + -94.420245, + 44.2894748 + ], + [ + -94.4201728, + 44.2894239 + ], + [ + -94.4201004, + 44.2893733 + ], + [ + -94.4200278, + 44.2893229 + ], + [ + -94.4199526, + 44.289271 + ], + [ + -94.4198815, + 44.2892234 + ], + [ + -94.4198075, + 44.2891745 + ], + [ + -94.4197341, + 44.2891252 + ], + [ + -94.41966, + 44.2890767 + ], + [ + -94.4195868, + 44.2890278 + ], + [ + -94.4195127, + 44.2889791 + ], + [ + -94.4194372, + 44.288931 + ], + [ + -94.4193598, + 44.288884 + ], + [ + -94.4193033, + 44.2888471 + ], + [ + -94.4192439, + 44.2888129 + ], + [ + -94.4191636, + 44.2887684 + ], + [ + -94.4190801, + 44.2887272 + ], + [ + -94.4189973, + 44.288686 + ], + [ + -94.4189136, + 44.2886466 + ], + [ + -94.418829, + 44.2886093 + ], + [ + -94.4187435, + 44.2885743 + ], + [ + -94.4186593, + 44.2885445 + ], + [ + -94.418562, + 44.2885203 + ], + [ + -94.418464, + 44.2885024 + ], + [ + -94.4183587, + 44.2884882 + ], + [ + -94.4182608, + 44.2884814 + ], + [ + -94.4181596, + 44.2884779 + ], + [ + -94.4180638, + 44.2884763 + ], + [ + -94.4179606, + 44.2884786 + ], + [ + -94.4178608, + 44.2884836 + ], + [ + -94.4177607, + 44.2884907 + ], + [ + -94.4176856, + 44.2884967 + ], + [ + -94.4176104, + 44.2885026 + ], + [ + -94.4175225, + 44.2885089 + ], + [ + -94.4174101, + 44.2885143 + ], + [ + -94.4173094, + 44.2885185 + ], + [ + -94.4172333, + 44.2885224 + ], + [ + -94.4171577, + 44.2885226 + ], + [ + -94.4170594, + 44.2885142 + ], + [ + -94.4169631, + 44.2884984 + ], + [ + -94.4168734, + 44.2884805 + ], + [ + -94.4167721, + 44.2884548 + ], + [ + -94.416678, + 44.2884285 + ], + [ + -94.4165789, + 44.2884059 + ], + [ + -94.416491, + 44.2883732 + ], + [ + -94.4164007, + 44.2883423 + ], + [ + -94.4163097, + 44.2883112 + ], + [ + -94.4162184, + 44.2882799 + ], + [ + -94.4161501, + 44.2882561 + ], + [ + -94.4160821, + 44.2882318 + ], + [ + -94.4159912, + 44.2881977 + ], + [ + -94.4159044, + 44.2881632 + ], + [ + -94.4158225, + 44.2881278 + ], + [ + -94.4157353, + 44.2880868 + ], + [ + -94.4156547, + 44.2880444 + ], + [ + -94.4155791, + 44.2879981 + ], + [ + -94.4155037, + 44.2879511 + ], + [ + -94.41543, + 44.2879045 + ], + [ + -94.4153537, + 44.2878554 + ], + [ + -94.4152791, + 44.2878067 + ], + [ + -94.4152049, + 44.2877576 + ], + [ + -94.4151312, + 44.287708 + ], + [ + -94.4150579, + 44.2876578 + ], + [ + -94.4149852, + 44.2876073 + ], + [ + -94.4149131, + 44.2875563 + ], + [ + -94.4148417, + 44.2875048 + ], + [ + -94.414771, + 44.287453 + ], + [ + -94.414701, + 44.2874007 + ], + [ + -94.4146319, + 44.2873481 + ], + [ + -94.4145637, + 44.2872951 + ], + [ + -94.4144967, + 44.287242 + ], + [ + -94.4144302, + 44.2871881 + ], + [ + -94.4143644, + 44.2871337 + ], + [ + -94.4143079, + 44.2870811 + ], + [ + -94.4142527, + 44.2870198 + ], + [ + -94.4141843, + 44.2869648 + ], + [ + -94.414135, + 44.2869019 + ], + [ + -94.4140931, + 44.2868351 + ], + [ + -94.4140661, + 44.2867833 + ], + [ + -94.4140431, + 44.2867302 + ], + [ + -94.4140174, + 44.2866588 + ], + [ + -94.4140162, + 44.2865823 + ], + [ + -94.413992, + 44.2865143 + ], + [ + -94.4139754, + 44.2864449 + ], + [ + -94.4139694, + 44.2863756 + ], + [ + -94.4139758, + 44.2863004 + ], + [ + -94.4139889, + 44.2862279 + ], + [ + -94.414006, + 44.2861559 + ], + [ + -94.4140228, + 44.2860845 + ], + [ + -94.4140565, + 44.2860179 + ], + [ + -94.4140922, + 44.2859525 + ], + [ + -94.4141347, + 44.2858858 + ], + [ + -94.4141847, + 44.285828 + ], + [ + -94.4142423, + 44.2857678 + ], + [ + -94.414303, + 44.2857097 + ], + [ + -94.4143524, + 44.2856439 + ], + [ + -94.4144076, + 44.2855835 + ], + [ + -94.4144798, + 44.2856018 + ], + [ + -94.4220047, + 44.2875083 + ], + [ + -94.4219809, + 44.2840859 + ], + [ + -94.4249158, + 44.2842305 + ], + [ + -94.426389, + 44.2855966 + ], + [ + -94.4267877, + 44.2854384 + ], + [ + -94.4280963, + 44.286598 + ], + [ + -94.4288321, + 44.2866021 + ], + [ + -94.4269094, + 44.2846678 + ], + [ + -94.4269033, + 44.2830124 + ], + [ + -94.4319159, + 44.2830469 + ], + [ + -94.4363473, + 44.2830312 + ], + [ + -94.4359739, + 44.2810499 + ], + [ + -94.436149, + 44.2808958 + ], + [ + -94.4362248, + 44.2807309 + ], + [ + -94.4362165, + 44.2805551 + ], + [ + -94.436147, + 44.2803192 + ], + [ + -94.4358915, + 44.2793095 + ], + [ + -94.4357072, + 44.278986 + ], + [ + -94.4353622, + 44.2785531 + ], + [ + -94.4348033, + 44.2780438 + ], + [ + -94.434053, + 44.2774087 + ], + [ + -94.433532, + 44.2768388 + ], + [ + -94.4330647, + 44.2763458 + ], + [ + -94.4328422, + 44.2760114 + ], + [ + -94.4328415, + 44.2758027 + ], + [ + -94.4419549, + 44.27583 + ], + [ + -94.4421716, + 44.2830334 + ], + [ + -94.4501352, + 44.2830045 + ], + [ + -94.4501352, + 44.2827343 + ], + [ + -94.4485409, + 44.2827391 + ], + [ + -94.4488339, + 44.2821581 + ], + [ + -94.4527525, + 44.2821381 + ], + [ + -94.4519169, + 44.2830047 + ], + [ + -94.4519518, + 44.2863678 + ], + [ + -94.4523487, + 44.2863243 + ], + [ + -94.4531129, + 44.2861031 + ], + [ + -94.4539511, + 44.2856495 + ], + [ + -94.4540798, + 44.2855385 + ], + [ + -94.4542595, + 44.2853172 + ], + [ + -94.4544887, + 44.2845789 + ], + [ + -94.4549709, + 44.2841377 + ], + [ + -94.4553046, + 44.2839794 + ], + [ + -94.455773, + 44.2838575 + ], + [ + -94.456414, + 44.2837585 + ], + [ + -94.4568804, + 44.2837601 + ], + [ + -94.4575961, + 44.2841726 + ], + [ + -94.4579861, + 44.2845306 + ], + [ + -94.4584441, + 44.2846493 + ], + [ + -94.4588846, + 44.284616 + ], + [ + -94.4593252, + 44.2845057 + ], + [ + -94.4603452, + 44.2837818 + ], + [ + -94.4605643, + 44.2836995 + ], + [ + -94.4614415, + 44.2836628 + ], + [ + -94.4618204, + 44.28359 + ], + [ + -94.4628228, + 44.2834995 + ], + [ + -94.4644374, + 44.2838716 + ], + [ + -94.4645799, + 44.2847494 + ], + [ + -94.4650368, + 44.287559 + ], + [ + -94.465292, + 44.2884902 + ], + [ + -94.4718003, + 44.2884433 + ], + [ + -94.4718431, + 44.2901622 + ], + [ + -94.4819865, + 44.2901813 + ], + [ + -94.4820194, + 44.2974494 + ], + [ + -94.4861656, + 44.2974613 + ], + [ + -94.486224, + 44.3008983 + ], + [ + -94.4875586, + 44.3008736 + ], + [ + -94.4875788, + 44.3020671 + ], + [ + -94.4862442, + 44.3020918 + ], + [ + -94.48627, + 44.3033392 + ], + [ + -94.4868573, + 44.3033283 + ], + [ + -94.4869219, + 44.3071318 + ], + [ + -94.4884304, + 44.3071362 + ], + [ + -94.4883442, + 44.3117898 + ], + [ + -94.4921238, + 44.311786 + ], + [ + -94.4920516, + 44.3190171 + ], + [ + -94.4932129, + 44.3190259 + ], + [ + -94.4932163, + 44.3194343 + ], + [ + -94.4938822, + 44.319606 + ], + [ + -94.4940456, + 44.3196557 + ], + [ + -94.4943085, + 44.3197656 + ], + [ + -94.4945512, + 44.3199056 + ], + [ + -94.4947131, + 44.3200326 + ], + [ + -94.4948447, + 44.320162 + ], + [ + -94.4956637, + 44.3210721 + ], + [ + -94.4959995, + 44.3209092 + ], + [ + -94.4960648, + 44.3208746 + ], + [ + -94.496153, + 44.3208144 + ], + [ + -94.4962244, + 44.3207486 + ], + [ + -94.4970882, + 44.3203194 + ], + [ + -94.497197, + 44.3171671 + ], + [ + -94.4983613, + 44.3171777 + ], + [ + -94.4922769, + 44.3096376 + ], + [ + -94.4923172, + 44.3096212 + ], + [ + -94.4904022, + 44.3078516 + ], + [ + -94.4889322, + 44.3065331 + ], + [ + -94.4889734, + 44.3065311 + ], + [ + -94.4882087, + 44.3058244 + ], + [ + -94.4920057, + 44.3042933 + ], + [ + -94.4920198, + 44.3052172 + ], + [ + -94.4937131, + 44.304774 + ], + [ + -94.4942619, + 44.3038899 + ], + [ + -94.4960716, + 44.3073128 + ], + [ + -94.4960363, + 44.3073129 + ], + [ + -94.4962085, + 44.3076417 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149546_s_4149547", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4861953, + 44.3261276 + ], + [ + -94.4859927, + 44.3263078 + ], + [ + -94.4854265, + 44.326647 + ], + [ + -94.484779, + 44.3269003 + ], + [ + -94.4840751, + 44.3270581 + ], + [ + -94.4833418, + 44.3271143 + ], + [ + -94.4826073, + 44.3270668 + ], + [ + -94.4818999, + 44.3269172 + ], + [ + -94.4812467, + 44.3266715 + ], + [ + -94.4806728, + 44.326339 + ], + [ + -94.4802003, + 44.3259326 + ], + [ + -94.4801463, + 44.3258756 + ], + [ + -94.4797931, + 44.3254102 + ], + [ + -94.4795733, + 44.3249043 + ], + [ + -94.4795604, + 44.3248169 + ], + [ + -94.4795543, + 44.3248106 + ], + [ + -94.4795212, + 44.3247784 + ], + [ + -94.4795167, + 44.3247741 + ], + [ + -94.4790257, + 44.3242948 + ], + [ + -94.4786177, + 44.3239025 + ], + [ + -94.4785278, + 44.3238122 + ], + [ + -94.4776068, + 44.3228462 + ], + [ + -94.4775532, + 44.3227884 + ], + [ + -94.4773602, + 44.3225744 + ], + [ + -94.4772747, + 44.3224831 + ], + [ + -94.4772221, + 44.3224254 + ], + [ + -94.4771521, + 44.3223464 + ], + [ + -94.4771257, + 44.3223162 + ], + [ + -94.4770147, + 44.3221872 + ], + [ + -94.4770018, + 44.322172 + ], + [ + -94.476643, + 44.3217488 + ], + [ + -94.4764254, + 44.3215037 + ], + [ + -94.476083, + 44.3211363 + ], + [ + -94.4758945, + 44.3209414 + ], + [ + -94.4758292, + 44.3208743 + ], + [ + -94.4758245, + 44.3208694 + ], + [ + -94.4756515, + 44.3206904 + ], + [ + -94.4756346, + 44.3206727 + ], + [ + -94.4749486, + 44.3199507 + ], + [ + -94.4749457, + 44.3199477 + ], + [ + -94.4748737, + 44.3198717 + ], + [ + -94.4739493, + 44.3188943 + ], + [ + -94.4730903, + 44.3179935 + ], + [ + -94.4730633, + 44.3179648 + ], + [ + -94.4729993, + 44.3178958 + ], + [ + -94.4726539, + 44.3174305 + ], + [ + -94.472441, + 44.3169259 + ], + [ + -94.4723687, + 44.3164013 + ], + [ + -94.4724398, + 44.3158766 + ], + [ + -94.4726515, + 44.3153717 + ], + [ + -94.4729958, + 44.3149061 + ], + [ + -94.4734596, + 44.3144973 + ], + [ + -94.4740251, + 44.314161 + ], + [ + -94.4741154, + 44.3141173 + ], + [ + -94.4753437, + 44.3135145 + ], + [ + -94.4760418, + 44.3132446 + ], + [ + -94.4768032, + 44.3130858 + ], + [ + -94.477594, + 44.3130451 + ], + [ + -94.4783791, + 44.3131243 + ], + [ + -94.4791237, + 44.31332 + ], + [ + -94.4797946, + 44.3136233 + ], + [ + -94.4798476, + 44.3136533 + ], + [ + -94.480379, + 44.3140202 + ], + [ + -94.4808006, + 44.3144545 + ], + [ + -94.4810961, + 44.3149395 + ], + [ + -94.4812541, + 44.3154566 + ], + [ + -94.4812686, + 44.3159859 + ], + [ + -94.481139, + 44.316507 + ], + [ + -94.4810094, + 44.3167448 + ], + [ + -94.4810948, + 44.316835 + ], + [ + -94.4811647, + 44.3169087 + ], + [ + -94.4818408, + 44.3176203 + ], + [ + -94.482003, + 44.3177881 + ], + [ + -94.4820676, + 44.3178546 + ], + [ + -94.4820712, + 44.3178583 + ], + [ + -94.4822802, + 44.3180743 + ], + [ + -94.4823171, + 44.3181132 + ], + [ + -94.4827011, + 44.3185252 + ], + [ + -94.482747, + 44.3185756 + ], + [ + -94.483008, + 44.3188696 + ], + [ + -94.483049, + 44.3189169 + ], + [ + -94.4834216, + 44.3193563 + ], + [ + -94.4835131, + 44.3194626 + ], + [ + -94.4835439, + 44.3194974 + ], + [ + -94.4836211, + 44.3195798 + ], + [ + -94.4836576, + 44.3196195 + ], + [ + -94.4838423, + 44.3198244 + ], + [ + -94.4846924, + 44.3207159 + ], + [ + -94.4850621, + 44.3210714 + ], + [ + -94.4850781, + 44.3210869 + ], + [ + -94.4855749, + 44.3215717 + ], + [ + -94.4856436, + 44.3216385 + ], + [ + -94.4857177, + 44.321713 + ], + [ + -94.4857829, + 44.3217811 + ], + [ + -94.4861452, + 44.3221573 + ], + [ + -94.4861479, + 44.3221601 + ], + [ + -94.4865804, + 44.3226104 + ], + [ + -94.4866388, + 44.3226706 + ], + [ + -94.4869997, + 44.3231346 + ], + [ + -94.4872272, + 44.3236402 + ], + [ + -94.4873122, + 44.3241681 + ], + [ + -94.4872517, + 44.3246977 + ], + [ + -94.4870478, + 44.3252085 + ], + [ + -94.4867086, + 44.3256808 + ], + [ + -94.486247, + 44.3260963 + ], + [ + -94.4861953, + 44.3261276 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149547_s_4149548", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4801071, + 44.3177189 + ], + [ + -94.4799617, + 44.3178275 + ], + [ + -94.4793568, + 44.3181301 + ], + [ + -94.4786812, + 44.3183423 + ], + [ + -94.477961, + 44.3184557 + ], + [ + -94.4772238, + 44.3184661 + ], + [ + -94.4764979, + 44.318373 + ], + [ + -94.4758113, + 44.3181801 + ], + [ + -94.4751903, + 44.3178946 + ], + [ + -94.4751373, + 44.3178646 + ], + [ + -94.4746277, + 44.3175159 + ], + [ + -94.4742175, + 44.3171052 + ], + [ + -94.4739211, + 44.3166467 + ], + [ + -94.4737489, + 44.3161566 + ], + [ + -94.4737071, + 44.3156534 + ], + [ + -94.4735181, + 44.3154537 + ], + [ + -94.4733282, + 44.3152529 + ], + [ + -94.4730946, + 44.3150575 + ], + [ + -94.4727328, + 44.3145962 + ], + [ + -94.4725033, + 44.3140931 + ], + [ + -94.4724148, + 44.3135676 + ], + [ + -94.4724709, + 44.3130397 + ], + [ + -94.4726693, + 44.3125299 + ], + [ + -94.4730025, + 44.3120576 + ], + [ + -94.4734575, + 44.3116411 + ], + [ + -94.474017, + 44.3112963 + ], + [ + -94.4746594, + 44.3110365 + ], + [ + -94.47536, + 44.3108717 + ], + [ + -94.4760919, + 44.3108082 + ], + [ + -94.4768271, + 44.3108485 + ], + [ + -94.4775372, + 44.3109909 + ], + [ + -94.4781949, + 44.3112301 + ], + [ + -94.4782299, + 44.3112461 + ], + [ + -94.4785749, + 44.3114242 + ], + [ + -94.4786059, + 44.3114422 + ], + [ + -94.4789861, + 44.3116961 + ], + [ + -94.4790161, + 44.3117191 + ], + [ + -94.4791441, + 44.3118224 + ], + [ + -94.4791641, + 44.3118394 + ], + [ + -94.4792597, + 44.311924 + ], + [ + -94.4792857, + 44.311948 + ], + [ + -94.4794288, + 44.3120893 + ], + [ + -94.4797403, + 44.3124187 + ], + [ + -94.4800532, + 44.3127494 + ], + [ + -94.4801127, + 44.3128116 + ], + [ + -94.4801261, + 44.3128258 + ], + [ + -94.4805318, + 44.3132563 + ], + [ + -94.4808144, + 44.3135548 + ], + [ + -94.4808189, + 44.3135595 + ], + [ + -94.4811139, + 44.3138725 + ], + [ + -94.4811172, + 44.313876 + ], + [ + -94.4811792, + 44.313942 + ], + [ + -94.4815284, + 44.3144058 + ], + [ + -94.4817455, + 44.3149095 + ], + [ + -94.4818221, + 44.315434 + ], + [ + -94.4817553, + 44.3159591 + ], + [ + -94.4815477, + 44.3164648 + ], + [ + -94.4812071, + 44.316932 + ], + [ + -94.4807465, + 44.3173427 + ], + [ + -94.4801835, + 44.3176814 + ], + [ + -94.4801071, + 44.3177189 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149548_s_4149549", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4775251, + 44.3109801 + ], + [ + -94.4775921, + 44.3110012 + ], + [ + -94.4776751, + 44.3110282 + ], + [ + -94.4777471, + 44.3110523 + ], + [ + -94.4777791, + 44.3110633 + ], + [ + -94.4781523, + 44.3112108 + ], + [ + -94.4781723, + 44.3112198 + ], + [ + -94.4787556, + 44.3115435 + ], + [ + -94.4792398, + 44.3119428 + ], + [ + -94.4796062, + 44.3124021 + ], + [ + -94.4798408, + 44.312904 + ], + [ + -94.4799345, + 44.3134291 + ], + [ + -94.4798837, + 44.3139572 + ], + [ + -94.4796904, + 44.3144681 + ], + [ + -94.479362, + 44.3149421 + ], + [ + -94.4789111, + 44.3153609 + ], + [ + -94.478355, + 44.3157086 + ], + [ + -94.4777152, + 44.3159716 + ], + [ + -94.4770162, + 44.31614 + ], + [ + -94.4762848, + 44.3162073 + ], + [ + -94.4755492, + 44.3161708 + ], + [ + -94.4748377, + 44.316032 + ], + [ + -94.4748072, + 44.3160211 + ], + [ + -94.4747372, + 44.3160556 + ], + [ + -94.4747326, + 44.3160578 + ], + [ + -94.474059, + 44.3163887 + ], + [ + -94.4733814, + 44.3167235 + ], + [ + -94.473355, + 44.3167364 + ], + [ + -94.4726956, + 44.3170564 + ], + [ + -94.4720249, + 44.3173893 + ], + [ + -94.4720206, + 44.3173914 + ], + [ + -94.4713396, + 44.3177285 + ], + [ + -94.4713224, + 44.3177369 + ], + [ + -94.4706394, + 44.3180709 + ], + [ + -94.4706312, + 44.3180749 + ], + [ + -94.4700492, + 44.3183579 + ], + [ + -94.4700421, + 44.3183613 + ], + [ + -94.4699573, + 44.3184024 + ], + [ + -94.4698715, + 44.3184444 + ], + [ + -94.4698605, + 44.3184497 + ], + [ + -94.4692675, + 44.3187377 + ], + [ + -94.4686819, + 44.319022 + ], + [ + -94.4686739, + 44.3190259 + ], + [ + -94.4685913, + 44.3190658 + ], + [ + -94.4685042, + 44.3191081 + ], + [ + -94.4684206, + 44.3191495 + ], + [ + -94.4677754, + 44.3194057 + ], + [ + -94.467073, + 44.3195667 + ], + [ + -94.4663402, + 44.3196262 + ], + [ + -94.4656054, + 44.3195819 + ], + [ + -94.4648968, + 44.3194355 + ], + [ + -94.4642416, + 44.3191927 + ], + [ + -94.4636649, + 44.3188628 + ], + [ + -94.463189, + 44.3184585 + ], + [ + -94.4628321, + 44.3179952 + ], + [ + -94.4626079, + 44.3174909 + ], + [ + -94.4625251, + 44.3169649 + ], + [ + -94.4625868, + 44.3164374 + ], + [ + -94.4627907, + 44.3159286 + ], + [ + -94.4631289, + 44.3154582 + ], + [ + -94.4635884, + 44.3150442 + ], + [ + -94.4641515, + 44.3147025 + ], + [ + -94.4642485, + 44.3146545 + ], + [ + -94.4642755, + 44.3146413 + ], + [ + -94.4643805, + 44.3145903 + ], + [ + -94.4643893, + 44.314586 + ], + [ + -94.4644723, + 44.314546 + ], + [ + -94.4650529, + 44.3142641 + ], + [ + -94.4656402, + 44.3139789 + ], + [ + -94.4657287, + 44.3139356 + ], + [ + -94.465745, + 44.3139276 + ], + [ + -94.4658345, + 44.3138843 + ], + [ + -94.4664088, + 44.3136051 + ], + [ + -94.4670791, + 44.3132773 + ], + [ + -94.4677494, + 44.3129456 + ], + [ + -94.4684342, + 44.3126057 + ], + [ + -94.4684671, + 44.3125895 + ], + [ + -94.4691299, + 44.312268 + ], + [ + -94.4697988, + 44.3119375 + ], + [ + -94.4698076, + 44.3119331 + ], + [ + -94.4704833, + 44.3116012 + ], + [ + -94.471003, + 44.3113452 + ], + [ + -94.4710219, + 44.3113346 + ], + [ + -94.4710692, + 44.3113079 + ], + [ + -94.471289, + 44.3111646 + ], + [ + -94.4714054, + 44.3110918 + ], + [ + -94.4715254, + 44.3110198 + ], + [ + -94.4715868, + 44.3109837 + ], + [ + -94.4716738, + 44.3109337 + ], + [ + -94.4717472, + 44.3108926 + ], + [ + -94.4718882, + 44.3108156 + ], + [ + -94.4719656, + 44.3107745 + ], + [ + -94.4721356, + 44.3106865 + ], + [ + -94.4721791, + 44.3106643 + ], + [ + -94.4723941, + 44.3105563 + ], + [ + -94.4730503, + 44.3102925 + ], + [ + -94.4737664, + 44.3101278 + ], + [ + -94.4745139, + 44.3100687 + ], + [ + -94.4752628, + 44.3101175 + ], + [ + -94.4759832, + 44.3102723 + ], + [ + -94.4766463, + 44.3105269 + ], + [ + -94.477162, + 44.3108334 + ], + [ + -94.477308, + 44.3108825 + ], + [ + -94.477343, + 44.3108955 + ], + [ + -94.4775251, + 44.3109801 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149549_s_4149550", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4679152, + 44.3193955 + ], + [ + -94.4673942, + 44.319649 + ], + [ + -94.4673616, + 44.3196648 + ], + [ + -94.4672571, + 44.3197161 + ], + [ + -94.4666088, + 44.3199712 + ], + [ + -94.4659035, + 44.3201303 + ], + [ + -94.4651684, + 44.3201873 + ], + [ + -94.4644321, + 44.32014 + ], + [ + -94.4637228, + 44.3199902 + ], + [ + -94.4630681, + 44.3197437 + ], + [ + -94.4624932, + 44.31941 + ], + [ + -94.4620203, + 44.319002 + ], + [ + -94.4614653, + 44.318414 + ], + [ + -94.4611028, + 44.3180308 + ], + [ + -94.4610448, + 44.3179699 + ], + [ + -94.4609272, + 44.3179257 + ], + [ + -94.4603534, + 44.3175932 + ], + [ + -94.459881, + 44.3171868 + ], + [ + -94.459528, + 44.316722 + ], + [ + -94.4593082, + 44.3162167 + ], + [ + -94.4592299, + 44.3156903 + ], + [ + -94.4592961, + 44.315163 + ], + [ + -94.4595043, + 44.3146552 + ], + [ + -94.4598466, + 44.3141863 + ], + [ + -94.4603096, + 44.3137743 + ], + [ + -94.4608757, + 44.3134351 + ], + [ + -94.4609094, + 44.3134186 + ], + [ + -94.4609933, + 44.3133772 + ], + [ + -94.4610964, + 44.3133279 + ], + [ + -94.4612484, + 44.3132579 + ], + [ + -94.4618928, + 44.3130207 + ], + [ + -94.4625886, + 44.3128764 + ], + [ + -94.46331, + 44.3128306 + ], + [ + -94.4640302, + 44.312885 + ], + [ + -94.4647226, + 44.3130374 + ], + [ + -94.4653615, + 44.3132823 + ], + [ + -94.4659232, + 44.3136105 + ], + [ + -94.4663868, + 44.31401 + ], + [ + -94.4664608, + 44.3140879 + ], + [ + -94.4666139, + 44.3142489 + ], + [ + -94.4669958, + 44.3142741 + ], + [ + -94.4677028, + 44.3144244 + ], + [ + -94.4683553, + 44.314671 + ], + [ + -94.4689282, + 44.3150041 + ], + [ + -94.4693997, + 44.3154111 + ], + [ + -94.4697515, + 44.3158764 + ], + [ + -94.4699702, + 44.3163819 + ], + [ + -94.4700472, + 44.3169084 + ], + [ + -94.4699797, + 44.3174356 + ], + [ + -94.4697703, + 44.3179432 + ], + [ + -94.469427, + 44.3184116 + ], + [ + -94.4689629, + 44.318823 + ], + [ + -94.468396, + 44.3191615 + ], + [ + -94.4679152, + 44.3193955 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149550_s_4149551", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4648831, + 44.318009 + ], + [ + -94.464585, + 44.3181546 + ], + [ + -94.4645807, + 44.3181567 + ], + [ + -94.4639997, + 44.3184397 + ], + [ + -94.4638857, + 44.3184952 + ], + [ + -94.4632376, + 44.3187479 + ], + [ + -94.4625333, + 44.318905 + ], + [ + -94.4617998, + 44.3189604 + ], + [ + -94.4610654, + 44.318912 + ], + [ + -94.4603583, + 44.3187616 + ], + [ + -94.4597056, + 44.318515 + ], + [ + -94.4591325, + 44.3181818 + ], + [ + -94.458661, + 44.3177746 + ], + [ + -94.4586, + 44.3177099 + ], + [ + -94.458457, + 44.3175602 + ], + [ + -94.4584522, + 44.3175552 + ], + [ + -94.4578192, + 44.3168892 + ], + [ + -94.4577402, + 44.3168062 + ], + [ + -94.4577239, + 44.316789 + ], + [ + -94.4576555, + 44.316716 + ], + [ + -94.4569193, + 44.315939 + ], + [ + -94.4565663, + 44.3154743 + ], + [ + -94.4563464, + 44.314969 + ], + [ + -94.456268, + 44.3144426 + ], + [ + -94.4563341, + 44.3139153 + ], + [ + -94.4565423, + 44.3134075 + ], + [ + -94.4568844, + 44.3129385 + ], + [ + -94.4573473, + 44.3125265 + ], + [ + -94.4579133, + 44.3121873 + ], + [ + -94.4585606, + 44.3119339 + ], + [ + -94.4592644, + 44.3117759 + ], + [ + -94.4599975, + 44.3117196 + ], + [ + -94.4607318, + 44.3117671 + ], + [ + -94.4614391, + 44.3119165 + ], + [ + -94.4620922, + 44.3121621 + ], + [ + -94.4626661, + 44.3124945 + ], + [ + -94.4631386, + 44.3129009 + ], + [ + -94.4632173, + 44.3129839 + ], + [ + -94.4637101, + 44.3130174 + ], + [ + -94.4644165, + 44.313169 + ], + [ + -94.4650681, + 44.3134167 + ], + [ + -94.4656399, + 44.3137509 + ], + [ + -94.4661099, + 44.3141588 + ], + [ + -94.4664601, + 44.3146246 + ], + [ + -94.466677, + 44.3151306 + ], + [ + -94.4667522, + 44.3156572 + ], + [ + -94.4666829, + 44.3161842 + ], + [ + -94.4664717, + 44.3166914 + ], + [ + -94.4661267, + 44.3171593 + ], + [ + -94.4656612, + 44.3175699 + ], + [ + -94.4650931, + 44.3179073 + ], + [ + -94.4648831, + 44.318009 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149551_s_4149552", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4568912, + 44.315909 + ], + [ + -94.4568307, + 44.3158462 + ], + [ + -94.4568079, + 44.3158222 + ], + [ + -94.4567311, + 44.3157406 + ], + [ + -94.4563433, + 44.3153301 + ], + [ + -94.4559709, + 44.3149391 + ], + [ + -94.4559036, + 44.3148689 + ], + [ + -94.4558963, + 44.3148613 + ], + [ + -94.4557963, + 44.3147563 + ], + [ + -94.4557881, + 44.3147476 + ], + [ + -94.4557221, + 44.3146777 + ], + [ + -94.4553395, + 44.3142743 + ], + [ + -94.4549533, + 44.3138682 + ], + [ + -94.4548748, + 44.3137856 + ], + [ + -94.4548671, + 44.3137776 + ], + [ + -94.4548659, + 44.3137763 + ], + [ + -94.4548567, + 44.3137678 + ], + [ + -94.4547303, + 44.3136435 + ], + [ + -94.4546633, + 44.3135735 + ], + [ + -94.4543073, + 44.3131099 + ], + [ + -94.4540841, + 44.3126053 + ], + [ + -94.4540023, + 44.3120792 + ], + [ + -94.454065, + 44.3115518 + ], + [ + -94.4542698, + 44.3110432 + ], + [ + -94.4546089, + 44.3105731 + ], + [ + -94.4550691, + 44.3101596 + ], + [ + -94.4556329, + 44.3098184 + ], + [ + -94.4562785, + 44.3095628 + ], + [ + -94.4569812, + 44.3094025 + ], + [ + -94.4577139, + 44.3093438 + ], + [ + -94.4584485, + 44.3093888 + ], + [ + -94.4591567, + 44.3095358 + ], + [ + -94.4598114, + 44.3097792 + ], + [ + -94.4603874, + 44.3101097 + ], + [ + -94.4608625, + 44.3105145 + ], + [ + -94.4608688, + 44.310521 + ], + [ + -94.4608851, + 44.3105361 + ], + [ + -94.4610247, + 44.3106743 + ], + [ + -94.4610889, + 44.3107423 + ], + [ + -94.4611641, + 44.3108213 + ], + [ + -94.461553, + 44.3112302 + ], + [ + -94.4615556, + 44.311233 + ], + [ + -94.4619417, + 44.31164 + ], + [ + -94.4619458, + 44.3116444 + ], + [ + -94.4620097, + 44.311712 + ], + [ + -94.4621019, + 44.3118088 + ], + [ + -94.4621692, + 44.311879 + ], + [ + -94.4621766, + 44.3118867 + ], + [ + -94.4625566, + 44.3122857 + ], + [ + -94.4625644, + 44.3122939 + ], + [ + -94.4629584, + 44.3127109 + ], + [ + -94.462963, + 44.3127157 + ], + [ + -94.4630306, + 44.3127877 + ], + [ + -94.4630961, + 44.3128557 + ], + [ + -94.4631288, + 44.3128902 + ], + [ + -94.4631558, + 44.3129192 + ], + [ + -94.4635035, + 44.313386 + ], + [ + -94.4637177, + 44.3138926 + ], + [ + -94.4637901, + 44.3144194 + ], + [ + -94.4637181, + 44.3149462 + ], + [ + -94.4635042, + 44.3154529 + ], + [ + -94.4631568, + 44.3159198 + ], + [ + -94.4626892, + 44.3163291 + ], + [ + -94.4621193, + 44.316665 + ], + [ + -94.4614691, + 44.3169147 + ], + [ + -94.4607635, + 44.3170685 + ], + [ + -94.4600298, + 44.3171205 + ], + [ + -94.4592959, + 44.3170687 + ], + [ + -94.4585903, + 44.3169151 + ], + [ + -94.45794, + 44.3166656 + ], + [ + -94.4573699, + 44.3163299 + ], + [ + -94.4569021, + 44.3159207 + ], + [ + -94.4568912, + 44.315909 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149552_s_4149553", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4614989, + 44.312219 + ], + [ + -94.4614591, + 44.3125437 + ], + [ + -94.4612523, + 44.3130518 + ], + [ + -94.4609114, + 44.3135212 + ], + [ + -94.4604496, + 44.3139339 + ], + [ + -94.4598844, + 44.3142739 + ], + [ + -94.4592378, + 44.3145282 + ], + [ + -94.4585344, + 44.314687 + ], + [ + -94.4578015, + 44.3147443 + ], + [ + -94.457067, + 44.3146978 + ], + [ + -94.4563593, + 44.3145493 + ], + [ + -94.4557055, + 44.3143046 + ], + [ + -94.4551308, + 44.3139729 + ], + [ + -94.4546573, + 44.3135671 + ], + [ + -94.4544423, + 44.3133411 + ], + [ + -94.4544031, + 44.3132991 + ], + [ + -94.4540095, + 44.3128682 + ], + [ + -94.4539533, + 44.312809 + ], + [ + -94.4536008, + 44.3123462 + ], + [ + -94.4533804, + 44.3118431 + ], + [ + -94.4533003, + 44.3113188 + ], + [ + -94.4533637, + 44.3107934 + ], + [ + -94.4535681, + 44.3102868 + ], + [ + -94.4536511, + 44.3101716 + ], + [ + -94.4536001, + 44.3101173 + ], + [ + -94.4531463, + 44.3096388 + ], + [ + -94.4531418, + 44.309634 + ], + [ + -94.4530627, + 44.3095502 + ], + [ + -94.4526833, + 44.3091522 + ], + [ + -94.45213, + 44.308576 + ], + [ + -94.4521251, + 44.3085709 + ], + [ + -94.4519349, + 44.3083719 + ], + [ + -94.4517567, + 44.3081868 + ], + [ + -94.4517438, + 44.3081733 + ], + [ + -94.4511868, + 44.3075873 + ], + [ + -94.4508124, + 44.3071928 + ], + [ + -94.4508085, + 44.3071887 + ], + [ + -94.4502555, + 44.3066036 + ], + [ + -94.4498926, + 44.3062189 + ], + [ + -94.4493476, + 44.3056482 + ], + [ + -94.4493449, + 44.3056454 + ], + [ + -94.4489649, + 44.3052464 + ], + [ + -94.4489597, + 44.3052409 + ], + [ + -94.4484212, + 44.3046724 + ], + [ + -94.4481098, + 44.304344 + ], + [ + -94.4480923, + 44.3043254 + ], + [ + -94.4480342, + 44.304263 + ], + [ + -94.4479672, + 44.3041925 + ], + [ + -94.4474807, + 44.3036799 + ], + [ + -94.447112, + 44.3032912 + ], + [ + -94.4471076, + 44.3032865 + ], + [ + -94.4465673, + 44.3027142 + ], + [ + -94.446186, + 44.302311 + ], + [ + -94.4461719, + 44.3022959 + ], + [ + -94.4457937, + 44.3018901 + ], + [ + -94.4456066, + 44.3016912 + ], + [ + -94.4455988, + 44.3016829 + ], + [ + -94.4452692, + 44.3013299 + ], + [ + -94.4447277, + 44.3007598 + ], + [ + -94.4443559, + 44.3003684 + ], + [ + -94.4440702, + 44.3000719 + ], + [ + -94.4440671, + 44.3000687 + ], + [ + -94.4437971, + 44.2997877 + ], + [ + -94.4434318, + 44.2994074 + ], + [ + -94.4434103, + 44.2993847 + ], + [ + -94.4428489, + 44.2987873 + ], + [ + -94.4424883, + 44.298404 + ], + [ + -94.4419212, + 44.2978071 + ], + [ + -94.4415639, + 44.2974308 + ], + [ + -94.4411633, + 44.2970092 + ], + [ + -94.4409583, + 44.2967932 + ], + [ + -94.4406378, + 44.2964557 + ], + [ + -94.440091, + 44.2958795 + ], + [ + -94.4400273, + 44.2958139 + ], + [ + -94.4399164, + 44.2957062 + ], + [ + -94.4399106, + 44.2957006 + ], + [ + -94.4398519, + 44.2956432 + ], + [ + -94.4396378, + 44.2954599 + ], + [ + -94.4396306, + 44.295454 + ], + [ + -94.4395968, + 44.2954308 + ], + [ + -94.4395099, + 44.2953735 + ], + [ + -94.4392022, + 44.2951804 + ], + [ + -94.439201, + 44.2951798 + ], + [ + -94.4385987, + 44.2948581 + ], + [ + -94.4380919, + 44.2945872 + ], + [ + -94.4380728, + 44.2945769 + ], + [ + -94.4374689, + 44.2942497 + ], + [ + -94.4374666, + 44.2942485 + ], + [ + -94.4368234, + 44.2942974 + ], + [ + -94.4360787, + 44.2942472 + ], + [ + -94.4353625, + 44.294092 + ], + [ + -94.4347033, + 44.2938381 + ], + [ + -94.4341271, + 44.2934955 + ], + [ + -94.4336568, + 44.2930777 + ], + [ + -94.4326909, + 44.2920195 + ], + [ + -94.4319113, + 44.2912158 + ], + [ + -94.4303965, + 44.2896541 + ], + [ + -94.4297517, + 44.2889974 + ], + [ + -94.4293881, + 44.288537 + ], + [ + -94.4291564, + 44.2880344 + ], + [ + -94.4290657, + 44.2875091 + ], + [ + -94.4291195, + 44.2869811 + ], + [ + -94.4293156, + 44.2864708 + ], + [ + -94.4296465, + 44.2859978 + ], + [ + -94.4300995, + 44.2855802 + ], + [ + -94.4306572, + 44.2852342 + ], + [ + -94.4312982, + 44.2849729 + ], + [ + -94.4319978, + 44.2848065 + ], + [ + -94.4327292, + 44.2847414 + ], + [ + -94.4334642, + 44.28478 + ], + [ + -94.4341745, + 44.2849208 + ], + [ + -94.434833, + 44.2851585 + ], + [ + -94.4354143, + 44.2854839 + ], + [ + -94.4358961, + 44.2858845 + ], + [ + -94.4365471, + 44.2865475 + ], + [ + -94.4365595, + 44.2865602 + ], + [ + -94.4380806, + 44.2881281 + ], + [ + -94.4382383, + 44.2882908 + ], + [ + -94.4384894, + 44.2882952 + ], + [ + -94.4391733, + 44.2884003 + ], + [ + -94.4398182, + 44.2885946 + ], + [ + -94.440402, + 44.2888714 + ], + [ + -94.4409042, + 44.289221 + ], + [ + -94.4410909, + 44.2893777 + ], + [ + -94.4413048, + 44.2895536 + ], + [ + -94.4413808, + 44.2896101 + ], + [ + -94.4413857, + 44.2896135 + ], + [ + -94.4414369, + 44.2896414 + ], + [ + -94.4419426, + 44.2899086 + ], + [ + -94.4419791, + 44.2899281 + ], + [ + -94.4425915, + 44.2902599 + ], + [ + -94.443086, + 44.2905243 + ], + [ + -94.4436882, + 44.2908458 + ], + [ + -94.4438055, + 44.2909085 + ], + [ + -94.4440262, + 44.2910361 + ], + [ + -94.4441272, + 44.2910991 + ], + [ + -94.4441355, + 44.2911042 + ], + [ + -94.4444925, + 44.2913282 + ], + [ + -94.4445626, + 44.2913733 + ], + [ + -94.4447096, + 44.2914703 + ], + [ + -94.44476, + 44.2915042 + ], + [ + -94.44489, + 44.2915932 + ], + [ + -94.4450114, + 44.2916802 + ], + [ + -94.4451074, + 44.2917522 + ], + [ + -94.4451935, + 44.291819 + ], + [ + -94.4452745, + 44.291884 + ], + [ + -94.4453703, + 44.2919646 + ], + [ + -94.4453705, + 44.2919645 + ], + [ + -94.4456905, + 44.2922385 + ], + [ + -94.4458392, + 44.2923744 + ], + [ + -94.4459663, + 44.2924985 + ], + [ + -94.4461044, + 44.2926327 + ], + [ + -94.4461636, + 44.2926919 + ], + [ + -94.4462686, + 44.2927999 + ], + [ + -94.4462928, + 44.292825 + ], + [ + -94.4468504, + 44.2934126 + ], + [ + -94.4471711, + 44.2937502 + ], + [ + -94.4473753, + 44.2939654 + ], + [ + -94.4477756, + 44.2943867 + ], + [ + -94.448133, + 44.2947632 + ], + [ + -94.4487047, + 44.2953648 + ], + [ + -94.4487144, + 44.295375 + ], + [ + -94.4490804, + 44.295764 + ], + [ + -94.4496329, + 44.2963518 + ], + [ + -94.4499869, + 44.2967204 + ], + [ + -94.4502552, + 44.2969996 + ], + [ + -94.4505467, + 44.297302 + ], + [ + -94.4505612, + 44.2973171 + ], + [ + -94.4509402, + 44.2977161 + ], + [ + -94.4514902, + 44.2982951 + ], + [ + -94.451507, + 44.298313 + ], + [ + -94.4518412, + 44.2986708 + ], + [ + -94.4520293, + 44.2988707 + ], + [ + -94.452039, + 44.298881 + ], + [ + -94.4524149, + 44.2992845 + ], + [ + -94.4527898, + 44.2996809 + ], + [ + -94.4533301, + 44.3002531 + ], + [ + -94.4536955, + 44.3006384 + ], + [ + -94.4541794, + 44.3011482 + ], + [ + -94.4542556, + 44.3012284 + ], + [ + -94.4542755, + 44.3012495 + ], + [ + -94.4543348, + 44.3013132 + ], + [ + -94.454638, + 44.3016329 + ], + [ + -94.4551755, + 44.3022003 + ], + [ + -94.4555516, + 44.3025951 + ], + [ + -94.4561013, + 44.3031707 + ], + [ + -94.4561132, + 44.3031833 + ], + [ + -94.4564793, + 44.3035713 + ], + [ + -94.4570294, + 44.3041532 + ], + [ + -94.4573997, + 44.3045433 + ], + [ + -94.4579496, + 44.3051218 + ], + [ + -94.4581251, + 44.3053041 + ], + [ + -94.4581327, + 44.305312 + ], + [ + -94.4583243, + 44.3055124 + ], + [ + -94.4588789, + 44.3060899 + ], + [ + -94.4588862, + 44.3060976 + ], + [ + -94.4592742, + 44.3065045 + ], + [ + -94.4592841, + 44.3065149 + ], + [ + -94.4593658, + 44.3066015 + ], + [ + -94.4598215, + 44.3070821 + ], + [ + -94.45983, + 44.3070911 + ], + [ + -94.460222, + 44.3075081 + ], + [ + -94.4607453, + 44.3080651 + ], + [ + -94.4611419, + 44.3084834 + ], + [ + -94.4611478, + 44.3084896 + ], + [ + -94.4616708, + 44.3090446 + ], + [ + -94.4620221, + 44.3095099 + ], + [ + -94.4622402, + 44.3100155 + ], + [ + -94.4623168, + 44.3105419 + ], + [ + -94.462249, + 44.311069 + ], + [ + -94.4620392, + 44.3115764 + ], + [ + -94.4616957, + 44.3120447 + ], + [ + -94.4614989, + 44.312219 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149553_s_4149554", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4431305, + 44.2930991 + ], + [ + -94.4431314, + 44.2931177 + ], + [ + -94.4430132, + 44.2936402 + ], + [ + -94.4427553, + 44.2941362 + ], + [ + -94.4423677, + 44.2945864 + ], + [ + -94.4418653, + 44.2949738 + ], + [ + -94.4412673, + 44.2952832 + ], + [ + -94.4405967, + 44.2955029 + ], + [ + -94.4398793, + 44.2956245 + ], + [ + -94.4391426, + 44.2956431 + ], + [ + -94.4384151, + 44.2955582 + ], + [ + -94.4377246, + 44.295373 + ], + [ + -94.4370977, + 44.2950946 + ], + [ + -94.4365585, + 44.2947337 + ], + [ + -94.4365315, + 44.2947117 + ], + [ + -94.4362693, + 44.2944721 + ], + [ + -94.4361993, + 44.2944001 + ], + [ + -94.436181, + 44.294381 + ], + [ + -94.4359716, + 44.2941616 + ], + [ + -94.4358642, + 44.2940493 + ], + [ + -94.4355109, + 44.2935894 + ], + [ + -94.4352883, + 44.293089 + ], + [ + -94.43527, + 44.2929746 + ], + [ + -94.4351763, + 44.2928943 + ], + [ + -94.4350725, + 44.2928013 + ], + [ + -94.4349445, + 44.2926813 + ], + [ + -94.4348495, + 44.2925883 + ], + [ + -94.4347315, + 44.2924673 + ], + [ + -94.434594, + 44.2923156 + ], + [ + -94.43437, + 44.2920496 + ], + [ + -94.4342493, + 44.2918951 + ], + [ + -94.4341143, + 44.2917081 + ], + [ + -94.4339671, + 44.2914783 + ], + [ + -94.433792, + 44.2911678 + ], + [ + -94.4337074, + 44.2910241 + ], + [ + -94.4336452, + 44.2909114 + ], + [ + -94.4335362, + 44.2907004 + ], + [ + -94.4334776, + 44.2905781 + ], + [ + -94.4333976, + 44.2903971 + ], + [ + -94.4333753, + 44.2903448 + ], + [ + -94.4332943, + 44.2901478 + ], + [ + -94.4332801, + 44.2901086 + ], + [ + -94.4328739, + 44.2901412 + ], + [ + -94.4321395, + 44.2900963 + ], + [ + -94.4314315, + 44.2899494 + ], + [ + -94.4307769, + 44.2897061 + ], + [ + -94.4302011, + 44.2893757 + ], + [ + -94.429726, + 44.2889709 + ], + [ + -94.429324, + 44.2885509 + ], + [ + -94.4292777, + 44.2885014 + ], + [ + -94.4289858, + 44.2881814 + ], + [ + -94.4286656, + 44.2877497 + ], + [ + -94.4286216, + 44.2876747 + ], + [ + -94.4284086, + 44.287187 + ], + [ + -94.4283273, + 44.2866792 + ], + [ + -94.4282934, + 44.2854412 + ], + [ + -94.4283178, + 44.2850765 + ], + [ + -94.4283338, + 44.2849775 + ], + [ + -94.428543, + 44.2843506 + ], + [ + -94.428953, + 44.2837772 + ], + [ + -94.429032, + 44.2836932 + ], + [ + -94.4294621, + 44.2833148 + ], + [ + -94.4299801, + 44.2829983 + ], + [ + -94.4309431, + 44.2825103 + ], + [ + -94.4309472, + 44.2825082 + ], + [ + -94.4317942, + 44.2820802 + ], + [ + -94.4321455, + 44.2819227 + ], + [ + -94.4323885, + 44.2818267 + ], + [ + -94.4331838, + 44.2815931 + ], + [ + -94.4334167, + 44.2815461 + ], + [ + -94.4337702, + 44.2814878 + ], + [ + -94.4340422, + 44.2814528 + ], + [ + -94.4347269, + 44.2814106 + ], + [ + -94.4349659, + 44.2814116 + ], + [ + -94.4357124, + 44.2814685 + ], + [ + -94.4358098, + 44.2814831 + ], + [ + -94.4359363, + 44.2814826 + ], + [ + -94.4367124, + 44.2815372 + ], + [ + -94.4374563, + 44.2817057 + ], + [ + -94.4381357, + 44.2819808 + ], + [ + -94.4387214, + 44.2823507 + ], + [ + -94.4391883, + 44.2827994 + ], + [ + -94.4395163, + 44.2833078 + ], + [ + -94.4396912, + 44.2838538 + ], + [ + -94.4399503, + 44.2853688 + ], + [ + -94.4404641, + 44.2883737 + ], + [ + -94.440489, + 44.288492 + ], + [ + -94.4405218, + 44.288633 + ], + [ + -94.4405329, + 44.2886762 + ], + [ + -94.4405417, + 44.2887059 + ], + [ + -94.4405758, + 44.2887888 + ], + [ + -94.440617, + 44.2888821 + ], + [ + -94.4406654, + 44.2889757 + ], + [ + -94.4407285, + 44.2890828 + ], + [ + -94.4407508, + 44.2891216 + ], + [ + -94.4408697, + 44.2893325 + ], + [ + -94.4409625, + 44.2894426 + ], + [ + -94.4409909, + 44.2894693 + ], + [ + -94.4411676, + 44.2896206 + ], + [ + -94.4412652, + 44.2896862 + ], + [ + -94.4417641, + 44.2899504 + ], + [ + -94.4418125, + 44.2899765 + ], + [ + -94.4418965, + 44.2900225 + ], + [ + -94.4424238, + 44.2903733 + ], + [ + -94.4428485, + 44.2907897 + ], + [ + -94.4431552, + 44.2912567 + ], + [ + -94.4433325, + 44.291757 + ], + [ + -94.443374, + 44.2922724 + ], + [ + -94.4432783, + 44.292784 + ], + [ + -94.4431305, + 44.2930991 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149554_s_4149555", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4629201, + 44.3146899 + ], + [ + -94.4627241, + 44.3147852 + ], + [ + -94.4626504, + 44.314822 + ], + [ + -94.4625835, + 44.3148547 + ], + [ + -94.4624285, + 44.3149287 + ], + [ + -94.4617816, + 44.315176 + ], + [ + -94.4610801, + 44.3153285 + ], + [ + -94.4603507, + 44.3153805 + ], + [ + -94.4596211, + 44.3153298 + ], + [ + -94.4589191, + 44.3151786 + ], + [ + -94.4582713, + 44.3149324 + ], + [ + -94.4577023, + 44.3146008 + ], + [ + -94.4572336, + 44.3141961 + ], + [ + -94.4571306, + 44.3140871 + ], + [ + -94.4571249, + 44.314081 + ], + [ + -94.4570638, + 44.314016 + ], + [ + -94.4570362, + 44.3139867 + ], + [ + -94.4567848, + 44.3137214 + ], + [ + -94.4567703, + 44.313706 + ], + [ + -94.4566761, + 44.3136052 + ], + [ + -94.456215, + 44.3131163 + ], + [ + -94.4558541, + 44.3127334 + ], + [ + -94.4553012, + 44.3121457 + ], + [ + -94.4549329, + 44.3117587 + ], + [ + -94.4548309, + 44.3116517 + ], + [ + -94.4548103, + 44.31163 + ], + [ + -94.4546995, + 44.3115113 + ], + [ + -94.4543747, + 44.311165 + ], + [ + -94.4540227, + 44.3107944 + ], + [ + -94.4534556, + 44.3101983 + ], + [ + -94.4534453, + 44.3101874 + ], + [ + -94.4530753, + 44.3097944 + ], + [ + -94.4525222, + 44.3092062 + ], + [ + -94.4521494, + 44.3088094 + ], + [ + -94.4516057, + 44.3082319 + ], + [ + -94.4512462, + 44.3078526 + ], + [ + -94.4506794, + 44.3072548 + ], + [ + -94.4506736, + 44.3072486 + ], + [ + -94.450428, + 44.306988 + ], + [ + -94.4502976, + 44.3068498 + ], + [ + -94.4497579, + 44.3062801 + ], + [ + -94.4497535, + 44.3062755 + ], + [ + -94.4493889, + 44.3058889 + ], + [ + -94.4488344, + 44.3053027 + ], + [ + -94.4484665, + 44.304917 + ], + [ + -94.4484632, + 44.3049136 + ], + [ + -94.4479843, + 44.3044098 + ], + [ + -94.4479213, + 44.3043439 + ], + [ + -94.4479132, + 44.3043354 + ], + [ + -94.4478426, + 44.304261 + ], + [ + -94.447526, + 44.3039295 + ], + [ + -94.4475192, + 44.3039225 + ], + [ + -94.4472639, + 44.3036533 + ], + [ + -94.4469866, + 44.3033632 + ], + [ + -94.4469744, + 44.3033503 + ], + [ + -94.4466211, + 44.302976 + ], + [ + -94.4460532, + 44.3023752 + ], + [ + -94.4456716, + 44.3019727 + ], + [ + -94.4456603, + 44.3019607 + ], + [ + -94.4455274, + 44.3018188 + ], + [ + -94.4451374, + 44.3014035 + ], + [ + -94.444757, + 44.3010066 + ], + [ + -94.4442136, + 44.3004402 + ], + [ + -94.4442098, + 44.3004362 + ], + [ + -94.4438428, + 44.3000522 + ], + [ + -94.4432871, + 44.2994704 + ], + [ + -94.4429128, + 44.2990792 + ], + [ + -94.4429086, + 44.2990747 + ], + [ + -94.4423466, + 44.2984847 + ], + [ + -94.4423303, + 44.2984674 + ], + [ + -94.442008, + 44.2981234 + ], + [ + -94.4414432, + 44.2975432 + ], + [ + -94.4413891, + 44.297486 + ], + [ + -94.4409943, + 44.2970574 + ], + [ + -94.4404907, + 44.2965266 + ], + [ + -94.4404683, + 44.2965026 + ], + [ + -94.4404138, + 44.2964439 + ], + [ + -94.4401556, + 44.2964625 + ], + [ + -94.4394173, + 44.2964106 + ], + [ + -94.4387075, + 44.2962555 + ], + [ + -94.438054, + 44.2960034 + ], + [ + -94.4374821, + 44.2956641 + ], + [ + -94.437014, + 44.2952507 + ], + [ + -94.4369294, + 44.2951587 + ], + [ + -94.4368658, + 44.2950906 + ], + [ + -94.4366714, + 44.2948581 + ], + [ + -94.4366425, + 44.2948191 + ], + [ + -94.436626, + 44.294794 + ], + [ + -94.4365955, + 44.2947617 + ], + [ + -94.436578, + 44.2947495 + ], + [ + -94.436562, + 44.2947365 + ], + [ + -94.4361303, + 44.2943074 + ], + [ + -94.4358235, + 44.2938261 + ], + [ + -94.4356533, + 44.293311 + ], + [ + -94.4356263, + 44.292782 + ], + [ + -94.4357435, + 44.2922593 + ], + [ + -94.4360005, + 44.2917632 + ], + [ + -94.4363872, + 44.2913125 + ], + [ + -94.4368889, + 44.2909247 + ], + [ + -94.4374863, + 44.2906147 + ], + [ + -94.4381564, + 44.2903943 + ], + [ + -94.4388735, + 44.290272 + ], + [ + -94.43961, + 44.2902526 + ], + [ + -94.4403377, + 44.2903368 + ], + [ + -94.4408911, + 44.2904846 + ], + [ + -94.441302, + 44.2904486 + ], + [ + -94.4419955, + 44.2904805 + ], + [ + -94.442669, + 44.2906034 + ], + [ + -94.4432995, + 44.2908133 + ], + [ + -94.4438655, + 44.291103 + ], + [ + -94.4439785, + 44.291173 + ], + [ + -94.4440391, + 44.2912113 + ], + [ + -94.444335, + 44.2914028 + ], + [ + -94.444442, + 44.2914713 + ], + [ + -94.4446767, + 44.2916353 + ], + [ + -94.4454007, + 44.2921873 + ], + [ + -94.445639, + 44.2923877 + ], + [ + -94.445809, + 44.2925457 + ], + [ + -94.4459019, + 44.2926359 + ], + [ + -94.4460469, + 44.2927828 + ], + [ + -94.4460535, + 44.2927896 + ], + [ + -94.4461515, + 44.2928896 + ], + [ + -94.4462066, + 44.2929473 + ], + [ + -94.4467164, + 44.2934973 + ], + [ + -94.4472231, + 44.2940313 + ], + [ + -94.4472517, + 44.2940619 + ], + [ + -94.4476342, + 44.2944771 + ], + [ + -94.4481906, + 44.2950487 + ], + [ + -94.4482286, + 44.2950885 + ], + [ + -94.4485615, + 44.2954438 + ], + [ + -94.4491132, + 44.296023 + ], + [ + -94.4494861, + 44.2964127 + ], + [ + -94.4500433, + 44.296996 + ], + [ + -94.4504082, + 44.2973777 + ], + [ + -94.4509503, + 44.2979427 + ], + [ + -94.4513424, + 44.2983519 + ], + [ + -94.4513624, + 44.298373 + ], + [ + -94.4517634, + 44.2988 + ], + [ + -94.4517656, + 44.2988023 + ], + [ + -94.4518939, + 44.2989392 + ], + [ + -94.4522712, + 44.2993372 + ], + [ + -94.4522741, + 44.2993402 + ], + [ + -94.4528441, + 44.2999432 + ], + [ + -94.4531934, + 44.3003132 + ], + [ + -94.4534682, + 44.3006008 + ], + [ + -94.4534756, + 44.3006085 + ], + [ + -94.4537312, + 44.3008779 + ], + [ + -94.4540479, + 44.3012094 + ], + [ + -94.4540546, + 44.3012165 + ], + [ + -94.4541246, + 44.3012902 + ], + [ + -94.4541865, + 44.301355 + ], + [ + -94.4541926, + 44.3013613 + ], + [ + -94.454673, + 44.3018666 + ], + [ + -94.4550434, + 44.3022549 + ], + [ + -94.4550516, + 44.3022635 + ], + [ + -94.4556116, + 44.3028555 + ], + [ + -94.4556144, + 44.3028585 + ], + [ + -94.4559782, + 44.3032441 + ], + [ + -94.456518, + 44.3038138 + ], + [ + -94.4565225, + 44.3038185 + ], + [ + -94.4566555, + 44.3039595 + ], + [ + -94.4568993, + 44.3042182 + ], + [ + -94.4574634, + 44.3048131 + ], + [ + -94.4578269, + 44.3051966 + ], + [ + -94.4578333, + 44.3052034 + ], + [ + -94.4583813, + 44.3057854 + ], + [ + -94.4583835, + 44.3057877 + ], + [ + -94.4587561, + 44.3061842 + ], + [ + -94.4593071, + 44.3067701 + ], + [ + -94.4596714, + 44.3071571 + ], + [ + -94.4602342, + 44.3077486 + ], + [ + -94.460595, + 44.3081285 + ], + [ + -94.4606072, + 44.3081414 + ], + [ + -94.4609402, + 44.3084964 + ], + [ + -94.4609445, + 44.308501 + ], + [ + -94.4610473, + 44.308611 + ], + [ + -94.46114, + 44.3087082 + ], + [ + -94.4613708, + 44.3089507 + ], + [ + -94.4617473, + 44.3088029 + ], + [ + -94.4624509, + 44.3086445 + ], + [ + -94.463184, + 44.3085877 + ], + [ + -94.4639184, + 44.3086347 + ], + [ + -94.464626, + 44.3087836 + ], + [ + -94.4652795, + 44.3090289 + ], + [ + -94.4658538, + 44.309361 + ], + [ + -94.4663268, + 44.3097672 + ], + [ + -94.466381, + 44.3098243 + ], + [ + -94.4667603, + 44.3102225 + ], + [ + -94.4667698, + 44.3102325 + ], + [ + -94.4671198, + 44.3106035 + ], + [ + -94.4674715, + 44.3110688 + ], + [ + -94.46769, + 44.3115743 + ], + [ + -94.4677669, + 44.3121008 + ], + [ + -94.4676993, + 44.312628 + ], + [ + -94.4674898, + 44.3131355 + ], + [ + -94.4671464, + 44.313604 + ], + [ + -94.4666823, + 44.3140153 + ], + [ + -94.4661153, + 44.3143538 + ], + [ + -94.4654673, + 44.3146063 + ], + [ + -94.4647631, + 44.3147632 + ], + [ + -94.4640298, + 44.3148184 + ], + [ + -94.4632956, + 44.3147698 + ], + [ + -94.4629201, + 44.3146899 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149555_s_4149556", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4708913, + 44.310774 + ], + [ + -94.4707792, + 44.310846 + ], + [ + -94.4706622, + 44.310914 + ], + [ + -94.4703774, + 44.3110642 + ], + [ + -94.4700714, + 44.3112102 + ], + [ + -94.4700671, + 44.3112122 + ], + [ + -94.4694976, + 44.3114831 + ], + [ + -94.4694041, + 44.311528 + ], + [ + -94.4693476, + 44.3115546 + ], + [ + -94.4692628, + 44.3115938 + ], + [ + -94.4692019, + 44.3120911 + ], + [ + -94.4689939, + 44.3126012 + ], + [ + -94.4686507, + 44.3130723 + ], + [ + -94.4681856, + 44.3134859 + ], + [ + -94.4676167, + 44.3138261 + ], + [ + -94.4675421, + 44.3138624 + ], + [ + -94.4669309, + 44.3141605 + ], + [ + -94.4663453, + 44.3144463 + ], + [ + -94.4663175, + 44.3144598 + ], + [ + -94.4662235, + 44.3145048 + ], + [ + -94.4655752, + 44.3147532 + ], + [ + -94.464872, + 44.3149064 + ], + [ + -94.4641408, + 44.3149584 + ], + [ + -94.4634094, + 44.3149074 + ], + [ + -94.4627058, + 44.3147553 + ], + [ + -94.4620569, + 44.3145078 + ], + [ + -94.4614873, + 44.3141745 + ], + [ + -94.4610189, + 44.313768 + ], + [ + -94.4609879, + 44.313735 + ], + [ + -94.4609816, + 44.3137283 + ], + [ + -94.4609407, + 44.3136845 + ], + [ + -94.4608838, + 44.3136237 + ], + [ + -94.4605347, + 44.3131574 + ], + [ + -94.460319, + 44.3126512 + ], + [ + -94.460245, + 44.3121245 + ], + [ + -94.4603155, + 44.3115975 + ], + [ + -94.4605279, + 44.3110906 + ], + [ + -94.4608203, + 44.3106955 + ], + [ + -94.4608134, + 44.3106512 + ], + [ + -94.4608763, + 44.3101239 + ], + [ + -94.4610813, + 44.3096155 + ], + [ + -94.4614204, + 44.3091457 + ], + [ + -94.4618806, + 44.3087323 + ], + [ + -94.4624442, + 44.3083913 + ], + [ + -94.4637967, + 44.307724 + ], + [ + -94.4644672, + 44.3073897 + ], + [ + -94.4645734, + 44.3073387 + ], + [ + -94.4651714, + 44.3070617 + ], + [ + -94.4651766, + 44.3070593 + ], + [ + -94.4652521, + 44.3070245 + ], + [ + -94.465324, + 44.3069899 + ], + [ + -94.4653371, + 44.3069837 + ], + [ + -94.4659109, + 44.3067108 + ], + [ + -94.4660333, + 44.3066523 + ], + [ + -94.4665755, + 44.3063436 + ], + [ + -94.4668025, + 44.3062408 + ], + [ + -94.4668972, + 44.306197 + ], + [ + -94.4669882, + 44.3061543 + ], + [ + -94.4671402, + 44.3060815 + ], + [ + -94.4672885, + 44.3060062 + ], + [ + -94.4674794, + 44.3059093 + ], + [ + -94.467942, + 44.3056723 + ], + [ + -94.4685416, + 44.3053589 + ], + [ + -94.468613, + 44.3053224 + ], + [ + -94.469248, + 44.3050064 + ], + [ + -94.4692843, + 44.3049886 + ], + [ + -94.4693475, + 44.3049579 + ], + [ + -94.4699418, + 44.3046676 + ], + [ + -94.4710271, + 44.3041279 + ], + [ + -94.4716714, + 44.3038706 + ], + [ + -94.4723731, + 44.3037086 + ], + [ + -94.4731055, + 44.3036479 + ], + [ + -94.4738402, + 44.303691 + ], + [ + -94.4745491, + 44.3038363 + ], + [ + -94.4752049, + 44.304078 + ], + [ + -94.4757825, + 44.304407 + ], + [ + -94.4762596, + 44.3048105 + ], + [ + -94.4766179, + 44.3052732 + ], + [ + -94.4768436, + 44.3057771 + ], + [ + -94.4769281, + 44.306303 + ], + [ + -94.4768681, + 44.3068307 + ], + [ + -94.4766659, + 44.3073397 + ], + [ + -94.4763292, + 44.3078107 + ], + [ + -94.4758711, + 44.3082255 + ], + [ + -94.4753091, + 44.3085681 + ], + [ + -94.4742111, + 44.3091141 + ], + [ + -94.4741855, + 44.3091267 + ], + [ + -94.4735735, + 44.3094257 + ], + [ + -94.4735639, + 44.3094304 + ], + [ + -94.4735141, + 44.3094545 + ], + [ + -94.4729332, + 44.3097436 + ], + [ + -94.4723546, + 44.3100461 + ], + [ + -94.4723255, + 44.3100612 + ], + [ + -94.4718415, + 44.3103092 + ], + [ + -94.471828, + 44.3103161 + ], + [ + -94.4716313, + 44.3104159 + ], + [ + -94.4714407, + 44.3105127 + ], + [ + -94.4713545, + 44.3105552 + ], + [ + -94.4711455, + 44.3106552 + ], + [ + -94.4711184, + 44.3106681 + ], + [ + -94.4710034, + 44.3107221 + ], + [ + -94.4709825, + 44.3107318 + ], + [ + -94.4708913, + 44.310774 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149556_s_4149557", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4806531, + 44.3058345 + ], + [ + -94.4811094, + 44.3059301 + ], + [ + -94.4817633, + 44.3061745 + ], + [ + -94.4823382, + 44.3065059 + ], + [ + -94.4828121, + 44.3069114 + ], + [ + -94.4831666, + 44.3073756 + ], + [ + -94.4833883, + 44.3078805 + ], + [ + -94.4834685, + 44.3084067 + ], + [ + -94.4834043, + 44.308934 + ], + [ + -94.4831979, + 44.3094423 + ], + [ + -94.4828575, + 44.3099118 + ], + [ + -94.482396, + 44.3103247 + ], + [ + -94.4818312, + 44.3106649 + ], + [ + -94.4816622, + 44.3107479 + ], + [ + -94.4816491, + 44.3107543 + ], + [ + -94.4811605, + 44.3109921 + ], + [ + -94.4810459, + 44.311048 + ], + [ + -94.4803941, + 44.3113019 + ], + [ + -94.4796856, + 44.3114591 + ], + [ + -94.4789478, + 44.3115134 + ], + [ + -94.4782096, + 44.3114627 + ], + [ + -94.4774996, + 44.311309 + ], + [ + -94.4768454, + 44.3110583 + ], + [ + -94.4762725, + 44.3107202 + ], + [ + -94.4758031, + 44.310308 + ], + [ + -94.47546, + 44.3099374 + ], + [ + -94.4750248, + 44.3094853 + ], + [ + -94.4747773, + 44.309233 + ], + [ + -94.4747451, + 44.3091996 + ], + [ + -94.4744389, + 44.3088773 + ], + [ + -94.4739723, + 44.308986 + ], + [ + -94.4732402, + 44.309048 + ], + [ + -94.4725052, + 44.3090062 + ], + [ + -94.4717957, + 44.3088622 + ], + [ + -94.471139, + 44.3086217 + ], + [ + -94.4705603, + 44.3082938 + ], + [ + -94.4700817, + 44.3078911 + ], + [ + -94.4697218, + 44.307429 + ], + [ + -94.4694944, + 44.3069255 + ], + [ + -94.4694081, + 44.3063997 + ], + [ + -94.4694663, + 44.305872 + ], + [ + -94.4696667, + 44.3053626 + ], + [ + -94.4700017, + 44.304891 + ], + [ + -94.4704584, + 44.3044754 + ], + [ + -94.4710192, + 44.3041318 + ], + [ + -94.4710652, + 44.3041088 + ], + [ + -94.4710738, + 44.3041045 + ], + [ + -94.4717444, + 44.3037713 + ], + [ + -94.4719979, + 44.303645 + ], + [ + -94.4720053, + 44.3036413 + ], + [ + -94.4721129, + 44.303588 + ], + [ + -94.4732725, + 44.3030107 + ], + [ + -94.4732819, + 44.303006 + ], + [ + -94.4733749, + 44.30296 + ], + [ + -94.4740268, + 44.3027019 + ], + [ + -94.4747367, + 44.302541 + ], + [ + -94.4754769, + 44.3024836 + ], + [ + -94.4762183, + 44.3025322 + ], + [ + -94.4769318, + 44.3026846 + ], + [ + -94.4775896, + 44.302935 + ], + [ + -94.4781657, + 44.3032735 + ], + [ + -94.4786378, + 44.303687 + ], + [ + -94.4787012, + 44.3037554 + ], + [ + -94.4787378, + 44.3037948 + ], + [ + -94.479221, + 44.3043131 + ], + [ + -94.479505, + 44.3046115 + ], + [ + -94.4795223, + 44.3046299 + ], + [ + -94.4803606, + 44.3055266 + ], + [ + -94.4806531, + 44.3058345 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149557_s_4149558", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4834933, + 44.3058357 + ], + [ + -94.4835193, + 44.3058456 + ], + [ + -94.4840891, + 44.3061815 + ], + [ + -94.4845569, + 44.3065907 + ], + [ + -94.4849044, + 44.3070575 + ], + [ + -94.4851184, + 44.3075641 + ], + [ + -94.4851907, + 44.3080909 + ], + [ + -94.4851185, + 44.3086178 + ], + [ + -94.4849045, + 44.3091244 + ], + [ + -94.484557, + 44.3095912 + ], + [ + -94.4840893, + 44.3100005 + ], + [ + -94.4835194, + 44.3103363 + ], + [ + -94.4828692, + 44.3105859 + ], + [ + -94.4821637, + 44.3107396 + ], + [ + -94.4815275, + 44.3107845 + ], + [ + -94.4815271, + 44.3107847 + ], + [ + -94.4821498, + 44.3107415 + ], + [ + -94.4815919, + 44.3107905 + ], + [ + -94.4815163, + 44.310789 + ], + [ + -94.4811866, + 44.310919 + ], + [ + -94.4804836, + 44.3110784 + ], + [ + -94.4797507, + 44.3111363 + ], + [ + -94.4790162, + 44.3110904 + ], + [ + -94.4783083, + 44.3109425 + ], + [ + -94.4776542, + 44.3106982 + ], + [ + -94.477079, + 44.310367 + ], + [ + -94.4766049, + 44.3099616 + ], + [ + -94.47625, + 44.3094976 + ], + [ + -94.476028, + 44.3089928 + ], + [ + -94.4759475, + 44.3084666 + ], + [ + -94.4760114, + 44.3079392 + ], + [ + -94.4762175, + 44.3074309 + ], + [ + -94.4765576, + 44.3069613 + ], + [ + -94.4770188, + 44.3065483 + ], + [ + -94.4775833, + 44.3062078 + ], + [ + -94.4781234, + 44.3059423 + ], + [ + -94.4783825, + 44.3058147 + ], + [ + -94.478386, + 44.305813 + ], + [ + -94.4785498, + 44.3057326 + ], + [ + -94.4788256, + 44.3055961 + ], + [ + -94.4794746, + 44.3053388 + ], + [ + -94.4801813, + 44.3051779 + ], + [ + -94.4809183, + 44.3051197 + ], + [ + -94.4816568, + 44.3051664 + ], + [ + -94.4823681, + 44.3053163 + ], + [ + -94.4830248, + 44.3055635 + ], + [ + -94.4834933, + 44.3058357 + ] + ], + [ + [ + -94.4814771, + 44.3107882 + ], + [ + -94.4814764, + 44.3107882 + ], + [ + -94.48143, + 44.3107914 + ], + [ + -94.4814771, + 44.3107882 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149558_s_4149560", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.5009099, + 44.3235544 + ], + [ + -94.5009251, + 44.3236257 + ], + [ + -94.5009461, + 44.3237377 + ], + [ + -94.5009615, + 44.3238325 + ], + [ + -94.5009758, + 44.3239365 + ], + [ + -94.5009901, + 44.3240364 + ], + [ + -94.5010015, + 44.3241338 + ], + [ + -94.5010085, + 44.3242098 + ], + [ + -94.5010094, + 44.3242197 + ], + [ + -94.5010154, + 44.3242887 + ], + [ + -94.5010204, + 44.3243624 + ], + [ + -94.5010245, + 44.3244444 + ], + [ + -94.5010268, + 44.3245389 + ], + [ + -94.5010268, + 44.3246339 + ], + [ + -94.5010263, + 44.3246777 + ], + [ + -94.5010234, + 44.3248041 + ], + [ + -94.501009, + 44.3257266 + ], + [ + -94.5010108, + 44.3259277 + ], + [ + -94.5010109, + 44.3259449 + ], + [ + -94.5010109, + 44.3262289 + ], + [ + -94.5009381, + 44.3267576 + ], + [ + -94.5007226, + 44.3272658 + ], + [ + -94.5003726, + 44.3277339 + ], + [ + -94.4999017, + 44.3281438 + ], + [ + -94.4993281, + 44.3284795 + ], + [ + -94.4986741, + 44.3287282 + ], + [ + -94.4979649, + 44.3288801 + ], + [ + -94.497228, + 44.3289294 + ], + [ + -94.4949859, + 44.3289204 + ], + [ + -94.4929577, + 44.3289116 + ], + [ + -94.4929382, + 44.3289119 + ], + [ + -94.4928942, + 44.3289136 + ], + [ + -94.4928891, + 44.3289139 + ], + [ + -94.4928765, + 44.3289307 + ], + [ + -94.4924088, + 44.32934 + ], + [ + -94.4923456, + 44.3293773 + ], + [ + -94.4921708, + 44.3296784 + ], + [ + -94.4921578, + 44.3296974 + ], + [ + -94.4921016, + 44.3297763 + ], + [ + -94.4920786, + 44.3298073 + ], + [ + -94.4918885, + 44.3300357 + ], + [ + -94.4918755, + 44.3300497 + ], + [ + -94.4917613, + 44.3301659 + ], + [ + -94.4917343, + 44.3301919 + ], + [ + -94.4914309, + 44.3304489 + ], + [ + -94.4913439, + 44.3305139 + ], + [ + -94.4911672, + 44.3306375 + ], + [ + -94.4911382, + 44.3306565 + ], + [ + -94.4909931, + 44.3307468 + ], + [ + -94.4909913, + 44.3307479 + ], + [ + -94.4909602, + 44.3307668 + ], + [ + -94.4907792, + 44.3308701 + ], + [ + -94.4907512, + 44.3308851 + ], + [ + -94.4905859, + 44.3309688 + ], + [ + -94.4903613, + 44.3310762 + ], + [ + -94.4901976, + 44.3311545 + ], + [ + -94.4895714, + 44.3313964 + ], + [ + -94.4888929, + 44.3315493 + ], + [ + -94.4881865, + 44.3316079 + ], + [ + -94.4874773, + 44.33157 + ], + [ + -94.4867907, + 44.3314369 + ], + [ + -94.4861513, + 44.3312136 + ], + [ + -94.4855818, + 44.3309078 + ], + [ + -94.4851027, + 44.3305306 + ], + [ + -94.4848603, + 44.3302991 + ], + [ + -94.484528, + 44.3299826 + ], + [ + -94.4844965, + 44.3299523 + ], + [ + -94.4843444, + 44.3298031 + ], + [ + -94.4842983, + 44.329758 + ], + [ + -94.4842441, + 44.3297049 + ], + [ + -94.4838574, + 44.329231 + ], + [ + -94.4836123, + 44.3287109 + ], + [ + -94.4835188, + 44.3281659 + ], + [ + -94.4835808, + 44.3276186 + ], + [ + -94.4837958, + 44.3270916 + ], + [ + -94.4841549, + 44.3266067 + ], + [ + -94.4846432, + 44.326184 + ], + [ + -94.4852404, + 44.3258409 + ], + [ + -94.4854285, + 44.3257538 + ], + [ + -94.4862769, + 44.3253598 + ], + [ + -94.4863022, + 44.3253479 + ], + [ + -94.4863125, + 44.3253431 + ], + [ + -94.4866305, + 44.3251951 + ], + [ + -94.4866348, + 44.3251931 + ], + [ + -94.4870337, + 44.325008 + ], + [ + -94.4871444, + 44.3249564 + ], + [ + -94.4873731, + 44.3248489 + ], + [ + -94.4874006, + 44.3248361 + ], + [ + -94.4878776, + 44.3246161 + ], + [ + -94.4879612, + 44.3245786 + ], + [ + -94.4881152, + 44.3245116 + ], + [ + -94.4881561, + 44.3244941 + ], + [ + -94.4883761, + 44.3244011 + ], + [ + -94.488479, + 44.3243591 + ], + [ + -94.488675, + 44.3242821 + ], + [ + -94.4888017, + 44.3242346 + ], + [ + -94.4889497, + 44.3241816 + ], + [ + -94.4890447, + 44.3241487 + ], + [ + -94.4890837, + 44.3241357 + ], + [ + -94.4891122, + 44.3241263 + ], + [ + -94.4892502, + 44.3240813 + ], + [ + -94.4893327, + 44.3240553 + ], + [ + -94.4895127, + 44.3240003 + ], + [ + -94.4896598, + 44.323958 + ], + [ + -94.4898188, + 44.323915 + ], + [ + -94.489944, + 44.3238829 + ], + [ + -94.490097, + 44.3238459 + ], + [ + -94.4901692, + 44.323829 + ], + [ + -94.4902622, + 44.323808 + ], + [ + -94.4903635, + 44.3237863 + ], + [ + -94.4905205, + 44.3237543 + ], + [ + -94.4906753, + 44.3237252 + ], + [ + -94.4909323, + 44.3236812 + ], + [ + -94.4910872, + 44.3236572 + ], + [ + -94.4912162, + 44.3236392 + ], + [ + -94.4912494, + 44.3236347 + ], + [ + -94.4913924, + 44.3236157 + ], + [ + -94.4915698, + 44.3235922 + ], + [ + -94.4917656, + 44.3235701 + ], + [ + -94.4919476, + 44.3235531 + ], + [ + -94.4921092, + 44.3235406 + ], + [ + -94.4922382, + 44.3235326 + ], + [ + -94.4922869, + 44.3235298 + ], + [ + -94.4923629, + 44.3235258 + ], + [ + -94.4924691, + 44.3235213 + ], + [ + -94.4924816, + 44.3235209 + ], + [ + -94.49259, + 44.3235166 + ], + [ + -94.4927178, + 44.3235132 + ], + [ + -94.4928518, + 44.3235112 + ], + [ + -94.4929528, + 44.3235106 + ], + [ + -94.4930756, + 44.3235112 + ], + [ + -94.4930746, + 44.3235098 + ], + [ + -94.4930116, + 44.3234294 + ], + [ + -94.4929279, + 44.3233286 + ], + [ + -94.492898, + 44.3232918 + ], + [ + -94.492882, + 44.3232718 + ], + [ + -94.4928814, + 44.3232711 + ], + [ + -94.49259, + 44.3229499 + ], + [ + -94.4923409, + 44.3226758 + ], + [ + -94.4923143, + 44.3226462 + ], + [ + -94.4922083, + 44.3225261 + ], + [ + -94.4922057, + 44.3225232 + ], + [ + -94.4920892, + 44.322391 + ], + [ + -94.4918955, + 44.3221788 + ], + [ + -94.4915939, + 44.322099 + ], + [ + -94.4901328, + 44.321713 + ], + [ + -94.4899416, + 44.3216628 + ], + [ + -94.4899238, + 44.3216581 + ], + [ + -94.4897277, + 44.3216057 + ], + [ + -94.4894562, + 44.3215344 + ], + [ + -94.4887587, + 44.3213516 + ], + [ + -94.4887544, + 44.3213505 + ], + [ + -94.4885074, + 44.3212855 + ], + [ + -94.4878014, + 44.3210994 + ], + [ + -94.4876086, + 44.3210488 + ], + [ + -94.4876007, + 44.3210467 + ], + [ + -94.4874034, + 44.3209944 + ], + [ + -94.487131, + 44.3209232 + ], + [ + -94.4870952, + 44.3209137 + ], + [ + -94.4869322, + 44.3208697 + ], + [ + -94.4867604, + 44.3208198 + ], + [ + -94.4867416, + 44.3208139 + ], + [ + -94.4867109, + 44.3208048 + ], + [ + -94.48657, + 44.3207603 + ], + [ + -94.486513, + 44.3207413 + ], + [ + -94.4864726, + 44.3207276 + ], + [ + -94.4864406, + 44.3207166 + ], + [ + -94.4863078, + 44.3206687 + ], + [ + -94.4862498, + 44.3206467 + ], + [ + -94.4860853, + 44.3205804 + ], + [ + -94.4860103, + 44.3205484 + ], + [ + -94.4858496, + 44.3204758 + ], + [ + -94.4857616, + 44.3204338 + ], + [ + -94.4855579, + 44.3203295 + ], + [ + -94.4854669, + 44.3202795 + ], + [ + -94.4852832, + 44.3201717 + ], + [ + -94.4852112, + 44.3201267 + ], + [ + -94.4851483, + 44.3200865 + ], + [ + -94.4850963, + 44.3200525 + ], + [ + -94.4849042, + 44.3199176 + ], + [ + -94.4848472, + 44.3198746 + ], + [ + -94.4847179, + 44.3197719 + ], + [ + -94.4846629, + 44.3197259 + ], + [ + -94.4845213, + 44.3196001 + ], + [ + -94.4844663, + 44.3195481 + ], + [ + -94.4844281, + 44.3195113 + ], + [ + -94.4843791, + 44.3194633 + ], + [ + -94.4842998, + 44.3193825 + ], + [ + -94.4842417, + 44.319321 + ], + [ + -94.4841457, + 44.3192214 + ], + [ + -94.4841198, + 44.3191942 + ], + [ + -94.483541, + 44.3185776 + ], + [ + -94.4834486, + 44.3184798 + ], + [ + -94.4829398, + 44.3179671 + ], + [ + -94.4829199, + 44.3179468 + ], + [ + -94.4828469, + 44.3178718 + ], + [ + -94.4828097, + 44.3178328 + ], + [ + -94.4827497, + 44.3177688 + ], + [ + -94.482739, + 44.3177574 + ], + [ + -94.4825102, + 44.3175106 + ], + [ + -94.4820996, + 44.3170797 + ], + [ + -94.4820873, + 44.3170667 + ], + [ + -94.4809783, + 44.3158881 + ], + [ + -94.4802944, + 44.3151714 + ], + [ + -94.4802915, + 44.3151684 + ], + [ + -94.4796035, + 44.3144454 + ], + [ + -94.4795511, + 44.3143888 + ], + [ + -94.4790442, + 44.3138262 + ], + [ + -94.4789095, + 44.3136805 + ], + [ + -94.4788369, + 44.3135988 + ], + [ + -94.4787139, + 44.3134548 + ], + [ + -94.4785968, + 44.3133075 + ], + [ + -94.4785658, + 44.3132655 + ], + [ + -94.4784966, + 44.3131669 + ], + [ + -94.4784826, + 44.3131459 + ], + [ + -94.4784799, + 44.3131412 + ], + [ + -94.4779614, + 44.3125951 + ], + [ + -94.4779585, + 44.312592 + ], + [ + -94.4774975, + 44.312105 + ], + [ + -94.4774872, + 44.312094 + ], + [ + -94.4768737, + 44.311439 + ], + [ + -94.4768033, + 44.311365 + ], + [ + -94.4766119, + 44.3111636 + ], + [ + -94.4762016, + 44.3107322 + ], + [ + -94.4761874, + 44.3107173 + ], + [ + -94.4759636, + 44.3104786 + ], + [ + -94.4758198, + 44.3103259 + ], + [ + -94.4754688, + 44.3098608 + ], + [ + -94.4752509, + 44.3093555 + ], + [ + -94.4751743, + 44.3088294 + ], + [ + -94.475242, + 44.3083027 + ], + [ + -94.4754514, + 44.3077955 + ], + [ + -94.4757945, + 44.3073274 + ], + [ + -94.476258, + 44.3069163 + ], + [ + -94.4768243, + 44.306578 + ], + [ + -94.4769393, + 44.306522 + ], + [ + -94.4774219, + 44.3062871 + ], + [ + -94.4781236, + 44.3059422 + ], + [ + -94.4783825, + 44.3058147 + ], + [ + -94.478386, + 44.305813 + ], + [ + -94.4785498, + 44.3057326 + ], + [ + -94.4788256, + 44.3055962 + ], + [ + -94.4794865, + 44.3052692 + ], + [ + -94.4801329, + 44.3050127 + ], + [ + -94.4808367, + 44.3048518 + ], + [ + -94.4815706, + 44.3047928 + ], + [ + -94.4823065, + 44.3048379 + ], + [ + -94.4830159, + 44.3049855 + ], + [ + -94.4836714, + 44.3052297 + ], + [ + -94.4842479, + 44.3055613 + ], + [ + -94.484723, + 44.3059674 + ], + [ + -94.484805, + 44.3060534 + ], + [ + -94.4848244, + 44.3060739 + ], + [ + -94.4848674, + 44.3061199 + ], + [ + -94.4851171, + 44.3064295 + ], + [ + -94.4851391, + 44.3064615 + ], + [ + -94.4853064, + 44.3067444 + ], + [ + -94.4853164, + 44.3067644 + ], + [ + -94.4854157, + 44.3069947 + ], + [ + -94.4854237, + 44.3070167 + ], + [ + -94.4854689, + 44.3071562 + ], + [ + -94.4854769, + 44.3071842 + ], + [ + -94.4855341, + 44.3074514 + ], + [ + -94.4855401, + 44.3074934 + ], + [ + -94.4855472, + 44.3075493 + ], + [ + -94.4855572, + 44.3076373 + ], + [ + -94.4855547, + 44.3080984 + ], + [ + -94.4855507, + 44.3081304 + ], + [ + -94.4854931, + 44.3084172 + ], + [ + -94.4854881, + 44.3084352 + ], + [ + -94.4853004, + 44.3088943 + ], + [ + -94.4850028, + 44.3093224 + ], + [ + -94.4849908, + 44.3093364 + ], + [ + -94.4844855, + 44.3098027 + ], + [ + -94.4844625, + 44.3098197 + ], + [ + -94.4844417, + 44.3098323 + ], + [ + -94.4849284, + 44.3103448 + ], + [ + -94.4851346, + 44.3106412 + ], + [ + -94.4852137, + 44.3107338 + ], + [ + -94.4853234, + 44.3108525 + ], + [ + -94.4853477, + 44.3108791 + ], + [ + -94.485841, + 44.3114266 + ], + [ + -94.4865009, + 44.31212 + ], + [ + -94.4871905, + 44.3128425 + ], + [ + -94.4872045, + 44.3128572 + ], + [ + -94.4883144, + 44.3140367 + ], + [ + -94.4887323, + 44.3144752 + ], + [ + -94.4887589, + 44.3145035 + ], + [ + -94.4889955, + 44.3147588 + ], + [ + -94.4890318, + 44.3147975 + ], + [ + -94.489076, + 44.3148429 + ], + [ + -94.4896, + 44.3153708 + ], + [ + -94.4896496, + 44.315422 + ], + [ + -94.4897696, + 44.3155489 + ], + [ + -94.489776, + 44.3155558 + ], + [ + -94.4901638, + 44.3159689 + ], + [ + -94.4901992, + 44.3159782 + ], + [ + -94.4903893, + 44.3160282 + ], + [ + -94.4910971, + 44.3162147 + ], + [ + -94.4913413, + 44.316279 + ], + [ + -94.4920372, + 44.3164614 + ], + [ + -94.4923202, + 44.3165357 + ], + [ + -94.4923401, + 44.3165409 + ], + [ + -94.4925372, + 44.3165936 + ], + [ + -94.4927223, + 44.3166422 + ], + [ + -94.4927279, + 44.3166437 + ], + [ + -94.4941928, + 44.3170307 + ], + [ + -94.4948412, + 44.3172023 + ], + [ + -94.4948514, + 44.317205 + ], + [ + -94.4951884, + 44.317295 + ], + [ + -94.4953219, + 44.3173328 + ], + [ + -94.4953989, + 44.3173558 + ], + [ + -94.4954357, + 44.3173669 + ], + [ + -94.4955007, + 44.3173869 + ], + [ + -94.4958284, + 44.3175016 + ], + [ + -94.4958614, + 44.3175146 + ], + [ + -94.4958827, + 44.317523 + ], + [ + -94.4959427, + 44.317547 + ], + [ + -94.4960873, + 44.3176079 + ], + [ + -94.4961663, + 44.3176429 + ], + [ + -94.4962564, + 44.3176841 + ], + [ + -94.4963094, + 44.3177091 + ], + [ + -94.496461, + 44.3177845 + ], + [ + -94.496482, + 44.3177955 + ], + [ + -94.496508, + 44.3178093 + ], + [ + -94.496553, + 44.3178333 + ], + [ + -94.4967548, + 44.3179488 + ], + [ + -94.4968118, + 44.3179838 + ], + [ + -94.4969383, + 44.318065 + ], + [ + -94.4969963, + 44.318104 + ], + [ + -94.4970819, + 44.3181635 + ], + [ + -94.4971489, + 44.3182115 + ], + [ + -94.4973999, + 44.3184101 + ], + [ + -94.4974559, + 44.3184591 + ], + [ + -94.4975387, + 44.3185342 + ], + [ + -94.4976067, + 44.3185982 + ], + [ + -94.4977154, + 44.318706 + ], + [ + -94.4977834, + 44.318777 + ], + [ + -94.4978297, + 44.3188264 + ], + [ + -94.4983977, + 44.3194484 + ], + [ + -94.4984312, + 44.3194857 + ], + [ + -94.4985629, + 44.3196352 + ], + [ + -94.4986544, + 44.3197389 + ], + [ + -94.498891, + 44.3199991 + ], + [ + -94.4992258, + 44.320368 + ], + [ + -94.4992553, + 44.3204011 + ], + [ + -94.4992843, + 44.3204341 + ], + [ + -94.4993765, + 44.3205447 + ], + [ + -94.499399, + 44.3205733 + ], + [ + -94.499503, + 44.3206992 + ], + [ + -94.4995447, + 44.3207511 + ], + [ + -94.4996647, + 44.3209041 + ], + [ + -94.4997315, + 44.3209931 + ], + [ + -94.499767, + 44.3210425 + ], + [ + -94.4998034, + 44.321093 + ], + [ + -94.4998271, + 44.3211264 + ], + [ + -94.4999241, + 44.3212654 + ], + [ + -94.499954, + 44.3213092 + ], + [ + -94.499992, + 44.3213662 + ], + [ + -94.5000537, + 44.3214637 + ], + [ + -94.5001347, + 44.3215987 + ], + [ + -94.5001581, + 44.3216385 + ], + [ + -94.5002281, + 44.3217605 + ], + [ + -94.5002473, + 44.3217945 + ], + [ + -94.5002953, + 44.3218815 + ], + [ + -94.5003384, + 44.3219636 + ], + [ + -94.5003884, + 44.3220636 + ], + [ + -94.5004068, + 44.3221012 + ], + [ + -94.500433, + 44.3221561 + ], + [ + -94.500451, + 44.3221929 + ], + [ + -94.5005059, + 44.3223141 + ], + [ + -94.5005272, + 44.3223653 + ], + [ + -94.5005615, + 44.3224456 + ], + [ + -94.5005883, + 44.3225114 + ], + [ + -94.5006493, + 44.3226684 + ], + [ + -94.5006717, + 44.3227285 + ], + [ + -94.5007057, + 44.3228245 + ], + [ + -94.5007165, + 44.3228558 + ], + [ + -94.5007515, + 44.3229598 + ], + [ + -94.5007681, + 44.3230115 + ], + [ + -94.5008001, + 44.3231155 + ], + [ + -94.5008216, + 44.3231902 + ], + [ + -94.5008576, + 44.3233252 + ], + [ + -94.5008771, + 44.3234048 + ], + [ + -94.5008941, + 44.3234808 + ], + [ + -94.500898, + 44.3234984 + ], + [ + -94.50091, + 44.3235544 + ], + [ + -94.5009099, + 44.3235544 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149560_s_4149561", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.5003575, + 44.3289607 + ], + [ + -94.5002352, + 44.3290238 + ], + [ + -94.5001582, + 44.3290598 + ], + [ + -94.4998661, + 44.3291832 + ], + [ + -94.4997951, + 44.3292102 + ], + [ + -94.4994426, + 44.329328 + ], + [ + -94.4993736, + 44.329348 + ], + [ + -94.498926, + 44.3294548 + ], + [ + -94.498868, + 44.3294658 + ], + [ + -94.4985273, + 44.3295185 + ], + [ + -94.4984273, + 44.3295305 + ], + [ + -94.4981795, + 44.3295542 + ], + [ + -94.4981235, + 44.3295582 + ], + [ + -94.4979236, + 44.3295686 + ], + [ + -94.4978326, + 44.3295716 + ], + [ + -94.4976873, + 44.3295744 + ], + [ + -94.4974953, + 44.3295754 + ], + [ + -94.497468, + 44.3295754 + ], + [ + -94.497327, + 44.3295754 + ], + [ + -94.4972822, + 44.3295752 + ], + [ + -94.4969312, + 44.3295722 + ], + [ + -94.496765, + 44.3295682 + ], + [ + -94.496641, + 44.3295632 + ], + [ + -94.4962404, + 44.3295315 + ], + [ + -94.4961474, + 44.3295205 + ], + [ + -94.4956405, + 44.3294343 + ], + [ + -94.4955555, + 44.3294153 + ], + [ + -94.4951686, + 44.3293118 + ], + [ + -94.4951016, + 44.3292908 + ], + [ + -94.4948766, + 44.3292126 + ], + [ + -94.4943919, + 44.3292083 + ], + [ + -94.4942027, + 44.3292074 + ], + [ + -94.4941989, + 44.3292073 + ], + [ + -94.4940274, + 44.3292064 + ], + [ + -94.4936119, + 44.3292044 + ], + [ + -94.4930841, + 44.3292016 + ], + [ + -94.4930092, + 44.3292028 + ], + [ + -94.4929678, + 44.3292031 + ], + [ + -94.4928548, + 44.3292054 + ], + [ + -94.4928401, + 44.3292056 + ], + [ + -94.4928104, + 44.3292079 + ], + [ + -94.4926575, + 44.3292818 + ], + [ + -94.4926513, + 44.3292848 + ], + [ + -94.4924204, + 44.3293957 + ], + [ + -94.4923106, + 44.3294487 + ], + [ + -94.4918444, + 44.3296733 + ], + [ + -94.4911947, + 44.3299238 + ], + [ + -94.4904893, + 44.3300785 + ], + [ + -94.4897555, + 44.3301314 + ], + [ + -94.4890214, + 44.3300806 + ], + [ + -94.4883153, + 44.3299279 + ], + [ + -94.4876642, + 44.3296793 + ], + [ + -94.4870931, + 44.3293443 + ], + [ + -94.4866242, + 44.3289357 + ], + [ + -94.4862752, + 44.3284693 + ], + [ + -94.4860598, + 44.3279631 + ], + [ + -94.485986, + 44.3274363 + ], + [ + -94.4860569, + 44.3269094 + ], + [ + -94.4862696, + 44.3264025 + ], + [ + -94.4866159, + 44.3259352 + ], + [ + -94.4870827, + 44.3255253 + ], + [ + -94.4876518, + 44.3251887 + ], + [ + -94.4881162, + 44.324965 + ], + [ + -94.4882275, + 44.3249113 + ], + [ + -94.4882319, + 44.3249092 + ], + [ + -94.4884618, + 44.3247987 + ], + [ + -94.4886617, + 44.3247022 + ], + [ + -94.4887542, + 44.3246589 + ], + [ + -94.4889552, + 44.3245679 + ], + [ + -94.4891854, + 44.3244717 + ], + [ + -94.4893414, + 44.3244117 + ], + [ + -94.4894138, + 44.3243846 + ], + [ + -94.4895728, + 44.3243266 + ], + [ + -94.4895745, + 44.3243289 + ], + [ + -94.4898038, + 44.3242479 + ], + [ + -94.4899558, + 44.3242009 + ], + [ + -94.4901592, + 44.324143 + ], + [ + -94.4902512, + 44.324119 + ], + [ + -94.4903938, + 44.3240841 + ], + [ + -94.4905468, + 44.3240491 + ], + [ + -94.490737, + 44.3240095 + ], + [ + -94.490966, + 44.3239665 + ], + [ + -94.4912279, + 44.3239244 + ], + [ + -94.4914369, + 44.3238964 + ], + [ + -94.4915575, + 44.3238817 + ], + [ + -94.4917485, + 44.3238607 + ], + [ + -94.4919136, + 44.3238452 + ], + [ + -94.4921326, + 44.3238282 + ], + [ + -94.4923291, + 44.3238167 + ], + [ + -94.4924801, + 44.3238107 + ], + [ + -94.4926035, + 44.3238073 + ], + [ + -94.4926554, + 44.3238064 + ], + [ + -94.4927952, + 44.3238036 + ], + [ + -94.4928333, + 44.323803 + ], + [ + -94.4929903, + 44.323801 + ], + [ + -94.4930841, + 44.3238006 + ], + [ + -94.4936631, + 44.3238036 + ], + [ + -94.4940801, + 44.3238056 + ], + [ + -94.4940851, + 44.3238057 + ], + [ + -94.4942572, + 44.3238066 + ], + [ + -94.4944543, + 44.3238076 + ], + [ + -94.4944739, + 44.3238078 + ], + [ + -94.4958458, + 44.3238198 + ], + [ + -94.4959455, + 44.3238216 + ], + [ + -94.4960175, + 44.3238236 + ], + [ + -94.4963554, + 44.323844 + ], + [ + -94.4964414, + 44.323852 + ], + [ + -94.496645, + 44.323875 + ], + [ + -94.49669, + 44.323881 + ], + [ + -94.497072, + 44.3239469 + ], + [ + -94.497119, + 44.3239569 + ], + [ + -94.4973555, + 44.3240134 + ], + [ + -94.4973651, + 44.324016 + ], + [ + -94.4974943, + 44.3239835 + ], + [ + -94.4975653, + 44.3239675 + ], + [ + -94.4979578, + 44.3238955 + ], + [ + -94.4979928, + 44.3238905 + ], + [ + -94.4987266, + 44.3238386 + ], + [ + -94.4994605, + 44.3238904 + ], + [ + -94.5001662, + 44.324044 + ], + [ + -94.5008166, + 44.3242935 + ], + [ + -94.5013867, + 44.3246293 + ], + [ + -94.5018546, + 44.3250385 + ], + [ + -94.5022023, + 44.3255053 + ], + [ + -94.5024165, + 44.3260119 + ], + [ + -94.5024889, + 44.3265387 + ], + [ + -94.5024167, + 44.3270655 + ], + [ + -94.5022027, + 44.3275721 + ], + [ + -94.5018552, + 44.328039 + ], + [ + -94.5013874, + 44.3284483 + ], + [ + -94.5008174, + 44.3287842 + ], + [ + -94.5003575, + 44.3289607 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149561_s_4149562", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.506062, + 44.3253623 + ], + [ + -94.5061182, + 44.3253626 + ], + [ + -94.506325, + 44.3253626 + ], + [ + -94.5063477, + 44.3253626 + ], + [ + -94.5065787, + 44.3253636 + ], + [ + -94.5073093, + 44.3254183 + ], + [ + -94.5080113, + 44.3255738 + ], + [ + -94.5086577, + 44.3258243 + ], + [ + -94.509224, + 44.3261603 + ], + [ + -94.5096886, + 44.3265688 + ], + [ + -94.5100337, + 44.3270343 + ], + [ + -94.5102462, + 44.3275391 + ], + [ + -94.510318, + 44.3280639 + ], + [ + -94.510318, + 44.3283229 + ], + [ + -94.5102457, + 44.3288498 + ], + [ + -94.5100317, + 44.3293564 + ], + [ + -94.5096841, + 44.3298232 + ], + [ + -94.5092162, + 44.3302325 + ], + [ + -94.5086461, + 44.3305683 + ], + [ + -94.5079957, + 44.3308179 + ], + [ + -94.50729, + 44.3309715 + ], + [ + -94.506556, + 44.3310234 + ], + [ + -94.505822, + 44.3309715 + ], + [ + -94.5051163, + 44.3308179 + ], + [ + -94.5049637, + 44.3307593 + ], + [ + -94.5047669, + 44.3307584 + ], + [ + -94.504569, + 44.3307584 + ], + [ + -94.5045468, + 44.3307584 + ], + [ + -94.5043108, + 44.3307574 + ], + [ + -94.504103, + 44.3307564 + ], + [ + -94.503901, + 44.3307564 + ], + [ + -94.503887, + 44.3307564 + ], + [ + -94.503512, + 44.3307554 + ], + [ + -94.5034959, + 44.3307553 + ], + [ + -94.5033219, + 44.3307543 + ], + [ + -94.5025745, + 44.3306961 + ], + [ + -94.5018582, + 44.3305324 + ], + [ + -94.5012015, + 44.3302697 + ], + [ + -94.5006307, + 44.3299186 + ], + [ + -94.5001686, + 44.329493 + ], + [ + -94.4999859, + 44.3292295 + ], + [ + -94.49955, + 44.3292274 + ], + [ + -94.4990575, + 44.3292246 + ], + [ + -94.4989853, + 44.3292257 + ], + [ + -94.4989628, + 44.3292261 + ], + [ + -94.4988241, + 44.3292385 + ], + [ + -94.4980886, + 44.3292003 + ], + [ + -94.4973776, + 44.3290597 + ], + [ + -94.4967184, + 44.3288223 + ], + [ + -94.4961364, + 44.3284971 + ], + [ + -94.495654, + 44.3280967 + ], + [ + -94.4952897, + 44.3276364 + ], + [ + -94.4950575, + 44.327134 + ], + [ + -94.4949664, + 44.3266087 + ], + [ + -94.4950197, + 44.3260807 + ], + [ + -94.4952155, + 44.3255703 + ], + [ + -94.4955463, + 44.3250972 + ], + [ + -94.4959992, + 44.3246794 + ], + [ + -94.496557, + 44.3243331 + ], + [ + -94.4971982, + 44.3240716 + ], + [ + -94.4978981, + 44.3239049 + ], + [ + -94.4979351, + 44.3238989 + ], + [ + -94.4983779, + 44.3238468 + ], + [ + -94.4984589, + 44.3238408 + ], + [ + -94.4987423, + 44.3238276 + ], + [ + -94.4987933, + 44.3238266 + ], + [ + -94.4988201, + 44.3238261 + ], + [ + -94.4989581, + 44.3238241 + ], + [ + -94.499063, + 44.3238237 + ], + [ + -94.4996035, + 44.3238266 + ], + [ + -94.500409, + 44.3238306 + ], + [ + -94.500413, + 44.3238307 + ], + [ + -94.5007601, + 44.3238327 + ], + [ + -94.5015611, + 44.3238366 + ], + [ + -94.5017685, + 44.3238418 + ], + [ + -94.5018805, + 44.3238468 + ], + [ + -94.5019995, + 44.3238535 + ], + [ + -94.5020735, + 44.3238585 + ], + [ + -94.5023786, + 44.3238882 + ], + [ + -94.5024806, + 44.3239012 + ], + [ + -94.5025924, + 44.3239167 + ], + [ + -94.5026124, + 44.3239197 + ], + [ + -94.5027827, + 44.3239482 + ], + [ + -94.5028287, + 44.3239567 + ], + [ + -94.5028316, + 44.3239572 + ], + [ + -94.5032991, + 44.324066 + ], + [ + -94.5034041, + 44.324096 + ], + [ + -94.5037896, + 44.3242247 + ], + [ + -94.5038546, + 44.3242497 + ], + [ + -94.5041745, + 44.3243878 + ], + [ + -94.5042845, + 44.3244408 + ], + [ + -94.5045429, + 44.3245772 + ], + [ + -94.5046019, + 44.3246112 + ], + [ + -94.5046951, + 44.3246685 + ], + [ + -94.5050849, + 44.3247862 + ], + [ + -94.5057305, + 44.3251087 + ], + [ + -94.506062, + 44.3253623 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149562_s_4149563", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.510318, + 44.3289312 + ], + [ + -94.5103206, + 44.3290504 + ], + [ + -94.5103128, + 44.329271 + ], + [ + -94.5103028, + 44.329379 + ], + [ + -94.5101722, + 44.3299268 + ], + [ + -94.5101282, + 44.3300398 + ], + [ + -94.5098693, + 44.3305216 + ], + [ + -94.5094872, + 44.3309592 + ], + [ + -94.5089962, + 44.3313366 + ], + [ + -94.508414, + 44.33164 + ], + [ + -94.5077619, + 44.3318582 + ], + [ + -94.507064, + 44.3319834 + ], + [ + -94.506962, + 44.3319944 + ], + [ + -94.5065498, + 44.3320224 + ], + [ + -94.5063358, + 44.3320284 + ], + [ + -94.5061467, + 44.3320302 + ], + [ + -94.5049096, + 44.3320202 + ], + [ + -94.5048397, + 44.3320192 + ], + [ + -94.5047831, + 44.332018 + ], + [ + -94.5045774, + 44.3320201 + ], + [ + -94.5044656, + 44.3320201 + ], + [ + -94.5039407, + 44.3320144 + ], + [ + -94.5034977, + 44.3320134 + ], + [ + -94.5034784, + 44.3320133 + ], + [ + -94.5033092, + 44.3320123 + ], + [ + -94.5007968, + 44.3319993 + ], + [ + -94.5006119, + 44.3319983 + ], + [ + -94.498817, + 44.3319888 + ], + [ + -94.4981567, + 44.3320971 + ], + [ + -94.4974137, + 44.3321114 + ], + [ + -94.4971559, + 44.3320794 + ], + [ + -94.497019, + 44.3322044 + ], + [ + -94.4964587, + 44.3325487 + ], + [ + -94.4958156, + 44.3328079 + ], + [ + -94.4951144, + 44.332972 + ], + [ + -94.4943821, + 44.3330348 + ], + [ + -94.4936467, + 44.3329939 + ], + [ + -94.4929367, + 44.3328508 + ], + [ + -94.4922792, + 44.332611 + ], + [ + -94.4916995, + 44.3322837 + ], + [ + -94.4912199, + 44.3318815 + ], + [ + -94.4908588, + 44.3314199 + ], + [ + -94.4906301, + 44.3309166 + ], + [ + -94.4905427, + 44.330391 + ], + [ + -94.4905997, + 44.3298632 + ], + [ + -94.4907992, + 44.3293535 + ], + [ + -94.4908242, + 44.3293075 + ], + [ + -94.4909355, + 44.3291233 + ], + [ + -94.4909875, + 44.3290453 + ], + [ + -94.4911417, + 44.3288377 + ], + [ + -94.4912067, + 44.3287587 + ], + [ + -94.4913238, + 44.3286254 + ], + [ + -94.4913828, + 44.3285624 + ], + [ + -94.4915044, + 44.3284401 + ], + [ + -94.4915634, + 44.3283841 + ], + [ + -94.4916345, + 44.3283187 + ], + [ + -94.4916895, + 44.3282697 + ], + [ + -94.4917405, + 44.3282253 + ], + [ + -94.4920535, + 44.3279583 + ], + [ + -94.4921111, + 44.3279103 + ], + [ + -94.4927289, + 44.3274078 + ], + [ + -94.4931726, + 44.3270443 + ], + [ + -94.4936974, + 44.3266147 + ], + [ + -94.4937172, + 44.3265986 + ], + [ + -94.4939282, + 44.3264286 + ], + [ + -94.4944737, + 44.326068 + ], + [ + -94.4951073, + 44.3257911 + ], + [ + -94.4958041, + 44.3256089 + ], + [ + -94.4965372, + 44.3255284 + ], + [ + -94.4972781, + 44.3255527 + ], + [ + -94.4979979, + 44.3256808 + ], + [ + -94.4986688, + 44.3259078 + ], + [ + -94.4992645, + 44.3262249 + ], + [ + -94.4993505, + 44.3262809 + ], + [ + -94.4993943, + 44.3263094 + ], + [ + -94.4996939, + 44.3265035 + ], + [ + -94.4998236, + 44.3265932 + ], + [ + -94.5006678, + 44.3265977 + ], + [ + -94.5008518, + 44.3265987 + ], + [ + -94.503365, + 44.3266116 + ], + [ + -94.50353, + 44.3266126 + ], + [ + -94.5036679, + 44.3266129 + ], + [ + -94.503896, + 44.3264135 + ], + [ + -94.504466, + 44.3260777 + ], + [ + -94.5051164, + 44.3258281 + ], + [ + -94.5058221, + 44.3256745 + ], + [ + -94.506556, + 44.3256226 + ], + [ + -94.5072899, + 44.3256745 + ], + [ + -94.5079956, + 44.3258281 + ], + [ + -94.508646, + 44.3260777 + ], + [ + -94.509216, + 44.3264135 + ], + [ + -94.5096839, + 44.3268227 + ], + [ + -94.5100316, + 44.3272895 + ], + [ + -94.5102457, + 44.3277961 + ], + [ + -94.510318, + 44.3283229 + ], + [ + -94.510318, + 44.3289312 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "radius_300_s_4149563_s_4210601", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -94.4979219, + 44.3310278 + ], + [ + -94.4979201, + 44.3310351 + ], + [ + -94.4978692, + 44.331418 + ], + [ + -94.4976677, + 44.3319107 + ], + [ + -94.4973399, + 44.332367 + ], + [ + -94.4968977, + 44.3327706 + ], + [ + -94.4963571, + 44.3331068 + ], + [ + -94.4957376, + 44.3333635 + ], + [ + -94.4956808, + 44.3333776 + ], + [ + -94.4956566, + 44.3335305 + ], + [ + -94.4955755, + 44.3337078 + ], + [ + -94.4955753, + 44.3337505 + ], + [ + -94.4955753, + 44.333757 + ], + [ + -94.4955615, + 44.3354417 + ], + [ + -94.4955595, + 44.3365265 + ], + [ + -94.4955586, + 44.3365843 + ], + [ + -94.4955527, + 44.3367715 + ], + [ + -94.4955566, + 44.3379666 + ], + [ + -94.4955566, + 44.3379764 + ], + [ + -94.4955557, + 44.3385334 + ], + [ + -94.4955361, + 44.3388054 + ], + [ + -94.4955354, + 44.3388098 + ], + [ + -94.4955357, + 44.3388149 + ], + [ + -94.4955357, + 44.3390739 + ], + [ + -94.4955355, + 44.3390996 + ], + [ + -94.4955196, + 44.3403076 + ], + [ + -94.4955191, + 44.3403341 + ], + [ + -94.4955064, + 44.340806 + ], + [ + -94.4955183, + 44.3413288 + ], + [ + -94.4955184, + 44.3413326 + ], + [ + -94.4955244, + 44.3416194 + ], + [ + -94.4955434, + 44.3424823 + ], + [ + -94.4955144, + 44.3428627 + ], + [ + -94.4955014, + 44.3429367 + ], + [ + -94.4953925, + 44.3433248 + ], + [ + -94.4953785, + 44.3433608 + ], + [ + -94.4951027, + 44.3438668 + ], + [ + -94.4950827, + 44.3438948 + ], + [ + -94.4946617, + 44.3443595 + ], + [ + -94.4941173, + 44.3447528 + ], + [ + -94.4940543, + 44.3447898 + ], + [ + -94.4935098, + 44.3450561 + ], + [ + -94.492909, + 44.3452501 + ], + [ + -94.492841, + 44.3452671 + ], + [ + -94.492076, + 44.345396 + ], + [ + -94.4912904, + 44.3454081 + ], + [ + -94.4911734, + 44.3454011 + ], + [ + -94.4908303, + 44.3453691 + ], + [ + -94.4907673, + 44.3453611 + ], + [ + -94.4905143, + 44.3453225 + ], + [ + -94.4904303, + 44.3453075 + ], + [ + -94.4900391, + 44.3452212 + ], + [ + -94.4899861, + 44.3452072 + ], + [ + -94.4895851, + 44.3450818 + ], + [ + -94.4895301, + 44.3450618 + ], + [ + -94.4892811, + 44.3449626 + ], + [ + -94.4892121, + 44.3449326 + ], + [ + -94.4889554, + 44.3448104 + ], + [ + -94.4877504, + 44.3441844 + ], + [ + -94.4875906, + 44.3440966 + ], + [ + -94.4874476, + 44.3440136 + ], + [ + -94.4873493, + 44.3439545 + ], + [ + -94.4872223, + 44.3438755 + ], + [ + -94.4870697, + 44.3437752 + ], + [ + -94.4869747, + 44.3437092 + ], + [ + -94.4867434, + 44.3435334 + ], + [ + -94.4866673, + 44.3434702 + ], + [ + -94.4866374, + 44.3434459 + ], + [ + -94.4865354, + 44.3433592 + ], + [ + -94.4864914, + 44.3433202 + ], + [ + -94.486453, + 44.3432856 + ], + [ + -94.486429, + 44.3432636 + ], + [ + -94.4863876, + 44.3432249 + ], + [ + -94.4863256, + 44.3431659 + ], + [ + -94.486203, + 44.3430422 + ], + [ + -94.4858516, + 44.3426655 + ], + [ + -94.4851764, + 44.3419557 + ], + [ + -94.484822, + 44.341491 + ], + [ + -94.4846008, + 44.3409855 + ], + [ + -94.4845214, + 44.3404589 + ], + [ + -94.4845868, + 44.3399312 + ], + [ + -94.4847944, + 44.3394229 + ], + [ + -94.4851364, + 44.3389534 + ], + [ + -94.4855994, + 44.3385408 + ], + [ + -94.4861658, + 44.3382011 + ], + [ + -94.4880292, + 44.3372902 + ], + [ + -94.4880275, + 44.3367502 + ], + [ + -94.4880284, + 44.3366826 + ], + [ + -94.4880345, + 44.3364905 + ], + [ + -94.4880365, + 44.3354284 + ], + [ + -94.4880366, + 44.3354159 + ], + [ + -94.4880507, + 44.3337281 + ], + [ + -94.4880513, + 44.3336129 + ], + [ + -94.4877994, + 44.3333484 + ], + [ + -94.4877128, + 44.3332579 + ], + [ + -94.4873564, + 44.3327936 + ], + [ + -94.4871333, + 44.3322882 + ], + [ + -94.487052, + 44.3317613 + ], + [ + -94.4871157, + 44.3312332 + ], + [ + -94.487322, + 44.3307241 + ], + [ + -94.4876628, + 44.3302538 + ], + [ + -94.488125, + 44.3298404 + ], + [ + -94.4886909, + 44.3294997 + ], + [ + -94.4888475, + 44.3294228 + ], + [ + -94.4890801, + 44.329308 + ], + [ + -94.4891063, + 44.3292952 + ], + [ + -94.4899623, + 44.3288802 + ], + [ + -94.4900697, + 44.32883 + ], + [ + -94.4901897, + 44.328776 + ], + [ + -94.4902594, + 44.3287454 + ], + [ + -94.4903084, + 44.3287244 + ], + [ + -94.4907124, + 44.3285742 + ], + [ + -94.4907784, + 44.3285532 + ], + [ + -94.4910956, + 44.3284644 + ], + [ + -94.4911326, + 44.3284554 + ], + [ + -94.4911592, + 44.328449 + ], + [ + -94.4912182, + 44.328435 + ], + [ + -94.4912673, + 44.3284237 + ], + [ + -94.4913203, + 44.3284117 + ], + [ + -94.4915122, + 44.3283722 + ], + [ + -94.4915932, + 44.3283572 + ], + [ + -94.4918231, + 44.3283201 + ], + [ + -94.4918266, + 44.3283196 + ], + [ + -94.4921533, + 44.3281194 + ], + [ + -94.4927968, + 44.3278608 + ], + [ + -94.4934982, + 44.3276972 + ], + [ + -94.4942306, + 44.3276351 + ], + [ + -94.4949658, + 44.3276767 + ], + [ + -94.4956755, + 44.3278204 + ], + [ + -94.4963326, + 44.3280608 + ], + [ + -94.4969117, + 44.3283886 + ], + [ + -94.4973906, + 44.3287911 + ], + [ + -94.4977509, + 44.329253 + ], + [ + -94.4979788, + 44.3297565 + ], + [ + -94.4980654, + 44.3302822 + ], + [ + -94.4980075, + 44.33081 + ], + [ + -94.4979219, + 44.3310278 + ] + ] + ] + }, + "properties": {} + } + ] +} \ No newline at end of file diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/routes.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/routes.txt new file mode 100644 index 000000000..2f075f539 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/routes.txt @@ -0,0 +1,3 @@ +agency_id,route_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color,route_sort_order,min_headway_minutes,eligibility_restricted,continuous_pickup,continuous_drop_off,tts_route_short_name,tts_route_long_name +4870,74362,,Heartland Express,,3,,,,0,,0,1,1,, +4870,74513,,Hermann Express,,3,https://www.newulmmn.gov/553/Hermann-Express-City-Bus-Service,009d4f,000000,0,60,0,1,1,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/stop_times.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/stop_times.txt new file mode 100644 index 000000000..7137dea51 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/stop_times.txt @@ -0,0 +1,477 @@ +trip_id,arrival_time,departure_time,stop_id,location_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled,timepoint,continuous_pickup,continuous_drop_off,pickup_booking_rule_id,drop_off_booking_rule_id,start_pickup_drop_off_window,end_pickup_drop_off_window,mean_duration_factor,mean_duration_offset,safe_duration_factor,safe_duration_offset,tts_stop_headsign +t_5374696_b_77497_tn_0,08:00:00,08:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,08:00:00,08:02:22,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:02:22,08:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,08:02:22,08:03:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:03:00,08:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,08:03:00,08:05:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:05:00,08:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,08:05:00,08:08:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:08:00,08:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,08:08:00,08:10:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:10:00,08:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,08:10:00,08:11:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:11:00,08:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,08:11:00,08:19:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:19:00,08:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,08:19:00,08:22:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:22:00,08:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,08:22:00,08:27:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:27:00,08:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,08:27:00,08:29:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:29:00,08:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,08:29:00,08:30:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:30:00,08:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,08:30:00,08:32:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:32:00,08:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,08:32:00,08:39:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:39:00,08:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,08:39:00,08:40:59,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:40:59,08:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,08:40:59,08:43:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:43:00,08:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,08:43:00,08:45:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:45:00,08:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,08:45:00,08:50:00,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:50:00,08:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374696_b_77497_tn_0,08:56:00,08:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:00:00,09:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,09:00:00,09:02:22,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:02:22,09:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,09:02:22,09:03:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:03:00,09:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,09:03:00,09:05:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:05:00,09:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,09:05:00,09:08:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:08:00,09:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,09:08:00,09:10:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:10:00,09:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,09:10:00,09:11:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:11:00,09:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,09:11:00,09:19:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:19:00,09:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,09:19:00,09:22:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:22:00,09:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,09:22:00,09:27:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:27:00,09:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,09:27:00,09:29:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:29:00,09:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,09:29:00,09:30:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:30:00,09:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,09:30:00,09:32:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:32:00,09:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,09:32:00,09:39:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:39:00,09:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,09:39:00,09:40:59,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:40:59,09:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,09:40:59,09:43:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:43:00,09:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,09:43:00,09:45:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:45:00,09:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,09:45:00,09:50:00,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:50:00,09:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374697_b_77497_tn_0,09:56:00,09:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:00:00,10:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,10:00:00,10:02:22,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:02:22,10:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,10:02:22,10:03:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:03:00,10:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,10:03:00,10:05:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:05:00,10:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,10:05:00,10:08:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:08:00,10:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,10:08:00,10:10:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:10:00,10:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,10:10:00,10:11:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:11:00,10:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,10:11:00,10:19:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:19:00,10:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,10:19:00,10:22:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:22:00,10:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,10:22:00,10:27:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:27:00,10:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,10:27:00,10:29:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:29:00,10:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,10:29:00,10:30:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:30:00,10:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,10:30:00,10:32:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:32:00,10:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,10:32:00,10:39:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:39:00,10:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,10:39:00,10:40:59,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:40:59,10:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,10:40:59,10:43:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:43:00,10:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,10:43:00,10:45:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:45:00,10:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,10:45:00,10:50:00,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:50:00,10:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374698_b_77497_tn_0,10:56:00,10:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:00:00,11:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,11:00:00,11:02:22,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:02:22,11:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,11:02:22,11:03:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:03:00,11:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,11:03:00,11:05:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:05:00,11:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,11:05:00,11:08:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:08:00,11:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,11:08:00,11:10:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:10:00,11:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,11:10:00,11:11:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:11:00,11:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,11:11:00,11:19:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:19:00,11:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,11:19:00,11:22:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:22:00,11:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,11:22:00,11:27:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:27:00,11:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,11:27:00,11:29:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:29:00,11:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,11:29:00,11:30:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:30:00,11:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,11:30:00,11:32:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:32:00,11:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,11:32:00,11:39:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:39:00,11:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,11:39:00,11:40:59,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:40:59,11:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,11:40:59,11:43:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:43:00,11:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,11:43:00,11:45:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:45:00,11:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,11:45:00,11:50:00,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:50:00,11:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374699_b_77497_tn_0,11:56:00,11:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:00:00,13:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,13:00:00,13:02:22,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:02:22,13:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,13:02:22,13:03:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:03:00,13:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,13:03:00,13:05:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:05:00,13:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,13:05:00,13:08:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:08:00,13:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,13:08:00,13:10:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:10:00,13:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,13:10:00,13:11:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:11:00,13:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,13:11:00,13:19:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:19:00,13:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,13:19:00,13:22:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:22:00,13:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,13:22:00,13:27:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:27:00,13:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,13:27:00,13:29:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:29:00,13:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,13:29:00,13:30:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:30:00,13:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,13:30:00,13:32:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:32:00,13:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,13:32:00,13:39:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:39:00,13:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,13:39:00,13:40:59,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:40:59,13:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,13:40:59,13:43:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:43:00,13:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,13:43:00,13:45:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:45:00,13:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,13:45:00,13:50:00,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:50:00,13:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374703_b_77497_tn_0,13:56:00,13:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:00:00,14:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,14:00:00,14:02:22,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:02:22,14:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,14:02:22,14:03:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:03:00,14:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,14:03:00,14:05:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:05:00,14:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,14:05:00,14:08:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:08:00,14:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,14:08:00,14:10:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:10:00,14:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,14:10:00,14:11:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:11:00,14:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,14:11:00,14:19:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:19:00,14:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,14:19:00,14:22:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:22:00,14:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,14:22:00,14:27:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:27:00,14:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,14:27:00,14:29:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:29:00,14:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,14:29:00,14:30:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:30:00,14:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,14:30:00,14:32:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:32:00,14:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,14:32:00,14:39:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:39:00,14:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,14:39:00,14:40:59,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:40:59,14:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,14:40:59,14:43:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:43:00,14:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,14:43:00,14:45:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:45:00,14:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,14:45:00,14:50:00,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:50:00,14:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374704_b_77497_tn_0,14:56:00,14:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:00:00,15:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,15:00:00,15:02:22,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:02:22,15:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,15:02:22,15:03:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:03:00,15:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,15:03:00,15:05:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:05:00,15:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,15:05:00,15:08:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:08:00,15:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,15:08:00,15:10:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:10:00,15:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,15:10:00,15:11:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:11:00,15:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,15:11:00,15:19:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:19:00,15:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,15:19:00,15:22:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:22:00,15:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,15:22:00,15:27:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:27:00,15:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,15:27:00,15:29:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:29:00,15:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,15:29:00,15:30:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:30:00,15:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,15:30:00,15:32:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:32:00,15:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,15:32:00,15:39:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:39:00,15:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,15:39:00,15:40:59,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:40:59,15:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,15:40:59,15:43:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:43:00,15:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,15:43:00,15:45:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:45:00,15:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,15:45:00,15:50:00,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:50:00,15:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374705_b_77497_tn_0,15:56:00,15:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5374944_b_77497_tn_0,,,,area_715,1,,2,1,,0,1,1,booking_route_74362,booking_route_74362,06:15:00,08:00:00,1,30.0,1,60.0, +t_5374944_b_77497_tn_0,,,,area_715,2,,1,2,,0,1,1,booking_route_74362,booking_route_74362,06:15:00,08:00:00,1,30.0,1,60.0, +t_5374945_b_77497_tn_0,,,,area_708,1,,2,1,,0,1,1,booking_route_74362,booking_route_74362,08:00:00,17:00:00,1,30.0,1,60.0, +t_5374945_b_77497_tn_0,,,,area_708,2,,1,2,,0,1,1,booking_route_74362,booking_route_74362,08:00:00,17:00:00,1,30.0,1,60.0, +t_5374946_b_77497_tn_0,,,,area_715,1,,2,1,,0,1,1,booking_route_74362,booking_route_74362,17:00:00,17:45:00,1,30.0,1,60.0, +t_5374946_b_77497_tn_0,,,,area_715,2,,1,2,,0,1,1,booking_route_74362,booking_route_74362,17:00:00,17:45:00,1,30.0,1,60.0, +t_5374947_b_77497_tn_0,,,,area_715,1,,2,1,,0,1,1,booking_route_74362,booking_route_74362,08:00:00,12:00:00,1,30.0,1,60.0, +t_5374947_b_77497_tn_0,,,,area_715,2,,1,2,,0,1,1,booking_route_74362,booking_route_74362,08:00:00,12:00:00,1,30.0,1,60.0, +t_5582676_b_77497_tn_0,07:00:00,07:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,07:00:00,07:02:22,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:02:22,07:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,07:02:22,07:03:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:03:00,07:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,07:03:00,07:05:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:05:00,07:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,07:05:00,07:08:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:08:00,07:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,07:08:00,07:10:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:10:00,07:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,07:10:00,07:11:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:11:00,07:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,07:11:00,07:19:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:19:00,07:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,07:19:00,07:22:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:22:00,07:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,07:22:00,07:27:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:27:00,07:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,07:27:00,07:29:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:29:00,07:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,07:29:00,07:30:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:30:00,07:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,07:30:00,07:32:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:32:00,07:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,07:32:00,07:39:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:39:00,07:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,07:39:00,07:40:59,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:40:59,07:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,07:40:59,07:43:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:43:00,07:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,07:43:00,07:45:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:45:00,07:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,07:45:00,07:50:00,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:50:00,07:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582676_b_77497_tn_0,07:56:00,07:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:00:00,16:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,16:00:00,16:02:22,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:02:22,16:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,16:02:22,16:03:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:03:00,16:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,16:03:00,16:05:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:05:00,16:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,16:05:00,16:08:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:08:00,16:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,16:08:00,16:10:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:10:00,16:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,16:10:00,16:11:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:11:00,16:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,16:11:00,16:19:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:19:00,16:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,16:19:00,16:22:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:22:00,16:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,16:22:00,16:27:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:27:00,16:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,16:27:00,16:29:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:29:00,16:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,16:29:00,16:30:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:30:00,16:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,16:30:00,16:32:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:32:00,16:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,16:32:00,16:39:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:39:00,16:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,16:39:00,16:40:59,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:40:59,16:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,16:40:59,16:43:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:43:00,16:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,16:43:00,16:45:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:45:00,16:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,16:45:00,16:50:00,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:50:00,16:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582677_b_77497_tn_0,16:56:00,16:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:00:00,10:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,10:00:00,10:02:22,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:02:22,10:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,10:02:22,10:03:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:03:00,10:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,10:03:00,10:05:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:05:00,10:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,10:05:00,10:08:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:08:00,10:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,10:08:00,10:10:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:10:00,10:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,10:10:00,10:11:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:11:00,10:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,10:11:00,10:19:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:19:00,10:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,10:19:00,10:22:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:22:00,10:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,10:22:00,10:27:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:27:00,10:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,10:27:00,10:29:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:29:00,10:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,10:29:00,10:30:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:30:00,10:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,10:30:00,10:32:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:32:00,10:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,10:32:00,10:39:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:39:00,10:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,10:39:00,10:40:59,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:40:59,10:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,10:40:59,10:43:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:43:00,10:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,10:43:00,10:45:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:45:00,10:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,10:45:00,10:50:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:50:00,10:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_1,10:56:00,10:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:00:00,11:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,11:00:00,11:02:22,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:02:22,11:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,11:02:22,11:03:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:03:00,11:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,11:03:00,11:05:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:05:00,11:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,11:05:00,11:08:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:08:00,11:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,11:08:00,11:10:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:10:00,11:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,11:10:00,11:11:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:11:00,11:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,11:11:00,11:19:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:19:00,11:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,11:19:00,11:22:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:22:00,11:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,11:22:00,11:27:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:27:00,11:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,11:27:00,11:29:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:29:00,11:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,11:29:00,11:30:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:30:00,11:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,11:30:00,11:32:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:32:00,11:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,11:32:00,11:39:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:39:00,11:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,11:39:00,11:40:59,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:40:59,11:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,11:40:59,11:43:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:43:00,11:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,11:43:00,11:45:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:45:00,11:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,11:45:00,11:50:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:50:00,11:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_2,11:56:00,11:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:00:00,12:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,12:00:00,12:02:22,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:02:22,12:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,12:02:22,12:03:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:03:00,12:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,12:03:00,12:05:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:05:00,12:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,12:05:00,12:08:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:08:00,12:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,12:08:00,12:10:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:10:00,12:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,12:10:00,12:11:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:11:00,12:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,12:11:00,12:19:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:19:00,12:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,12:19:00,12:22:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:22:00,12:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,12:22:00,12:27:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:27:00,12:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,12:27:00,12:29:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:29:00,12:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,12:29:00,12:30:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:30:00,12:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,12:30:00,12:32:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:32:00,12:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,12:32:00,12:39:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:39:00,12:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,12:39:00,12:40:59,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:40:59,12:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,12:40:59,12:43:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:43:00,12:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,12:43:00,12:45:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:45:00,12:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,12:45:00,12:50:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:50:00,12:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_3,12:56:00,12:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:00:00,13:00:00,4149546,,1,Oakwood Estates,0,0,0.0,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149546_s_4149547,2,,1,3,,0,,,booking_route_74513,booking_route_74513,13:00:00,13:02:22,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:02:22,13:02:22,4149547,,3,Oakwood Estates,0,0,1221.62711360848,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149547_s_4149548,4,,1,3,,0,,,booking_route_74513,booking_route_74513,13:02:22,13:03:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:03:00,13:03:00,4149548,,5,Oakwood Estates,0,0,1548.21635580622,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149548_s_4149549,6,,1,3,,0,,,booking_route_74513,booking_route_74513,13:03:00,13:05:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:05:00,13:05:00,4149549,,7,Oakwood Estates,0,0,2513.60637023167,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149549_s_4149550,8,,1,3,,0,,,booking_route_74513,booking_route_74513,13:05:00,13:08:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:08:00,13:08:00,4149550,,9,Oakwood Estates,0,0,2915.16956816462,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149550_s_4149551,10,,1,3,,0,,,booking_route_74513,booking_route_74513,13:08:00,13:10:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:10:00,13:10:00,4149551,,11,Oakwood Estates,0,0,3279.78097062954,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149551_s_4149552,12,,1,3,,0,,,booking_route_74513,booking_route_74513,13:10:00,13:11:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:11:00,13:11:00,4149552,,13,Oakwood Estates,0,0,3599.78460535105,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149552_s_4149553,14,,1,3,,0,,,booking_route_74513,booking_route_74513,13:11:00,13:19:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:19:00,13:19:00,4149553,,15,Oakwood Estates,0,0,7264.30948874952,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149553_s_4149554,16,,1,3,,0,,,booking_route_74513,booking_route_74513,13:19:00,13:22:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:22:00,13:22:00,4149554,,17,Aldi / Walmart,0,0,8967.25692149356,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149554_s_4149555,18,,1,3,,0,,,booking_route_74513,booking_route_74513,13:22:00,13:27:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:27:00,13:27:00,4149555,,19,Aldi / Walmart,0,0,12234.1088383589,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149555_s_4149556,20,,1,3,,0,,,booking_route_74513,booking_route_74513,13:27:00,13:29:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:29:00,13:29:00,4149556,,21,Aldi / Walmart,0,0,13350.3900682553,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149556_s_4149557,22,,1,3,,0,,,booking_route_74513,booking_route_74513,13:29:00,13:30:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:30:00,13:30:00,4149557,,23,Aldi / Walmart,0,0,14139.3197591783,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149557_s_4149558,24,,1,3,,0,,,booking_route_74513,booking_route_74513,13:30:00,13:32:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:32:00,13:32:00,4149558,,25,Aldi / Walmart,0,0,14310.8549866517,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149558_s_4149560,26,,1,3,,0,,,booking_route_74513,booking_route_74513,13:32:00,13:39:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:39:00,13:39:00,4149560,,27,Aldi / Walmart,0,0,18413.2640342851,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149560_s_4149561,28,,1,3,,0,,,booking_route_74513,booking_route_74513,13:39:00,13:40:59,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:40:59,13:40:59,4149561,,29,Aldi / Walmart,0,0,19176.1739337079,0,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149561_s_4149562,30,,1,3,,0,,,booking_route_74513,booking_route_74513,13:40:59,13:43:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:43:00,13:43:00,4149562,,31,Aldi / Walmart,0,0,19945.1532361354,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149562_s_4149563,32,,1,3,,0,,,booking_route_74513,booking_route_74513,13:43:00,13:45:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:45:00,13:45:00,4149563,,33,Heartland Express / DMV ,0,0,21223.4785074085,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,,,,radius_300_s_4149563_s_4210601,34,,1,3,,0,,,booking_route_74513,booking_route_74513,13:45:00,13:50:00,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:50:00,13:50:00,4210601,,35,Heartland Express / DMV ,0,0,23429.1955827843,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, +t_5582678_b_77497_tn_4,13:56:00,13:56:00,4149564,,36,Heartland Express / DMV ,0,0,25320.84710107,1,1,1,booking_route_74513,booking_route_74513,,,1,5.0,1,10.0, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/stops.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/stops.txt new file mode 100644 index 000000000..192c0c5dc --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/stops.txt @@ -0,0 +1,21 @@ +stop_id,stop_code,platform_code,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url,location_type,parent_station,stop_timezone,position,direction,wheelchair_boarding,tts_stop_name +4147510,,,Brown County Offices,,44.311175804922,-94.4615214245476,,,0,,America/Chicago,,,0, +4149546,,,Linderhof/Hillside Apartments,,44.3244403726866,-94.4832557975509,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149547,,,Oak Hills Living Center,,44.315809075239,-94.4774795762031,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149548,,,New Ulm Medical Center,,44.3134844379331,-94.4761953323972,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149549,,,St. Michael's,,44.3168886001971,-94.4662504029752,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149550,,,Broadway Haus,,44.3156026577971,-94.4629292109348,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149551,,,Downtown I,,44.3144054205273,-94.4600591933422,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149552,,,Downtown II,,44.3120173123428,-94.4578170057494,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149553,,,Oakwood Estates,,44.2874149536113,-94.4329113488943,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149554,,,HyVee,,44.2929254877207,-94.4394140088622,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149555,,,Emerson Union / Courthouse,,44.3121524043615,-94.4639345582956,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149556,,,Hermann Heights / Martin Luther College,,44.3063995950563,-94.4732186548907,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149557,,,Highland Regency,,44.3084939606084,-94.4797643063817,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149558,,,Sunset Apartments,,44.3080735626766,-94.4814244456242,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149560,,,Cash Wise Foods,,44.3274772503953,-94.4897919754112,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149561,,,Aldi,,44.3266453726204,-94.4987593411561,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149562,,,Walmart,,44.3283230814749,-94.5065654828155,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149563,,,Skyline Terrace / Orchard Hill,,44.3303167356009,-94.4942366508573,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4149564,,,Heartland Express / DMV,,44.3298515852333,-94.4821553131434,,https://newulmmn.gov/553/Hermann-Express-City-Bus-Service,0,,America/Chicago,,,0, +4210601,,,Ridgeway on 23rd / Traulich Estates,,44.3393958836996,-94.4905727129149,,,0,,America/Chicago,,,0, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/trips.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/trips.txt new file mode 100644 index 000000000..f79e291a0 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/brown-county-flex/trips.txt @@ -0,0 +1,18 @@ +route_id,service_id,trip_id,trip_short_name,trip_headsign,direction_id,block_id,shape_id,bikes_allowed,wheelchair_accessible,trip_type,continuous_pickup_message,continuous_drop_off_message,tts_trip_headsign,tts_trip_short_name +74362,c_67295_b_77497_d_31,t_5374945_b_77497_tn_0,,,0,,,,,,,,, +74362,c_67295_b_77497_d_31,t_5374946_b_77497_tn_0,,,0,,,,,,,,, +74362,c_67295_b_77497_d_31,t_5374944_b_77497_tn_0,,,0,,,,,,,,, +74362,c_67295_b_77497_d_64,t_5374947_b_77497_tn_0,,,0,,,,,,,,, +74513,c_67295_b_77497_d_31,t_5374704_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5374699_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5374698_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5374697_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5374696_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5374703_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5582677_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5582676_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_31,t_5374705_b_77497_tn_0,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_32,t_5582678_b_77497_tn_4,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_32,t_5582678_b_77497_tn_1,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_32,t_5582678_b_77497_tn_2,,,0,1296530.0,p_1426044,,,,,,, +74513,c_67295_b_77497_d_32,t_5582678_b_77497_tn_3,,,0,1296530.0,p_1426044,,,,,,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_containers.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_containers.txt deleted file mode 100644 index 2c642d115..000000000 --- a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_containers.txt +++ /dev/null @@ -1,4 +0,0 @@ -fare_container_id,fare_container_name,minimum_initial_purchase,amount,currency,rider_category_id -charmcard,CharmCard,,,, -charmcard_senior,Senior CharmCard,,,,sen -charmpass,CharmPass Mobile App,,,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_leg_rules.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_leg_rules.txt index f8b2c63e8..ef692d0c2 100644 --- a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_leg_rules.txt +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_leg_rules.txt @@ -1,22 +1,8 @@ -leg_group_id,fare_leg_name,network_id,from_area_id,contains_area_id,to_area_id,is_symmetrical,from_timeframe_id,to_timeframe_id,min_distance,max_distance,distance_type,service_id,min_amount,max_amount,fare_product_id,fare_container_id,rider_category_id,eligible_cap_id,amount,currency -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_1_day_fare,,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_senior_local_1_day_fare,,sen,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_disability_local_1_day_fare,,dis,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_7_day_fare,,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_31_day_fare,,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_senior_local_31_day_fare,,sen,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_disability_local_31_day_fare,,dis -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_1_day_fare,charmcard,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_senior_local_1_day_fare,charmcard_senior,sen,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_disability_local_1_day_fare,charmcard,dis,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_7_day_fare,charmcard,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_31_day_fare,charmcard,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_senior_local_31_day_fare,charmcard_senior,sen,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_disability_local_31_day_fare,charmcard,dis,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_1_day_fare,charmpass,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_senior_local_1_day_fare,charmpass,sen,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_disability_local_1_day_fare,charmpass,dis,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_7_day_fare,charmpass,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,core_local_31_day_fare,charmpass,,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_senior_local_31_day_fare,charmpass,sen,,, -core_local_one_way_trip,,core,,,,,,,,,,,,,reduced_disability_local_31_day_fare,charmpass,dis,,, +leg_group_id,fare_leg_name,network_id,from_area_id,contains_area_id,to_area_id,is_symmetrical,from_timeframe_id,to_timeframe_id,min_distance,max_distance,distance_type,fare_product_id,eligible_cap_id +core_local_one_way_trip,,core,,,,,,,,,,core_local_1_day_fare, +core_local_one_way_trip,,core,,,,,,,,,,reduced_senior_local_1_day_fare, +core_local_one_way_trip,,core,,,,,,,,,,reduced_disability_local_1_day_fare, +core_local_one_way_trip,,core,,,,,,,,,,core_local_7_day_fare, +core_local_one_way_trip,,core,,,,,,,,,,core_local_31_day_fare, +core_local_one_way_trip,,core,,,,,,,,,,reduced_senior_local_31_day_fare, +core_local_one_way_trip,,core,,,,,,,,,,reduced_disability_local_31_day_fare, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_media.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_media.txt new file mode 100644 index 000000000..90e502169 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_media.txt @@ -0,0 +1,4 @@ +fare_media_id,fare_media_name,fare_media_type,rider_category_id +charmcard,CharmCard,2, +charmcard_senior,Senior CharmCard,2,sen +charmpass,CharmPass Mobile App,4, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_products.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_products.txt index c1678d9f5..79f2e9bdf 100644 --- a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_products.txt +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/mdot-metro-fares-v2/fare_products.txt @@ -1,4 +1,4 @@ -fare_product_id,fare_product_name,rider_category_id,fare_container_id,bundle_amount,duration_start,duration_amount,duration_unit,duration_type,offset_amount,offset_unit,service_id,timeframe_id,timeframe_type,cap_required,eligible_cap_id,amount,min_amount,max_amount,currency +fare_product_id,fare_product_name,rider_category_id,fare_media_id,bundle_amount,duration_start,duration_amount,duration_unit,duration_type,offset_amount,offset_unit,service_id,timeframe_id,timeframe_type,cap_required,eligible_cap_id,amount,min_amount,max_amount,currency core_local_1_day_fare,1-Day Pass - Core Service,,,,0,1,3,1,3,2,,,,,,4.60,,,USD reduced_senior_local_1_day_fare,Reduced Senior 1-Day Pass - Core Service,sen,,,0,1,3,1,3,2,,,,,,2.30,,,USD reduced_disability_local_1_day_fare,Reduced Disability 1-Day Pass - Core Service,dis,,,0,1,3,1,3,2,,,,,,2.30,,,USD diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/agency.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/agency.txt new file mode 100644 index 000000000..49a72fad5 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/agency.txt @@ -0,0 +1,2 @@ +agency_id,agency_url,agency_lang,agency_name,agency_phone,agency_timezone,agency_fare_url,tts_agency_name +4971,https://www.piercetransit.org/,en,Pierce Transit,,America/Los_Angeles,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/areas.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/areas.txt new file mode 100644 index 000000000..6ee648fda --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/areas.txt @@ -0,0 +1,3 @@ +area_id,area_name +4210800,Spanaway Core +4210813,JBLM Stops \ No newline at end of file diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/booking_rules.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/booking_rules.txt new file mode 100644 index 000000000..26570f9cd --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/booking_rules.txt @@ -0,0 +1,5 @@ +booking_rule_id,booking_type,prior_notice_duration_min,prior_notice_duration_max,prior_notice_start_day,prior_notice_start_time,prior_notice_last_day,prior_notice_last_time,prior_notice_service_id,message,pickup_message,drop_off_message,phone_number,info_url,booking_url +booking_route_76310,0,,,,,,,,"The Ruston Runner provides on-demand transit service in Northwest Tacoma along Ruston Way. To request a ride, call 253-270-1340 or book a trip through the GOIN’ Rides for all mobile app.",,,253-270-1340,https://www.piercetransit.org/rustonrunner/, +booking_route_76311,0,,,,,,,,"The Tideflats Runner provides on-demand transit service in the Port of Tacoma, Fife, and Edgewood. To request a ride, call 253-270-1340 or book a trip through the GOIN’ Rides for all mobile app.",,,253-270-1340,https://www.piercetransit.org/tideflatsrunner/, +booking_route_76312,0,,,,,,,,"The Spanaway Runner provides on-demand transit service throughout the Spanaway, Midland, and Parkland areas. To request a ride, call 253-270-1340 or book a trip through the GOIN’ Rides for all mobile app.",,,253-270-1340,https://www.piercetransit.org/spanaway-parkland-midland-runner/, +booking_route_76313,0,,,,,,,,"The JBLM Runner provides on-demand transit service to and from the Joint Base Lewis-McChord military base. To request a ride, call 253-377-4380. If traveling onto the base, riders must have an approved Department of Defense ID.",,,253-377-4380,https://www.piercetransit.org/jblmrunner/, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar.txt new file mode 100644 index 000000000..cf8c9b9c3 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar.txt @@ -0,0 +1,3 @@ +service_id,service_name,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date +c_69336_b_80376_d_31,JBLM Runner (Weekday),1,1,1,1,1,0,0,20230401,20231201 +c_69335_b_80375_d_127,Flex Year Round (All days of week),1,1,1,1,1,1,1,20230401,20231201 diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar_attributes.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar_attributes.txt new file mode 100644 index 000000000..d8d4b3fe5 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar_attributes.txt @@ -0,0 +1,3 @@ +service_id,service_description +c_69336_b_80376_d_31,JBLM Runner (Weekday) +c_69335_b_80375_d_127,Flex Year Round (All days of week) diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar_dates.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar_dates.txt new file mode 100644 index 000000000..8ee08d3aa --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/calendar_dates.txt @@ -0,0 +1,11 @@ +service_id,date,holiday_name,exception_type +c_69336_b_80376_d_31,20231123,Thanksgiving Day,2 +c_69336_b_80376_d_31,20231110,Veteran's Day (Observed),2 +c_69336_b_80376_d_31,20230904,Labor Day,2 +c_69336_b_80376_d_31,20230704,Independence Day,2 +c_69336_b_80376_d_31,20230619,Juneteenth,2 +c_69336_b_80376_d_31,20230529,Memorial Day,2 +c_69335_b_80375_d_127,20231123,Thanksgiving Day,2 +c_69335_b_80375_d_127,20230904,Labor Day,2 +c_69335_b_80375_d_127,20230704,Independence Day,2 +c_69335_b_80375_d_127,20230529,Memorial Day,2 diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/directions.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/directions.txt new file mode 100644 index 000000000..d1c9baad5 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/directions.txt @@ -0,0 +1,5 @@ +route_id,direction_id,direction +76313,0,No direction +76312,0,No direction +76311,0,No direction +76310,0,No direction diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/feed_info.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/feed_info.txt new file mode 100644 index 000000000..c6306df82 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/feed_info.txt @@ -0,0 +1,2 @@ +feed_publisher_url,feed_publisher_name,feed_lang,feed_version,feed_license,feed_contact_email,feed_contact_url,feed_start_date,feed_end_date,feed_id +http://www.trilliumtransit.com,"Trillium Solutions, Inc.",en,UTC: 28-Apr-2023 22:41,,support+piercetransit-wa-us@trilliumtransit.com,http://support.trilliumtransit.com,20230428,20231201,piercetransit-wa-us diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/locations.geojson b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/locations.geojson new file mode 100644 index 000000000..950fbe5f4 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/locations.geojson @@ -0,0 +1,3469 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "id": "area_1072", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.509648, + 47.302401 + ], + [ + -122.511241, + 47.3037896 + ], + [ + -122.5130064, + 47.3050939 + ], + [ + -122.5127605, + 47.3054512 + ], + [ + -122.514157, + 47.3060945 + ], + [ + -122.5142272, + 47.3053321 + ], + [ + -122.5142448, + 47.3047127 + ], + [ + -122.5144191, + 47.3042949 + ], + [ + -122.5147829, + 47.3038301 + ], + [ + -122.5149098, + 47.3032908 + ], + [ + -122.5149388, + 47.3027432 + ], + [ + -122.5153739, + 47.3020508 + ], + [ + -122.5156947, + 47.3017192 + ], + [ + -122.5156947, + 47.3017192 + ], + [ + -122.5156561, + 47.3010741 + ], + [ + -122.5157294, + 47.2962746 + ], + [ + -122.5156982, + 47.2948707 + ], + [ + -122.5156982, + 47.2948707 + ], + [ + -122.5157281, + 47.2938001 + ], + [ + -122.5085606, + 47.2937319 + ], + [ + -122.4735423, + 47.2727602 + ], + [ + -122.4658318, + 47.2714988 + ], + [ + -122.4458944, + 47.2647135 + ], + [ + -122.4426232, + 47.2611956 + ], + [ + -122.4405756, + 47.2579658 + ], + [ + -122.4390261, + 47.2512101 + ], + [ + -122.4356871, + 47.2516103 + ], + [ + -122.4356655, + 47.2503981 + ], + [ + -122.4358214, + 47.2490826 + ], + [ + -122.435465, + 47.2470262 + ], + [ + -122.4350863, + 47.245257 + ], + [ + -122.43235, + 47.2455418 + ], + [ + -122.433299, + 47.2539226 + ], + [ + -122.427604, + 47.2541833 + ], + [ + -122.4266254, + 47.2550766 + ], + [ + -122.432561, + 47.2639148 + ], + [ + -122.4375817, + 47.2617502 + ], + [ + -122.4427331, + 47.2671937 + ], + [ + -122.4522692, + 47.2732208 + ], + [ + -122.4683304, + 47.2789107 + ], + [ + -122.4857673, + 47.2877613 + ], + [ + -122.5012681, + 47.2999976 + ], + [ + -122.5053378, + 47.302744 + ], + [ + -122.5066509, + 47.3029248 + ], + [ + -122.509648, + 47.302401 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "area_1073", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.4430122, + 47.267346 + ], + [ + -122.4476432, + 47.2688846 + ], + [ + -122.4485741, + 47.2674881 + ], + [ + -122.4461577, + 47.2660493 + ], + [ + -122.444831, + 47.2644577 + ], + [ + -122.4421736, + 47.2611831 + ], + [ + -122.4405237, + 47.25844 + ], + [ + -122.4405601, + 47.2580144 + ], + [ + -122.4399969, + 47.2553122 + ], + [ + -122.4389968, + 47.251226 + ], + [ + -122.4410629, + 47.2510149 + ], + [ + -122.4396757, + 47.2448239 + ], + [ + -122.4391834, + 47.2427751 + ], + [ + -122.4370702, + 47.2366673 + ], + [ + -122.4384538, + 47.2357451 + ], + [ + -122.4362172, + 47.2359279 + ], + [ + -122.4340473, + 47.2351683 + ], + [ + -122.4332828, + 47.2330961 + ], + [ + -122.429462, + 47.2337532 + ], + [ + -122.4217152, + 47.2369881 + ], + [ + -122.4181904, + 47.2381978 + ], + [ + -122.4147242, + 47.2386994 + ], + [ + -122.404219, + 47.2394476 + ], + [ + -122.3988195, + 47.2406945 + ], + [ + -122.3967334, + 47.2412368 + ], + [ + -122.3953554, + 47.240992 + ], + [ + -122.3937978, + 47.241166 + ], + [ + -122.3910376, + 47.2410723 + ], + [ + -122.3900518, + 47.2409652 + ], + [ + -122.3889477, + 47.2404164 + ], + [ + -122.3887899, + 47.2391313 + ], + [ + -122.3817251, + 47.2390091 + ], + [ + -122.3817062, + 47.2385338 + ], + [ + -122.367299, + 47.2344269 + ], + [ + -122.3674162, + 47.2327012 + ], + [ + -122.2939455, + 47.2124668 + ], + [ + -122.2939427, + 47.2146171 + ], + [ + -122.2943305, + 47.2152318 + ], + [ + -122.295379, + 47.2157586 + ], + [ + -122.2980362, + 47.2169976 + ], + [ + -122.298266, + 47.2173098 + ], + [ + -122.2981798, + 47.2177781 + ], + [ + -122.2975737, + 47.2187822 + ], + [ + -122.2975585, + 47.2190402 + ], + [ + -122.2974218, + 47.2199483 + ], + [ + -122.2967319, + 47.22078 + ], + [ + -122.2959561, + 47.2211975 + ], + [ + -122.2946242, + 47.2211378 + ], + [ + -122.2938924, + 47.2211478 + ], + [ + -122.2932044, + 47.221774 + ], + [ + -122.2933215, + 47.2223506 + ], + [ + -122.2939372, + 47.2241607 + ], + [ + -122.2939478, + 47.2248672 + ], + [ + -122.2938319, + 47.2500394 + ], + [ + -122.2937761, + 47.2509273 + ], + [ + -122.2934144, + 47.2510307 + ], + [ + -122.2916441, + 47.2527944 + ], + [ + -122.2921605, + 47.2530502 + ], + [ + -122.2924555, + 47.2530696 + ], + [ + -122.2958153, + 47.2530502 + ], + [ + -122.296158, + 47.2529146 + ], + [ + -122.296415, + 47.2526755 + ], + [ + -122.2964245, + 47.2523137 + ], + [ + -122.2964163, + 47.250042 + ], + [ + -122.3147016, + 47.2501777 + ], + [ + -122.3148237, + 47.2484178 + ], + [ + -122.3218806, + 47.2463195 + ], + [ + -122.3221419, + 47.246147 + ], + [ + -122.322281, + 47.2458963 + ], + [ + -122.3224469, + 47.2451079 + ], + [ + -122.3225379, + 47.2448645 + ], + [ + -122.3229179, + 47.2445302 + ], + [ + -122.3239772, + 47.2438444 + ], + [ + -122.3245416, + 47.2433251 + ], + [ + -122.3265885, + 47.2409657 + ], + [ + -122.3272811, + 47.2398087 + ], + [ + -122.3274328, + 47.2393527 + ], + [ + -122.3275736, + 47.2390437 + ], + [ + -122.33634, + 47.2390234 + ], + [ + -122.3363954, + 47.2404509 + ], + [ + -122.336626, + 47.2411815 + ], + [ + -122.3369488, + 47.241505 + ], + [ + -122.3389474, + 47.2423922 + ], + [ + -122.3399159, + 47.2425279 + ], + [ + -122.3407153, + 47.2429453 + ], + [ + -122.3383881, + 47.2438435 + ], + [ + -122.3365004, + 47.2450645 + ], + [ + -122.3354145, + 47.2464466 + ], + [ + -122.3417165, + 47.2464861 + ], + [ + -122.3451078, + 47.2481362 + ], + [ + -122.3467589, + 47.2518415 + ], + [ + -122.3506661, + 47.2563137 + ], + [ + -122.3516569, + 47.2596703 + ], + [ + -122.3503998, + 47.2615568 + ], + [ + -122.350684, + 47.2629028 + ], + [ + -122.3563694, + 47.2645066 + ], + [ + -122.3590378, + 47.2667388 + ], + [ + -122.3577624, + 47.2685153 + ], + [ + -122.3592392, + 47.2690619 + ], + [ + -122.3592392, + 47.2690619 + ], + [ + -122.3616111, + 47.2683127 + ], + [ + -122.3677256, + 47.2704631 + ], + [ + -122.366976, + 47.2719275 + ], + [ + -122.366766, + 47.2751527 + ], + [ + -122.3684431, + 47.2752022 + ], + [ + -122.3708373, + 47.2722254 + ], + [ + -122.3715028, + 47.2718706 + ], + [ + -122.3724521, + 47.2718954 + ], + [ + -122.3744056, + 47.2724032 + ], + [ + -122.376925, + 47.2736791 + ], + [ + -122.3785681, + 47.2749674 + ], + [ + -122.3821652, + 47.2779724 + ], + [ + -122.3847558, + 47.2806162 + ], + [ + -122.3860846, + 47.2826062 + ], + [ + -122.3945063, + 47.2823967 + ], + [ + -122.3990007, + 47.2824905 + ], + [ + -122.4023656, + 47.2838446 + ], + [ + -122.4044733, + 47.2860336 + ], + [ + -122.4068384, + 47.2888569 + ], + [ + -122.4096845, + 47.2926081 + ], + [ + -122.4129774, + 47.295555 + ], + [ + -122.4176842, + 47.2976369 + ], + [ + -122.4246947, + 47.2991319 + ], + [ + -122.4268998, + 47.299045 + ], + [ + -122.4292985, + 47.2985992 + ], + [ + -122.4316918, + 47.2977507 + ], + [ + -122.4316533, + 47.2968946 + ], + [ + -122.4138206, + 47.2864651 + ], + [ + -122.4161371, + 47.2845786 + ], + [ + -122.4169677, + 47.2796012 + ], + [ + -122.431683, + 47.2700429 + ], + [ + -122.4381934, + 47.2620403 + ], + [ + -122.4430122, + 47.267346 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "area_1074", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.44264, + 47.13243 + ], + [ + -122.44259, + 47.13337 + ], + [ + -122.44259, + 47.13439 + ], + [ + -122.4426, + 47.13543 + ], + [ + -122.4424827, + 47.1374397 + ], + [ + -122.44247, + 47.1387 + ], + [ + -122.44252, + 47.13906 + ], + [ + -122.44255, + 47.13949 + ], + [ + -122.44252, + 47.14048 + ], + [ + -122.44251, + 47.1412 + ], + [ + -122.44252, + 47.14194 + ], + [ + -122.4425, + 47.14254 + ], + [ + -122.44248, + 47.14356 + ], + [ + -122.4424386, + 47.1440708 + ], + [ + -122.44237, + 47.14524 + ], + [ + -122.44329, + 47.1455 + ], + [ + -122.44477, + 47.14586 + ], + [ + -122.44576, + 47.14601 + ], + [ + -122.44714, + 47.14603 + ], + [ + -122.44779, + 47.14607 + ], + [ + -122.44848, + 47.14608 + ], + [ + -122.44915, + 47.14609 + ], + [ + -122.44985, + 47.1461 + ], + [ + -122.45035, + 47.14623 + ], + [ + -122.45287, + 47.1463 + ], + [ + -122.45558, + 47.14634 + ], + [ + -122.46053, + 47.14638 + ], + [ + -122.46038, + 47.14551 + ], + [ + -122.46016, + 47.14493 + ], + [ + -122.45965, + 47.14398 + ], + [ + -122.45922, + 47.14239 + ], + [ + -122.4591, + 47.1389 + ], + [ + -122.45906, + 47.13814 + ], + [ + -122.45896, + 47.13541 + ], + [ + -122.45889, + 47.13334 + ], + [ + -122.45884, + 47.13159 + ], + [ + -122.45874, + 47.12934 + ], + [ + -122.45855, + 47.12413 + ], + [ + -122.45774, + 47.12387 + ], + [ + -122.45447, + 47.12304 + ], + [ + -122.452, + 47.12255 + ], + [ + -122.45067, + 47.1225 + ], + [ + -122.44923, + 47.12247 + ], + [ + -122.44816, + 47.12242 + ], + [ + -122.44596, + 47.12233 + ], + [ + -122.44403, + 47.12212 + ], + [ + -122.44276, + 47.12622 + ], + [ + -122.44278, + 47.12628 + ], + [ + -122.4427475, + 47.1271211 + ], + [ + -122.4427, + 47.12835 + ], + [ + -122.44269, + 47.12938 + ], + [ + -122.4441655, + 47.1293856 + ], + [ + -122.4442087, + 47.1304317 + ], + [ + -122.4453, + 47.13044 + ], + [ + -122.4453, + 47.13144 + ], + [ + -122.44265, + 47.13142 + ], + [ + -122.44264, + 47.13243 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "area_1075", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.4263292, + 47.184988 + ], + [ + -122.4257652, + 47.1809407 + ], + [ + -122.4234242, + 47.1810939 + ], + [ + -122.4307507, + 47.1750868 + ], + [ + -122.4236938, + 47.1698907 + ], + [ + -122.4253152, + 47.1636929 + ], + [ + -122.4196181, + 47.1589882 + ], + [ + -122.4091027, + 47.158996 + ], + [ + -122.3965814, + 47.1590042 + ], + [ + -122.3915931, + 47.1588341 + ], + [ + -122.380688, + 47.158893 + ], + [ + -122.3690105, + 47.1593204 + ], + [ + -122.3547003, + 47.1588259 + ], + [ + -122.3476657, + 47.1581112 + ], + [ + -122.3414736, + 47.1581866 + ], + [ + -122.3349715, + 47.1584607 + ], + [ + -122.3280845, + 47.1587227 + ], + [ + -122.3283358, + 47.1698719 + ], + [ + -122.3282359, + 47.1719801 + ], + [ + -122.3281325, + 47.172415 + ], + [ + -122.3275802, + 47.1729834 + ], + [ + -122.3264875, + 47.1737181 + ], + [ + -122.3257612, + 47.1743327 + ], + [ + -122.3255189, + 47.1750029 + ], + [ + -122.3255091, + 47.1755598 + ], + [ + -122.3258309, + 47.1769161 + ], + [ + -122.3264009, + 47.1778436 + ], + [ + -122.3271042, + 47.1788231 + ], + [ + -122.3274597, + 47.1797736 + ], + [ + -122.3270549, + 47.1813482 + ], + [ + -122.3269869, + 47.1824083 + ], + [ + -122.3269968, + 47.1843376 + ], + [ + -122.3572423, + 47.184528 + ], + [ + -122.3935499, + 47.1843941 + ], + [ + -122.4263292, + 47.184988 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "area_1076", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.4168, + 47.15039 + ], + [ + -122.42079, + 47.15146 + ], + [ + -122.425626, + 47.1503084 + ], + [ + -122.4266415, + 47.1484584 + ], + [ + -122.4266853, + 47.1474483 + ], + [ + -122.4269521, + 47.1383568 + ], + [ + -122.42718, + 47.13142 + ], + [ + -122.42735, + 47.12425 + ], + [ + -122.4276116, + 47.1205996 + ], + [ + -122.425453, + 47.1189598 + ], + [ + -122.4254549, + 47.115886 + ], + [ + -122.42914, + 47.11594 + ], + [ + -122.42957, + 47.11541 + ], + [ + -122.42627, + 47.11228 + ], + [ + -122.4262999, + 47.1118325 + ], + [ + -122.4263813, + 47.1037645 + ], + [ + -122.4264917, + 47.0951562 + ], + [ + -122.42868, + 47.09508 + ], + [ + -122.42853, + 47.09437 + ], + [ + -122.42841, + 47.0939 + ], + [ + -122.42821, + 47.09125 + ], + [ + -122.42797, + 47.08262 + ], + [ + -122.42155, + 47.08252 + ], + [ + -122.42158, + 47.07889 + ], + [ + -122.4215668, + 47.0740074 + ], + [ + -122.4216527, + 47.0738172 + ], + [ + -122.421705, + 47.0737412 + ], + [ + -122.4198017, + 47.0722827 + ], + [ + -122.4149622, + 47.0686564 + ], + [ + -122.413706, + 47.0678632 + ], + [ + -122.4134558, + 47.0680427 + ], + [ + -122.413034, + 47.0680371 + ], + [ + -122.4125686, + 47.0679074 + ], + [ + -122.40559, + 47.068 + ], + [ + -122.40038, + 47.068 + ], + [ + -122.40031, + 47.08228 + ], + [ + -122.40014, + 47.09688 + ], + [ + -122.40982, + 47.097 + ], + [ + -122.40966, + 47.10423 + ], + [ + -122.40004, + 47.10414 + ], + [ + -122.39996, + 47.10884 + ], + [ + -122.4004777, + 47.1089617 + ], + [ + -122.40478, + 47.11136 + ], + [ + -122.4058517, + 47.1114479 + ], + [ + -122.40723, + 47.11143 + ], + [ + -122.4072, + 47.11275 + ], + [ + -122.40722, + 47.11469 + ], + [ + -122.40791, + 47.1147 + ], + [ + -122.40787, + 47.11587 + ], + [ + -122.40745, + 47.11628 + ], + [ + -122.40721, + 47.11662 + ], + [ + -122.40716, + 47.11875 + ], + [ + -122.38926, + 47.11856 + ], + [ + -122.37872, + 47.11848 + ], + [ + -122.37886, + 47.12021 + ], + [ + -122.38085, + 47.12236 + ], + [ + -122.38171, + 47.12328 + ], + [ + -122.3856493, + 47.1258103 + ], + [ + -122.3892038, + 47.1258185 + ], + [ + -122.38932, + 47.12757 + ], + [ + -122.3933356, + 47.1285837 + ], + [ + -122.39626, + 47.12928 + ], + [ + -122.39735, + 47.12961 + ], + [ + -122.39803, + 47.12996 + ], + [ + -122.39943, + 47.13071 + ], + [ + -122.40146, + 47.13186 + ], + [ + -122.40214, + 47.13221 + ], + [ + -122.40597, + 47.13346 + ], + [ + -122.40931, + 47.13448 + ], + [ + -122.41038, + 47.13466 + ], + [ + -122.40994, + 47.14743 + ], + [ + -122.41556, + 47.14736 + ], + [ + -122.4165866, + 47.1473439 + ], + [ + -122.4168, + 47.15039 + ] + ] + ] + }, + "properties": {} + }, + { + "id": "area_1077", + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.4590509, + 47.1378921 + ], + [ + -122.4638115, + 47.1379219 + ], + [ + -122.4638009, + 47.1389431 + ], + [ + -122.467892, + 47.1389892 + ], + [ + -122.4680003, + 47.1413616 + ], + [ + -122.4691678, + 47.1413977 + ], + [ + -122.4691373, + 47.1426439 + ], + [ + -122.4694249, + 47.1426497 + ], + [ + -122.4693806, + 47.1443482 + ], + [ + -122.4679968, + 47.1443438 + ], + [ + -122.4679684, + 47.1462829 + ], + [ + -122.4676453, + 47.1462814 + ], + [ + -122.4674371, + 47.1492094 + ], + [ + -122.4681537, + 47.1491815 + ], + [ + -122.468178, + 47.1504206 + ], + [ + -122.4680782, + 47.1541716 + ], + [ + -122.4729449, + 47.1541437 + ], + [ + -122.4728702, + 47.1558394 + ], + [ + -122.472868, + 47.1559393 + ], + [ + -122.4728304, + 47.1559395 + ], + [ + -122.472697, + 47.1587698 + ], + [ + -122.4726937, + 47.15877 + ], + [ + -122.4716, + 47.158861 + ], + [ + -122.4715787, + 47.1589023 + ], + [ + -122.4715594, + 47.1589222 + ], + [ + -122.4714757, + 47.1589643 + ], + [ + -122.4714284, + 47.1589726 + ], + [ + -122.4724351, + 47.1588895 + ], + [ + -122.4724787, + 47.1588926 + ], + [ + -122.4725222, + 47.1589123 + ], + [ + -122.4725454, + 47.1589441 + ], + [ + -122.4725468, + 47.1589856 + ], + [ + -122.4725379, + 47.1593851 + ], + [ + -122.4713684, + 47.1596756 + ], + [ + -122.4713349, + 47.1597863 + ], + [ + -122.4726553, + 47.159785 + ], + [ + -122.4726395, + 47.1602873 + ], + [ + -122.4726713, + 47.160287 + ], + [ + -122.4740906, + 47.1602765 + ], + [ + -122.4741092, + 47.1594889 + ], + [ + -122.4746552, + 47.1594946 + ], + [ + -122.4746565, + 47.159416 + ], + [ + -122.4800016, + 47.1594551 + ], + [ + -122.4800058, + 47.1558976 + ], + [ + -122.4889213, + 47.1558323 + ], + [ + -122.4838052, + 47.1611244 + ], + [ + -122.4836227, + 47.1610769 + ], + [ + -122.472979, + 47.1702047 + ], + [ + -122.4433102, + 47.1701574 + ], + [ + -122.423999, + 47.1701155 + ], + [ + -122.4236938, + 47.1698907 + ], + [ + -122.4253152, + 47.1636929 + ], + [ + -122.4196181, + 47.1589882 + ], + [ + -122.4091027, + 47.158996 + ], + [ + -122.3965814, + 47.1590042 + ], + [ + -122.3915931, + 47.1588341 + ], + [ + -122.380688, + 47.158893 + ], + [ + -122.3690105, + 47.1593204 + ], + [ + -122.3547003, + 47.1588259 + ], + [ + -122.3476657, + 47.1581112 + ], + [ + -122.3414736, + 47.1581866 + ], + [ + -122.3349715, + 47.1584607 + ], + [ + -122.3280845, + 47.1587227 + ], + [ + -122.3283358, + 47.1698719 + ], + [ + -122.3282359, + 47.1719801 + ], + [ + -122.3281325, + 47.172415 + ], + [ + -122.3275802, + 47.1729834 + ], + [ + -122.3264875, + 47.1737181 + ], + [ + -122.3257612, + 47.1743327 + ], + [ + -122.3255189, + 47.1750029 + ], + [ + -122.3255091, + 47.1755598 + ], + [ + -122.3258309, + 47.1769161 + ], + [ + -122.3264009, + 47.1778436 + ], + [ + -122.3271042, + 47.1788231 + ], + [ + -122.3274597, + 47.1797736 + ], + [ + -122.3270549, + 47.1813482 + ], + [ + -122.3269869, + 47.1824083 + ], + [ + -122.3269968, + 47.1843376 + ], + [ + -122.3572423, + 47.184528 + ], + [ + -122.3935499, + 47.1843941 + ], + [ + -122.4263292, + 47.184988 + ], + [ + -122.4263292, + 47.2139397 + ], + [ + -122.3570309, + 47.2134796 + ], + [ + -122.3568584, + 47.2134784 + ], + [ + -122.3265964, + 47.213288 + ], + [ + -122.3248434, + 47.2132521 + ], + [ + -122.3230942, + 47.2131669 + ], + [ + -122.3213516, + 47.2130325 + ], + [ + -122.3196186, + 47.2128492 + ], + [ + -122.3178005, + 47.2126027 + ], + [ + -122.3159999, + 47.2123023 + ], + [ + -122.3142203, + 47.2119486 + ], + [ + -122.312465, + 47.2115424 + ], + [ + -122.3107375, + 47.2110843 + ], + [ + -122.3090409, + 47.2105753 + ], + [ + -122.3073786, + 47.2100164 + ], + [ + -122.3057536, + 47.2094085 + ], + [ + -122.3041692, + 47.208753 + ], + [ + -122.3026282, + 47.2080509 + ], + [ + -122.3011338, + 47.2073036 + ], + [ + -122.2996886, + 47.2065126 + ], + [ + -122.2982954, + 47.2056795 + ], + [ + -122.296957, + 47.2048056 + ], + [ + -122.2956758, + 47.2038928 + ], + [ + -122.2944543, + 47.2029428 + ], + [ + -122.2932948, + 47.2019573 + ], + [ + -122.2921996, + 47.2009384 + ], + [ + -122.2911706, + 47.1998878 + ], + [ + -122.2902099, + 47.1988076 + ], + [ + -122.2893192, + 47.1976998 + ], + [ + -122.2885004, + 47.1965667 + ], + [ + -122.2877548, + 47.1954102 + ], + [ + -122.2870841, + 47.1942327 + ], + [ + -122.2864893, + 47.1930364 + ], + [ + -122.2859717, + 47.1918235 + ], + [ + -122.2855322, + 47.1905964 + ], + [ + -122.2851717, + 47.1893574 + ], + [ + -122.2848956, + 47.188134 + ], + [ + -122.2846965, + 47.1869036 + ], + [ + -122.2845748, + 47.1856685 + ], + [ + -122.2845306, + 47.1844311 + ], + [ + -122.2845271, + 47.1836076 + ], + [ + -122.2843721, + 47.1831749 + ], + [ + -122.2840116, + 47.1819359 + ], + [ + -122.2839121, + 47.1815332 + ], + [ + -122.2835913, + 47.1801768 + ], + [ + -122.2833539, + 47.1790271 + ], + [ + -122.2831844, + 47.1778718 + ], + [ + -122.2830829, + 47.1767128 + ], + [ + -122.2830497, + 47.175552 + ], + [ + -122.2830531, + 47.175204 + ], + [ + -122.2830633, + 47.174647 + ], + [ + -122.28312, + 47.1734715 + ], + [ + -122.2832467, + 47.1722985 + ], + [ + -122.2834431, + 47.1711299 + ], + [ + -122.283709, + 47.1699678 + ], + [ + -122.2839809, + 47.169013 + ], + [ + -122.2842998, + 47.168065 + ], + [ + -122.2845426, + 47.167395 + ], + [ + -122.2848307, + 47.1666433 + ], + [ + -122.2851482, + 47.1658972 + ], + [ + -122.285495, + 47.1651571 + ], + [ + -122.2857623, + 47.1646354 + ], + [ + -122.2856433, + 47.1591597 + ], + [ + -122.2856386, + 47.1587148 + ], + [ + -122.28568, + 47.157452 + ], + [ + -122.2858021, + 47.1561916 + ], + [ + -122.2860047, + 47.154936 + ], + [ + -122.2862874, + 47.1536876 + ], + [ + -122.2866496, + 47.1524489 + ], + [ + -122.2870907, + 47.1512221 + ], + [ + -122.2876098, + 47.1500096 + ], + [ + -122.2882058, + 47.1488136 + ], + [ + -122.2888778, + 47.1476366 + ], + [ + -122.2896243, + 47.1464806 + ], + [ + -122.290444, + 47.145348 + ], + [ + -122.2913353, + 47.1442409 + ], + [ + -122.2922965, + 47.1431613 + ], + [ + -122.2933257, + 47.1421113 + ], + [ + -122.2944211, + 47.1410929 + ], + [ + -122.2955804, + 47.1401082 + ], + [ + -122.2968016, + 47.1391588 + ], + [ + -122.2980823, + 47.1382467 + ], + [ + -122.29942, + 47.1373735 + ], + [ + -122.3008122, + 47.136541 + ], + [ + -122.3022562, + 47.1357507 + ], + [ + -122.3037494, + 47.1350041 + ], + [ + -122.3052888, + 47.1343026 + ], + [ + -122.3068716, + 47.1336476 + ], + [ + -122.3084946, + 47.1330403 + ], + [ + -122.3101549, + 47.1324819 + ], + [ + -122.3118493, + 47.1319734 + ], + [ + -122.3135746, + 47.1315159 + ], + [ + -122.3153274, + 47.13111 + ], + [ + -122.3171045, + 47.1307567 + ], + [ + -122.3189024, + 47.1304567 + ], + [ + -122.3207178, + 47.1302104 + ], + [ + -122.3219625, + 47.1300736 + ], + [ + -122.3232125, + 47.1299622 + ], + [ + -122.3244668, + 47.1298762 + ], + [ + -122.3257243, + 47.1298156 + ], + [ + -122.3324816, + 47.1295585 + ], + [ + -122.3385958, + 47.1293007 + ], + [ + -122.3384012, + 47.1289089 + ], + [ + -122.3378842, + 47.127696 + ], + [ + -122.3374453, + 47.1264689 + ], + [ + -122.3370852, + 47.1252299 + ], + [ + -122.3368847, + 47.1243769 + ], + [ + -122.3367216, + 47.1235203 + ], + [ + -122.336596, + 47.1226608 + ], + [ + -122.336508, + 47.1217991 + ], + [ + -122.3363694, + 47.120069 + ], + [ + -122.3363216, + 47.1192709 + ], + [ + -122.3363061, + 47.1184721 + ], + [ + -122.3363475, + 47.1172093 + ], + [ + -122.3364695, + 47.1159489 + ], + [ + -122.3366719, + 47.1146933 + ], + [ + -122.3369544, + 47.1134449 + ], + [ + -122.3373163, + 47.1122061 + ], + [ + -122.3377571, + 47.1109793 + ], + [ + -122.3382757, + 47.1097668 + ], + [ + -122.3388714, + 47.1085709 + ], + [ + -122.3395428, + 47.1073938 + ], + [ + -122.3402888, + 47.1062379 + ], + [ + -122.3411078, + 47.1051052 + ], + [ + -122.3419984, + 47.1039981 + ], + [ + -122.3429589, + 47.1029185 + ], + [ + -122.3439874, + 47.1018685 + ], + [ + -122.3450819, + 47.1008501 + ], + [ + -122.3462404, + 47.0998653 + ], + [ + -122.3474606, + 47.098916 + ], + [ + -122.3487403, + 47.0980038 + ], + [ + -122.350077, + 47.0971307 + ], + [ + -122.3514682, + 47.0962981 + ], + [ + -122.3529112, + 47.0955078 + ], + [ + -122.3544032, + 47.0947612 + ], + [ + -122.3559414, + 47.0940597 + ], + [ + -122.357523, + 47.0934047 + ], + [ + -122.3577863, + 47.0933062 + ], + [ + -122.3579255, + 47.0821086 + ], + [ + -122.3580065, + 47.0678952 + ], + [ + -122.3580523, + 47.0666567 + ], + [ + -122.3581757, + 47.0654206 + ], + [ + -122.3583763, + 47.0641892 + ], + [ + -122.3586538, + 47.0629649 + ], + [ + -122.3590154, + 47.0617261 + ], + [ + -122.3594557, + 47.0604993 + ], + [ + -122.3599739, + 47.0592867 + ], + [ + -122.360569, + 47.0580908 + ], + [ + -122.3612398, + 47.0569137 + ], + [ + -122.361985, + 47.0557578 + ], + [ + -122.3628033, + 47.0546251 + ], + [ + -122.3636931, + 47.0535179 + ], + [ + -122.3646527, + 47.0524383 + ], + [ + -122.3656802, + 47.0513883 + ], + [ + -122.3667736, + 47.05037 + ], + [ + -122.367931, + 47.0493852 + ], + [ + -122.3691501, + 47.0484358 + ], + [ + -122.3704286, + 47.0475236 + ], + [ + -122.3717641, + 47.0466505 + ], + [ + -122.3731539, + 47.0458179 + ], + [ + -122.3745955, + 47.0450276 + ], + [ + -122.3760861, + 47.044281 + ], + [ + -122.3776229, + 47.0435795 + ], + [ + -122.379203, + 47.0429245 + ], + [ + -122.3808233, + 47.0423172 + ], + [ + -122.3824808, + 47.0417588 + ], + [ + -122.3841723, + 47.0412503 + ], + [ + -122.3858947, + 47.0407927 + ], + [ + -122.3862288, + 47.0407152 + ], + [ + -122.3884671, + 47.0434408 + ], + [ + -122.3889249, + 47.0439372 + ], + [ + -122.3898338, + 47.0449229 + ], + [ + -122.3981849, + 47.053292 + ], + [ + -122.3982176, + 47.0533248 + ], + [ + -122.4002901, + 47.0533347 + ], + [ + -122.4003635, + 47.0533351 + ], + [ + -122.40039, + 47.0551389 + ], + [ + -122.4003905, + 47.0551709 + ], + [ + -122.4056738, + 47.0551933 + ], + [ + -122.4056757, + 47.0605883 + ], + [ + -122.4057707, + 47.0606798 + ], + [ + -122.4110411, + 47.0606814 + ], + [ + -122.4110342, + 47.063265 + ], + [ + -122.411034, + 47.0633349 + ], + [ + -122.4111421, + 47.0633201 + ], + [ + -122.4111609, + 47.0635937 + ], + [ + -122.4111154, + 47.0635999 + ], + [ + -122.411081, + 47.0655334 + ], + [ + -122.4139229, + 47.0677978 + ], + [ + -122.4137743, + 47.0679063 + ], + [ + -122.413706, + 47.0678632 + ], + [ + -122.4134558, + 47.0680427 + ], + [ + -122.413034, + 47.0680371 + ], + [ + -122.4125686, + 47.0679074 + ], + [ + -122.40559, + 47.068 + ], + [ + -122.40038, + 47.068 + ], + [ + -122.40031, + 47.08228 + ], + [ + -122.40014, + 47.09688 + ], + [ + -122.40982, + 47.097 + ], + [ + -122.40966, + 47.10423 + ], + [ + -122.40004, + 47.10414 + ], + [ + -122.39996, + 47.10884 + ], + [ + -122.4004777, + 47.1089617 + ], + [ + -122.40478, + 47.11136 + ], + [ + -122.4058517, + 47.1114479 + ], + [ + -122.40723, + 47.11143 + ], + [ + -122.4072, + 47.11275 + ], + [ + -122.40722, + 47.11469 + ], + [ + -122.40791, + 47.1147 + ], + [ + -122.40787, + 47.11587 + ], + [ + -122.40745, + 47.11628 + ], + [ + -122.40721, + 47.11662 + ], + [ + -122.40716, + 47.11875 + ], + [ + -122.38926, + 47.11856 + ], + [ + -122.37872, + 47.11848 + ], + [ + -122.37886, + 47.12021 + ], + [ + -122.38085, + 47.12236 + ], + [ + -122.38171, + 47.12328 + ], + [ + -122.3856493, + 47.1258103 + ], + [ + -122.3892038, + 47.1258185 + ], + [ + -122.38932, + 47.12757 + ], + [ + -122.3933356, + 47.1285837 + ], + [ + -122.39626, + 47.12928 + ], + [ + -122.39735, + 47.12961 + ], + [ + -122.39803, + 47.12996 + ], + [ + -122.39943, + 47.13071 + ], + [ + -122.40146, + 47.13186 + ], + [ + -122.40214, + 47.13221 + ], + [ + -122.40597, + 47.13346 + ], + [ + -122.40931, + 47.13448 + ], + [ + -122.41038, + 47.13466 + ], + [ + -122.40994, + 47.14743 + ], + [ + -122.41556, + 47.14736 + ], + [ + -122.4165866, + 47.1473439 + ], + [ + -122.4168, + 47.15039 + ], + [ + -122.42079, + 47.15146 + ], + [ + -122.425626, + 47.1503084 + ], + [ + -122.4266415, + 47.1484584 + ], + [ + -122.4266853, + 47.1474483 + ], + [ + -122.4269521, + 47.1383568 + ], + [ + -122.42718, + 47.13142 + ], + [ + -122.42735, + 47.12425 + ], + [ + -122.4276116, + 47.1205996 + ], + [ + -122.425453, + 47.1189598 + ], + [ + -122.4254549, + 47.115886 + ], + [ + -122.42914, + 47.11594 + ], + [ + -122.42957, + 47.11541 + ], + [ + -122.42627, + 47.11228 + ], + [ + -122.4262999, + 47.1118325 + ], + [ + -122.4263813, + 47.1037645 + ], + [ + -122.4264917, + 47.0951562 + ], + [ + -122.42868, + 47.09508 + ], + [ + -122.42853, + 47.09437 + ], + [ + -122.42841, + 47.0939 + ], + [ + -122.42821, + 47.09125 + ], + [ + -122.42797, + 47.08262 + ], + [ + -122.42155, + 47.08252 + ], + [ + -122.42158, + 47.07889 + ], + [ + -122.4215668, + 47.0740074 + ], + [ + -122.4216527, + 47.0738172 + ], + [ + -122.421705, + 47.0737412 + ], + [ + -122.4198017, + 47.0722827 + ], + [ + -122.4149622, + 47.0686564 + ], + [ + -122.4138741, + 47.0679693 + ], + [ + -122.4140136, + 47.0678702 + ], + [ + -122.4141171, + 47.0679526 + ], + [ + -122.4215546, + 47.0679299 + ], + [ + -122.4215553, + 47.0678461 + ], + [ + -122.428273, + 47.067935 + ], + [ + -122.4327341, + 47.0680053 + ], + [ + -122.4323595, + 47.0790174 + ], + [ + -122.4324382, + 47.0790189 + ], + [ + -122.4336362, + 47.0790416 + ], + [ + -122.4336243, + 47.0794015 + ], + [ + -122.4335457, + 47.0817688 + ], + [ + -122.4335245, + 47.0824063 + ], + [ + -122.4336052, + 47.0823959 + ], + [ + -122.4336416, + 47.0823566 + ], + [ + -122.4336972, + 47.0823247 + ], + [ + -122.4337627, + 47.0822539 + ], + [ + -122.4340588, + 47.0821818 + ], + [ + -122.4341609, + 47.0821826 + ], + [ + -122.4344676, + 47.0821956 + ], + [ + -122.4349558, + 47.0822106 + ], + [ + -122.435606, + 47.0822512 + ], + [ + -122.4359857, + 47.0823401 + ], + [ + -122.4356221, + 47.0831069 + ], + [ + -122.4356047, + 47.083144 + ], + [ + -122.4355879, + 47.0831813 + ], + [ + -122.4355719, + 47.0832181 + ], + [ + -122.4355561, + 47.0832555 + ], + [ + -122.4355411, + 47.0832925 + ], + [ + -122.4355264, + 47.0833301 + ], + [ + -122.4355125, + 47.0833673 + ], + [ + -122.4354988, + 47.0834051 + ], + [ + -122.4354859, + 47.0834425 + ], + [ + -122.4354733, + 47.0834805 + ], + [ + -122.4354614, + 47.083518 + ], + [ + -122.4354498, + 47.0835562 + ], + [ + -122.435439, + 47.0835938 + ], + [ + -122.4354285, + 47.0836321 + ], + [ + -122.4354187, + 47.0836699 + ], + [ + -122.4354093, + 47.0837083 + ], + [ + -122.4354006, + 47.0837462 + ], + [ + -122.4353923, + 47.0837848 + ], + [ + -122.4353846, + 47.0838228 + ], + [ + -122.4353773, + 47.0838614 + ], + [ + -122.4353707, + 47.0838995 + ], + [ + -122.4353645, + 47.0839383 + ], + [ + -122.435359, + 47.0839764 + ], + [ + -122.4353539, + 47.0840153 + ], + [ + -122.4353494, + 47.0840535 + ], + [ + -122.4353454, + 47.0840924 + ], + [ + -122.435342, + 47.0841307 + ], + [ + -122.435339, + 47.0841696 + ], + [ + -122.4353367, + 47.0842079 + ], + [ + -122.4353348, + 47.0842469 + ], + [ + -122.4353335, + 47.0842852 + ], + [ + -122.4353328, + 47.0843242 + ], + [ + -122.4353304, + 47.0845124 + ], + [ + -122.4364943, + 47.0845288 + ], + [ + -122.4364838, + 47.085365 + ], + [ + -122.4358417, + 47.0853559 + ], + [ + -122.4353199, + 47.0853491 + ], + [ + -122.4351712, + 47.0972119 + ], + [ + -122.4427843, + 47.0972931 + ], + [ + -122.453359, + 47.0974034 + ], + [ + -122.4533585, + 47.0974682 + ], + [ + -122.4533584, + 47.0974836 + ], + [ + -122.4534102, + 47.0974845 + ], + [ + -122.4557409, + 47.097525 + ], + [ + -122.456925, + 47.0975455 + ], + [ + -122.4570231, + 47.097546 + ], + [ + -122.4571263, + 47.097549 + ], + [ + -122.4573084, + 47.0978121 + ], + [ + -122.4574322, + 47.0979662 + ], + [ + -122.4575477, + 47.0981042 + ], + [ + -122.4577908, + 47.0982832 + ], + [ + -122.4579482, + 47.0983829 + ], + [ + -122.4582564, + 47.0985096 + ], + [ + -122.4584835, + 47.098573 + ], + [ + -122.4586519, + 47.0986048 + ], + [ + -122.4590334, + 47.0987333 + ], + [ + -122.4593969, + 47.0988762 + ], + [ + -122.4595655, + 47.0989424 + ], + [ + -122.460369, + 47.0992438 + ], + [ + -122.4608405, + 47.0994135 + ], + [ + -122.4609053, + 47.099438 + ], + [ + -122.4610044, + 47.0994754 + ], + [ + -122.4611369, + 47.0995404 + ], + [ + -122.4612964, + 47.0995889 + ], + [ + -122.461631, + 47.0996801 + ], + [ + -122.4619738, + 47.099782 + ], + [ + -122.4625264, + 47.0999046 + ], + [ + -122.4639498, + 47.1003271 + ], + [ + -122.4639196, + 47.1259857 + ], + [ + -122.4673213, + 47.1268024 + ], + [ + -122.4689019, + 47.1268008 + ], + [ + -122.4690796, + 47.1269906 + ], + [ + -122.4690816, + 47.1273193 + ], + [ + -122.4690304, + 47.132187 + ], + [ + -122.4655989, + 47.1322521 + ], + [ + -122.4655786, + 47.1361709 + ], + [ + -122.4638298, + 47.1361537 + ], + [ + -122.4638119, + 47.1378866 + ], + [ + -122.4590505, + 47.1378819 + ], + [ + -122.45896, + 47.13541 + ], + [ + -122.45889, + 47.13334 + ], + [ + -122.45884, + 47.13159 + ], + [ + -122.45874, + 47.12934 + ], + [ + -122.45855, + 47.12413 + ], + [ + -122.45774, + 47.12387 + ], + [ + -122.45447, + 47.12304 + ], + [ + -122.452, + 47.12255 + ], + [ + -122.45067, + 47.1225 + ], + [ + -122.44923, + 47.12247 + ], + [ + -122.44816, + 47.12242 + ], + [ + -122.44596, + 47.12233 + ], + [ + -122.44403, + 47.12212 + ], + [ + -122.44276, + 47.12622 + ], + [ + -122.44278, + 47.12628 + ], + [ + -122.4427475, + 47.1271211 + ], + [ + -122.4427, + 47.12835 + ], + [ + -122.44269, + 47.12938 + ], + [ + -122.4441655, + 47.1293856 + ], + [ + -122.4442087, + 47.1304317 + ], + [ + -122.4453, + 47.13044 + ], + [ + -122.4453, + 47.13144 + ], + [ + -122.44265, + 47.13142 + ], + [ + -122.44264, + 47.13243 + ], + [ + -122.44259, + 47.13337 + ], + [ + -122.44259, + 47.13439 + ], + [ + -122.4426, + 47.13543 + ], + [ + -122.4424827, + 47.1374397 + ], + [ + -122.44247, + 47.1387 + ], + [ + -122.44252, + 47.13906 + ], + [ + -122.44255, + 47.13949 + ], + [ + -122.44252, + 47.14048 + ], + [ + -122.44251, + 47.1412 + ], + [ + -122.44252, + 47.14194 + ], + [ + -122.4425, + 47.14254 + ], + [ + -122.44248, + 47.14356 + ], + [ + -122.4424386, + 47.1440708 + ], + [ + -122.44237, + 47.14524 + ], + [ + -122.44329, + 47.1455 + ], + [ + -122.44477, + 47.14586 + ], + [ + -122.44576, + 47.14601 + ], + [ + -122.44714, + 47.14603 + ], + [ + -122.44779, + 47.14607 + ], + [ + -122.44848, + 47.14608 + ], + [ + -122.44915, + 47.14609 + ], + [ + -122.44985, + 47.1461 + ], + [ + -122.45035, + 47.14623 + ], + [ + -122.45287, + 47.1463 + ], + [ + -122.45558, + 47.14634 + ], + [ + -122.46053, + 47.14638 + ], + [ + -122.46038, + 47.14551 + ], + [ + -122.46016, + 47.14493 + ], + [ + -122.45965, + 47.14398 + ], + [ + -122.45922, + 47.14239 + ], + [ + -122.4591, + 47.1389 + ], + [ + -122.45906, + 47.13814 + ], + [ + -122.4590509, + 47.1378921 + ] + ] + ] + }, + "properties": {} + } + ] +} \ No newline at end of file diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/routes.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/routes.txt new file mode 100644 index 000000000..15f733558 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/routes.txt @@ -0,0 +1,5 @@ +agency_id,route_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color,route_sort_order,min_headway_minutes,eligibility_restricted,continuous_pickup,continuous_drop_off,tts_route_short_name,tts_route_long_name +4971,76310,,Ruston Runner,,3,,398bc5,,0,,0,1,1,, +4971,76311,,Tideflats Runner,,3,,3b6a9d,,1,,0,1,1,, +4971,76312,,Spanaway Runner,,3,,00befd,000000,2,,0,1,1,, +4971,76313,,JBLM Runner,,3,,00befd,000000,3,,0,1,1,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stop_areas.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stop_areas.txt new file mode 100644 index 000000000..6ed570846 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stop_areas.txt @@ -0,0 +1,16 @@ +area_id,stop_id +4210800,area_1074 +4210800,area_1075 +4210800,area_1076 +4210813,4210804 +4210813,4210805 +4210813,4210806 +4210813,4210807 +4210813,4210801 +4210813,4210809 +4210813,4210810 +4210813,4210811 +4210813,4210812 +4210813,4210808 +4210813,4210802 +4210813,4210803 \ No newline at end of file diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stop_times.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stop_times.txt new file mode 100644 index 000000000..78e3074ba --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stop_times.txt @@ -0,0 +1,15 @@ +trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled,timepoint,start_service_area_id,end_service_area_id,start_service_area_radius,end_service_area_radius,continuous_pickup,continuous_drop_off,pickup_booking_rule_id,drop_off_booking_rule_id,start_pickup_drop_off_window,end_pickup_drop_off_window,mean_duration_factor,mean_duration_offset,safe_duration_factor,safe_duration_offset,tts_stop_headsign,min_arrival_time,max_departure_time +t_5582575_b_80375_tn_0,,,area_1072,1,,2,1,0,0,,,,,1,1,booking_route_76310,booking_route_76310,07:00:00,22:00:00,1,5.00,1,7.00,,, +t_5582575_b_80375_tn_0,,,area_1072,2,,1,2,0,0,,,,,1,1,booking_route_76310,booking_route_76310,07:00:00,22:00:00,1,5.00,1,7.00,,, +t_5586053_b_80375_tn_0,,,area_1073,1,,2,1,0,0,,,,,1,1,booking_route_76311,booking_route_76311,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586053_b_80375_tn_0,,,area_1073,2,,1,2,0,0,,,,,1,1,booking_route_76311,booking_route_76311,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586054_b_80375_tn_0,,,4210800,1,,2,1,0,0,,,,,1,1,booking_route_76312,booking_route_76312,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586054_b_80375_tn_0,,,4210800,2,,1,2,0,0,,,,,1,1,booking_route_76312,booking_route_76312,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586055_b_80375_tn_0,,,4210800,1,,2,1,0,0,,,,,1,1,booking_route_76312,booking_route_76312,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586055_b_80375_tn_0,,,area_1077,2,,1,2,0,0,,,,,1,1,booking_route_76312,booking_route_76312,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586056_b_80375_tn_0,,,area_1077,1,,2,1,0,0,,,,,1,1,booking_route_76312,booking_route_76312,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586056_b_80375_tn_0,,,4210800,2,,1,2,0,0,,,,,1,1,booking_route_76312,booking_route_76312,07:00:00,22:00:00,1,5.00,1,10.00,,, +t_5586096_b_80376_tn_0,,,4210813,1,,2,1,0,0,,,,,1,1,booking_route_76313,booking_route_76313,07:00:00,09:30:00,1,5.00,1,7.00,,, +t_5586096_b_80376_tn_0,,,4210813,2,,1,2,0,0,,,,,1,1,booking_route_76313,booking_route_76313,07:00:00,09:30:00,1,5.00,1,7.00,,, +t_5586097_b_80376_tn_0,,,4210813,1,,2,1,0,0,,,,,1,1,booking_route_76313,booking_route_76313,15:00:00,18:30:00,1,5.00,1,7.00,,, +t_5586097_b_80376_tn_0,,,4210813,2,,1,2,0,0,,,,,1,1,booking_route_76313,booking_route_76313,15:00:00,18:30:00,1,5.00,1,7.00,,, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stops.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stops.txt new file mode 100644 index 000000000..7567024ab --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/stops.txt @@ -0,0 +1,19 @@ +stop_id,stop_code,platform_code,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url,location_type,parent_station,stop_timezone,position,direction,wheelchair_boarding,tts_stop_name +4210574,,,Ruston Way,,47.2803611075431,-122.478135960265,,,0,,America/Los_Angeles,,,0, +4210575,,,Port of Tacoma,,47.2530211408576,-122.375902952852,,,0,,America/Los_Angeles,,,0, +4210576,,,"Spanaway, WA, USA",,47.1215482031301,-122.41115802604,,,0,,America/Los_Angeles,,,0, +4210577,,,"Midland, WA, USA",,47.172908040322,-122.366108336615,,,0,,America/Los_Angeles,,,0, +4210578,,,"Parkland, WA, USA",,47.1352304417448,-122.449156667491,,,0,,America/Los_Angeles,,,0, +4210579,,,"Spanaway Buffer, WA, USA",,47.1406240812435,-122.383051288107,,,0,,America/Los_Angeles,,,0, +4210801,,,Lakewood Transit Center,,47.1651533527433,-122.513206389954,,,0,,America/Los_Angeles,,,0, +4210802,,,Lakewood Station (Bay 6),,47.1525830474275,-122.49918573403,,,0,,America/Los_Angeles,,,0, +4210803,,,Bridgeport Way & Pacific Hwy SW (Northbound),,47.1508470880185,-122.50432023215,,,0,,America/Los_Angeles,,,0, +4210804,,,Bridgeport Way & Pacific Hwy SW (Southbound),,47.1505105434807,-122.504607230921,,,0,,America/Los_Angeles,,,0, +4210805,,,Bridgeport Way & San Francisco Ave SW (Southbound),,47.1416586202339,-122.503714676304,,,0,,America/Los_Angeles,,,0, +4210806,,,Bridgeport Way & San Francisco Ave SW (Northbound),,47.1427796398538,-122.504098108707,,,0,,America/Los_Angeles,,,0, +4210807,,,Visitor Main Gate - Fairway Rd,,47.1367431155588,-122.500633149635,,,0,,America/Los_Angeles,,,0, +4210808,,,Barnes Blvd & D St SW,,47.1297618324364,-122.494075148601,,,0,,America/Los_Angeles,,,0, +4210809,,,Olympic Dining Facility - Outer Dr,,47.1282959051506,-122.491026105129,,,0,,America/Los_Angeles,,,0, +4210810,,,McChord Base Exchange (Barnes Blvd & 14th St),,47.1266199477849,-122.494126392815,,,0,,America/Los_Angeles,,,0, +4210811,,,JBLM Commissary,,47.1254155072807,-122.49638058507,,,0,,America/Los_Angeles,,,0, +4210812,,,Lincoln Blvd SW & B St SW,,47.1227158430177,-122.495208934161,,,0,,America/Los_Angeles,,,0, diff --git a/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/trips.txt b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/trips.txt new file mode 100644 index 000000000..d9b74e172 --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/org/onebusaway/gtfs/piercetransit-stop-areas-flex/trips.txt @@ -0,0 +1,8 @@ +route_id,service_id,trip_id,trip_short_name,trip_headsign,direction_id,block_id,shape_id,bikes_allowed,wheelchair_accessible,trip_type,drt_max_travel_time,drt_avg_travel_time,drt_advance_book_min,drt_pickup_message,drt_drop_off_message,continuous_pickup_message,continuous_drop_off_message,tts_trip_headsign,tts_trip_short_name +76310,c_69335_b_80375_d_127,t_5582575_b_80375_tn_0,,,0,,,,,,,,,,,,,, +76311,c_69335_b_80375_d_127,t_5586053_b_80375_tn_0,,,0,,,,,,,,,,,,,, +76312,c_69335_b_80375_d_127,t_5586054_b_80375_tn_0,,,0,,,,,,,,,,,,,, +76312,c_69335_b_80375_d_127,t_5586055_b_80375_tn_0,,,0,,,,,,,,,,,,,, +76312,c_69335_b_80375_d_127,t_5586056_b_80375_tn_0,,,0,,,,,,,,,,,,,, +76313,c_69336_b_80376_d_31,t_5586097_b_80376_tn_0,,,0,,,,,,,,,,,,,, +76313,c_69336_b_80376_d_31,t_5586096_b_80376_tn_0,,,0,,,,,,,,,,,,,, diff --git a/onebusaway-gtfs/src/test/resources/simplelogger.properties b/onebusaway-gtfs/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..712780a1e --- /dev/null +++ b/onebusaway-gtfs/src/test/resources/simplelogger.properties @@ -0,0 +1,25 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=info +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +org.slf4j.simpleLogger.showDateTime=true +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss +# Set to true if you want to output the current thread name. +# Defaults to true. +org.slf4j.simpleLogger.showThreadName=false +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +org.slf4j.simpleLogger.showShortLogName=true diff --git a/pom.xml b/pom.xml index 323839160..b8b4aaecd 100644 --- a/pom.xml +++ b/pom.xml @@ -3,11 +3,11 @@ org.onebusaway onebusaway - 1.2.8 + 1.2.9 onebusaway-gtfs-modules - 1.3.112-openmove-8 + 1.4.15-openmove-1 pom onebusaway-gtfs-modules @@ -15,8 +15,10 @@ https://github.com/OneBusAway/onebusaway-gtfs-modules/wiki/ - 1.1.6 + 1.1.7 1.2.8 + 2.0.6 + 0.0.13 @@ -94,21 +96,32 @@ org.onebusaway onebusaway-csv-entities ${onebusaway_csv_entities_version} + + + slf4j-api + org.slf4j + + org.onebusaway onebusaway-collections ${onebusaway_collections_version} + + org.slf4j + slf4j + ${slf4j_version} + + + org.slf4j + slf4j-api + ${slf4j_version} + org.slf4j - slf4j-api - 1.7.5 - - - org.slf4j - slf4j-log4j12 - 1.7.5 + slf4j-simple + ${slf4j_version} junit @@ -122,72 +135,89 @@ 1.8.0 test - - javax.xml.bind - jaxb-api - 2.3.0 - - - com.sun.xml.bind - jaxb-core - 2.3.0 - - - com.sun.xml.bind - jaxb-impl - 2.3.0 - + + javax.xml.bind + jaxb-api + 2.3.0 + + + com.sun.xml.bind + jaxb-core + 2.3.0 + + + com.sun.xml.bind + jaxb-impl + 2.3.0 + - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.0.1 - - - none - 8 - false - - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-jar-plugin - 3.0.1 - - - com.mycila - license-maven-plugin - -
LICENSE.txt
- - **/ci.yml - -
-
-
-
+ + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.4.2 + + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.4.1 + + + -Xdoclint:none + 8 + false + + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + 11 + 11 + + + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.1 + + + com.mycila + license-maven-plugin + +
LICENSE.txt
+ + **/ci.yml + **/simplelogger.properties + +
+
+
+
diff --git a/src/site/site.xml b/src/site/site.xml index 84be4e4cc..05d5ad552 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -1,12 +1,12 @@ - + - + - + @@ -16,4 +16,9 @@ + + org.apache.maven.skins + maven-fluido-skin + 1.11.1 +