Browse Source

inital commit for reference AVLS design

abetusk 4 years ago
parent
commit
ce1cc3ec25

+ 4 - 0
.gitignore

@@ -92,3 +92,7 @@ build/Release
 # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
 node_modules
 
+
+# ---> custom
+#
+*~

+ 8 - 2
README.md

@@ -1,3 +1,9 @@
-# RideLogicAVLS
+RideLogicAVLS
+===
+
+**THIS CODE IS CURRENTLY EXPERIMENTAL**
+
+RideLogic Automatic Vehicle Location System
+
+---
 
-RideLogic Automatic Vehicle Location System

+ 19 - 0
doc/README.md

@@ -0,0 +1,19 @@
+Notes
+===
+
+
+
+Command line tool to decode protocol buffer feed:
+
+
+```
+protoc --decode_raw  < GTFS-Realtime.protobuf
+protoc --decode 'transit_realtime.Shape' gtfs-realtime.proto < GTFS-Realtime.protobuf  
+protoc --decode 'transit_realtime.FeedEntity' gtfs-realtime.proto < GTFS-Realtime.protobuf  
+```
+
+References
+---
+
+* [TCAT feed from transit.land](https://www.transit.land/feeds/f-dr997-tompkinsconsolidatedareatransit)
+* [GTFS TCAT feed from Avail](https://realtimetcatbus.availtec.com/InfoPoint/GTFS-Realtime.ashx?&Type=TripUpdat)

+ 2 - 0
doc/example-txt/agency.txt

@@ -0,0 +1,2 @@
+agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone,agency_fare_url,agency_email
+0,Tompkins Consolidated Area Transit Inc,http://www.tcatbus.com/,America/New_York,en,607-277-RIDE,https://www.tcatbus.com/ride/fare-pass-options/,support@availtec.com

+ 2 - 0
doc/example-txt/calendar.txt

@@ -0,0 +1,2 @@
+service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
+1,1,1,1,1,1,1,1,20210901,20220901

+ 141 - 0
doc/example-txt/calendar_dates.txt

@@ -0,0 +1,141 @@
+service_id,date,exception_type
+13,20210905,1
+13,20210912,1
+13,20210919,1
+13,20210926,1
+13,20211003,1
+13,20211010,1
+13,20211017,1
+13,20211024,1
+13,20211031,1
+13,20211107,1
+13,20211114,1
+13,20211121,1
+13,20211128,1
+13,20211205,1
+13,20211212,1
+13,20211219,1
+13,20211226,1
+13,20220102,1
+13,20220109,1
+13,20220116,1
+13,20210906,1
+12,20210913,1
+12,20210920,1
+12,20210927,1
+12,20211004,1
+12,20211011,1
+12,20211018,1
+12,20211025,1
+12,20211101,1
+12,20211108,1
+12,20211115,1
+12,20211122,1
+12,20211129,1
+12,20211206,1
+12,20211213,1
+12,20211220,1
+12,20211227,1
+12,20220103,1
+12,20220110,1
+12,20220117,1
+12,20210907,1
+12,20210914,1
+12,20210921,1
+12,20210928,1
+12,20211005,1
+12,20211012,1
+12,20211019,1
+12,20211026,1
+12,20211102,1
+12,20211109,1
+12,20211116,1
+12,20211123,1
+12,20211130,1
+12,20211207,1
+12,20211214,1
+12,20211221,1
+12,20211228,1
+12,20220104,1
+12,20220111,1
+12,20220118,1
+12,20210908,1
+12,20210915,1
+12,20210922,1
+12,20210929,1
+12,20211006,1
+12,20211013,1
+12,20211020,1
+12,20211027,1
+12,20211103,1
+12,20211110,1
+12,20211117,1
+12,20211124,1
+12,20211201,1
+12,20211208,1
+12,20211215,1
+12,20211222,1
+12,20211229,1
+12,20220105,1
+12,20220112,1
+12,20220119,1
+12,20210902,1
+12,20210909,1
+12,20210916,1
+12,20210923,1
+12,20210930,1
+12,20211007,1
+12,20211014,1
+12,20211021,1
+12,20211028,1
+12,20211104,1
+12,20211111,1
+12,20211118,1
+12,20211202,1
+12,20211209,1
+12,20211216,1
+12,20211223,1
+12,20211230,1
+12,20220106,1
+12,20220113,1
+12,20220120,1
+11,20210903,1
+11,20210910,1
+11,20210917,1
+11,20210924,1
+11,20211001,1
+11,20211008,1
+11,20211015,1
+11,20211022,1
+11,20211029,1
+11,20211105,1
+11,20211112,1
+11,20211119,1
+11,20211126,1
+11,20211203,1
+11,20211210,1
+11,20211217,1
+11,20211224,1
+11,20211231,1
+11,20220107,1
+11,20220114,1
+11,20220121,1
+15,20210904,1
+15,20210911,1
+15,20210918,1
+15,20210925,1
+15,20211002,1
+15,20211009,1
+15,20211016,1
+15,20211023,1
+15,20211030,1
+15,20211106,1
+15,20211113,1
+15,20211120,1
+15,20211127,1
+15,20211204,1
+15,20211211,1
+15,20211218,1
+15,20220108,1
+15,20220115,1
+15,20220122,1

+ 2 - 0
doc/example-txt/fare_attributes.txt

@@ -0,0 +1,2 @@
+fare_id,price,currency_type,payment_method,transfers,agency_id,transfer_duration
+6,1.50,USD,0,1,0,60

+ 2 - 0
doc/example-txt/feed_info.txt

@@ -0,0 +1,2 @@
+feed_publisher_name,feed_publisher_url,feed_lang,feed_start_date,feed_end_date,feed_version
+Tompkins Consolidated Area Transit Inc,http://tcatbus.com/,en,20210901,20220122,20210901

+ 1 - 0
doc/example-txt/frequencies.txt

@@ -0,0 +1 @@
+trip_id,start_time,end_time,headway_secs,exact_times

+ 29 - 0
doc/example-txt/routes.txt

@@ -0,0 +1,29 @@
+route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color,route_sort_order
+10,0,"10","Route 10","Cornell - Commons",3,,211561,ffffff,1
+11,0,"11","Route 11","Ithaca College - Commons",3,,F36623,FFFFFF,12
+13,0,"13","Route 13","IHS - Northside - Commons",3,,00736C,FFFFFF,18
+14,0,"14","Route 14","West Hill - Hospital - Commons",3,,00AEAF,FFFFFF,20
+15,0,"15","Route 15","Southside Shopper",3,,FACE07,100001,28
+17,0,"17","Route 17","TCAT - Fall Creek - Commons",3,,AAA000,FFFFFF,30
+20,0,"20","Route 20","Enfield - Commons",3,,F5977A,FFFFFF,32
+21,0,"21","Route 21","Trumansburg - Commons",3,,ED1D26,FFFFFF,34
+30,0,"30","Route 30","Commons - Cornell - Shops at Ithaca Mall",3,,AB6339,FFFFFF,38
+32,0,"32","Route 32","Airport - Cornell - Commons",3,,615CA8,FFFFFF,42
+36,0,"36","Route 36","South Lansing - Cornell - Commons",3,,615CA8,FFFFFF,42
+37,0,"37","Route 37","North Lansing - Cornell - Commons",3,,005F22,FFFFFF,46
+40,0,"40","Route 40","Groton - Freeville- Cornell - Commons",3,,0077A4,FFFFFF,48
+43,0,"43","Route 43","TC3 - Varna - Cornell - Commons",3,,014964,FFFFFF,52
+51,0,"51","Route 51","Commons - Cornell - EHP - Eastern Height",3,,009955,FFFFFF,54
+52,0,"52","Route 52","Caroline - Brooktondale - Commons",3,,2D3194,FFFFFF,56
+53,0,"53","Route 53","Ellis Hollow - Brooktondale",3,,9b9fd9,000000,57
+65,0,"65","Route 65","Danby",3,,F5999D,000000,60
+67,0,"67","Route 67","Newfield - Commons",3,,EB048E,FFFFFF,62
+77,0,"77","Route 77","Route Warren@ Farrel - Mall",3,,91288F,FFFFFF,72
+81,0,"81","Route 81","Cornell Daytime Campus Service",3,,f24040,ffffff,74
+82,0,"82","Route 82","Cornell Campus Service - East Hill Offic",3,,00A99E,FFFFFF,75
+83,0,"83","Route 83","Cornell North Campus Service",3,,c81919,ffffff,77
+90,0,"90","Route 90","Ithaca Commons - Cornell University",3,,7c0410,ffffff,80
+92,0,"92","Route 92","Cornell Campus Service-Nights",3,,550707,ffffff,82
+135,0,"135","Route 13S","Northside - Shopping - Commons",3,,1ba745,030202,19
+145,0,"145","Route 14S","West Hill - Shopping",3,,FF4EC5,FFFFFF,22
+314,0,"314","Route 31-41","31-41 combined",3,,9951e1,050505,40

File diff suppressed because it is too large
+ 39817 - 0
doc/example-txt/shapes.txt


File diff suppressed because it is too large
+ 50489 - 0
doc/example-txt/stop_times.txt


+ 650 - 0
doc/example-txt/stops.txt

@@ -0,0 +1,650 @@
+stop_id,stop_code,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url,location_type,parent_station,wheelchair_boarding
+100,100,"Ithaca Commons - Seneca St",,42.440502,-76.496506,,,0,,0
+103,103,"Tioga @ Court",,42.442574,-76.496895,,,0,,0
+105,105,"Court @ Linn",,42.443115,-76.494507,,,0,,0
+107,107,"Cayuga @ Buffalo",,42.441227,-76.499046,,,0,,0
+108,108,"Cayuga @ Buffalo",,42.441402,-76.499176,,,0,,0
+110,110,"Geneva @ State/MLK",,42.439583,-76.500801,,,0,,0
+1111,1111,"University @ Cornell Ave",,42.447132,-76.493027,,,0,,0
+1113,1113,"University @ Lake",,42.449551,-76.492081,,,0,,0
+1119,1119,"Auden Ithaca",,42.450989,-76.493675,,,0,,0
+112,112,"Albany at Salvation Army",,42.43988,-76.501778,,,0,,0
+1120,1120,"Auden Ithaca",,42.451084,-76.493645,,,0,,0
+1121,1121,"Lake @ Falls",,42.452843,-76.494621,,,0,,0
+1122,1122,"Lake @ Lincoln",,42.452271,-76.49472,,,0,,0
+1123,1123,"Falls @ Lake",,42.452839,-76.494843,,,0,,0
+1124,1124,"Falls @ Lake",,42.452934,-76.494896,,,0,,0
+1125,1125,"Lake St at Ithaca High School",,42.455181,-76.496002,,,0,,0
+1126,1126,"Lake St at Ithaca High School",,42.455162,-76.496094,,,0,,0
+1129,1129,"Lake St at Boynton Middle School",,42.460854,-76.497299,,,0,,0
+113,113,"Seneca @ Albany",,42.440392,-76.501617,,,0,,0
+1130,1130,"Lake St at Boynton Middle School",,42.460827,-76.497368,,,0,,0
+1137,1137,"East Shore @ James L. Gibbs",,42.463848,-76.498863,,,0,,0
+1138,1138,"East Shore @ James L. Gibbs",,42.464016,-76.499168,,,0,,0
+1143,1143,"Stewart Park Entrance",,42.462711,-76.500809,,,0,,0
+115,115,"State/MLK @ Albany",,42.4394,-76.501869,,,0,,0
+127,127,"State/MLK @ Plain",,42.439346,-76.504135,,,0,,0
+128,128,"State/MLK @ Plain",,42.439434,-76.503761,,,0,,0
+1301,1301,"Thurston @ Stewart",,42.454651,-76.490387,,,0,,0
+1306,1306,"Thurston @ Barton",,42.453785,-76.487991,,,0,,0
+1307,1307,"Thurston @ Barton",,42.453758,-76.488167,,,0,,0
+1308,1308,"Thurston @ Highland",,42.453831,-76.486816,,,0,,0
+1309,1309,"Thurston @ Highland",,42.453632,-76.486359,,,0,,0
+1310,1310,"Highland @ Thurston",,42.453846,-76.486504,,,0,,0
+1311,1311,"Highland @ Thurston",,42.453926,-76.486465,,,0,,0
+1313,1313,"55 Ridgewood Rd pk",,42.455589,-76.489044,,,0,,0
+1314,1314,"Highland @ Wyckoff",,42.456318,-76.486115,,,0,,0
+1315,1315,"Highland @ Wyckoff",,42.456394,-76.485985,,,0,,0
+1316,1316,"Highland @ Lakeland",,42.45845,-76.486519,,,0,,0
+1317,1317,"Highland @ Lakeland",,42.458408,-76.486382,,,0,,0
+1319,1319,"Wyckoff @ Highland",,42.456223,-76.486092,,,0,,0
+1323,1323,"Risley Hall - Front",,42.453423,-76.481499,,,0,,0
+1325,1325,"Thurston at Balch Hall",,42.452957,-76.480995,,,0,,0
+1326,1326,"Risley Hall - Shelter",,42.452244,-76.481293,,,0,,0
+1327,1327,"Cradit Farm @ Thurston",,42.452473,-76.480713,,,0,,0
+1328,1328,"Cradit Farm at Balch Hall",,42.452866,-76.47937,,,0,,0
+1329,1329,"Helen Newman Hall",,42.45322,-76.477264,,,0,,0
+133,133,"McGraw House",,42.437733,-76.500595,,,0,,0
+1330,1330,"Appel Commons",,42.453255,-76.477318,,,0,,0
+1331,1331,"Cradit Farm @ Pleasant Grove",,42.455299,-76.473724,,,0,,0
+134,134,"McGraw House",,42.437733,-76.50071,,,0,,0
+1342,1342,"Northcross @ Jessup",,42.456978,-76.478416,,,0,,0
+1343,1343,"Robert Purcell Community Center",,42.456635,-76.476936,,,0,,0
+1344,1344,"Robert Purcell Community Center",,42.456741,-76.477135,,,0,,0
+1345,1345,"Jessup @ Pleasant Grove",,42.456734,-76.474564,,,0,,0
+1346,1346,"Jessup @ Pleasant Grove",,42.456818,-76.474648,,,0,,0
+1347,1347,"Pleasant Grove @ Jessup",,42.456741,-76.47403,,,0,,0
+1348,1348,"Pleasant Grove @ Jessup",,42.456924,-76.474319,,,0,,0
+1349,1349,"Hasbrouck Apts",,42.456341,-76.471642,,,0,,0
+135,135,"Green @ Fayette",,42.438461,-76.502815,,,0,,0
+1351,1351,"A Lot - Upper Stop",,42.458111,-76.475403,,,0,,0
+1353,1353,"A Lot - Lower Stop",,42.458027,-76.47728,,,0,,0
+1355,1355,"Jessup @ Triphammer",,42.456367,-76.48082,,,0,,0
+1356,1356,"Jessup @ Triphammer",,42.456406,-76.48101,,,0,,0
+1357,1357,"Triphammer @ Jessup",,42.456215,-76.481216,,,0,,0
+1358,1358,"Triphammer @ Dearborn",,42.456375,-76.481369,,,0,,0
+1360,1360,"Triphammer @ Country Club Rd",,42.458389,-76.482224,,,0,,0
+1361,1361,"Triphammer @ Country Club Rd",,42.458408,-76.482086,,,0,,0
+1362,1362,"Triphammer @ Oak Hill",,42.460621,-76.482162,,,0,,0
+1363,1363,"Triphammer @ Oak Hill",,42.460396,-76.481873,,,0,,0
+1367,1367,"Triphammer @ Iroquois",,42.462852,-76.483383,,,0,,0
+1368,1368,"Triphammer @ Iroquois",,42.463116,-76.483597,,,0,,0
+1371,1371,"Northway @ Triphammer",,42.46632,-76.48436,,,0,,0
+1372,1372,"Triphammer @ Northway",,42.466553,-76.484207,,,0,,0
+1373,1373,"Triphammer @ Northway",,42.466339,-76.484116,,,0,,0
+1375,1375,"The Parkway @ Upland",,42.463627,-76.486542,,,0,,0
+1376,1376,"The Parkway @ Upland",,42.463799,-76.486687,,,0,,0
+1377,1377,"The Parkway @ Northway",,42.465145,-76.48671,,,0,,0
+1378,1378,"Northway @ The Parkway",,42.465393,-76.486671,,,0,,0
+1398,1398,"Forest Home Bridge",,42.453365,-76.47023,,,0,,0
+1399,1399,"Forest Home Bridge",,42.452961,-76.471039,,,0,,0
+1507,1507,"Stewart @ University",,42.44912,-76.490311,,,0,,0
+1508,1508,"University @ Stewart",,42.449306,-76.490227,,,0,,0
+1511,1511,"Boldt Hall",,42.449238,-76.488693,,,0,,0
+1512,1512,"Baker Flagpole  - Slope Side",,42.447544,-76.487564,,,0,,0
+1513,1513,"Baker Flagpole",,42.447533,-76.487709,,,0,,0
+1520,1520,"Milstein Hall",,42.451385,-76.483688,,,0,,0
+1521,1521,"Milstein Hall",,42.451355,-76.483688,,,0,,0
+1524,1524,"Goldwin Smith Hall",,42.449841,-76.482941,,,0,,0
+1525,1525,"Rockefeller Hall",,42.4496,-76.482788,,,0,,0
+1530,1530,"Anabel Taylor Hall",,42.44479,-76.485138,,,0,,0
+1531,1531,"Carpenter Hall",,42.444889,-76.484993,,,0,,0
+1533,1533,"Statler Hall",,42.446033,-76.48259,,,0,,0
+1534,1534,"Sage Hall",,42.445351,-76.482689,,,0,,0
+1535,1535,"Campus @ Gates Hall",,42.445217,-76.480431,,,0,,0
+1540,1540,"Uris Hall Across Street",,42.44759,-76.482399,,,0,,0
+1541,1541,"Uris Hall",,42.447525,-76.482079,,,0,,0
+1542,1542,"Kennedy Hall",,42.447624,-76.479439,,,0,,0
+1543,1543,"Corson/Mudd Hall",,42.44754,-76.479324,,,0,,0
+1544,1544,"Bradfield Hall",,42.447594,-76.475822,,,0,,0
+1545,1545,"Bradfield Hall Across Street",,42.447533,-76.475578,,,0,,0
+1546,1546,"Dairy Bar Across Street",,42.447575,-76.471359,,,0,,0
+1547,1547,"Dairy Bar",,42.44751,-76.471199,,,0,,0
+1549,1549,"Garden@Tower",,42.447388,-76.479691,,,0,,0
+1550,1550,"Cornell Botanic Gardens",,42.449814,-76.471107,,,0,,0
+1551,1551,"Cornell Botanic Gardens",,42.449879,-76.471008,,,0,,0
+1553,1553,"Boyce Thompson Institute",,42.447491,-76.467636,,,0,,0
+1555,1555,"Vet School",,42.447311,-76.466805,,,0,,0
+1556,1556,"Vet Medical Center",,42.446373,-76.464867,,,0,,0
+1557,1557,"Vet Medical Center",,42.446301,-76.464821,,,0,,0
+1562,1562,"Campus @ Tower",,42.445831,-76.466187,,,0,,0
+1564,1564,"Campus @ Judd Falls",,42.445389,-76.469337,,,0,,0
+1565,1565,"Campus @ Judd Falls",,42.445236,-76.469833,,,0,,0
+1571,1571,"Campus @ Bartels Hall",,42.445202,-76.476555,,,0,,0
+1573,1573,"Campus @ Wilson Lab",,42.445358,-76.473061,,,0,,0
+165,165,"Ithaca Commons - Green St",,42.438618,-76.497658,,,0,,0
+1701,1701,"State/MLK @ Stewart",,42.439247,-76.490463,,,0,,0
+1702,1702,"State/MLK @ Stewart",,42.439339,-76.490433,,,0,,0
+1703,1703,"State/MLK @ Quarry",,42.438679,-76.488632,,,0,,0
+1704,1704,"State/MLK @ Quarry",,42.438667,-76.488419,,,0,,0
+1708,1708,"State/MLK @ Giles",,42.432598,-76.478142,,,0,,0
+1709,1709,"State/MLK @ Cornell",,42.43269,-76.478127,,,0,,0
+171,171,"Aurora @ State/MLK",,42.439274,-76.495399,,,0,,0
+1712,1712,"Mitchell @ College",,42.437717,-76.484932,,,0,,0
+1713,1713,"Mitchell @ College",,42.437607,-76.484871,,,0,,0
+1716,1716,"Schwartz Performing Arts Center",,42.442558,-76.485336,,,0,,0
+1717,1717,"Oak @ Collegetown Circle",,42.442616,-76.484962,,,0,,0
+172,172,"Ithaca Commons - Aurora St",,42.439236,-76.495552,,,0,,0
+1721,1721,"Stewart @ Seneca",,42.44059,-76.489723,,,0,,0
+1722,1722,"Stewart @ Seneca",,42.440758,-76.489799,,,0,,0
+1725,1725,"Stewart @ Williams",,42.442619,-76.489769,,,0,,0
+1726,1726,"Stewart @ Williams",,42.442543,-76.489906,,,0,,0
+1731,1731,"Dryden @ Linden - Breazzano Center",,42.441601,-76.484337,,,0,,0
+1744,1744,"Fairmount @ Ithaca Rd",,42.439091,-76.480042,,,0,,0
+1746,1746,"Ithaca @ Elmwood",,42.439449,-76.478958,,,0,,0
+1747,1747,"Ithaca @ Elmwood",,42.439339,-76.478912,,,0,,0
+1751,1751,"Humphreys Service Building",,42.442245,-76.476654,,,0,,0
+1752,1752,"Humphreys Service Building",,42.44236,-76.476662,,,0,,0
+1753,1753,"Maple @ Veterans - Maplewood Apts",,42.441185,-76.475128,,,0,,0
+1754,1754,"Maple @ Veterans - Maplewood Apts",,42.441284,-76.474976,,,0,,0
+1757,1757,"Ithaca East Apts",,42.441299,-76.472,,,0,,0
+1758,1758,"Ithaca East Apts",,42.441357,-76.47187,,,0,,0
+1767,1767,"Pine Tree at East Hill Plaza",,42.437576,-76.46508,,,0,,0
+1768,1768,"Pine Tree at East Hill Plaza",,42.437607,-76.465248,,,0,,0
+1769,1769,"CISER",,42.43853,-76.465202,,,0,,0
+1770,1770,"CISER",,42.438629,-76.465202,,,0,,0
+1771,1771,"East Hill Office Building",,42.438877,-76.46286,,,0,,0
+1772,1772,"East Hill Office Building",,42.43858,-76.463516,,,0,,0
+1774,1774,"East Hill Plaza",,42.437618,-76.462776,,,0,,0
+2309,2309,"EcoVillage",,42.448181,-76.540108,,,0,,0
+2310,2310,"EcoVillage",,42.448265,-76.540222,,,0,,0
+2315,2315,"Mecklenburg Rd @ Sheffield",,42.447361,-76.571388,,,0,,0
+2316,2316,"Mecklenburg Rd @ Sheffield",,42.447376,-76.57106,,,0,,0
+2319,2319,"Mecklenburg Rd @ Van Dorn",,42.452053,-76.591423,,,0,,0
+2320,2320,"Mecklenburg Rd @ Van Dorn",,42.452099,-76.590965,,,0,,0
+2323,2323,"Mecklenburg Rd @ Applegate",,42.451523,-76.611549,,,0,,0
+2324,2324,"Mecklenburg Rd @ Applegate",,42.451603,-76.611176,,,0,,0
+2325,2325,"Mecklenburg Rd at Sandy Creek",,42.451069,-76.626183,,,0,,0
+2326,2326,"Mecklenburg Rd at Sandy Creek",,42.451149,-76.626022,,,0,,0
+2329,2329,"Enfield Elementary",,42.449696,-76.631004,,,0,,0
+2330,2330,"Enfield Elementary",,42.449688,-76.631104,,,0,,0
+2333,2333,"Enfield Park and Ride",,42.438198,-76.630821,,,0,,0
+2334,2334,"Enfield Park and Ride",,42.438221,-76.630882,,,0,,0
+2337,2337,"Enfield Main Rd @ Bostwick",,42.421387,-76.629402,,,0,,0
+2338,2338,"Enfield Main Rd @ Bostwick",,42.421535,-76.629517,,,0,,0
+2339,2339,"Enfield Highway Department",,42.416069,-76.627701,,,0,,0
+2511,2511,"Candlewyck Park Apts",,42.459969,-76.528595,,,0,,0
+2514,2514,"Trumansburg Rd @ Bundy",,42.460575,-76.52977,,,0,,0
+2533,2533,"1229 Trumansburg Rd - Cayuga Ridge",,42.462475,-76.53273,,,0,,0
+2534,2534,"1229 Trumansburg Rd - Cayuga Ridge",,42.462429,-76.532852,,,0,,0
+2542,2542,"Overlook Apts",,42.465775,-76.540718,,,0,,0
+2543,2543,"Cayuga Meadows",,42.46442,-76.541122,,,0,,0
+2546,2546,"Cayuga Medical Center",,42.468266,-76.537064,,,0,,0
+2547,2547,"Museum of the Earth",,42.467205,-76.536995,,,0,,0
+2550,2550,"Trumansburg Rd at CMC",,42.466614,-76.539749,,,0,,0
+2553,2553,"Trumansburg Rd at CMC",,42.466751,-76.539795,,,0,,0
+2555,2555,"Trumansburg Rd at Professional Building",,42.467991,-76.541824,,,0,,0
+2556,2556,"Trumansburg Rd at Professional Building",,42.467861,-76.541779,,,0,,0
+2557,2557,"Professional Building",,42.468006,-76.541252,,,0,,0
+2559,2559,"Trumansburg Rd @ Dubois",,42.471375,-76.54705,,,0,,0
+2560,2560,"Trumansburg Rd @ Dubois",,42.471432,-76.547417,,,0,,0
+2563,2563,"Trumansburg Rd @ Woolf",,42.477474,-76.557503,,,0,,0
+2564,2564,"Trumansburg Rd @ Woolf",,42.477558,-76.557755,,,0,,0
+2567,2567,"Trumansburg Rd @ Iradell",,42.480034,-76.560837,,,0,,0
+2568,2568,"Trumansburg Rd @ Iradell",,42.480186,-76.561195,,,0,,0
+2573,2573,"Trumansburg Rd @ Krums Corner",,42.486095,-76.57325,,,0,,0
+2574,2574,"Trumansburg Rd @ Krums Corner",,42.486118,-76.57357,,,0,,0
+2577,2577,"Trumansburg Rd @ Perry City Rd",,42.495731,-76.595734,,,0,,0
+2578,2578,"Trumansburg Rd @ Perry City Rd",,42.495911,-76.596428,,,0,,0
+2581,2581,"Trumansburg Rd @ Colegrove",,42.505047,-76.610146,,,0,,0
+2582,2582,"Trumansburg Rd @ Colegrove",,42.505081,-76.610367,,,0,,0
+2583,2583,"Jacksonville Post Office",,42.507759,-76.613831,,,0,,0
+2584,2584,"Jacksonville Post Office",,42.507713,-76.613922,,,0,,0
+2611,2611,"Trumansburg Rd at Shur-Save",,42.534092,-76.642525,,,0,,0
+2612,2612,"Trumansburg Rd at Kinney Drugs",,42.534016,-76.642586,,,0,,0
+2615,2615,"E Main @ Cemetery Rd",,42.536743,-76.647865,,,0,,0
+2616,2616,"E Main @ Cemetery Rd",,42.536655,-76.647957,,,0,,0
+2619,2619,"Trumansburg Central School",,42.539295,-76.653046,,,0,,0
+2620,2620,"Trumansburg Central School",,42.539268,-76.653206,,,0,,0
+2623,2623,"Main @ South (Trumansburg)",,42.541088,-76.65873,,,0,,0
+2624,2624,"Main @ South (Trumansburg)",,42.540951,-76.658554,,,0,,0
+2627,2627,"Main @ Washington (Trumansburg)",,42.542171,-76.662697,,,0,,0
+2628,2628,"Main @ Washington (Trumansburg)",,42.542072,-76.662788,,,0,,0
+2631,2631,"Trumansburg Park and Ride",,42.541954,-76.666672,,,0,,0
+2641,2641,"Juniper Manor",,42.540401,-76.663864,,,0,,0
+2669,2669,"Main @ Seneca (Trumansburg)",,42.54726,-76.672882,,,0,,0
+2670,2670,"Seneca @ Main (Trumansburg)",,42.547352,-76.67321,,,0,,0
+2671,2671,"Aubles Trailer Park",,42.547237,-76.678131,,,0,,0
+3111,3111,"East Shore Dr @ Burdick Hill",,42.49778,-76.50972,,,0,,0
+3112,3112,"East Shore Dr @ Burdick Hill",,42.497959,-76.509857,,,0,,0
+3115,3115,"East Shore Dr @ Waterwagon",,42.515568,-76.508316,,,0,,0
+3116,3116,"East Shore Dr @ Waterwagon",,42.515717,-76.50843,,,0,,0
+3119,3119,"East Shore Dr @ Asbury",,42.524967,-76.500092,,,0,,0
+3120,3120,"East Shore Dr @ Asbury",,42.52512,-76.50029,,,0,,0
+3127,3127,"Cayuga  Vista @ East Shore",,42.533287,-76.501457,,,0,,0
+3129,3129,"East Shore Dr @ Cayuga Vista",,42.532883,-76.502785,,,0,,0
+313,313,"Hudson @ Columbia",,42.435791,-76.492256,,,0,,0
+3130,3130,"East Shore Dr @ Cayuga Vista",,42.532848,-76.502991,,,0,,0
+3137,3137,"Lansing Town Hall",,42.53791,-76.502403,,,0,,0
+3139,3139,"East Shore Dr @ Auburn Rd",,42.537678,-76.505966,,,0,,0
+314,314,"Hudson @ Columbia",,42.435936,-76.492378,,,0,,0
+3140,3140,"East Shore Dr @ Ridge Rd",,42.537491,-76.50618,,,0,,0
+3141,3141,"Ridge Rd @ Conlon",,42.537964,-76.50782,,,0,,0
+3142,3142,"Ridge Rd @ Conlon",,42.53801,-76.507584,,,0,,0
+3149,3149,"Ridge Rd @ Brickyard",,42.543377,-76.525162,,,0,,0
+3150,3150,"Ridge Rd @ Brickyard",,42.54343,-76.524826,,,0,,0
+3154,3154,"Lansing School",,42.54274,-76.536758,,,0,,0
+3158,3158,"Ridge Rd @ Ludlowville Rd",,42.542175,-76.536819,,,0,,0
+317,317,"Hudson at South Hill School",,42.433704,-76.491631,,,0,,0
+318,318,"Hudson at South Hill School",,42.433723,-76.491737,,,0,,0
+323,323,"Hudson @ Pearsall",,42.43145,-76.492088,,,0,,0
+324,324,"Hudson @ Grandview",,42.431004,-76.492424,,,0,,0
+327,327,"Coddington @ Hudson",,42.429077,-76.491089,,,0,,0
+328,328,"Hudson @ Coddington",,42.429348,-76.491463,,,0,,0
+329,329,"Coddington at Ithaca College",,42.426823,-76.488838,,,0,,0
+330,330,"Coddington at Ithaca College",,42.426819,-76.488937,,,0,,0
+3305,3305,"Warren @ Asbury",,42.524666,-76.47261,,,0,,0
+3306,3306,"Asbury @ Warren",,42.524723,-76.472847,,,0,,0
+3309,3309,"Asbury @ Armstrong",,42.526867,-76.484116,,,0,,0
+3310,3310,"Asbury @ Armstrong",,42.526951,-76.48381,,,0,,0
+3312,3312,"Asbury @ Triphammer",,42.526733,-76.491699,,,0,,0
+3313,3313,"Triphammer @ Asbury Rd",,42.526585,-76.491776,,,0,,0
+3314,3314,"Triphammer @ Asbury",,42.526794,-76.491959,,,0,,0
+3315,3315,"Triphammer @ Peruville",,42.538322,-76.492561,,,0,,0
+3316,3316,"Triphammer @ Peruville",,42.538002,-76.492683,,,0,,0
+337,337,"Ithaca College - Garden Apts",,42.425053,-76.492081,,,0,,0
+338,338,"Ithaca College - Garden Apts",,42.425182,-76.49192,,,0,,0
+339,339,"Ithaca College - Roy Park School",,42.424274,-76.495438,,,0,,0
+340,340,"Ithaca College - Roy Park School",,42.424351,-76.495422,,,0,,0
+341,341,"Ithaca College - Main Entrance",,42.421406,-76.499977,,,0,,0
+342,342,"Ithaca College - Alumni Circle",,42.421803,-76.499657,,,0,,0
+343,343,"Ithaca College - Alumni Circle",,42.42173,-76.499405,,,0,,0
+348,348,"Ithaca College - Butterfield Stadium",,42.419464,-76.498459,,,0,,0
+349,349,"Ithaca College - The Towers",,42.420338,-76.494415,,,0,,0
+351,351,"Ithaca College - Terrace Apts",,42.419609,-76.49659,,,0,,0
+3511,3511,"Triphammer @ Hanshaw",,42.469692,-76.480324,,,0,,0
+3512,3512,"Triphammer @ Hanshaw",,42.469814,-76.480644,,,0,,0
+3515,3515,"Triphammer @ Texas",,42.472656,-76.481323,,,0,,0
+3516,3516,"Triphammer @ Spruce",,42.472546,-76.481438,,,0,,0
+3519,3519,"Triphammer @ Winthrop",,42.475204,-76.481628,,,0,,0
+352,352,"Ithaca College - Terrace Apts",,42.419682,-76.49659,,,0,,0
+3520,3520,"Triphammer @ Winthrop",,42.475216,-76.481857,,,0,,0
+3521,3521,"Triphammer at Kendall",,42.476627,-76.48175,,,0,,0
+3522,3522,"Triphammer at Kendall",,42.476658,-76.481979,,,0,,0
+3523,3523,"Sheraton @ Triphammer",,42.478161,-76.481316,,,0,,0
+3524,3524,"Sheraton @ Triphammer",,42.478241,-76.481407,,,0,,0
+3525,3525,"Lansing West Apts",,42.479057,-76.482613,,,0,,0
+3526,3526,"Triphammer Marketplace",,42.478714,-76.482216,,,0,,0
+3547,3547,"Cinema @ Sheraton",,42.478607,-76.478294,,,0,,0
+3548,3548,"Cinema @ Sheraton",,42.478653,-76.478394,,,0,,0
+3549,3549,"Cinema @ Uptown",,42.480976,-76.478439,,,0,,0
+3550,3550,"Uptown @ Cinema",,42.481106,-76.478333,,,0,,0
+3553,3553,"Uptown Village Apts",,42.478474,-76.472534,,,0,,0
+3554,3554,"Uptown Village Apts",,42.478493,-76.472672,,,0,,0
+3555,3555,"Gaslight Village Apts",,42.481285,-76.474915,,,0,,0
+3556,3556,"Gaslight Village Apts",,42.481339,-76.474922,,,0,,0
+3557,3557,"University Park Apts",,42.48074,-76.472801,,,0,,0
+3558,3558,"University Park Apts",,42.480549,-76.472885,,,0,,0
+3559,3559,"Warrenwood Apts",,42.478523,-76.468956,,,0,,0
+3560,3560,"Warrenwood Apts",,42.478584,-76.468826,,,0,,0
+3579,3579,"Cayuga Mall",,42.483673,-76.485535,,,0,,0
+3584,3584,"YMCA",,42.48597,-76.488831,,,0,,0
+3588,3588,"The Shops at Ithaca Mall",,42.48262,-76.489914,,,0,,0
+3593,3593,"Tops Supermarket (Lansing)",,42.482422,-76.486397,,,0,,0
+3601,3601,"Triphammer @ Graham",,42.486004,-76.487053,,,0,,0
+3605,3605,"Triphammer @ Craft",,42.490372,-76.489594,,,0,,0
+3606,3606,"Triphammer @ Craft",,42.490654,-76.489883,,,0,,0
+3609,3609,"Triphammer @ Horizon",,42.498306,-76.490303,,,0,,0
+361,361,"South Hill Business Park",,42.423557,-76.501976,,,0,,0
+3610,3610,"Triphammer @ Burdick Hill",,42.498566,-76.490517,,,0,,0
+3613,3613,"Triphammer @ Triphammer Terrace",,42.515961,-76.491188,,,0,,0
+3614,3614,"Triphammer @ Waterwagon",,42.516273,-76.491379,,,0,,0
+365,365,"Longview",,42.415726,-76.503906,,,0,,0
+369,369,"Danby @ Vista",,42.413101,-76.502968,,,0,,0
+3711,3711,"Pleasant Grove @ Hanshaw",,42.467655,-76.477821,,,0,,0
+3712,3712,"Pleasant Grove @ Hanshaw",,42.467319,-76.477898,,,0,,0
+3715,3715,"Hanshaw @ Blackstone",,42.466927,-76.470787,,,0,,0
+3716,3716,"Hanshaw @ Blackstone",,42.46703,-76.470512,,,0,,0
+372,372,"College Circle Apts - North Entrance",,42.413074,-76.500534,,,0,,0
+3721,3721,"Warren @ Christopher",,42.472012,-76.464485,,,0,,0
+3722,3722,"Warren @ Christopher",,42.472069,-76.464592,,,0,,0
+3725,3725,"Warren at BOCES",,42.474792,-76.465851,,,0,,0
+3726,3726,"Dewitt Middle School",,42.474888,-76.466103,,,0,,0
+3727,3727,"Warren at Warrenwood Apts",,42.477661,-76.466888,,,0,,0
+3728,3728,"Warren at Warrenwood Apts",,42.477055,-76.467026,,,0,,0
+373,373,"College Circle Apts - Community Building",,42.411572,-76.500519,,,0,,0
+3733,3733,"Convenient Care",,42.479858,-76.465172,,,0,,0
+3735,3735,"Guthrie Orthopedic",,42.480507,-76.46402,,,0,,0
+3740,3740,"Warren @ Dart",,42.483459,-76.46743,,,0,,0
+3741,3741,"Warren @ Dart",,42.483356,-76.467247,,,0,,0
+3743,3743,"Warren @ Northwoods",,42.486023,-76.467331,,,0,,0
+3744,3744,"Warren @ Northwoods",,42.486298,-76.467537,,,0,,0
+3745,3745,"Northwoods Apts",,42.486336,-76.470436,,,0,,0
+3747,3747,"Warren Rd Post Office",,42.489956,-76.46756,,,0,,0
+3748,3748,"Warren @ Bomax",,42.490177,-76.467796,,,0,,0
+3749,3749,"Tompkins County Jail",,42.493011,-76.467758,,,0,,0
+3750,3750,"Borg Warner",,42.49334,-76.467964,,,0,,0
+3751,3751,"Warren @ Dutch Mill",,42.507618,-76.47168,,,0,,0
+3752,3752,"Warren @ Dutch Mill",,42.507893,-76.471825,,,0,,0
+3759,3759,"Warren @ Farrell",,42.514465,-76.472069,,,0,,0
+376,376,"College Circle Apts - North Lot",,42.412563,-76.499191,,,0,,0
+3760,3760,"Warren @ Farrell",,42.514725,-76.472206,,,0,,0
+3761,3761,"Springbrook @ Farrell",,42.514565,-76.467926,,,0,,0
+3762,3762,"Village Solars South",,42.509426,-76.47081,,,0,,0
+3763,3763,"Village Solars South",,42.509354,-76.47081,,,0,,0
+3764,3764,"Village Solars North",,42.511513,-76.47081,,,0,,0
+3765,3765,"Village Solars North",,42.511448,-76.470795,,,0,,0
+3781,3781,"Thornwood @ Brown",,42.487255,-76.46492,,,0,,0
+3782,3782,"Brown @ Thornwood",,42.487301,-76.465141,,,0,,0
+3783,3783,"Brown @ Culligan",,42.487488,-76.462181,,,0,,0
+3784,3784,"Culligan @ Brown",,42.487785,-76.462502,,,0,,0
+3785,3785,"Airport",,42.49052,-76.463974,,,0,,0
+3790,3790,"Langmuir Lab",,42.485481,-76.458176,,,0,,0
+3794,3794,"20 Thornwood Dr",,42.484016,-76.463638,,,0,,0
+3900,3900,"Warren @ Hanshaw",,42.467171,-76.466042,,,0,,0
+3901,3901,"Hanshaw @ Warren",,42.467075,-76.466278,,,0,,0
+3902,3902,"Hanshaw @ Warren",,42.467136,-76.465836,,,0,,0
+3903,3903,"Hanshaw @ Muriel",,42.467182,-76.461723,,,0,,0
+3904,3904,"Muriel @ Hanshaw",,42.467308,-76.461678,,,0,,0
+3905,3905,"Hanshaw @ Salem",,42.467262,-76.458817,,,0,,0
+3906,3906,"Hanshaw @ Salem",,42.467339,-76.458504,,,0,,0
+3908,3908,"Hanshaw @ Muriel",,42.467251,-76.461487,,,0,,0
+3909,3909,"Salem @ Maplewood",,42.469334,-76.45871,,,0,,0
+3911,3911,"Salem @ Birchwood",,42.471275,-76.457008,,,0,,0
+3915,3915,"Winston Court Apts",,42.475567,-76.457382,,,0,,0
+3919,3919,"Rose Hill @ Tareyton",,42.474007,-76.459808,,,0,,0
+3921,3921,"Rose Hill @ Muriel",,42.473938,-76.461838,,,0,,0
+3923,3923,"128 Muriel St",,42.470608,-76.461807,,,0,,0
+3931,3931,"Hanshaw @ Sapsucker Woods",,42.46748,-76.450233,,,0,,0
+3932,3932,"Sapsucker Woods @ Hanshaw",,42.467548,-76.450371,,,0,,0
+3936,3936,"Lab of Ornithology",,42.479336,-76.450516,,,0,,0
+3947,3947,"Guthrie Ithaca",,42.476494,-76.432449,,,0,,0
+3951,3951,"Hanshaw Village",,42.483364,-76.429214,,,0,,0
+4311,4311,"Freeville Rd at William George Academy",,42.505863,-76.334953,,,0,,0
+4312,4312,"Freeville Rd at William George Academy",,42.505901,-76.33522,,,0,,0
+4315,4315,"Railroad @ Cook (Freeville)",,42.512444,-76.342766,,,0,,0
+4316,4316,"Railroad @ Cook (Freeville)",,42.512405,-76.343048,,,0,,0
+4318,4318,"Station Park - Freeville",,42.513123,-76.345047,,,0,,0
+4321,4321,"Freeville Park and Ride",,42.511971,-76.350449,,,0,,0
+4322,4322,"Freeville Park and Ride",,42.512016,-76.350533,,,0,,0
+4325,4325,"Rte 38 @ Fall Creek Rd",,42.51384,-76.346809,,,0,,0
+4326,4326,"Rte38 @ Main (Freeville)",,42.513981,-76.346893,,,0,,0
+4328,4328,"Railroad @ Main (Freeville)",,42.513874,-76.346474,,,0,,0
+4335,4335,"Groton Rd @ Peruville",,42.54808,-76.361519,,,0,,0
+4336,4336,"Groton Rd @ Peruville",,42.548393,-76.361771,,,0,,0
+4351,4351,"Groton High School",,42.580624,-76.369049,,,0,,0
+4352,4352,"Groton High School",,42.580643,-76.369202,,,0,,0
+4355,4355,"Peru Rd @ Hamilton Square",,42.583397,-76.368423,,,0,,0
+4356,4356,"Peru Rd @ Hamilton Square",,42.583427,-76.368568,,,0,,0
+4359,4359,"South @ Main (Groton)",,42.58493,-76.365761,,,0,,0
+4360,4360,"Main @ South (Groton)",,42.585087,-76.36573,,,0,,0
+4361,4361,"Main @ Railroad (Groton)",,42.586338,-76.366043,,,0,,0
+4362,4362,"Main @ Railroad (Groton)",,42.586483,-76.366241,,,0,,0
+4365,4365,"Groton Express Mart",,42.587536,-76.366852,,,0,,0
+4375,4375,"Groton Town Hall",,42.589951,-76.369118,,,0,,0
+4378,4378,"Main @ Groton Park N Ride",,42.590046,-76.367752,,,0,,0
+4387,4387,"Cortland St @ Cayuga",,42.590714,-76.368065,,,0,,0
+4505,4505,"Dryden Rd @ Game Farm",,42.450832,-76.449585,,,0,,0
+4506,4506,"Dryden Rd @ Game Farm",,42.451,-76.449409,,,0,,0
+4509,4509,"Dryden Rd @ Forest Home",,42.453087,-76.444336,,,0,,0
+4510,4510,"Dryden Rd @ Forest Home",,42.453156,-76.444397,,,0,,0
+4511,4511,"933 Dryden Rd - Varna Auto",,42.454197,-76.440651,,,0,,0
+4512,4512,"Varna",,42.454292,-76.440674,,,0,,0
+4515,4515,"Dryden Rd @ Mt Pleasant",,42.455818,-76.436302,,,0,,0
+4516,4516,"Dryden Rd @ Freese",,42.455952,-76.436256,,,0,,0
+4517,4517,"1062 Dryden Rd - Pineridge Apts",,42.459278,-76.430199,,,0,,0
+4518,4518,"1062 Dryden Rd - Pineridge Apts",,42.459351,-76.430244,,,0,,0
+4519,4519,"Turkey Hill at Varna Fire Station",,42.45916,-76.427452,,,0,,0
+4520,4520,"Turkey Hill at Varna Fire Station",,42.458969,-76.427589,,,0,,0
+4521,4521,"Dryden Rd @ Turkey Hill",,42.460251,-76.427536,,,0,,0
+4522,4522,"Dryden Rd @ Turkey Hill",,42.460426,-76.427246,,,0,,0
+4523,4523,"Turkey Hill @ Mt. Pleasant",,42.453247,-76.429237,,,0,,0
+4524,4524,"Turkey Hill @ Mt. Pleasant",,42.453114,-76.429283,,,0,,0
+4527,4527,"Dryden Rd @ Baker Hill",,42.46735,-76.410881,,,0,,0
+4528,4528,"Dryden Rd @ Baker Hill",,42.467411,-76.410957,,,0,,0
+4537,4537,"Main St @ Dryden Rd (Etna)",,42.476929,-76.387047,,,0,,0
+4538,4538,"Dryden Rd @ Main St (Etna)",,42.476181,-76.387283,,,0,,0
+4539,4539,"Main St @ Dryden Rd (Etna)",,42.476486,-76.387291,,,0,,0
+4540,4540,"Dryden Rd @ Main St (Etna)",,42.476467,-76.386917,,,0,,0
+4543,4543,"Dryden Rd @ Mineah",,42.480637,-76.373871,,,0,,0
+4544,4544,"Dryden Rd @ Kirk",,42.480835,-76.373444,,,0,,0
+4549,4549,"Lower Creek @ Pickney",,42.476944,-76.40641,,,0,,0
+4553,4553,"Creekwood Apts",,42.479568,-76.399712,,,0,,0
+4554,4554,"Creekwood Apts",,42.479595,-76.399765,,,0,,0
+4562,4562,"Etna @ Pinckney",,42.48724,-76.409447,,,0,,0
+4568,4568,"Lower Creek @ Etna Ln",,42.485447,-76.385246,,,0,,0
+4569,4569,"Main @ Etna Ln - Etna Mills Apts",,42.485332,-76.383629,,,0,,0
+4570,4570,"Main @ Etna Ln - Etna Mills Apts",,42.485317,-76.383759,,,0,,0
+4707,4707,"Dryden Rd @ Yellowbarn",,42.486992,-76.343086,,,0,,0
+4708,4708,"Dryden Rd @ Johnson",,42.487099,-76.343109,,,0,,0
+4709,4709,"Dryden Rd @ Irish Settlement",,42.489574,-76.328468,,,0,,0
+4710,4710,"Dryden Rd @ George",,42.489693,-76.328056,,,0,,0
+4713,4713,"W Main @ Hilton (Dryden)",,42.490097,-76.311264,,,0,,0
+4714,4714,"W Main @ Hilton (Dryden)",,42.490189,-76.311302,,,0,,0
+4715,4715,"Main @ Rochester (Dryden)",,42.490322,-76.303551,,,0,,0
+4716,4716,"Main @ Rochester (Dryden)",,42.490452,-76.303452,,,0,,0
+4717,4717,"Dryden Village - Post Office",,42.490452,-76.299393,,,0,,0
+4718,4718,"Dryden Village - Main @ Library",,42.490551,-76.299408,,,0,,0
+4723,4723,"South @ Union",,42.489349,-76.2976,,,0,,0
+4724,4724,"South @ Union",,42.489346,-76.297714,,,0,,0
+4728,4728,"South @ Ferguson",,42.483341,-76.297333,,,0,,0
+4732,4732,"Dryden Harford Rd @ Beam Hill",,42.472267,-76.294868,,,0,,0
+4733,4733,"Keith at Jim Schug Trail",,42.469131,-76.289116,,,0,,0
+4734,4734,"Rt 38 @ Keith",,42.468792,-76.291672,,,0,,0
+4735,4735,"Keith @ Lake",,42.470005,-76.283508,,,0,,0
+4737,4737,"Lake @ Kimberly",,42.480396,-76.290596,,,0,,0
+4749,4749,"36 North St - Dunkin Donuts",,42.494858,-76.297844,,,0,,0
+4750,4750,"43 North St - Valero",,42.494755,-76.298004,,,0,,0
+4751,4751,"North @ Lee",,42.497982,-76.297989,,,0,,0
+4752,4752,"North @ Freeville",,42.498405,-76.298218,,,0,,0
+4755,4755,"North @ Brightday",,42.50071,-76.298172,,,0,,0
+4756,4756,"North @ Brightday",,42.500816,-76.298302,,,0,,0
+4773,4773,"Poets Landing Apartments",,42.498402,-76.309402,,,0,,0
+4776,4776,"Dryden Central School",,42.498505,-76.309319,,,0,,0
+4779,4779,"Freeville Rd @ Lewis",,42.498043,-76.302422,,,0,,0
+4780,4780,"Freeville Rd @ Enterprise",,42.498161,-76.302177,,,0,,0
+4783,4783,"TC3",,42.502785,-76.288277,,,0,,0
+4787,4787,"TC3 Dorms",,42.499817,-76.284431,,,0,,0
+503,503,"Clinton @ Fayette",,42.436722,-76.50267,,,0,,0
+504,504,"Clinton @ Fayette",,42.436798,-76.502449,,,0,,0
+511,511,"Clinton West Plaza",,42.436604,-76.506348,,,0,,0
+512,512,"Clinton @ Corn",,42.436687,-76.505882,,,0,,0
+519,519,"Plain @ Center",,42.435444,-76.503685,,,0,,0
+520,520,"Plain @ Center",,42.435612,-76.503777,,,0,,0
+523,523,"Plain @ Wood",,42.432682,-76.50354,,,0,,0
+524,524,"Plain @ Wood",,42.432819,-76.503647,,,0,,0
+527,527,"215 Elmira Rd - Pudgies",,42.429901,-76.504684,,,0,,0
+528,528,"214 Elmira Rd - Ithaca ReUse",,42.429981,-76.504814,,,0,,0
+531,531,"Meadow @ Wood",,42.432533,-76.507942,,,0,,0
+5311,5311,"Turkey Hill @ Ellis Hollow Creek",,42.442387,-76.428764,,,0,,0
+5312,5312,"Turkey Hill @ Ellis Hollow Creek",,42.442574,-76.428917,,,0,,0
+5316,5316,"Turkey Hill @ Ellis Hollow",,42.430874,-76.428185,,,0,,0
+5318,5318,"Ellis Hollow @ Turkey Hill",,42.430786,-76.428001,,,0,,0
+532,532,"Meadow @ Wood",,42.43232,-76.508133,,,0,,0
+5321,5321,"Ellis Hollow @ Genung",,42.428082,-76.415283,,,0,,0
+5322,5322,"Ellis Hollow @ Genung",,42.428101,-76.415062,,,0,,0
+5331,5331,"Ellis Hollow @ Ellis Hollow Creek",,42.425316,-76.381676,,,0,,0
+5332,5332,"Ellis Hollow @ Ellis Hollow Creek",,42.425243,-76.381332,,,0,,0
+5337,5337,"Ellis Hollow @ Eagleshead",,42.423756,-76.378471,,,0,,0
+5338,5338,"Ellis Hollow @ Eagleshead",,42.423752,-76.378227,,,0,,0
+5341,5341,"Ellis Hollow @ Hunt Hill",,42.422554,-76.377106,,,0,,0
+5342,5342,"Ellis Hollow @ Hunt Hill",,42.422405,-76.376808,,,0,,0
+535,535,"Titus Towers",,42.431789,-76.504509,,,0,,0
+541,541,"Wegmans",,42.434944,-76.509613,,,0,,0
+543,543,"Tops Supermarket (Ithaca)",,42.432365,-76.509804,,,0,,0
+545,545,"South Meadow Marketplace",,42.430428,-76.50988,,,0,,0
+547,547,"Fairgrounds Memorial Parkway at Lowes",,42.429966,-76.511955,,,0,,0
+549,549,"WalMart",,42.428844,-76.513329,,,0,,0
+551,551,"Walmart South Entrance",,42.427132,-76.511909,,,0,,0
+5525,5525,"318 Pine Tree - Equestrian Center",,42.434036,-76.463066,,,0,,0
+5526,5526,"318 Pine Tree - Equestrian Center",,42.434044,-76.463264,,,0,,0
+5530,5530,"Honness @ Pine Tree",,42.429714,-76.462929,,,0,,0
+5531,5531,"Pine Tree @ Honness",,42.429882,-76.462433,,,0,,0
+5532,5532,"Pine Tree @ Honness",,42.42984,-76.462563,,,0,,0
+5536,5536,"Honness at Ithaca Recreation Way",,42.429604,-76.467056,,,0,,0
+5541,5541,"Snyder Hill @ Sugarbush",,42.429371,-76.459671,,,0,,0
+5542,5542,"Snyder Hill @ Sugarbush",,42.429325,-76.459396,,,0,,0
+5545,5545,"Regency @ Snyder Hill",,42.426128,-76.455276,,,0,,0
+5546,5546,"Snyder Hill @ Regency",,42.426277,-76.455353,,,0,,0
+5548,5548,"Snyder Hill @ Hungerford Hill",,42.425091,-76.453789,,,0,,0
+5549,5549,"Snyder Hill @ Dove",,42.423912,-76.45105,,,0,,0
+5552,5552,"Skyvue @ Snyder Hill",,42.422901,-76.448456,,,0,,0
+5559,5559,"Eastern Heights @ Sharlene",,42.423298,-76.452621,,,0,,0
+5560,5560,"Eastern Heights @ Landmark",,42.42437,-76.454544,,,0,,0
+5561,5561,"Eastern Heights @ Joanne",,42.424992,-76.456482,,,0,,0
+559,559,"Meadow at Ithaca Shopping Plaza",,42.429436,-76.507767,,,0,,0
+561,561,"Elmira @ Meadow",,42.427567,-76.508827,,,0,,0
+562,562,"Meadow @ Elmira",,42.428619,-76.508163,,,0,,0
+564,564,"Elmira Rd @ Walmart",,42.426552,-76.511276,,,0,,0
+565,565,"323 Elmira Rd - Byrne Dairy",,42.426125,-76.511551,,,0,,0
+567,567,"359 Elmira Rd - Fairfield Inn",,42.423042,-76.515701,,,0,,0
+568,568,"366 Elmira Rd - Speedway",,42.422878,-76.516205,,,0,,0
+569,569,"Elmira @ Spencer",,42.420002,-76.519447,,,0,,0
+570,570,"Elmira @ Spencer",,42.419739,-76.520027,,,0,,0
+5707,5707,"Slaterville Rd @ Honness",,42.429516,-76.472298,,,0,,0
+5708,5708,"Slaterville Rd @ Honness",,42.429367,-76.472244,,,0,,0
+571,571,"Elmira @ Buttermilk",,42.417809,-76.522888,,,0,,0
+5710,5710,"Honness @ Slaterville Rd",,42.429417,-76.471939,,,0,,0
+5712,5712,"Slaterville Rd @ Tower View",,42.426205,-76.467339,,,0,,0
+5715,5715,"Slaterville Rd @ Lois - Commonland",,42.424248,-76.464165,,,0,,0
+5716,5716,"Slaterville Rd @ Lois - Commonland",,42.424183,-76.464195,,,0,,0
+5719,5719,"Pine Tree @ Slaterville Rd",,42.423244,-76.46151,,,0,,0
+572,572,"Elmira @ Buttermilk",,42.41777,-76.523399,,,0,,0
+5720,5720,"Pine Tree @ Slaterville Rd",,42.422577,-76.46154,,,0,,0
+5729,5729,"Slaterville Rd @ German Cross",,42.405312,-76.429245,,,0,,0
+5730,5730,"Slaterville Rd @ German Cross",,42.405418,-76.429626,,,0,,0
+5733,5733,"Slaterville Rd @ Brooktondale Rd",,42.402771,-76.423897,,,0,,0
+5734,5734,"Slaterville Rd @ Brooktondale",,42.402802,-76.424408,,,0,,0
+5736,5736,"Brooktondale @ Slaterville Rd",,42.402458,-76.423737,,,0,,0
+5737,5737,"Slaterville Rd @ Bessemer Hill",,42.39616,-76.408714,,,0,,0
+5738,5738,"Slaterville Rd @ Bessemer Hill",,42.396091,-76.40905,,,0,,0
+5741,5741,"Slaterville Rd @ Landon",,42.395496,-76.397835,,,0,,0
+5742,5742,"Slaterville Rd @ Landon",,42.395466,-76.398033,,,0,,0
+5743,5743,"Slaterville Rd @ Snyder Hill",,42.395462,-76.382034,,,0,,0
+5744,5744,"Slaterville Rd @ Snyder Hill",,42.395374,-76.382385,,,0,,0
+5745,5745,"Slaterville Rd @ Thomas",,42.394417,-76.375069,,,0,,0
+5746,5746,"Slaterville Rd @ Lounsberry",,42.394356,-76.37532,,,0,,0
+5747,5747,"Ellis Hollow @ Slaterville Rd",,42.393826,-76.367271,,,0,,0
+5748,5748,"Slaterville Rd @ Ellis Hollow",,42.393597,-76.367424,,,0,,0
+5749,5749,"Slaterville Rd @ Ellis Hollow",,42.393692,-76.366982,,,0,,0
+5752,5752,"Slaterville Rd @ Boiceville",,42.393753,-76.362991,,,0,,0
+5753,5753,"Slaterville Rd @ Boiceville",,42.393841,-76.362694,,,0,,0
+5754,5754,"Boiceville @ Slaterville Rd",,42.393688,-76.362801,,,0,,0
+5759,5759,"Caroline Town Hall",,42.393986,-76.349709,,,0,,0
+5760,5760,"Caroline Town Hall",,42.393898,-76.349716,,,0,,0
+5771,5771,"Caroline Turn-Around",,42.377563,-76.280907,,,0,,0
+5779,5779,"Brooktondale Rd @ Besemer",,42.388641,-76.408112,,,0,,0
+5780,5780,"Brooktondale Rd @ Besemer",,42.388695,-76.408585,,,0,,0
+5785,5785,"Brooktondale Store",,42.381554,-76.396744,,,0,,0
+5786,5786,"Brooktondale Store",,42.381489,-76.396805,,,0,,0
+5787,5787,"Brooktondale Park and Ride",,42.381004,-76.393372,,,0,,0
+5788,5788,"Brooktondale Park and Ride",,42.380924,-76.393486,,,0,,0
+5792,5792,"Valley @ Boiceville",,42.385826,-76.360313,,,0,,0
+5794,5794,"Boiceville @ Valley",,42.38596,-76.36013,,,0,,0
+5795,5795,"Boiceville Cottages",,42.388184,-76.361778,,,0,,0
+5796,5796,"Boiceville Cottages",,42.388237,-76.361893,,,0,,0
+6321,6321,"Danby Rd @ King",,42.407223,-76.502945,,,0,,0
+6322,6322,"Danby Rd @ King",,42.408066,-76.503189,,,0,,0
+6329,6329,"Danby Rd @ Comfort",,42.39439,-76.497513,,,0,,0
+6330,6330,"Danby Rd @ Comfort",,42.394547,-76.497833,,,0,,0
+6337,6337,"Danby Rd @ Muzzy",,42.380821,-76.491165,,,0,,0
+6338,6338,"Danby Rd @ Muzzy",,42.380978,-76.491463,,,0,,0
+6343,6343,"Danby Rd @ Miller",,42.367725,-76.486862,,,0,,0
+6344,6344,"Danby Rd @ Miller",,42.367626,-76.487091,,,0,,0
+6349,6349,"Danby Fire Station",,42.358238,-76.483131,,,0,,0
+6350,6350,"Danby Fire Station",,42.358288,-76.483368,,,0,,0
+6351,6351,"Danby Town Hall Park and Ride",,42.354198,-76.4814,,,0,,0
+6352,6352,"Danby Town Hall Park and Ride",,42.354099,-76.481598,,,0,,0
+6353,6353,"Danby Rd @ Bald Hill",,42.352375,-76.480721,,,0,,0
+6354,6354,"Danby Rd @ Bald Hill",,42.352505,-76.480965,,,0,,0
+6357,6357,"Danby Rd @ Michigan Hollow",,42.349846,-76.478836,,,0,,0
+6358,6358,"Danby Rd @ Michigan Hollow",,42.349903,-76.479202,,,0,,0
+6363,6363,"Danby Rd @ Steam Mill",,42.343376,-76.466331,,,0,,0
+6364,6364,"Danby Rd @ Steam Mill",,42.343456,-76.466766,,,0,,0
+6367,6367,"South Danby Park and Ride",,42.339382,-76.458618,,,0,,0
+6368,6368,"South Danby Park and Ride",,42.339214,-76.458702,,,0,,0
+6374,6374,"Hillview Terrace MHC",,42.3279,-76.440941,,,0,,0
+6511,6511,"West Danby Rd @ Decker",,42.387653,-76.553864,,,0,,0
+6515,6515,"West Danby Rd @ Melody - Meadowbrook Par",,42.381859,-76.553596,,,0,,0
+6519,6519,"West Danby Rd @ Shelter Valley",,42.373962,-76.551369,,,0,,0
+6524,6524,"Newfield Depot @ W Danby",,42.368603,-76.552292,,,0,,0
+6532,6532,"Newfield Depot @ Valley Manor",,42.368721,-76.555298,,,0,,0
+661,661,"Green @ Meadow",,42.438309,-76.508499,,,0,,0
+663,663,"State/MLK @ Meadow",,42.439217,-76.507942,,,0,,0
+664,664,"State/MLK @ Meadow",,42.439297,-76.50808,,,0,,0
+665,665,"State/MLK @ Fulton",,42.439156,-76.509888,,,0,,0
+668,668,"State @ Fulton",,42.439243,-76.511024,,,0,,0
+669,669,"State/MLK @ Taughannock",,42.439579,-76.512512,,,0,,0
+6711,6711,"Elmira Rd @ Five Mile",,42.413532,-76.533424,,,0,,0
+6712,6712,"Elmira Rd @ Five Mile",,42.413754,-76.533295,,,0,,0
+6713,6713,"Elmira Rd @ 7 Mile",,42.408623,-76.541237,,,0,,0
+6714,6714,"Elmira Rd @ 7 Mile",,42.408623,-76.541496,,,0,,0
+6717,6717,"Elmira Rd @ Enfield Falls",,42.403488,-76.546204,,,0,,0
+6718,6718,"Elmira Rd @ Enfield Falls",,42.403728,-76.546303,,,0,,0
+672,672,"Seneca @ Fulton",,42.440086,-76.511139,,,0,,0
+6720,6720,"Elmira Rd @ Enfield Creek Overpass",,42.397011,-76.546852,,,0,,0
+6721,6721,"Elmira Rd @ Enfield Creek Overpass",,42.397995,-76.545906,,,0,,0
+673,673,"Buffalo @ Fulton",,42.440853,-76.510956,,,0,,0
+6742,6742,"Elmira Rd @ Burdge Hill",,42.366524,-76.586296,,,0,,0
+676,676,"Buffalo @ Taughannock",,42.440952,-76.51329,,,0,,0
+6767,6767,"Newfield Depot @ Mill",,42.363846,-76.585739,,,0,,0
+6775,6775,"Newfield-Town Hall",,42.362503,-76.589577,,,0,,0
+6779,6779,"Main @ Bridge",,42.362003,-76.590652,,,0,,0
+6781,6781,"Main @ Pearl",,42.361061,-76.592247,,,0,,0
+6784,6784,"Newfield Central School",,42.359272,-76.597198,,,0,,0
+6787,6787,"Main @ Vankirk",,42.354309,-76.601784,,,0,,0
+6789,6789,"Elmira Rd @ Main - Newfield Horizon Apts",,42.352379,-76.60833,,,0,,0
+679,679,"State/MLK at Inlet Island",,42.440517,-76.514015,,,0,,0
+703,703,"Chestnut @ Sunrise",,42.443478,-76.517685,,,0,,0
+704,704,"Chestnut @ Sunrise",,42.443447,-76.517815,,,0,,0
+705,705,"Chestnut Hill Apts",,42.441708,-76.518036,,,0,,0
+706,706,"Chestnut Hill Apts",,42.441711,-76.518082,,,0,,0
+709,709,"Chestnut @ Elm - LACS",,42.438648,-76.519127,,,0,,0
+710,710,"Chestnut @ Hook - LACS",,42.438911,-76.519119,,,0,,0
+713,713,"Elm @ West Village Pl",,42.436691,-76.522141,,,0,,0
+715,715,"West Village Parking Lot",,42.435436,-76.523033,,,0,,0
+717,717,"Haller @ Elm",,42.436466,-76.526009,,,0,,0
+718,718,"Haller @ Elm",,42.436352,-76.526062,,,0,,0
+719,719,"Haller @ Hook",,42.439304,-76.526093,,,0,,0
+720,720,"Hook @ Haller",,42.43948,-76.526062,,,0,,0
+721,721,"Warren Pl @ Hook",,42.439678,-76.523865,,,0,,0
+722,722,"Warren Pl @ Hook",,42.439602,-76.523926,,,0,,0
+725,725,"Warren Pl @ Sunrise",,42.443802,-76.524429,,,0,,0
+726,726,"Warren Pl @ Sunrise",,42.443947,-76.524521,,,0,,0
+729,729,"Warren Pl @ Hector",,42.448711,-76.52636,,,0,,0
+730,730,"Warren Pl @ Hector",,42.448238,-76.526108,,,0,,0
+731,731,"Hector @ Warren Pl",,42.448673,-76.526627,,,0,,0
+732,732,"Mecklenburg Rd @ Conifer Dr",,42.448513,-76.530502,,,0,,0
+736,736,"Linderman Creek Apts",,42.449429,-76.53054,,,0,,0
+737,737,"Linderman Creek Apts",,42.449688,-76.530815,,,0,,0
+738,738,"Conifer Village",,42.451122,-76.532227,,,0,,0
+744,744,"Hector @ N Taylor",,42.450924,-76.520851,,,0,,0
+745,745,"Hector @ Fairview Terrace",,42.451904,-76.521545,,,0,,0
+747,747,"413 Hector St",,42.446095,-76.517021,,,0,,0
+748,748,"412 Hector St",,42.446087,-76.517151,,,0,,0
+767,767,"Campbell @ Hector",,42.45256,-76.523338,,,0,,0
+768,768,"Campbell @ Hector",,42.452522,-76.523407,,,0,,0
+773,773,"Campbell @ Hopkins",,42.456551,-76.524567,,,0,,0
+774,774,"Campbell @ Hopkins",,42.456421,-76.524551,,,0,,0
+779,779,"Cliff @ Vinegar Hill",,42.449738,-76.517723,,,0,,0
+780,780,"Cliff @ Vinegar Hill",,42.449829,-76.517883,,,0,,0
+785,785,"Trumansburg Rd @ Hopkins",,42.456947,-76.524277,,,0,,0
+786,786,"Trumansburg Rd @ Hopkins",,42.456894,-76.524384,,,0,,0
+900,900,"Cayuga @ Cascadilla",,42.444801,-76.499306,,,0,,0
+901,901,"Cayuga @ Cascadilla",,42.444496,-76.499207,,,0,,0
+903,903,"Cascadilla @ Cayuga",,42.444553,-76.499466,,,0,,0
+905,905,"Tompkins @ Cayuga",,42.448326,-76.499641,,,0,,0
+906,906,"Cayuga @ Tompkins",,42.448456,-76.49955,,,0,,0
+907,907,"Cayuga @ Tompkins",,42.448273,-76.499428,,,0,,0
+911,911,"Cayuga @ Lincoln",,42.451878,-76.499657,,,0,,0
+912,912,"Cayuga @ Lincoln",,42.452068,-76.499786,,,0,,0
+913,913,"Lincoln @ Cayuga",,42.451942,-76.499893,,,0,,0
+914,914,"Lincoln @ Cayuga",,42.452011,-76.499565,,,0,,0
+918,918,"Dey @ Lincoln",,42.451187,-76.503075,,,0,,0
+920,920,"Lincoln @ Dey",,42.451229,-76.502823,,,0,,0
+925,925,"Tioga @ Falls",,42.452732,-76.497536,,,0,,0
+926,926,"Falls @ Tioga",,42.452808,-76.497498,,,0,,0
+927,927,"Cascadilla @ Third",,42.444489,-76.503532,,,0,,0
+928,928,"Third @ Cascadilla",,42.444553,-76.503677,,,0,,0
+929,929,"Third @ Hancock",,42.446365,-76.505035,,,0,,0
+930,930,"Third @ Hancock",,42.446476,-76.505226,,,0,,0
+932,932,"Hancock @ Third",,42.446491,-76.505005,,,0,,0
+933,933,"Third @ Adams",,42.447296,-76.505798,,,0,,0
+934,934,"Third @ Adams",,42.447395,-76.505981,,,0,,0
+939,939,"Aldi",,42.449238,-76.506561,,,0,,0
+953,953,"Hancock @ First",,42.447285,-76.50309,,,0,,0
+954,954,"Hancock @ First",,42.447414,-76.502968,,,0,,0
+959,959,"Hancock @ 5th",,42.445576,-76.507172,,,0,,0
+960,960,"5th @ Cascadilla",,42.444599,-76.506592,,,0,,0
+962,962,"Cascadilla @ Fulton",,42.444332,-76.509659,,,0,,0
+998,998,"TCAT Garage",,42.452354,-76.505447,,,0,,0

+ 1 - 0
doc/example-txt/transfers.txt

@@ -0,0 +1 @@
+from_stop_id,to_stop_id,transfer_type,min_transfer_time

File diff suppressed because it is too large
+ 2810 - 0
doc/example-txt/trips.txt


+ 937 - 0
doc/gtfs-realtime.proto

@@ -0,0 +1,937 @@
+// Copyright 2015 The GTFS Specifications Authors.
+//
+// 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.
+
+// Protocol definition file for GTFS Realtime.
+//
+// GTFS Realtime lets transit agencies provide consumers with realtime
+// information about disruptions to their service (stations closed, lines not
+// operating, important delays etc), location of their vehicles and expected
+// arrival times.
+//
+// This protocol is published at:
+// https://github.com/google/transit/tree/master/gtfs-realtime
+
+syntax = "proto2";
+option java_package = "com.google.transit.realtime";
+package transit_realtime;
+
+// The contents of a feed message.
+// A feed is a continuous stream of feed messages. Each message in the stream is
+// obtained as a response to an appropriate HTTP GET request.
+// A realtime feed is always defined with relation to an existing GTFS feed.
+// All the entity ids are resolved with respect to the GTFS feed.
+// Note that "required" and "optional" as stated in this file refer to Protocol
+// Buffer cardinality, not semantic cardinality.  See reference.md at
+// https://github.com/google/transit/tree/master/gtfs-realtime for field
+// semantic cardinality.
+message FeedMessage {
+  // Metadata about this feed and feed message.
+  required FeedHeader header = 1;
+
+  // Contents of the feed.
+  repeated FeedEntity entity = 2;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// Metadata about a feed, included in feed messages.
+message FeedHeader {
+  // Version of the feed specification.
+  // The current version is 2.0.  Valid versions are "2.0", "1.0".
+  required string gtfs_realtime_version = 1;
+
+  // Determines whether the current fetch is incremental.  Currently,
+  // DIFFERENTIAL mode is unsupported and behavior is unspecified for feeds
+  // that use this mode.  There are discussions on the GTFS Realtime mailing
+  // list around fully specifying the behavior of DIFFERENTIAL mode and the
+  // documentation will be updated when those discussions are finalized.
+  enum Incrementality {
+    FULL_DATASET = 0;
+    DIFFERENTIAL = 1;
+  }
+  optional Incrementality incrementality = 2 [default = FULL_DATASET];
+
+  // This timestamp identifies the moment when the content of this feed has been
+  // created (in server time). In POSIX time (i.e., number of seconds since
+  // January 1st 1970 00:00:00 UTC).
+  optional uint64 timestamp = 3;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// A definition (or update) of an entity in the transit feed.
+message FeedEntity {
+  // The ids are used only to provide incrementality support. The id should be
+  // unique within a FeedMessage. Consequent FeedMessages may contain
+  // FeedEntities with the same id. In case of a DIFFERENTIAL update the new
+  // FeedEntity with some id will replace the old FeedEntity with the same id
+  // (or delete it - see is_deleted below).
+  // The actual GTFS entities (e.g. stations, routes, trips) referenced by the
+  // feed must be specified by explicit selectors (see EntitySelector below for
+  // more info).
+  required string id = 1;
+
+  // Whether this entity is to be deleted. Relevant only for incremental
+  // fetches.
+  optional bool is_deleted = 2 [default = false];
+
+  // Data about the entity itself. Exactly one of the following fields must be
+  // present (unless the entity is being deleted).
+  optional TripUpdate trip_update = 3;
+  optional VehiclePosition vehicle = 4;
+  optional Alert alert = 5;
+
+  // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+  optional Shape shape = 6;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+//
+// Entities used in the feed.
+//
+
+// Realtime update of the progress of a vehicle along a trip.
+// Depending on the value of ScheduleRelationship, a TripUpdate can specify:
+// - A trip that proceeds along the schedule.
+// - A trip that proceeds along a route but has no fixed schedule.
+// - A trip that have been added or removed with regard to schedule.
+//
+// The updates can be for future, predicted arrival/departure events, or for
+// past events that already occurred.
+// Normally, updates should get more precise and more certain (see
+// uncertainty below) as the events gets closer to current time.
+// Even if that is not possible, the information for past events should be
+// precise and certain. In particular, if an update points to time in the past
+// but its update's uncertainty is not 0, the client should conclude that the
+// update is a (wrong) prediction and that the trip has not completed yet.
+//
+// Note that the update can describe a trip that is already completed.
+// To this end, it is enough to provide an update for the last stop of the trip.
+// If the time of that is in the past, the client will conclude from that that
+// the whole trip is in the past (it is possible, although inconsequential, to
+// also provide updates for preceding stops).
+// This option is most relevant for a trip that has completed ahead of schedule,
+// but according to the schedule, the trip is still proceeding at the current
+// time. Removing the updates for this trip could make the client assume
+// that the trip is still proceeding.
+// Note that the feed provider is allowed, but not required, to purge past
+// updates - this is one case where this would be practically useful.
+message TripUpdate {
+  // The Trip that this message applies to. There can be at most one
+  // TripUpdate entity for each actual trip instance.
+  // If there is none, that means there is no prediction information available.
+  // It does *not* mean that the trip is progressing according to schedule.
+  required TripDescriptor trip = 1;
+
+  // Additional information on the vehicle that is serving this trip.
+  optional VehicleDescriptor vehicle = 3;
+
+  // Timing information for a single predicted event (either arrival or
+  // departure).
+  // Timing consists of delay and/or estimated time, and uncertainty.
+  // - delay should be used when the prediction is given relative to some
+  //   existing schedule in GTFS.
+  // - time should be given whether there is a predicted schedule or not. If
+  //   both time and delay are specified, time will take precedence
+  //   (although normally, time, if given for a scheduled trip, should be
+  //   equal to scheduled time in GTFS + delay).
+  //
+  // Uncertainty applies equally to both time and delay.
+  // The uncertainty roughly specifies the expected error in true delay (but
+  // note, we don't yet define its precise statistical meaning). It's possible
+  // for the uncertainty to be 0, for example for trains that are driven under
+  // computer timing control.
+  message StopTimeEvent {
+    // Delay (in seconds) can be positive (meaning that the vehicle is late) or
+    // negative (meaning that the vehicle is ahead of schedule). Delay of 0
+    // means that the vehicle is exactly on time.
+    optional int32 delay = 1;
+
+    // Event as absolute time.
+    // In Unix time (i.e., number of seconds since January 1st 1970 00:00:00
+    // UTC).
+    optional int64 time = 2;
+
+    // If uncertainty is omitted, it is interpreted as unknown.
+    // If the prediction is unknown or too uncertain, the delay (or time) field
+    // should be empty. In such case, the uncertainty field is ignored.
+    // To specify a completely certain prediction, set its uncertainty to 0.
+    optional int32 uncertainty = 3;
+
+    // The extensions namespace allows 3rd-party developers to extend the
+    // GTFS Realtime Specification in order to add and evaluate new features
+    // and modifications to the spec.
+    extensions 1000 to 1999;
+
+    // The following extension IDs are reserved for private use by any organization.
+    extensions 9000 to 9999;
+  }
+
+  // Realtime update for arrival and/or departure events for a given stop on a
+  // trip. Updates can be supplied for both past and future events.
+  // The producer is allowed, although not required, to drop past events.
+  message StopTimeUpdate {
+    // The update is linked to a specific stop either through stop_sequence or
+    // stop_id, so one of the fields below must necessarily be set.
+    // See the documentation in TripDescriptor for more information.
+
+    // Must be the same as in stop_times.txt in the corresponding GTFS feed.
+    optional uint32 stop_sequence = 1;
+    // Must be the same as in stops.txt in the corresponding GTFS feed.
+    optional string stop_id = 4;
+
+    optional StopTimeEvent arrival = 2;
+    optional StopTimeEvent departure = 3;
+
+    // Expected occupancy after departure from the given stop.
+    // Should be provided only for future stops.
+    // In order to provide departure_occupancy_status without either arrival or
+    // departure StopTimeEvents, ScheduleRelationship should be set to NO_DATA. 
+    optional VehiclePosition.OccupancyStatus departure_occupancy_status = 7;
+    
+    // The relation between the StopTimeEvents and the static schedule.
+    enum ScheduleRelationship {
+      // The vehicle is proceeding in accordance with its static schedule of
+      // stops, although not necessarily according to the times of the schedule.
+      // At least one of arrival and departure must be provided. If the schedule
+      // for this stop contains both arrival and departure times then so must
+      // this update. Frequency-based trips (GTFS frequencies.txt with exact_times = 0)
+      // should not have a SCHEDULED value and should use UNSCHEDULED instead.
+      SCHEDULED = 0;
+
+      // The stop is skipped, i.e., the vehicle will not stop at this stop.
+      // Arrival and departure are optional.
+      SKIPPED = 1;
+
+      // No StopTimeEvents are given for this stop.
+      // The main intention for this value is to give time predictions only for
+      // part of a trip, i.e., if the last update for a trip has a NO_DATA
+      // specifier, then StopTimeEvents for the rest of the stops in the trip
+      // are considered to be unspecified as well.
+      // Neither arrival nor departure should be supplied.
+      NO_DATA = 2;
+
+      // The vehicle is operating a trip defined in GTFS frequencies.txt with exact_times = 0.
+      // This value should not be used for trips that are not defined in GTFS frequencies.txt,
+      // or trips in GTFS frequencies.txt with exact_times = 1. Trips containing StopTimeUpdates
+      // with ScheduleRelationship=UNSCHEDULED must also set TripDescriptor.ScheduleRelationship=UNSCHEDULED.
+      // NOTE: This field is still experimental, and subject to change. It may be
+      // formally adopted in the future.
+      UNSCHEDULED = 3;
+    }
+    optional ScheduleRelationship schedule_relationship = 5
+        [default = SCHEDULED];
+
+    // Provides the updated values for the stop time.
+    // NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future.
+    message StopTimeProperties {
+      // Supports real-time stop assignments. Refers to a stop_id defined in the GTFS stops.txt.
+      // The new assigned_stop_id should not result in a significantly different trip experience for the end user than
+      // the stop_id defined in GTFS stop_times.txt. In other words, the end user should not view this new stop_id as an
+      // "unusual change" if the new stop was presented within an app without any additional context.
+      // For example, this field is intended to be used for platform assignments by using a stop_id that belongs to the
+      // same station as the stop originally defined in GTFS stop_times.txt.
+      // To assign a stop without providing any real-time arrival or departure predictions, populate this field and set
+      // StopTimeUpdate.schedule_relationship = NO_DATA.
+      // If this field is populated, it is preferred to omit `StopTimeUpdate.stop_id` and use only `StopTimeUpdate.stop_sequence`. If
+      // `StopTimeProperties.assigned_stop_id` and `StopTimeUpdate.stop_id` are populated, `StopTimeUpdate.stop_id` must match `assigned_stop_id`.
+      // Platform assignments should be reflected in other GTFS-realtime fields as well
+      // (e.g., `VehiclePosition.stop_id`).
+      // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+      optional string assigned_stop_id = 1;
+
+      // The extensions namespace allows 3rd-party developers to extend the
+      // GTFS Realtime Specification in order to add and evaluate new features
+      // and modifications to the spec.
+      extensions 1000 to 1999;
+
+      // The following extension IDs are reserved for private use by any organization.
+      extensions 9000 to 9999;
+    }
+
+    // Realtime updates for certain properties defined within GTFS stop_times.txt
+    // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional StopTimeProperties stop_time_properties = 6;
+
+    // The extensions namespace allows 3rd-party developers to extend the
+    // GTFS Realtime Specification in order to add and evaluate new features
+    // and modifications to the spec.
+    extensions 1000 to 1999;
+
+    // The following extension IDs are reserved for private use by any organization.
+    extensions 9000 to 9999;
+  }
+
+  // Updates to StopTimes for the trip (both future, i.e., predictions, and in
+  // some cases, past ones, i.e., those that already happened).
+  // The updates must be sorted by stop_sequence, and apply for all the
+  // following stops of the trip up to the next specified one.
+  //
+  // Example 1:
+  // For a trip with 20 stops, a StopTimeUpdate with arrival delay and departure
+  // delay of 0 for stop_sequence of the current stop means that the trip is
+  // exactly on time.
+  //
+  // Example 2:
+  // For the same trip instance, 3 StopTimeUpdates are provided:
+  // - delay of 5 min for stop_sequence 3
+  // - delay of 1 min for stop_sequence 8
+  // - delay of unspecified duration for stop_sequence 10
+  // This will be interpreted as:
+  // - stop_sequences 3,4,5,6,7 have delay of 5 min.
+  // - stop_sequences 8,9 have delay of 1 min.
+  // - stop_sequences 10,... have unknown delay.
+  repeated StopTimeUpdate stop_time_update = 2;
+
+  // The most recent moment at which the vehicle's real-time progress was measured
+  // to estimate StopTimes in the future. When StopTimes in the past are provided,
+  // arrival/departure times may be earlier than this value. In POSIX
+  // time (i.e., the number of seconds since January 1st 1970 00:00:00 UTC).
+  optional uint64 timestamp = 4;
+
+  // The current schedule deviation for the trip.  Delay should only be
+  // specified when the prediction is given relative to some existing schedule
+  // in GTFS.
+  //
+  // Delay (in seconds) can be positive (meaning that the vehicle is late) or
+  // negative (meaning that the vehicle is ahead of schedule). Delay of 0
+  // means that the vehicle is exactly on time.
+  //
+  // Delay information in StopTimeUpdates take precedent of trip-level delay
+  // information, such that trip-level delay is only propagated until the next
+  // stop along the trip with a StopTimeUpdate delay value specified.
+  //
+  // Feed providers are strongly encouraged to provide a TripUpdate.timestamp
+  // value indicating when the delay value was last updated, in order to
+  // evaluate the freshness of the data.
+  //
+  // NOTE: This field is still experimental, and subject to change. It may be
+  // formally adopted in the future.
+  optional int32 delay = 5;
+
+  // Defines updated properties of the trip, such as a new shape_id when there is a detour. Or defines the
+  // trip_id, start_date, and start_time of a DUPLICATED trip. 
+  // NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future.
+  message TripProperties {
+    // Defines the identifier of a new trip that is a duplicate of an existing trip defined in (CSV) GTFS trips.txt
+    // but will start at a different service date and/or time (defined using the TripProperties.start_date and
+    // TripProperties.start_time fields). See definition of trips.trip_id in (CSV) GTFS. Its value must be different
+    // than the ones used in the (CSV) GTFS. Required if schedule_relationship=DUPLICATED, otherwise this field must not
+    // be populated and will be ignored by consumers.
+    // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional string trip_id = 1;
+    // Service date on which the DUPLICATED trip will be run, in YYYYMMDD format. Required if
+    // schedule_relationship=DUPLICATED, otherwise this field must not be populated and will be ignored by consumers.
+    // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional string start_date = 2;
+    // Defines the departure start time of the trip when it’s duplicated. See definition of stop_times.departure_time
+    // in (CSV) GTFS. Scheduled arrival and departure times for the duplicated trip are calculated based on the offset
+    // between the original trip departure_time and this field. For example, if a GTFS trip has stop A with a
+    // departure_time of 10:00:00 and stop B with departure_time of 10:01:00, and this field is populated with the value
+    // of 10:30:00, stop B on the duplicated trip will have a scheduled departure_time of 10:31:00. Real-time prediction
+    // delay values are applied to this calculated schedule time to determine the predicted time. For example, if a
+    // departure delay of 30 is provided for stop B, then the predicted departure time is 10:31:30. Real-time
+    // prediction time values do not have any offset applied to them and indicate the predicted time as provided.
+    // For example, if a departure time representing 10:31:30 is provided for stop B, then the predicted departure time
+    // is 10:31:30. This field is required if schedule_relationship is DUPLICATED, otherwise this field must not be
+    // populated and will be ignored by consumers.
+    // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional string start_time = 3;
+    // Specifies the shape of the vehicle travel path when the trip shape differs from the shape specified in
+    // (CSV) GTFS or to specify it in real-time when it's not provided by (CSV) GTFS, such as a vehicle that takes differing
+    // paths based on rider demand. See definition of trips.shape_id in (CSV) GTFS. If a shape is neither defined in (CSV) GTFS
+    // nor in real-time, the shape is considered unknown. This field can refer to a shape defined in the (CSV) GTFS in shapes.txt
+    // or a Shape in the (protobuf) real-time feed. The order of stops (stop sequences) for this trip must remain the same as
+    // (CSV) GTFS. Stops that are a part of the original trip but will no longer be made, such as when a detour occurs, should
+    // be marked as schedule_relationship=SKIPPED.
+    // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. 
+    optional string shape_id = 4;
+
+    // The extensions namespace allows 3rd-party developers to extend the
+    // GTFS Realtime Specification in order to add and evaluate new features
+    // and modifications to the spec.
+    extensions 1000 to 1999;
+
+    // The following extension IDs are reserved for private use by any organization.
+    extensions 9000 to 9999;
+  }
+  optional TripProperties trip_properties = 6;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// Realtime positioning information for a given vehicle.
+message VehiclePosition {
+  // The Trip that this vehicle is serving.
+  // Can be empty or partial if the vehicle can not be identified with a given
+  // trip instance.
+  optional TripDescriptor trip = 1;
+
+  // Additional information on the vehicle that is serving this trip.
+  optional VehicleDescriptor vehicle = 8;
+
+  // Current position of this vehicle.
+  optional Position position = 2;
+
+  // The stop sequence index of the current stop. The meaning of
+  // current_stop_sequence (i.e., the stop that it refers to) is determined by
+  // current_status.
+  // If current_status is missing IN_TRANSIT_TO is assumed.
+  optional uint32 current_stop_sequence = 3;
+  // Identifies the current stop. The value must be the same as in stops.txt in
+  // the corresponding GTFS feed.
+  optional string stop_id = 7;
+
+  enum VehicleStopStatus {
+    // The vehicle is just about to arrive at the stop (on a stop
+    // display, the vehicle symbol typically flashes).
+    INCOMING_AT = 0;
+
+    // The vehicle is standing at the stop.
+    STOPPED_AT = 1;
+
+    // The vehicle has departed and is in transit to the next stop.
+    IN_TRANSIT_TO = 2;
+  }
+  // The exact status of the vehicle with respect to the current stop.
+  // Ignored if current_stop_sequence is missing.
+  optional VehicleStopStatus current_status = 4 [default = IN_TRANSIT_TO];
+
+  // Moment at which the vehicle's position was measured. In POSIX time
+  // (i.e., number of seconds since January 1st 1970 00:00:00 UTC).
+  optional uint64 timestamp = 5;
+
+  // Congestion level that is affecting this vehicle.
+  enum CongestionLevel {
+    UNKNOWN_CONGESTION_LEVEL = 0;
+    RUNNING_SMOOTHLY = 1;
+    STOP_AND_GO = 2;
+    CONGESTION = 3;
+    SEVERE_CONGESTION = 4;  // People leaving their cars.
+  }
+  optional CongestionLevel congestion_level = 6;
+
+  // The state of passenger occupancy for the vehicle or carriage.
+  // Individual producers may not publish all OccupancyStatus values. Therefore, consumers
+  // must not assume that the OccupancyStatus values follow a linear scale.
+  // Consumers should represent OccupancyStatus values as the state indicated 
+  // and intended by the producer. Likewise, producers must use OccupancyStatus values that
+  // correspond to actual vehicle occupancy states.
+  // For describing passenger occupancy levels on a linear scale, see `occupancy_percentage`.
+  // This field is still experimental, and subject to change. It may be formally adopted in the future.
+  enum OccupancyStatus {
+    // The vehicle or carriage is considered empty by most measures, and has few or no
+    // passengers onboard, but is still accepting passengers.
+    EMPTY = 0;
+
+    // The vehicle or carriage has a large number of seats available.
+    // The amount of free seats out of the total seats available to be
+    // considered large enough to fall into this category is determined at the
+    // discretion of the producer.
+    MANY_SEATS_AVAILABLE = 1;
+
+    // The vehicle or carriage has a relatively small number of seats available.
+    // The amount of free seats out of the total seats available to be
+    // considered small enough to fall into this category is determined at the
+    // discretion of the feed producer.
+    FEW_SEATS_AVAILABLE = 2;
+
+    // The vehicle or carriage can currently accommodate only standing passengers.
+    STANDING_ROOM_ONLY = 3;
+
+    // The vehicle or carriage can currently accommodate only standing passengers
+    // and has limited space for them.
+    CRUSHED_STANDING_ROOM_ONLY = 4;
+
+    // The vehicle or carriage is considered full by most measures, but may still be
+    // allowing passengers to board.
+    FULL = 5;
+
+    // The vehicle or carriage is not accepting passengers, but usually accepts passengers for boarding.
+    NOT_ACCEPTING_PASSENGERS = 6;
+
+    // The vehicle or carriage doesn't have any occupancy data available at that time.
+    NO_DATA_AVAILABLE = 7;
+
+    // The vehicle or carriage is not boardable and never accepts passengers.
+    // Useful for special vehicles or carriages (engine, maintenance carriage, etc…).
+    NOT_BOARDABLE = 8;
+
+  }
+  // If multi_carriage_status is populated with per-carriage OccupancyStatus,
+  // then this field should describe the entire vehicle with all carriages accepting passengers considered.
+  optional OccupancyStatus occupancy_status = 9;
+
+  // A percentage value indicating the degree of passenger occupancy in the vehicle.
+  // The values are represented as an integer without decimals. 0 means 0% and 100 means 100%.
+  // The value 100 should represent the total maximum occupancy the vehicle was designed for,
+  // including both seated and standing capacity, and current operating regulations allow.
+  // The value may exceed 100 if there are more passengers than the maximum designed capacity.
+  // The precision of occupancy_percentage should be low enough that individual passengers cannot be tracked boarding or alighting the vehicle.
+  // If multi_carriage_status is populated with per-carriage occupancy_percentage, 
+  // then this field should describe the entire vehicle with all carriages accepting passengers considered.
+  // This field is still experimental, and subject to change. It may be formally adopted in the future.
+  optional uint32 occupancy_percentage = 10;
+
+  // Carriage specific details, used for vehicles composed of several carriages
+  // This message/field is still experimental, and subject to change. It may be formally adopted in the future.
+  message CarriageDetails {
+
+    // Identification of the carriage. Should be unique per vehicle.
+    optional string id = 1;
+
+    // User visible label that may be shown to the passenger to help identify
+    // the carriage. Example: "7712", "Car ABC-32", etc...
+    // This message/field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional string label = 2;
+
+    // Occupancy status for this given carriage, in this vehicle
+    // This message/field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional OccupancyStatus occupancy_status = 3 [default = NO_DATA_AVAILABLE];
+
+    // Occupancy percentage for this given carriage, in this vehicle.
+    // Follows the same rules as "VehiclePosition.occupancy_percentage"
+    // -1 in case data is not available for this given carriage (as protobuf defaults to 0 otherwise)
+    // This message/field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional int32 occupancy_percentage = 4 [default = -1];
+
+    // Identifies the order of this carriage with respect to the other
+    // carriages in the vehicle's list of CarriageDetails.
+    // The first carriage in the direction of travel must have a value of 1.
+    // The second value corresponds to the second carriage in the direction
+    // of travel and must have a value of 2, and so forth.
+    // For example, the first carriage in the direction of travel has a value of 1.
+    // If the second carriage in the direction of travel has a value of 3,
+    // consumers will discard data for all carriages (i.e., the multi_carriage_details field).
+    // Carriages without data must be represented with a valid carriage_sequence number and the fields 
+    // without data should be omitted (alternately, those fields could also be included and set to the "no data" values).
+    // This message/field is still experimental, and subject to change. It may be formally adopted in the future.
+    optional uint32 carriage_sequence = 5;
+
+    // The extensions namespace allows 3rd-party developers to extend the
+    // GTFS Realtime Specification in order to add and evaluate new features and
+    // modifications to the spec.
+    extensions 1000 to 1999;
+
+    // The following extension IDs are reserved for private use by any organization.
+    extensions 9000 to 9999;
+  }
+
+  // Details of the multiple carriages of this given vehicle.
+  // The first occurrence represents the first carriage of the vehicle, 
+  // given the current direction of travel. 
+  // The number of occurrences of the multi_carriage_details 
+  // field represents the number of carriages of the vehicle.
+  // It also includes non boardable carriages, 
+  // like engines, maintenance carriages, etc… as they provide valuable 
+  // information to passengers about where to stand on a platform.
+  // This message/field is still experimental, and subject to change. It may be formally adopted in the future.
+  repeated CarriageDetails multi_carriage_details = 11;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// An alert, indicating some sort of incident in the public transit network.
+message Alert {
+  // Time when the alert should be shown to the user. If missing, the
+  // alert will be shown as long as it appears in the feed.
+  // If multiple ranges are given, the alert will be shown during all of them.
+  repeated TimeRange active_period = 1;
+
+  // Entities whose users we should notify of this alert.
+  repeated EntitySelector informed_entity = 5;
+
+  // Cause of this alert.
+  enum Cause {
+    UNKNOWN_CAUSE = 1;
+    OTHER_CAUSE = 2;        // Not machine-representable.
+    TECHNICAL_PROBLEM = 3;
+    STRIKE = 4;             // Public transit agency employees stopped working.
+    DEMONSTRATION = 5;      // People are blocking the streets.
+    ACCIDENT = 6;
+    HOLIDAY = 7;
+    WEATHER = 8;
+    MAINTENANCE = 9;
+    CONSTRUCTION = 10;
+    POLICE_ACTIVITY = 11;
+    MEDICAL_EMERGENCY = 12;
+  }
+  optional Cause cause = 6 [default = UNKNOWN_CAUSE];
+
+  // What is the effect of this problem on the affected entity.
+  enum Effect {
+    NO_SERVICE = 1;
+    REDUCED_SERVICE = 2;
+
+    // We don't care about INsignificant delays: they are hard to detect, have
+    // little impact on the user, and would clutter the results as they are too
+    // frequent.
+    SIGNIFICANT_DELAYS = 3;
+
+    DETOUR = 4;
+    ADDITIONAL_SERVICE = 5;
+    MODIFIED_SERVICE = 6;
+    OTHER_EFFECT = 7;
+    UNKNOWN_EFFECT = 8;
+    STOP_MOVED = 9;
+    NO_EFFECT = 10;
+    ACCESSIBILITY_ISSUE = 11;
+  }
+  optional Effect effect = 7 [default = UNKNOWN_EFFECT];
+
+  // The URL which provides additional information about the alert.
+  optional TranslatedString url = 8;
+
+  // Alert header. Contains a short summary of the alert text as plain-text.
+  optional TranslatedString header_text = 10;
+
+  // Full description for the alert as plain-text. The information in the
+  // description should add to the information of the header.
+  optional TranslatedString description_text = 11;
+
+  // Text for alert header to be used in text-to-speech implementations. This field is the text-to-speech version of header_text.
+  optional TranslatedString tts_header_text = 12;
+
+  // Text for full description for the alert to be used in text-to-speech implementations. This field is the text-to-speech version of description_text.
+  optional TranslatedString tts_description_text = 13;
+
+  // Severity of this alert.
+  enum SeverityLevel {
+	UNKNOWN_SEVERITY = 1;
+	INFO = 2;
+	WARNING = 3;
+	SEVERE = 4;
+  }
+
+  optional SeverityLevel severity_level = 14 [default = UNKNOWN_SEVERITY];
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features
+  // and modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+//
+// Low level data structures used above.
+//
+
+// A time interval. The interval is considered active at time 't' if 't' is
+// greater than or equal to the start time and less than the end time.
+message TimeRange {
+  // Start time, in POSIX time (i.e., number of seconds since January 1st 1970
+  // 00:00:00 UTC).
+  // If missing, the interval starts at minus infinity.
+  optional uint64 start = 1;
+
+  // End time, in POSIX time (i.e., number of seconds since January 1st 1970
+  // 00:00:00 UTC).
+  // If missing, the interval ends at plus infinity.
+  optional uint64 end = 2;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// A position.
+message Position {
+  // Degrees North, in the WGS-84 coordinate system.
+  required float latitude = 1;
+
+  // Degrees East, in the WGS-84 coordinate system.
+  required float longitude = 2;
+
+  // Bearing, in degrees, clockwise from North, i.e., 0 is North and 90 is East.
+  // This can be the compass bearing, or the direction towards the next stop
+  // or intermediate location.
+  // This should not be direction deduced from the sequence of previous
+  // positions, which can be computed from previous data.
+  optional float bearing = 3;
+
+  // Odometer value, in meters.
+  optional double odometer = 4;
+  // Momentary speed measured by the vehicle, in meters per second.
+  optional float speed = 5;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// A descriptor that identifies an instance of a GTFS trip, or all instances of
+// a trip along a route.
+// - To specify a single trip instance, the trip_id (and if necessary,
+//   start_time) is set. If route_id is also set, then it should be same as one
+//   that the given trip corresponds to.
+// - To specify all the trips along a given route, only the route_id should be
+//   set. Note that if the trip_id is not known, then stop sequence ids in
+//   TripUpdate are not sufficient, and stop_ids must be provided as well. In
+//   addition, absolute arrival/departure times must be provided.
+message TripDescriptor {
+  // The trip_id from the GTFS feed that this selector refers to.
+  // For non frequency-based trips, this field is enough to uniquely identify
+  // the trip. For frequency-based trip, start_time and start_date might also be
+  // necessary. When schedule_relationship is DUPLICATED within a TripUpdate, the trip_id identifies the trip from
+  // static GTFS to be duplicated. When schedule_relationship is DUPLICATED within a VehiclePosition, the trip_id
+  // identifies the new duplicate trip and must contain the value for the corresponding TripUpdate.TripProperties.trip_id.
+  optional string trip_id = 1;
+
+  // The route_id from the GTFS that this selector refers to.
+  optional string route_id = 5;
+
+  // The direction_id from the GTFS feed trips.txt file, indicating the
+  // direction of travel for trips this selector refers to.
+  optional uint32 direction_id = 6;
+
+  // The initially scheduled start time of this trip instance.
+  // When the trip_id corresponds to a non-frequency-based trip, this field
+  // should either be omitted or be equal to the value in the GTFS feed. When
+  // the trip_id correponds to a frequency-based trip, the start_time must be
+  // specified for trip updates and vehicle positions. If the trip corresponds
+  // to exact_times=1 GTFS record, then start_time must be some multiple
+  // (including zero) of headway_secs later than frequencies.txt start_time for
+  // the corresponding time period. If the trip corresponds to exact_times=0,
+  // then its start_time may be arbitrary, and is initially expected to be the
+  // first departure of the trip. Once established, the start_time of this
+  // frequency-based trip should be considered immutable, even if the first
+  // departure time changes -- that time change may instead be reflected in a
+  // StopTimeUpdate.
+  // Format and semantics of the field is same as that of
+  // GTFS/frequencies.txt/start_time, e.g., 11:15:35 or 25:15:35.
+  optional string start_time = 2;
+  // The scheduled start date of this trip instance.
+  // Must be provided to disambiguate trips that are so late as to collide with
+  // a scheduled trip on a next day. For example, for a train that departs 8:00
+  // and 20:00 every day, and is 12 hours late, there would be two distinct
+  // trips on the same time.
+  // This field can be provided but is not mandatory for schedules in which such
+  // collisions are impossible - for example, a service running on hourly
+  // schedule where a vehicle that is one hour late is not considered to be
+  // related to schedule anymore.
+  // In YYYYMMDD format.
+  optional string start_date = 3;
+
+  // The relation between this trip and the static schedule. If a trip is done
+  // in accordance with temporary schedule, not reflected in GTFS, then it
+  // shouldn't be marked as SCHEDULED, but likely as ADDED.
+  enum ScheduleRelationship {
+    // Trip that is running in accordance with its GTFS schedule, or is close
+    // enough to the scheduled trip to be associated with it.
+    SCHEDULED = 0;
+
+    // An extra trip that was added in addition to a running schedule, for
+    // example, to replace a broken vehicle or to respond to sudden passenger
+    // load.
+    // NOTE: Currently, behavior is unspecified for feeds that use this mode. There are discussions on the GTFS GitHub
+    // [(1)](https://github.com/google/transit/issues/106) [(2)](https://github.com/google/transit/pull/221)
+    // [(3)](https://github.com/google/transit/pull/219) around fully specifying or deprecating ADDED trips and the
+    // documentation will be updated when those discussions are finalized.
+    ADDED = 1;
+
+    // A trip that is running with no schedule associated to it (GTFS frequencies.txt exact_times=0).
+    // Trips with ScheduleRelationship=UNSCHEDULED must also set all StopTimeUpdates.ScheduleRelationship=UNSCHEDULED.
+    UNSCHEDULED = 2;
+
+    // A trip that existed in the schedule but was removed.
+    CANCELED = 3;
+
+    // Should not be used - for backwards-compatibility only.
+    REPLACEMENT = 5 [deprecated=true];
+
+    // An extra trip that was added in addition to a running schedule, for example, to replace a broken vehicle or to
+    // respond to sudden passenger load. Used with TripUpdate.TripProperties.trip_id, TripUpdate.TripProperties.start_date,
+    // and TripUpdate.TripProperties.start_time to copy an existing trip from static GTFS but start at a different service
+    // date and/or time. Duplicating a trip is allowed if the service related to the original trip in (CSV) GTFS
+    // (in calendar.txt or calendar_dates.txt) is operating within the next 30 days. The trip to be duplicated is
+    // identified via TripUpdate.TripDescriptor.trip_id. This enumeration does not modify the existing trip referenced by
+    // TripUpdate.TripDescriptor.trip_id - if a producer wants to cancel the original trip, it must publish a separate
+    // TripUpdate with the value of CANCELED. Trips defined in GTFS frequencies.txt with exact_times that is empty or
+    // equal to 0 cannot be duplicated. The VehiclePosition.TripDescriptor.trip_id for the new trip must contain
+    // the matching value from TripUpdate.TripProperties.trip_id and VehiclePosition.TripDescriptor.ScheduleRelationship
+    // must also be set to DUPLICATED.
+    // Existing producers and consumers that were using the ADDED enumeration to represent duplicated trips must follow
+    // the migration guide (https://github.com/google/transit/tree/master/gtfs-realtime/spec/en/examples/migration-duplicated.md)
+    // to transition to the DUPLICATED enumeration.
+    // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+    DUPLICATED = 6;
+  }
+  optional ScheduleRelationship schedule_relationship = 4;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// Identification information for the vehicle performing the trip.
+message VehicleDescriptor {
+  // Internal system identification of the vehicle. Should be unique per
+  // vehicle, and can be used for tracking the vehicle as it proceeds through
+  // the system.
+  optional string id = 1;
+
+  // User visible label, i.e., something that must be shown to the passenger to
+  // help identify the correct vehicle.
+  optional string label = 2;
+
+  // The license plate of the vehicle.
+  optional string license_plate = 3;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// A selector for an entity in a GTFS feed.
+message EntitySelector {
+  // The values of the fields should correspond to the appropriate fields in the
+  // GTFS feed.
+  // At least one specifier must be given. If several are given, then the
+  // matching has to apply to all the given specifiers.
+  optional string agency_id = 1;
+  optional string route_id = 2;
+  // corresponds to route_type in GTFS.
+  optional int32 route_type = 3;
+  optional TripDescriptor trip = 4;
+  optional string stop_id = 5;
+  // Corresponds to trip direction_id in GTFS trips.txt. If provided the
+  // route_id must also be provided.
+  optional uint32 direction_id = 6;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+// An internationalized message containing per-language versions of a snippet of
+// text or a URL.
+// One of the strings from a message will be picked up. The resolution proceeds
+// as follows:
+// 1. If the UI language matches the language code of a translation,
+//    the first matching translation is picked.
+// 2. If a default UI language (e.g., English) matches the language code of a
+//    translation, the first matching translation is picked.
+// 3. If some translation has an unspecified language code, that translation is
+//    picked.
+message TranslatedString {
+  message Translation {
+    // A UTF-8 string containing the message.
+    required string text = 1;
+    // BCP-47 language code. Can be omitted if the language is unknown or if
+    // no i18n is done at all for the feed. At most one translation is
+    // allowed to have an unspecified language tag.
+    optional string language = 2;
+
+    // The extensions namespace allows 3rd-party developers to extend the
+    // GTFS Realtime Specification in order to add and evaluate new features and
+    // modifications to the spec.
+    extensions 1000 to 1999;
+
+    // The following extension IDs are reserved for private use by any organization.
+    extensions 9000 to 9999;
+  }
+  // At least one translation must be provided.
+  repeated Translation translation = 1;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}
+
+
+// Describes the physical path that a vehicle takes when it's not part of the (CSV) GTFS,
+// such as for a detour. Shapes belong to Trips, and consist of a sequence of shape points.
+// Tracing the points in order provides the path of the vehicle.  Shapes do not need to intercept
+// the location of Stops exactly, but all Stops on a trip should lie within a small distance of
+// the shape for that trip, i.e. close to straight line segments connecting the shape points
+// NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future.
+message Shape {
+  // Identifier of the shape. Must be different than any shape_id defined in the (CSV) GTFS.
+  // This field is required as per reference.md, but needs to be specified here optional because "Required is Forever"
+  // See https://developers.google.com/protocol-buffers/docs/proto#specifying_field_rules
+  // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+  optional string shape_id = 1;
+  
+  // Encoded polyline representation of the shape. This polyline must contain at least two points.
+  // For more information about encoded polylines, see https://developers.google.com/maps/documentation/utilities/polylinealgorithm
+  // This field is required as per reference.md, but needs to be specified here optional because "Required is Forever"
+  // See https://developers.google.com/protocol-buffers/docs/proto#specifying_field_rules
+  // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future.
+  optional string encoded_polyline = 2;
+
+  // The extensions namespace allows 3rd-party developers to extend the
+  // GTFS Realtime Specification in order to add and evaluate new features and
+  // modifications to the spec.
+  extensions 1000 to 1999;
+
+  // The following extension IDs are reserved for private use by any organization.
+  extensions 9000 to 9999;
+}

+ 1 - 0
html/css/ol.css

@@ -0,0 +1 @@
+v6.6.1-dist/ol.css

+ 1 - 0
html/css/ol.css.map

@@ -0,0 +1 @@
+v6.6.1-dist/ol.css.map

File diff suppressed because it is too large
+ 2 - 0
html/css/v6.6.1-dist/ol.css


File diff suppressed because it is too large
+ 1 - 0
html/css/v6.6.1-dist/ol.css.map


BIN
html/data/bus_gw.png


BIN
html/data/bus_gw_0.png


BIN
html/data/bus_gw_135.png


BIN
html/data/bus_gw_180.png


BIN
html/data/bus_gw_225.png


BIN
html/data/bus_gw_270.png


BIN
html/data/bus_gw_315.png


BIN
html/data/bus_gw_45.png


BIN
html/data/bus_gw_90.png


BIN
html/data/bus_gw_sq.png


BIN
html/data/bus_gw_sq_inv.png


+ 1 - 0
html/data/icon.png

@@ -0,0 +1 @@
+bus_gw_sq.png

BIN
html/data/logo_v0_s.png


+ 1 - 0
html/favicon.ico

@@ -0,0 +1 @@
+data/logo_v0_s.png

+ 22 - 0
html/index.html

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
+    <meta content="utf-8" http-equiv="encoding">
+
+    <title>RideLogic AVLS</title>
+    <link rel="stylesheet" href="css/ol.css" type="text/css">
+    <script src="js/jquery.js"></script>
+    <script src="js/ol.js"></script>
+    <style>
+      .map {
+        width: 100%;
+        height:500px;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="map" class="map"><div id="popup"></div></div>
+    <script src="js/RideLogicAVLS.js"></script>
+  </body>
+</html>

+ 162 - 0
html/js/RideLogicAVLS.js

@@ -0,0 +1,162 @@
+
+
+
+
+
+var Feature = ol.Feature;
+var Map = ol.Map;
+var Overlay = ol.Overlay;
+var Point = ol.geom.Point;
+var TileJSON = ol.source.TileJSON;
+var VectorSource = ol.source.Vector;
+var View = ol.View;
+var Icon = ol.style.Icon;
+var Style = ol.style.Style;
+var TileLayer = ol.layer.Tile;
+var VectorLayer = ol.layer.Vector;
+var OSM = ol.source.OSM;
+var fromLonLat =  ol.proj.fromLonLat;
+
+var defaultLonLat = [ -76.5019, 42.4440];
+var defaultWebMerc = fromLonLat(defaultLonLat);
+
+
+function _rnd(a,b) {
+  a = ((typeof a == "undefined") ? 1.0 : a);
+  if (typeof b === "undefined") {
+    return Math.random()*a;
+  }
+  return Math.random()*(b-a) + a;
+}
+
+//var vectorSource = new VectorSource({ features: [iconFeature], });
+var vectorSource = new VectorSource();
+
+var _icon = [];
+
+
+function example_change_pos() {
+
+  var w = 1/16.0;
+
+  let lonlat = [
+    defaultLonLat[0] + _rnd(-w,w),
+    defaultLonLat[1] + _rnd(-w,w)];
+  let merc = fromLonLat(lonlat);
+
+
+  _icon[0].feature.getGeometry().setCoordinates(merc);
+  vectorLayer.getSource().changed();
+}
+
+function example_change_opacity(p) {
+  p = ((typeof p === "undefined") ? 0.0 : p);
+  _icon[0].style.getImage().setOpacity(p);
+  vectorLayer.getSource().changed();
+}
+
+// icon can't change image src dynamically,
+// so have to replace.
+// See https://stackoverflow.com/questions/57341190/how-can-i-change-icon-source-dynamically
+//
+function example_change_image() {
+  var _nuimg = new Icon({
+      anchor: [0.5, 46],
+      anchorXUnits: 'fraction',
+      anchorYUnits: 'pixels',
+      src: 'data/bus_gw_90.png',
+    });
+  _icon[0].style.setImage(_nuimg);
+  vectorLayer.getSource().changed();
+}
+
+for (var ii=0; ii<10; ii++) {
+
+  var w = 1/32.0;
+  let lonlat = [
+    defaultLonLat[0] + _rnd(-w,w),
+    defaultLonLat[1] + _rnd(-w,w)];
+  let merc = fromLonLat(lonlat);
+
+  var iconFeature = new Feature({
+    //geometry: new Point([10, 20]),
+    geometry: new Point([merc[0], merc[1]]),
+    name: 'Null Island',
+    population: 4000,
+    rainfall: 500,
+  });
+
+  var iconStyle = new Style({
+    image: new Icon({
+      anchor: [0.5, 46],
+      anchorXUnits: 'fraction',
+      anchorYUnits: 'pixels',
+      src: 'data/icon.png',
+    }),
+  });
+
+  _icon.push({ "style": iconStyle, "feature": iconFeature });
+  iconFeature.setStyle(iconStyle);
+  vectorSource.addFeature(iconFeature);
+
+}
+
+const vectorLayer = new VectorLayer({
+  source: vectorSource,
+});
+
+const rasterLayer = new TileLayer({
+  //source: ol.source.OSM()
+  source: new ol.source.OSM(),
+});
+
+const map = new Map({
+  layers: [rasterLayer, vectorLayer],
+  target: document.getElementById('map'),
+  view: new View({
+    center: defaultWebMerc,
+    zoom: 13,
+  }),
+});
+
+const element = document.getElementById('popup');
+
+const popup = new Overlay({
+  element: element,
+  positioning: 'bottom-center',
+  stopEvent: false,
+});
+map.addOverlay(popup);
+
+// display popup on click
+map.on('click', function (evt) {
+  const feature = map.forEachFeatureAtPixel(evt.pixel, function (feature) {
+    return feature;
+  });
+});
+
+// change mouse cursor when over marker
+map.on('pointermove', function (e) {
+  const pixel = map.getEventPixel(e.originalEvent);
+  const hit = map.hasFeatureAtPixel(pixel);
+  map.getTarget().style.cursor = hit ? 'pointer' : '';
+});
+// Close the popup when the map is moved
+map.on('movestart', function () {
+  //$(element).popover('dispose');
+});
+
+map.on("postrender", function(event) {
+  //console.log("bang...");
+});
+
+
+//----
+//
+
+setInterval( function() {
+  //console.log("bang");
+  //map.render();
+}, 1000);
+
+

File diff suppressed because it is too large
+ 2 - 0
html/js/jquery-3.5.1.min.js


+ 1 - 0
html/js/jquery.js

@@ -0,0 +1 @@
+jquery-3.5.1.min.js

+ 3 - 0
html/js/ol-polyfill.min.js

@@ -0,0 +1,3 @@
+/* Disable minification (remove `.min` from URL path) for more info */
+
+(function(undefined) {}).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});

+ 1 - 0
html/js/ol.js

@@ -0,0 +1 @@
+v6.6.1-dist/ol.js

+ 3 - 0
html/js/ol.js.LICENSE.txt

@@ -0,0 +1,3 @@
+/*! https://mths.be/punycode v1.3.2 by @mathias */
+
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */

+ 1 - 0
html/js/ol.js.map

@@ -0,0 +1 @@
+v6.6.1-dist/ol.js.map

File diff suppressed because it is too large
+ 3 - 0
html/js/v6.6.1-dist/ol.js


File diff suppressed because it is too large
+ 1 - 0
html/js/v6.6.1-dist/ol.js.map