diff --git a/.gitignore b/.gitignore index 4bbaf5f..136e8af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ node_modules subway.zip .env* +.env +downloads +.vscode +dynamodb_local diff --git a/README.md b/README.md index e68c689..385514e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [NYC Subway](http://alexa.amazon.com/spa/index.html#skills/dp/B01MR1N9YH) is an Alexa Custom Skill that gives you an update on subway statuses. -![](nyc-subway-skill.png) +![](assets/nyc-subway-skill.png) This repository contains code for the skill's lambda handler. diff --git a/logo-108.png b/assets/logo-108.png similarity index 100% rename from logo-108.png rename to assets/logo-108.png diff --git a/logo-512.png b/assets/logo-512.png similarity index 100% rename from logo-512.png rename to assets/logo-512.png diff --git a/assets/mta/Stations.csv b/assets/mta/Stations.csv new file mode 100644 index 0000000..3556cd9 --- /dev/null +++ b/assets/mta/Stations.csv @@ -0,0 +1,494 @@ +Station ID,Complex ID,GTFS Stop ID,Division,Line,Stop Name,Borough,Daytime Routes,Structure,GTFS Latitude,GTFS Longitude +001,001,R01,BMT,Astoria,Astoria - Ditmars Blvd,Q,N W,Elevated,40.775036,-73.912034 +002,002,R03,BMT,Astoria,Astoria Blvd,Q,N W,Elevated,40.770258,-73.917843 +003,003,R04,BMT,Astoria,30 Av,Q,N W,Elevated,40.766779,-73.921479 +004,004,R05,BMT,Astoria,Broadway,Q,N W,Elevated,40.76182,-73.925508 +005,005,R06,BMT,Astoria,36 Av,Q,N W,Elevated,40.756804,-73.929575 +006,006,R08,BMT,Astoria,39 Av,Q,N W,Elevated,40.752882,-73.932755 +007,613,R11,BMT,Astoria,Lexington Av/59 St,M,N W R,Subway,40.76266,-73.967258 +008,008,R13,BMT,Astoria,5 Av/59 St,M,N W R,Subway,40.764811,-73.973347 +009,009,R14,BMT,Broadway - Brighton,57 St - 7 Av,M,N Q R W,Subway,40.764664,-73.980658 +010,010,R15,BMT,Broadway - Brighton,49 St,M,N R W,Subway,40.759901,-73.984139 +011,611,R16,BMT,Broadway - Brighton,Times Sq - 42 St,M,N Q R W,Subway,40.754672,-73.986754 +012,607,R17,BMT,Broadway - Brighton,34 St - Herald Sq,M,N Q R W,Subway,40.749567,-73.98795 +013,013,R18,BMT,Broadway - Brighton,28 St,M,R W,Subway,40.745494,-73.988691 +014,014,R19,BMT,Broadway - Brighton,23 St,M,R W,Subway,40.741303,-73.989344 +015,602,R20,BMT,Broadway - Brighton,14 St - Union Sq,M,N Q R W,Subway,40.735736,-73.990568 +016,016,R21,BMT,Broadway - Brighton,8 St - NYU,M,R W,Subway,40.730328,-73.992629 +017,017,R22,BMT,Broadway - Brighton,Prince St,M,R W,Subway,40.724329,-73.997702 +018,623,R23,BMT,Broadway,Canal St,M,R W,Subway,40.719527,-74.001775 +019,623,Q01,BMT,Manhattan Bridge,Canal St,M,N Q,Subway,40.718383,-74.00046 +020,020,R24,BMT,Broadway,City Hall,M,R W,Subway,40.713282,-74.006978 +021,021,R25,BMT,Broadway,Cortlandt St,M,R W,Subway,40.710668,-74.011029 +022,022,R26,BMT,Broadway,Rector St,M,R W,Subway,40.70722,-74.013342 +023,635,R27,BMT,Broadway,Whitehall St,M,R W,Subway,40.703087,-74.012994 +024,620,R28,BMT,Broadway,Court St,Bk,R,Subway,40.6941,-73.991777 +025,636,R29,BMT,Broadway,Jay St - MetroTech,Bk,R,Subway,40.69218,-73.985942 +026,026,R30,BMT,Broadway - Brighton,DeKalb Av,Bk,B Q R,Subway,40.690635,-73.981824 +027,617,R31,BMT,4th Av,Atlantic Av - Barclays Ctr,Bk,D N R,Subway,40.683666,-73.97881 +028,028,R32,BMT,4th Av,Union St,Bk,R,Subway,40.677316,-73.98311 +029,608,R33,BMT,4th Av,9 St,Bk,R,Subway,40.670847,-73.988302 +030,030,R34,BMT,4th Av,Prospect Av,Bk,R,Subway,40.665414,-73.992872 +031,031,R35,BMT,4th Av,25 St,Bk,R,Subway,40.660397,-73.998091 +032,032,R36,BMT,4th Av,36 St,Bk,D N R,Subway,40.655144,-74.003549 +033,033,R39,BMT,4th Av,45 St,Bk,R,Subway,40.648939,-74.010006 +034,034,R40,BMT,4th Av,53 St,Bk,R,Subway,40.645069,-74.014034 +035,035,R41,BMT,4th Av,59 St,Bk,N R,Subway,40.641362,-74.017881 +036,036,R42,BMT,4th Av,Bay Ridge Av,Bk,R,Subway,40.634967,-74.023377 +037,037,R43,BMT,4th Av,77 St,Bk,R,Subway,40.629742,-74.02551 +038,038,R44,BMT,4th Av,86 St,Bk,R,Subway,40.622687,-74.028398 +039,039,R45,BMT,4th Av,Bay Ridge - 95 St,Bk,R,Subway,40.616622,-74.030876 +040,617,D24,BMT,Broadway - Brighton,Atlantic Av - Barclays Ctr,Bk,B Q,Subway,40.68446,-73.97689 +041,041,D25,BMT,Broadway - Brighton,7 Av,Bk,B Q,Subway,40.67705,-73.972367 +042,042,D26,BMT,Broadway - Brighton,Prospect Park,Bk,B Q,Open Cut,40.661614,-73.962246 +043,043,D27,BMT,Broadway - Brighton,Parkside Av,Bk,B Q,Open Cut,40.655292,-73.961495 +044,044,D28,BMT,Broadway - Brighton,Church Av,Bk,B Q,Open Cut,40.650527,-73.962982 +045,045,D29,BMT,Broadway - Brighton,Beverley Rd,Bk,B Q,Open Cut,40.644031,-73.964492 +046,046,D30,BMT,Broadway - Brighton,Cortelyou Rd,Bk,B Q,Open Cut,40.640927,-73.963891 +047,047,D31,BMT,Broadway - Brighton,Newkirk Plaza,Bk,B Q,Open Cut,40.635082,-73.962793 +048,048,D32,BMT,Broadway - Brighton,Avenue H,Bk,B Q,Open Cut,40.62927,-73.961639 +049,049,D33,BMT,Broadway - Brighton,Avenue J,Bk,B Q,Open Cut,40.625039,-73.960803 +050,050,D34,BMT,Broadway - Brighton,Avenue M,Bk,B Q,Open Cut,40.617618,-73.959399 +051,051,D35,BMT,Broadway - Brighton,Kings Hwy,Bk,B Q,Open Cut,40.60867,-73.957734 +052,052,D37,BMT,Broadway - Brighton,Avenue U,Bk,B Q,Open Cut,40.5993,-73.955929 +053,053,D38,BMT,Broadway - Brighton,Neck Rd,Bk,B Q,Open Cut,40.595246,-73.955161 +054,054,D39,BMT,Broadway - Brighton,Sheepshead Bay,Bk,B Q,Open Cut,40.586896,-73.954155 +055,055,D40,BMT,Broadway - Brighton,Brighton Beach,Bk,B Q,Elevated,40.577621,-73.961376 +056,056,D41,BMT,Broadway - Brighton,Ocean Pkwy,Bk,Q,Elevated,40.576312,-73.968501 +057,057,D42,BMT,Broadway - Brighton,W 8 St - NY Aquarium,Bk,F Q,Elevated,40.576127,-73.975939 +058,058,D43,BMT,Sea Beach / West End / Culver / Brighton,Coney Island - Stillwell Av,Bk,D F N Q,Viaduct,40.577422,-73.981233 +059,059,B12,BMT,West End,9 Av,Bk,D,Open Cut,40.646292,-73.994324 +060,060,B13,BMT,West End,Fort Hamilton Pkwy,Bk,D,Elevated,40.640914,-73.994304 +061,061,B14,BMT,West End,50 St,Bk,D,Elevated,40.63626,-73.994791 +062,062,B15,BMT,West End,55 St,Bk,D,Elevated,40.631435,-73.995476 +063,615,B16,BMT,West End,62 St,Bk,D,Elevated,40.626472,-73.996895 +064,064,B17,BMT,West End,71 St,Bk,D,Elevated,40.619589,-73.998864 +065,065,B18,BMT,West End,79 St,Bk,D,Elevated,40.613501,-74.00061 +066,066,B19,BMT,West End,18 Av,Bk,D,Elevated,40.607954,-74.001736 +067,067,B20,BMT,West End,20 Av,Bk,D,Elevated,40.604556,-73.998168 +068,068,B21,BMT,West End,Bay Pkwy,Bk,D,Elevated,40.601875,-73.993728 +069,069,B22,BMT,West End,25 Av,Bk,D,Elevated,40.597704,-73.986829 +070,070,B23,BMT,West End,Bay 50 St,Bk,D,Elevated,40.588841,-73.983765 +071,071,N02,BMT,Sea Beach,8 Av,Bk,N,Open Cut,40.635064,-74.011719 +072,072,N03,BMT,Sea Beach,Fort Hamilton Pkwy,Bk,N,Open Cut,40.631386,-74.005351 +073,615,N04,BMT,Sea Beach,New Utrecht Av,Bk,N,Open Cut,40.624842,-73.996353 +074,074,N05,BMT,Sea Beach,18 Av,Bk,N,Open Cut,40.620671,-73.990414 +075,075,N06,BMT,Sea Beach,20 Av,Bk,N,Open Cut,40.61741,-73.985026 +076,076,N07,BMT,Sea Beach,Bay Pkwy,Bk,N,Open Cut,40.611815,-73.981848 +077,077,N08,BMT,Sea Beach,Kings Hwy,Bk,N,Open Cut,40.603923,-73.980353 +078,078,N09,BMT,Sea Beach,Avenue U,Bk,N,Open Cut,40.597473,-73.979137 +079,079,N10,BMT,Sea Beach,86 St,Bk,N,Open Cut,40.592721,-73.97823 +080,080,J12,BMT,Jamaica,121 St,Q,J Z,Elevated,40.700492,-73.828294 +081,081,J13,BMT,Jamaica,111 St,Q,J,Elevated,40.697418,-73.836345 +082,082,J14,BMT,Jamaica,104 St,Q,J Z,Elevated,40.695178,-73.84433 +083,083,J15,BMT,Jamaica,Woodhaven Blvd,Q,J Z,Elevated,40.693879,-73.851576 +084,084,J16,BMT,Jamaica,85 St - Forest Pkwy,Q,J,Elevated,40.692435,-73.86001 +085,085,J17,BMT,Jamaica,75 St,Q,J Z,Elevated,40.691324,-73.867139 +086,086,J19,BMT,Jamaica,Cypress Hills,Bk,J,Elevated,40.689941,-73.87255 +087,087,J20,BMT,Jamaica,Crescent St,Bk,J Z,Elevated,40.683194,-73.873785 +088,088,J21,BMT,Jamaica,Norwood Av,Bk,J Z,Elevated,40.68141,-73.880039 +089,089,J22,BMT,Jamaica,Cleveland St,Bk,J,Elevated,40.679947,-73.884639 +090,090,J23,BMT,Jamaica,Van Siclen Av,Bk,J Z,Elevated,40.678024,-73.891688 +091,091,J24,BMT,Jamaica,Alabama Av,Bk,J,Elevated,40.676992,-73.898654 +092,621,J27,BMT,Jamaica,Broadway Jct,Bk,J Z,Elevated,40.679498,-73.904512 +093,093,J28,BMT,Jamaica,Chauncey St,Bk,J Z,Elevated,40.682893,-73.910456 +094,094,J29,BMT,Jamaica,Halsey St,Bk,J,Elevated,40.68637,-73.916559 +095,095,J30,BMT,Jamaica,Gates Av,Bk,J Z,Elevated,40.68963,-73.92227 +096,096,J31,BMT,Jamaica,Kosciuszko St,Bk,J,Elevated,40.693342,-73.928814 +097,097,M11,BMT,Jamaica,Myrtle Av,Bk,J M Z,Elevated,40.697207,-73.935657 +098,098,M12,BMT,Jamaica,Flushing Av,Bk,J M,Elevated,40.70026,-73.941126 +099,099,M13,BMT,Jamaica,Lorimer St,Bk,J M,Elevated,40.703869,-73.947408 +100,100,M14,BMT,Jamaica,Hewes St,Bk,J M,Elevated,40.70687,-73.953431 +101,101,M16,BMT,Jamaica,Marcy Av,Bk,J M Z,Elevated,40.708359,-73.957757 +102,625,M18,BMT,Jamaica,Essex St,M,J M Z,Subway,40.718315,-73.987437 +103,103,M19,BMT,Jamaica,Bowery,M,J Z,Subway,40.72028,-73.993915 +104,623,M20,BMT,Jamaica,Canal St,M,J Z,Subway,40.718092,-73.999892 +105,622,M21,BMT,Jamaica,Chambers St,M,J Z,Subway,40.713243,-74.003401 +106,628,M22,BMT,Jamaica,Fulton St,M,J Z,Subway,40.710374,-74.007582 +107,107,M23,BMT,Jamaica,Broad St,M,J Z,Subway,40.706476,-74.011056 +108,108,M01,BMT,Myrtle Av,Middle Village - Metropolitan Av,Q,M,Elevated,40.711396,-73.889601 +109,109,M04,BMT,Myrtle Av,Fresh Pond Rd,Q,M,Elevated,40.706186,-73.895877 +110,110,M05,BMT,Myrtle Av,Forest Av,Q,M,Elevated,40.704423,-73.903077 +111,111,M06,BMT,Myrtle Av,Seneca Av,Q,M,Elevated,40.702762,-73.90774 +112,630,M08,BMT,Myrtle Av,Myrtle - Wyckoff Avs,Bk,M,Elevated,40.69943,-73.912385 +113,113,M09,BMT,Myrtle Av,Knickerbocker Av,Bk,M,Elevated,40.698664,-73.919711 +114,114,M10,BMT,Myrtle Av,Central Av,Bk,M,Elevated,40.697857,-73.927397 +115,618,L01,BMT,Canarsie,8 Av,M,L,Subway,40.739777,-74.002578 +116,601,L02,BMT,Canarsie,6 Av,M,L,Subway,40.737335,-73.996786 +117,602,L03,BMT,Canarsie,Union Sq - 14 St,M,L,Subway,40.734789,-73.99073 +118,118,L05,BMT,Canarsie,3 Av,M,L,Subway,40.732849,-73.986122 +119,119,L06,BMT,Canarsie,1 Av,M,L,Subway,40.730953,-73.981628 +120,120,L08,BMT,Canarsie,Bedford Av,Bk,L,Subway,40.717304,-73.956872 +121,629,L10,BMT,Canarsie,Lorimer St,Bk,L,Subway,40.714063,-73.950275 +122,122,L11,BMT,Canarsie,Graham Av,Bk,L,Subway,40.714565,-73.944053 +123,123,L12,BMT,Canarsie,Grand St,Bk,L,Subway,40.711926,-73.94067 +124,124,L13,BMT,Canarsie,Montrose Av,Bk,L,Subway,40.707739,-73.93985 +125,125,L14,BMT,Canarsie,Morgan Av,Bk,L,Subway,40.706152,-73.933147 +126,126,L15,BMT,Canarsie,Jefferson St,Bk,L,Subway,40.706607,-73.922913 +127,127,L16,BMT,Canarsie,DeKalb Av,Bk,L,Subway,40.703811,-73.918425 +128,630,L17,BMT,Canarsie,Myrtle - Wyckoff Avs,Bk,L,Subway,40.699814,-73.911586 +129,129,L19,BMT,Canarsie,Halsey St,Q,L,Subway,40.695602,-73.904084 +130,130,L20,BMT,Canarsie,Wilson Av,Bk,L,Subway,40.688764,-73.904046 +131,131,L21,BMT,Canarsie,Bushwick Av - Aberdeen St,Bk,L,Subway,40.682829,-73.905249 +132,621,L22,BMT,Canarsie,Broadway Jct,Bk,L,Elevated,40.678856,-73.90324 +133,133,L24,BMT,Canarsie,Atlantic Av,Bk,L,Elevated,40.675345,-73.903097 +134,134,L25,BMT,Canarsie,Sutter Av,Bk,L,Elevated,40.669367,-73.901975 +135,135,L26,BMT,Canarsie,Livonia Av,Bk,L,Elevated,40.664038,-73.900571 +136,136,L27,BMT,Canarsie,New Lots Av,Bk,L,Elevated,40.658733,-73.899232 +137,137,L28,BMT,Canarsie,E 105 St,Bk,L,At Grade,40.650573,-73.899485 +138,138,L29,BMT,Canarsie,Canarsie - Rockaway Pkwy,Bk,L,At Grade,40.646654,-73.90185 +139,627,S01,BMT,Franklin Shuttle,Franklin Av,Bk,S,Elevated,40.680596,-73.955827 +141,141,S03,BMT,Franklin Shuttle,Park Pl,Bk,S,Open Cut,40.674772,-73.957624 +142,626,S04,BMT,Franklin Shuttle,Botanic Garden,Bk,S,Open Cut,40.670343,-73.959245 +143,143,A02,IND,8th Av - Fulton St,Inwood - 207 St,M,A,Subway,40.868072,-73.919899 +144,144,A03,IND,8th Av - Fulton St,Dyckman St,M,A,Subway,40.865491,-73.927271 +145,145,A05,IND,8th Av - Fulton St,190 St,M,A,Subway,40.859022,-73.93418 +146,146,A06,IND,8th Av - Fulton St,181 St,M,A,Subway,40.851695,-73.937969 +147,147,A07,IND,8th Av - Fulton St,175 St,M,A,Subway,40.847391,-73.939704 +148,605,A09,IND,8th Av - Fulton St,168 St,M,A C,Subway,40.840719,-73.939561 +149,149,A10,IND,8th Av - Fulton St,163 St - Amsterdam Av,M,C,Subway,40.836013,-73.939892 +150,150,A11,IND,8th Av - Fulton St,155 St,M,C,Subway,40.830518,-73.941514 +151,151,A12,IND,8th Av - Fulton St,145 St,M,A B C D,Subway,40.824783,-73.944216 +152,152,A14,IND,8th Av - Fulton St,135 St,M,B C,Subway,40.817894,-73.947649 +153,153,A15,IND,8th Av - Fulton St,125 St,M,A B C D,Subway,40.811109,-73.952343 +154,154,A16,IND,8th Av - Fulton St,116 St,M,B C,Subway,40.805085,-73.954882 +155,155,A17,IND,8th Av - Fulton St,Cathedral Pkwy (110 St),M,B C,Subway,40.800603,-73.958161 +156,156,A18,IND,8th Av - Fulton St,103 St,M,B C,Subway,40.796092,-73.961454 +157,157,A19,IND,8th Av - Fulton St,96 St,M,B C,Subway,40.791642,-73.964696 +158,158,A20,IND,8th Av - Fulton St,86 St,M,B C,Subway,40.785868,-73.968916 +159,159,A21,IND,8th Av - Fulton St,81 St - Museum of Natural History,M,B C,Subway,40.781433,-73.972143 +160,160,A22,IND,8th Av - Fulton St,72 St,M,B C,Subway,40.775594,-73.97641 +161,614,A24,IND,8th Av - Fulton St,59 St - Columbus Circle,M,A B C D,Subway,40.768296,-73.981736 +162,162,A25,IND,8th Av - Fulton St,50 St,M,C E,Subway,40.762456,-73.985984 +163,611,A27,IND,8th Av - Fulton St,42 St - Port Authority Bus Terminal,M,A C E,Subway,40.757308,-73.989735 +164,164,A28,IND,8th Av - Fulton St,34 St - Penn Station,M,A C E,Subway,40.752287,-73.993391 +165,165,A30,IND,8th Av - Fulton St,23 St,M,C E,Subway,40.745906,-73.998041 +166,618,A31,IND,8th Av - Fulton St,14 St,M,A C E,Subway,40.740893,-74.00169 +167,167,A32,IND,8th Av - Fulton St,W 4 St,M,A B C D E F M,Subway,40.732338,-74.000495 +168,168,A33,IND,8th Av - Fulton St,Spring St,M,C E,Subway,40.726227,-74.003739 +169,169,A34,IND,8th Av - Fulton St,Canal St,M,A C E,Subway,40.720824,-74.005229 +170,624,A36,IND,8th Av - Fulton St,Chambers St,M,A C,Subway,40.714111,-74.008585 +171,624,E01,IND,8th Av - Fulton St,World Trade Center,M,E,Subway,40.712582,-74.009781 +172,628,A38,IND,8th Av - Fulton St,Fulton St,M,A C,Subway,40.710197,-74.007691 +173,173,A40,IND,8th Av - Fulton St,High St,Bk,A C,Subway,40.699337,-73.990531 +174,636,A41,IND,8th Av - Fulton St,Jay St - MetroTech,Bk,A C F,Subway,40.692338,-73.987342 +175,175,A42,IND,8th Av - Fulton St,Hoyt - Schermerhorn Sts,Bk,A C G,Subway,40.688484,-73.985001 +176,176,A43,IND,8th Av - Fulton St,Lafayette Av,Bk,C,Subway,40.686113,-73.973946 +177,177,A44,IND,8th Av - Fulton St,Clinton - Washington Avs,Bk,C,Subway,40.683263,-73.965838 +178,627,A45,IND,8th Av - Fulton St,Franklin Av,Bk,C,Subway,40.68138,-73.956848 +179,179,A46,IND,8th Av - Fulton St,Nostrand Av,Bk,A C,Subway,40.680438,-73.950426 +180,180,A47,IND,8th Av - Fulton St,Kingston - Throop Avs,Bk,C,Subway,40.679921,-73.940858 +181,181,A48,IND,8th Av - Fulton St,Utica Av,Bk,A C,Subway,40.679364,-73.930729 +182,182,A49,IND,8th Av - Fulton St,Ralph Av,Bk,C,Subway,40.678822,-73.920786 +183,183,A50,IND,8th Av - Fulton St,Rockaway Av,Bk,C,Subway,40.67834,-73.911946 +184,621,A51,IND,8th Av - Fulton St,Broadway Jct,Bk,A C,Subway,40.678334,-73.905316 +185,185,A52,IND,8th Av - Fulton St,Liberty Av,Bk,C,Subway,40.674542,-73.896548 +186,186,A53,IND,8th Av - Fulton St,Van Siclen Av,Bk,C,Subway,40.67271,-73.890358 +187,187,A54,IND,8th Av - Fulton St,Shepherd Av,Bk,C,Subway,40.67413,-73.88075 +188,188,A55,IND,8th Av - Fulton St,Euclid Av,Bk,A C,Subway,40.675377,-73.872106 +189,189,A57,IND,Liberty Av,Grant Av,Bk,A,Subway,40.677044,-73.86505 +190,190,A59,IND,Liberty Av,80 St,Q,A,Elevated,40.679371,-73.858992 +191,191,A60,IND,Liberty Av,88 St,Q,A,Elevated,40.679843,-73.85147 +192,192,A61,IND,Liberty Av,Rockaway Blvd,Q,A,Elevated,40.680429,-73.843853 +193,193,A63,IND,Liberty Av,104 St,Q,A,Elevated,40.681711,-73.837683 +194,194,A64,IND,Liberty Av,111 St,Q,A,Elevated,40.684331,-73.832163 +195,195,A65,IND,Liberty Av,Ozone Park - Lefferts Blvd,Q,A,Elevated,40.685951,-73.825798 +196,196,H01,IND,Rockaway,Aqueduct Racetrack,Q,A,At Grade,40.672097,-73.835919 +197,197,H02,IND,Rockaway,Aqueduct - N Conduit Av,Q,A,At Grade,40.668234,-73.834058 +198,198,H03,IND,Rockaway,Howard Beach - JFK Airport,Q,A,At Grade,40.660476,-73.830301 +199,199,H04,IND,Rockaway,Broad Channel,Q,A S,At Grade,40.608382,-73.815925 +200,200,H12,IND,Rockaway,Beach 90 St,Q,A S,Viaduct,40.588034,-73.813641 +201,201,H13,IND,Rockaway,Beach 98 St,Q,A S,Viaduct,40.585307,-73.820558 +202,202,H14,IND,Rockaway,Beach 105 St,Q,A S,Viaduct,40.583209,-73.827559 +203,203,H15,IND,Rockaway,Rockaway Park - Beach 116 St,Q,A S,At Grade,40.580903,-73.835592 +204,204,H06,IND,Rockaway,Beach 67 St,Q,A,Viaduct,40.590927,-73.796924 +205,205,H07,IND,Rockaway,Beach 60 St,Q,A,Viaduct,40.592374,-73.788522 +206,206,H08,IND,Rockaway,Beach 44 St,Q,A,Viaduct,40.592943,-73.776013 +207,207,H09,IND,Rockaway,Beach 36 St,Q,A,Viaduct,40.595398,-73.768175 +208,208,H10,IND,Rockaway,Beach 25 St,Q,A,Viaduct,40.600066,-73.761353 +209,209,H11,IND,Rockaway,Far Rockaway - Mott Av,Q,A,Viaduct,40.603995,-73.755405 +210,210,D01,IND,Concourse,Norwood - 205 St,Bx,D,Subway,40.874811,-73.878855 +211,211,D03,IND,Concourse,Bedford Park Blvd,Bx,B D,Subway,40.873244,-73.887138 +212,212,D04,IND,Concourse,Kingsbridge Rd,Bx,B D,Subway,40.866978,-73.893509 +213,213,D05,IND,Concourse,Fordham Rd,Bx,B D,Subway,40.861296,-73.897749 +214,214,D06,IND,Concourse,182-183 Sts,Bx,B D,Subway,40.856093,-73.900741 +215,215,D07,IND,Concourse,Tremont Av,Bx,B D,Subway,40.85041,-73.905227 +216,216,D08,IND,Concourse,174-175 Sts,Bx,B D,Subway,40.8459,-73.910136 +217,217,D09,IND,Concourse,170 St,Bx,B D,Subway,40.839306,-73.9134 +218,218,D10,IND,Concourse,167 St,Bx,B D,Subway,40.833771,-73.91844 +219,604,D11,IND,Concourse,161 St - Yankee Stadium,Bx,B D,Subway,40.827905,-73.925651 +220,220,D12,IND,Concourse,155 St,M,B D,Subway,40.830135,-73.938209 +221,221,B04,IND,63rd St,21 St - Queensbridge,Q,F,Subway,40.754203,-73.942836 +222,222,B06,IND,63rd St,Roosevelt Island,M,F,Subway,40.759145,-73.95326 +223,223,B08,IND,63rd St,Lexington Av/63 St,M,F Q,Subway,40.764629,-73.966113 +224,224,B10,IND,6th Av - Culver,57 St,M,F,Subway,40.763972,-73.97745 +225,225,D15,IND,6th Av - Culver,47-50 Sts - Rockefeller Ctr,M,B D F M,Subway,40.758663,-73.981329 +226,609,D16,IND,6th Av - Culver,42 St - Bryant Pk,M,B D F M,Subway,40.754222,-73.984569 +227,607,D17,IND,6th Av - Culver,34 St - Herald Sq,M,B D F M,Subway,40.749719,-73.987823 +228,228,D18,IND,6th Av - Culver,23 St,M,F M,Subway,40.742878,-73.992821 +229,601,D19,IND,6th Av - Culver,14 St,M,F M,Subway,40.738228,-73.996209 +230,619,D21,IND,6th Av - Culver,Broadway-Lafayette St,M,B D F M,Subway,40.725297,-73.996204 +231,231,D22,IND,6th Av - Culver,Grand St,M,B D,Subway,40.718267,-73.993753 +232,232,F14,IND,6th Av - Culver,2 Av,M,F,Subway,40.723402,-73.989938 +233,625,F15,IND,6th Av - Culver,Delancey St,M,F,Subway,40.718611,-73.988114 +234,234,F16,IND,6th Av - Culver,East Broadway,M,F,Subway,40.713715,-73.990173 +235,235,F18,IND,6th Av - Culver,York St,Bk,F,Subway,40.701397,-73.986751 +236,236,F20,IND,6th Av - Culver,Bergen St,Bk,F G,Subway,40.686145,-73.990862 +237,237,F21,IND,6th Av - Culver,Carroll St,Bk,F G,Subway,40.680303,-73.995048 +238,238,F22,IND,6th Av - Culver,Smith - 9 Sts,Bk,F G,Viaduct,40.67358,-73.995959 +239,608,F23,IND,6th Av - Culver,4 Av,Bk,F G,Viaduct,40.670272,-73.989779 +240,240,F24,IND,6th Av - Culver,7 Av,Bk,F G,Subway,40.666271,-73.980305 +241,241,F25,IND,6th Av - Culver,15 St - Prospect Park,Bk,F G,Subway,40.660365,-73.979493 +242,242,F26,IND,6th Av - Culver,Fort Hamilton Pkwy,Bk,F G,Subway,40.650782,-73.975776 +243,243,F27,IND,6th Av - Culver,Church Av,Bk,F,Subway,40.644041,-73.979678 +244,244,F29,IND,6th Av - Culver,Ditmas Av,Bk,F,Elevated,40.636119,-73.978172 +245,245,F30,IND,6th Av - Culver,18 Av,Bk,F,Elevated,40.629755,-73.976971 +246,246,F31,IND,6th Av - Culver,Avenue I,Bk,F,Elevated,40.625322,-73.976127 +247,247,F32,IND,6th Av - Culver,Bay Pkwy,Bk,F,Elevated,40.620769,-73.975264 +248,248,F33,IND,6th Av - Culver,Avenue N,Bk,F,Elevated,40.61514,-73.974197 +249,249,F34,IND,6th Av - Culver,Avenue P,Bk,F,Elevated,40.608944,-73.973022 +250,250,F35,IND,6th Av - Culver,Kings Hwy,Bk,F,Elevated,40.603217,-73.972361 +251,251,F36,IND,6th Av - Culver,Avenue U,Bk,F,Elevated,40.596063,-73.973357 +252,252,F38,IND,6th Av - Culver,Avenue X,Bk,F,Elevated,40.58962,-73.97425 +253,253,F39,IND,6th Av - Culver,Neptune Av,Bk,F,Elevated,40.581011,-73.974574 +254,254,F01,IND,Queens - Archer,Jamaica - 179 St,Q,F,Subway,40.712646,-73.783817 +255,255,F02,IND,Queens - Archer,169 St,Q,F,Subway,40.71047,-73.793604 +256,256,F03,IND,Queens - Archer,Parsons Blvd,Q,F,Subway,40.707564,-73.803326 +257,257,F04,IND,Queens - Archer,Sutphin Blvd,Q,F,Subway,40.70546,-73.810708 +258,258,F05,IND,Queens - Archer,Briarwood - Van Wyck Blvd,Q,E F,Subway,40.709179,-73.820574 +259,259,F06,IND,Queens - Archer,Kew Gardens - Union Tpke,Q,E F,Subway,40.714441,-73.831008 +260,260,F07,IND,Queens - Archer,75 Av,Q,E F,Subway,40.718331,-73.837324 +261,261,G08,IND,Queens - Archer,Forest Hills - 71 Av,Q,E F M R,Subway,40.721691,-73.844521 +262,262,G09,IND,Queens - Archer,67 Av,Q,M R,Subway,40.726523,-73.852719 +263,263,G10,IND,Queens - Archer,63 Dr - Rego Park,Q,M R,Subway,40.729846,-73.861604 +264,264,G11,IND,Queens - Archer,Woodhaven Blvd,Q,M R,Subway,40.733106,-73.869229 +265,265,G12,IND,Queens - Archer,Grand Av - Newtown,Q,M R,Subway,40.737015,-73.877223 +266,266,G13,IND,Queens - Archer,Elmhurst Av,Q,M R,Subway,40.742454,-73.882017 +267,616,G14,IND,Queens - Archer,Jackson Hts - Roosevelt Av,Q,E F M R,Subway,40.746644,-73.891338 +268,268,G15,IND,Queens - Archer,65 St,Q,M R,Subway,40.749669,-73.898453 +269,269,G16,IND,Queens - Archer,Northern Blvd,Q,M R,Subway,40.752885,-73.906006 +270,270,G18,IND,Queens - Archer,46 St,Q,M R,Subway,40.756312,-73.913333 +271,271,G19,IND,Queens - Archer,Steinway St,Q,M R,Subway,40.756879,-73.92074 +272,272,G20,IND,Queens - Archer,36 St,Q,M R,Subway,40.752039,-73.928781 +273,273,G21,IND,Queens - Archer,Queens Plaza,Q,E M R,Subway,40.748973,-73.937243 +274,606,F09,IND,Queens - Archer,Court Sq,Q,E M,Subway,40.747846,-73.946 +275,612,F11,IND,Queens - Archer,Lexington Av/53 St,M,E M,Subway,40.757552,-73.969055 +276,276,F12,IND,Queens - Archer,5 Av/53 St,M,E M,Subway,40.760167,-73.975224 +277,277,D14,IND,Queens - Archer,7 Av,M,B D E,Subway,40.762862,-73.981637 +278,278,G05,IND,Queens - Archer,Jamaica Center - Parsons/Archer,Q,E J Z,Subway,40.702147,-73.801109 +279,279,G06,IND,Queens - Archer,Sutphin Blvd - Archer Av - JFK Airport,Q,E J Z,Subway,40.700486,-73.807969 +280,280,G07,IND,Queens - Archer,Jamaica - Van Wyck,Q,E,Subway,40.702566,-73.816859 +281,606,G22,IND,Crosstown,Court Sq,Q,G,Subway,40.746554,-73.943832 +282,282,G24,IND,Crosstown,21 St,Q,G,Subway,40.744065,-73.949724 +283,283,G26,IND,Crosstown,Greenpoint Av,Bk,G,Subway,40.731352,-73.954449 +284,284,G28,IND,Crosstown,Nassau Av,Bk,G,Subway,40.724635,-73.951277 +285,629,G29,IND,Crosstown,Metropolitan Av,Bk,G,Subway,40.712792,-73.951418 +286,286,G30,IND,Crosstown,Broadway,Bk,G,Subway,40.706092,-73.950308 +287,287,G31,IND,Crosstown,Flushing Av,Bk,G,Subway,40.700377,-73.950234 +288,288,G32,IND,Crosstown,Myrtle - Willoughby Avs,Bk,G,Subway,40.694568,-73.949046 +289,289,G33,IND,Crosstown,Bedford - Nostrand Avs,Bk,G,Subway,40.689627,-73.953522 +290,290,G34,IND,Crosstown,Classon Av,Bk,G,Subway,40.688873,-73.96007 +291,291,G35,IND,Crosstown,Clinton - Washington Avs,Bk,G,Subway,40.688089,-73.966839 +292,292,G36,IND,Crosstown,Fulton St,Bk,G,Subway,40.687119,-73.975375 +293,293,101,IRT,Broadway - 7Av,Van Cortlandt Park - 242 St,Bx,1,Elevated,40.889248,-73.898583 +294,294,103,IRT,Broadway - 7Av,238 St,Bx,1,Elevated,40.884667,-73.90087 +295,295,104,IRT,Broadway - 7Av,231 St,Bx,1,Elevated,40.878856,-73.904834 +296,296,106,IRT,Broadway - 7Av,Marble Hill - 225 St,M,1,Elevated,40.874561,-73.909831 +297,297,107,IRT,Broadway - 7Av,215 St,M,1,Elevated,40.869444,-73.915279 +298,298,108,IRT,Broadway - 7Av,207 St,M,1,Elevated,40.864621,-73.918822 +299,299,109,IRT,Broadway - 7Av,Dyckman St,M,1,Elevated,40.860531,-73.925536 +300,300,110,IRT,Broadway - 7Av,191 St,M,1,Subway,40.855225,-73.929412 +301,301,111,IRT,Broadway - 7Av,181 St,M,1,Subway,40.849505,-73.933596 +302,605,112,IRT,Broadway - 7Av,168 St - Washington Hts,M,1,Subway,40.840556,-73.940133 +303,303,113,IRT,Broadway - 7Av,157 St,M,1,Subway,40.834041,-73.94489 +304,304,114,IRT,Broadway - 7Av,145 St,M,1,Subway,40.826551,-73.95036 +305,305,115,IRT,Broadway - 7Av,137 St - City College,M,1,Subway,40.822008,-73.953676 +306,306,116,IRT,Broadway - 7Av,125 St,M,1,Elevated,40.815581,-73.958372 +307,307,117,IRT,Broadway - 7Av,116 St - Columbia University,M,1,Subway,40.807722,-73.96411 +308,308,118,IRT,Broadway - 7Av,Cathedral Pkwy,M,1,Subway,40.803967,-73.966847 +309,309,119,IRT,Broadway - 7Av,103 St,M,1,Subway,40.799446,-73.968379 +310,310,120,IRT,Broadway - 7Av,96 St,M,1 2 3,Subway,40.793919,-73.972323 +311,311,121,IRT,Broadway - 7Av,86 St,M,1,Subway,40.788644,-73.976218 +312,312,122,IRT,Broadway - 7Av,79 St,M,1,Subway,40.783934,-73.979917 +313,313,123,IRT,Broadway - 7Av,72 St,M,1 2 3,Subway,40.778453,-73.98197 +314,314,124,IRT,Broadway - 7Av,66 St - Lincoln Center,M,1,Subway,40.77344,-73.982209 +315,614,125,IRT,Broadway - 7Av,59 St - Columbus Circle,M,1,Subway,40.768247,-73.981929 +316,316,126,IRT,Broadway - 7Av,50 St,M,1,Subway,40.761728,-73.983849 +317,611,127,IRT,Broadway - 7Av,Times Sq - 42 St,M,1 2 3,Subway,40.75529,-73.987495 +318,318,128,IRT,Broadway - 7Av,34 St - Penn Station,M,1 2 3,Subway,40.750373,-73.991057 +319,319,129,IRT,Broadway - 7Av,28 St,M,1,Subway,40.747215,-73.993365 +320,320,130,IRT,Broadway - 7Av,23 St,M,1,Subway,40.744081,-73.995657 +321,321,131,IRT,Broadway - 7Av,18 St,M,1,Subway,40.74104,-73.997871 +322,601,132,IRT,Broadway - 7Av,14 St,M,1 2 3,Subway,40.737826,-74.000201 +323,323,133,IRT,Broadway - 7Av,Christopher St - Sheridan Sq,M,1,Subway,40.733422,-74.002906 +324,324,134,IRT,Broadway - 7Av,Houston St,M,1,Subway,40.728251,-74.005367 +325,325,135,IRT,Broadway - 7Av,Canal St,M,1,Subway,40.722854,-74.006277 +326,326,136,IRT,Broadway - 7Av,Franklin St,M,1,Subway,40.719318,-74.006886 +327,327,137,IRT,Broadway - 7Av,Chambers St,M,1 2 3,Subway,40.715478,-74.009266 +328,328,138,IRT,Broadway - 7Av,Cortlandt St,M,1,Subway,40.711835,-74.012188 +329,329,139,IRT,Broadway - 7Av,Rector St,M,1,Subway,40.707513,-74.013783 +330,635,140,IRT,South Ferry Loop,South Ferry Loop,M,1,Subway,40.701411,-74.013205 +331,624,228,IRT,Clark St,Park Pl,M,2 3,Subway,40.713051,-74.008811 +332,628,229,IRT,Clark St,Fulton St,M,2 3,Subway,40.709416,-74.006571 +333,333,230,IRT,Clark St,Wall St,M,2 3,Subway,40.706821,-74.0091 +334,334,231,IRT,Clark St,Clark St,Bk,2 3,Subway,40.697466,-73.993086 +335,620,232,IRT,Clark St,Borough Hall,Bk,2 3,Subway,40.693219,-73.989998 +336,336,233,IRT,Eastern Pky,Hoyt St,Bk,2 3,Subway,40.690545,-73.985065 +337,337,234,IRT,Eastern Pky,Nevins St,Bk,2 3 4 5,Subway,40.688246,-73.980492 +338,617,235,IRT,Eastern Pky,Atlantic Av - Barclays Ctr,Bk,2 3,Subway,40.684359,-73.977666 +339,339,236,IRT,Eastern Pky,Bergen St,Bk,2 3,Subway,40.680829,-73.975098 +340,340,237,IRT,Eastern Pky,Grand Army Plaza,Bk,2 3,Subway,40.675235,-73.971046 +341,341,238,IRT,Eastern Pky,Eastern Pkwy - Brooklyn Museum,Bk,2 3,Subway,40.671987,-73.964375 +342,626,239,IRT,Eastern Pky,Franklin Av,Bk,2 3 4 5,Subway,40.670682,-73.958131 +343,343,248,IRT,Eastern Pky,Nostrand Av,Bk,3,Subway,40.669847,-73.950466 +344,344,249,IRT,Eastern Pky,Kingston Av,Bk,3,Subway,40.669399,-73.942161 +345,345,250,IRT,Eastern Pky,Crown Hts - Utica Av,Bk,3 4,Subway,40.668897,-73.932942 +346,346,251,IRT,Eastern Pky,Sutter Av - Rutland Rd,Bk,3,Elevated,40.664717,-73.92261 +347,347,252,IRT,Eastern Pky,Saratoga Av,Bk,3,Elevated,40.661453,-73.916327 +348,348,253,IRT,Eastern Pky,Rockaway Av,Bk,3,Elevated,40.662549,-73.908946 +349,349,254,IRT,Eastern Pky,Junius St,Bk,3,Elevated,40.663515,-73.902447 +350,350,255,IRT,Eastern Pky,Pennsylvania Av,Bk,3,Elevated,40.664635,-73.894895 +351,351,256,IRT,Eastern Pky,Van Siclen Av,Bk,3,Elevated,40.665449,-73.889395 +352,352,257,IRT,Eastern Pky,New Lots Av,Bk,3,Elevated,40.666235,-73.884079 +353,353,241,IRT,Nostrand,President St,Bk,2 5,Subway,40.667883,-73.950683 +354,354,242,IRT,Nostrand,Sterling St,Bk,2 5,Subway,40.662742,-73.95085 +355,355,243,IRT,Nostrand,Winthrop St,Bk,2 5,Subway,40.656652,-73.9502 +356,356,244,IRT,Nostrand,Church Av,Bk,2 5,Subway,40.650843,-73.949575 +357,357,245,IRT,Nostrand,Beverly Rd,Bk,2 5,Subway,40.645098,-73.948959 +358,358,246,IRT,Nostrand,Newkirk Av,Bk,2 5,Subway,40.639967,-73.948411 +359,359,247,IRT,Nostrand,Flatbush Av - Brooklyn College,Bk,2 5,Subway,40.632836,-73.947642 +360,360,601,IRT,Pelham,Pelham Bay Park,Bx,6,Elevated,40.852462,-73.828121 +361,361,602,IRT,Pelham,Buhre Av,Bx,6,Elevated,40.84681,-73.832569 +362,362,603,IRT,Pelham,Middletown Rd,Bx,6,Elevated,40.843863,-73.836322 +363,363,604,IRT,Pelham,Westchester Sq - E Tremont Av,Bx,6,Elevated,40.839892,-73.842952 +364,364,606,IRT,Pelham,Zerega Av,Bx,6,Elevated,40.836488,-73.847036 +365,365,607,IRT,Pelham,Castle Hill Av,Bx,6,Elevated,40.834255,-73.851222 +366,366,608,IRT,Pelham,Parkchester,Bx,6,Elevated,40.833226,-73.860816 +367,367,609,IRT,Pelham,St Lawrence Av,Bx,6,Elevated,40.831509,-73.867618 +368,368,610,IRT,Pelham,Morrison Av- Sound View,Bx,6,Elevated,40.829521,-73.874516 +369,369,611,IRT,Pelham,Elder Av,Bx,6,Elevated,40.828584,-73.879159 +370,370,612,IRT,Pelham,Whitlock Av,Bx,6,Elevated,40.826525,-73.886283 +371,371,613,IRT,Pelham,Hunts Point Av,Bx,6,Subway,40.820948,-73.890549 +372,372,614,IRT,Pelham,Longwood Av,Bx,6,Subway,40.816104,-73.896435 +373,373,615,IRT,Pelham,E 149 St,Bx,6,Subway,40.812118,-73.904098 +374,374,616,IRT,Pelham,E 143 St - St Mary's St,Bx,6,Subway,40.808719,-73.907657 +375,375,617,IRT,Pelham,Cypress Av,Bx,6,Subway,40.805368,-73.914042 +376,376,618,IRT,Pelham,Brook Av,Bx,6,Subway,40.807566,-73.91924 +377,377,619,IRT,Pelham,3 Av - 138 St,Bx,6,Subway,40.810476,-73.926138 +378,378,401,IRT,Jerome Av,Woodlawn,Bx,4,Elevated,40.886037,-73.878751 +379,379,402,IRT,Jerome Av,Mosholu Pkwy,Bx,4,Elevated,40.87975,-73.884655 +380,380,405,IRT,Jerome Av,Bedford Park Blvd - Lehman College,Bx,4,Elevated,40.873412,-73.890064 +381,381,406,IRT,Jerome Av,Kingsbridge Rd,Bx,4,Elevated,40.86776,-73.897174 +382,382,407,IRT,Jerome Av,Fordham Rd,Bx,4,Elevated,40.862803,-73.901034 +383,383,408,IRT,Jerome Av,183 St,Bx,4,Elevated,40.858407,-73.903879 +384,384,409,IRT,Jerome Av,Burnside Av,Bx,4,Elevated,40.853453,-73.907684 +385,385,410,IRT,Jerome Av,176 St,Bx,4,Elevated,40.84848,-73.911794 +386,386,411,IRT,Jerome Av,Mt Eden Av,Bx,4,Elevated,40.844434,-73.914685 +387,387,412,IRT,Jerome Av,170 St,Bx,4,Elevated,40.840075,-73.917791 +388,388,413,IRT,Jerome Av,167 St,Bx,4,Elevated,40.835537,-73.9214 +389,604,414,IRT,Jerome Av,161 St - Yankee Stadium,Bx,4,Elevated,40.827994,-73.925831 +390,603,415,IRT,Jerome Av,149 St - Grand Concourse,Bx,4,Subway,40.818375,-73.927351 +391,391,416,IRT,Jerome Av,138 St - Grand Concourse,Bx,4 5,Subway,40.813224,-73.929849 +392,392,621,IRT,Lexington - Shuttle,125 St,M,4 5 6,Subway,40.804138,-73.937594 +393,393,622,IRT,Lexington - Shuttle,116 St,M,6,Subway,40.798629,-73.941617 +394,394,623,IRT,Lexington - Shuttle,110 St,M,6,Subway,40.79502,-73.94425 +395,395,624,IRT,Lexington - Shuttle,103 St,M,6,Subway,40.7906,-73.947478 +396,396,625,IRT,Lexington - Shuttle,96 St,M,6,Subway,40.785672,-73.95107 +397,397,626,IRT,Lexington - Shuttle,86 St,M,4 5 6,Subway,40.779492,-73.955589 +398,398,627,IRT,Lexington - Shuttle,77 St,M,6,Subway,40.77362,-73.959874 +399,399,628,IRT,Lexington - Shuttle,68 St - Hunter College,M,6,Subway,40.768141,-73.96387 +400,613,629,IRT,Lexington - Shuttle,59 St,M,4 5 6,Subway,40.762526,-73.967967 +401,612,630,IRT,Lexington - Shuttle,51 St,M,6,Subway,40.757107,-73.97192 +402,610,631,IRT,Lexington - Shuttle,Grand Central - 42 St,M,4 5 6,Subway,40.751776,-73.976848 +403,403,632,IRT,Lexington - Shuttle,33 St,M,6,Subway,40.746081,-73.982076 +404,404,633,IRT,Lexington - Shuttle,28 St,M,6,Subway,40.74307,-73.984264 +405,405,634,IRT,Lexington - Shuttle,23 St,M,6,Subway,40.739864,-73.986599 +406,602,635,IRT,Lexington - Shuttle,14 St - Union Sq,M,4 5 6,Subway,40.734673,-73.989951 +407,407,636,IRT,Lexington - Shuttle,Astor Pl,M,6,Subway,40.730054,-73.99107 +408,619,637,IRT,Lexington - Shuttle,Bleecker St,M,6,Subway,40.725915,-73.994659 +409,409,638,IRT,Lexington - Shuttle,Spring St,M,6,Subway,40.722301,-73.997141 +410,623,639,IRT,Lexington - Shuttle,Canal St,M,6,Subway,40.718803,-74.000193 +411,622,640,IRT,Lexington - Shuttle,Brooklyn Bridge - City Hall,M,4 5 6,Subway,40.713065,-74.004131 +412,628,418,IRT,Lexington - Shuttle,Fulton St,M,4 5,Subway,40.710368,-74.009509 +413,413,419,IRT,Lexington - Shuttle,Wall St,M,4 5,Subway,40.707557,-74.011862 +414,414,420,IRT,Lexington - Shuttle,Bowling Green,M,4 5,Subway,40.704817,-74.014065 +415,620,423,IRT,Eastern Pky,Borough Hall,Bk,4 5,Subway,40.692404,-73.990151 +416,416,201,IRT,Lenox - White Plains Rd,Wakefield - 241 St,Bx,2,Elevated,40.903125,-73.85062 +417,417,204,IRT,Lenox - White Plains Rd,Nereid Av,Bx,2 5,Elevated,40.898379,-73.854376 +418,418,205,IRT,Lenox - White Plains Rd,233 St,Bx,2 5,Elevated,40.893193,-73.857473 +419,419,206,IRT,Lenox - White Plains Rd,225 St,Bx,2 5,Elevated,40.888022,-73.860341 +420,420,207,IRT,Lenox - White Plains Rd,219 St,Bx,2 5,Elevated,40.883895,-73.862633 +421,421,208,IRT,Lenox - White Plains Rd,Gun Hill Rd,Bx,2 5,Elevated,40.87785,-73.866256 +422,422,209,IRT,Lenox - White Plains Rd,Burke Av,Bx,2 5,Elevated,40.871356,-73.867164 +423,423,210,IRT,Lenox - White Plains Rd,Allerton Av,Bx,2 5,Elevated,40.865462,-73.867352 +424,424,211,IRT,Lenox - White Plains Rd,Pelham Pkwy,Bx,2 5,Elevated,40.857192,-73.867615 +425,425,212,IRT,Lenox - White Plains Rd,Bronx Park East,Bx,2 5,Elevated,40.848828,-73.868457 +426,426,213,IRT,Lenox - White Plains Rd,E 180 St,Bx,2 5,Elevated,40.841894,-73.873488 +427,427,214,IRT,Lenox - White Plains Rd,West Farms Sq - E Tremont Av,Bx,2 5,Elevated,40.840295,-73.880049 +428,428,215,IRT,Lenox - White Plains Rd,174 St,Bx,2 5,Elevated,40.837288,-73.887734 +429,429,216,IRT,Lenox - White Plains Rd,Freeman St,Bx,2 5,Elevated,40.829993,-73.891865 +430,430,217,IRT,Lenox - White Plains Rd,Simpson St,Bx,2 5,Elevated,40.824073,-73.893064 +431,431,218,IRT,Lenox - White Plains Rd,Intervale Av,Bx,2 5,Elevated,40.822181,-73.896736 +432,432,219,IRT,Lenox - White Plains Rd,Prospect Av,Bx,2 5,Elevated,40.819585,-73.90177 +433,433,220,IRT,Lenox - White Plains Rd,Jackson Av,Bx,2 5,Elevated,40.81649,-73.907807 +434,434,221,IRT,Lenox - White Plains Rd,3 Av - 149 St,Bx,2 5,Subway,40.816109,-73.917757 +435,603,222,IRT,Lenox - White Plains Rd,149 St - Grand Concourse,Bx,2 5,Subway,40.81841,-73.926718 +436,436,301,IRT,Lenox - White Plains Rd,Harlem - 148 St,M,3,Subway,40.82388,-73.93647 +437,437,302,IRT,Lenox - White Plains Rd,145 St,M,3,Subway,40.820421,-73.936245 +438,438,224,IRT,Lenox - White Plains Rd,135 St,M,2 3,Subway,40.814229,-73.94077 +439,439,225,IRT,Lenox - White Plains Rd,125 St,M,2 3,Subway,40.807754,-73.945495 +440,440,226,IRT,Lenox - White Plains Rd,116 St,M,2 3,Subway,40.802098,-73.949625 +441,441,227,IRT,Lenox - White Plains Rd,Central Park North (110 St),M,2 3,Subway,40.799075,-73.951822 +442,442,501,IRT,Dyre Av,Eastchester - Dyre Av,Bx,5,At Grade,40.8883,-73.830834 +443,443,502,IRT,Dyre Av,Baychester Av,Bx,5,Open Cut,40.878663,-73.838591 +444,444,503,IRT,Dyre Av,Gun Hill Rd,Bx,5,Open Cut,40.869526,-73.846384 +445,445,504,IRT,Dyre Av,Pelham Pkwy,Bx,5,Open Cut,40.858985,-73.855359 +446,446,505,IRT,Dyre Av,Morris Park,Bx,5,Open Cut,40.854364,-73.860495 +447,447,701,IRT,Flushing,Flushing - Main St,Q,7,Subway,40.7596,-73.83003 +448,448,702,IRT,Flushing,Mets - Willets Point,Q,7,Elevated,40.754622,-73.845625 +449,449,705,IRT,Flushing,111 St,Q,7,Elevated,40.75173,-73.855334 +450,450,706,IRT,Flushing,103 St - Corona Plaza,Q,7,Elevated,40.749865,-73.8627 +451,451,707,IRT,Flushing,Junction Blvd,Q,7,Elevated,40.749145,-73.869527 +452,452,708,IRT,Flushing,90 St - Elmhurst Av,Q,7,Elevated,40.748408,-73.876613 +453,453,709,IRT,Flushing,82 St - Jackson Hts,Q,7,Elevated,40.747659,-73.883697 +454,616,710,IRT,Flushing,74 St - Broadway,Q,7,Elevated,40.746848,-73.891394 +455,455,711,IRT,Flushing,69 St,Q,7,Elevated,40.746325,-73.896403 +456,456,712,IRT,Flushing,Woodside - 61 St,Q,7,Elevated,40.74563,-73.902984 +457,457,713,IRT,Flushing,52 St,Q,7,Elevated,40.744149,-73.912549 +458,458,714,IRT,Flushing,46 St,Q,7,Elevated,40.743132,-73.918435 +459,459,715,IRT,Flushing,40 St,Q,7,Elevated,40.743781,-73.924016 +460,460,716,IRT,Flushing,33 St,Q,7,Elevated,40.744587,-73.930997 +461,461,718,IRT,Flushing,Queensboro Plaza,Q,7 N W,Elevated,40.750582,-73.940202 +462,606,719,IRT,Flushing,Court Sq,Q,7,Elevated,40.747023,-73.945264 +463,463,720,IRT,Flushing,Hunters Point Av,Q,7,Subway,40.742216,-73.948916 +464,464,721,IRT,Flushing,Vernon Blvd - Jackson Av,Q,7,Subway,40.742626,-73.953581 +465,610,723,IRT,Flushing,Grand Central - 42 St,M,7,Subway,40.751431,-73.976041 +466,609,724,IRT,Flushing,5 Av,M,7,Subway,40.753821,-73.981963 +467,611,725,IRT,Flushing,Times Sq - 42 St,M,7,Subway,40.755477,-73.987691 +468,611,902,IRT,Lexington - Shuttle,Times Sq - 42 St,M,S,Subway,40.755983,-73.986229 +469,610,901,IRT,Lexington - Shuttle,Grand Central - 42 St,M,S,Subway,40.752769,-73.979189 +471,471,726,IRT,Flushing,34 St - 11 Av,M,7,Subway,40.755882,-74.00191 +475,475,Q05,IND,Second Av,96 St,M,Q,Subway,40.784318,-73.947152 +476,476,Q04,IND,Second Av,86 St,M,Q,Subway,40.777891,-73.951787 +477,477,Q03,IND,Second Av,72 St,M,Q,Subway,40.768799,-73.958424 +501,501,S31,SIR,Staten Island,St George,SI,SIR,Open Cut,40.643748,-74.073643 +502,502,S30,SIR,Staten Island,Tompkinsville,SI,SIR,At Grade,40.636949,-74.074835 +503,503,S29,SIR,Staten Island,Stapleton,SI,SIR,Elevated,40.627915,-74.075162 +504,504,S28,SIR,Staten Island,Clifton,SI,SIR,Elevated,40.621319,-74.071402 +505,505,S27,SIR,Staten Island,Grasmere,SI,SIR,Open Cut,40.603117,-74.084087 +506,506,S26,SIR,Staten Island,Old Town,SI,SIR,Embankment,40.596612,-74.087368 +507,507,S25,SIR,Staten Island,Dongan Hills,SI,SIR,Embankment,40.588849,-74.09609 +508,508,S24,SIR,Staten Island,Jefferson Av,SI,SIR,Embankment,40.583591,-74.103338 +509,509,S23,SIR,Staten Island,Grant City,SI,SIR,Open Cut,40.578965,-74.109704 +510,510,S22,SIR,Staten Island,New Dorp,SI,SIR,Open Cut,40.57348,-74.11721 +511,511,S21,SIR,Staten Island,Oakwood Heights,SI,SIR,Open Cut,40.56511,-74.12632 +512,512,S20,SIR,Staten Island,Bay Terrace,SI,SIR,Embankment,40.5564,-74.136907 +513,513,S19,SIR,Staten Island,Great Kills,SI,SIR,Open Cut,40.551231,-74.151399 +514,514,S18,SIR,Staten Island,Eltingville,SI,SIR,Embankment,40.544601,-74.16457 +515,515,S17,SIR,Staten Island,Annadale,SI,SIR,Open Cut,40.54046,-74.178217 +516,516,S16,SIR,Staten Island,Huguenot,SI,SIR,Open Cut,40.533674,-74.191794 +517,517,S15,SIR,Staten Island,Prince's Bay,SI,SIR,Open Cut,40.525507,-74.200064 +518,518,S14,SIR,Staten Island,Pleasant Plains,SI,SIR,Embankment,40.52241,-74.217847 +519,519,S13,SIR,Staten Island,Richmond Valley,SI,SIR,Open Cut,40.519631,-74.229141 +522,522,S09,SIR,Staten Island,Tottenville,SI,SIR,At Grade,40.512764,-74.251961 +523,523,S11,SIR,Staten Island,Arthur Kill,SI,SIR,At Grade,40.516578,-74.242096 diff --git a/assets/mta/google_transit.zip b/assets/mta/google_transit.zip new file mode 100644 index 0000000..0efba91 Binary files /dev/null and b/assets/mta/google_transit.zip differ diff --git a/nyc-subway-skill.png b/assets/nyc-subway-skill.png similarity index 100% rename from nyc-subway-skill.png rename to assets/nyc-subway-skill.png diff --git a/circle.yml b/circle.yml index b752f9a..95e5d32 100644 --- a/circle.yml +++ b/circle.yml @@ -3,11 +3,13 @@ machine: version: $NODE_RUNTIME_VERSION environment: NODE_RUNTIME_VERSION: 6.10 # To be the same version AWS Lambda uses - YARN_VERSION: 0.18.1 + YARN_VERSION: 0.24.6 PATH: "${PATH}:${HOME}/.yarn/bin:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin" AWS_DEFAULT_REGION: us-east-1 AWS_LAMBDA_PRODUCTION_ARN: arn:aws:lambda:us-east-1:750878068186:function:mtaStatus AWS_FB_LAMBDA_PRODUCTION_ARN: arn:aws:lambda:us-east-1:750878068186:function:mtaStatusFlashBriefing + MTA_STATUS_URL: http://web.mta.info/status/serviceStatus.txt + TARGET_ENV: $(if [[ "$CIRCLE_BRANCH" == "development" ]]; then echo development; else echo production; fi) dependencies: pre: @@ -18,24 +20,40 @@ dependencies: else echo "The correct version of Yarn is already installed." fi + - yarn run dynamodb:download + - yarn run dynamodb:start: + background: true + - sleep 10 + override: - yarn install + cache_directories: - ~/.yarn - ~/.cache/yarn + - ~/nyc-subway/downloads test: override: - yarn test deployment: + development: + branch: development + commands: + - yarn release + - 'aws lambda update-function-code --function-name $AWS_LAMBDA_PRODUCTION_ARN --zip-file fileb://subway.zip' + - 'aws lambda update-function-code --function-name $AWS_FB_LAMBDA_PRODUCTION_ARN --zip-file fileb://subway.zip' + - 'aws lambda update-function-configuration --function-name $AWS_FB_LAMBDA_PRODUCTION_ARN --runtime "nodejs${NODE_RUNTIME_VERSION}" --environment "Variables={NODE_ENV=$TARGET_ENV,APPLICATION_ID=$ALEXA_FB_APPLICATION_ID,MTA_STATUS_URL=$MTA_STATUS_URL}"' + - 'aws lambda update-function-configuration --function-name $AWS_LAMBDA_PRODUCTION_ARN --runtime "nodejs${NODE_RUNTIME_VERSION}" --environment "Variables={NODE_ENV=$TARGET_ENV,APPLICATION_ID=$ALEXA_APPLICATION_ID,MTA_STATUS_URL=$MTA_STATUS_URL}"' + master: branch: master commands: - yarn release - 'aws lambda update-function-code --function-name $AWS_LAMBDA_PRODUCTION_ARN --zip-file fileb://subway.zip' - - 'aws lambda publish-version --function-name $AWS_LAMBDA_PRODUCTION_ARN --description "SHA: $CIRCLE_SHA1 Github: $CIRCLE_COMPARE_URL Build Number: $CIRCLE_BUILD_NUM"' - - 'aws lambda update-function-configuration --function-name $AWS_LAMBDA_PRODUCTION_ARN --runtime "nodejs${NODE_RUNTIME_VERSION}"' - 'aws lambda update-function-code --function-name $AWS_FB_LAMBDA_PRODUCTION_ARN --zip-file fileb://subway.zip' - - 'aws lambda publish-version --function-name $AWS_FB_LAMBDA_PRODUCTION_ARN --description "SHA: $CIRCLE_SHA1 Github: $CIRCLE_COMPARE_URL Build Number: $CIRCLE_BUILD_NUM"' - - 'aws lambda update-function-configuration --function-name $AWS_FB_LAMBDA_PRODUCTION_ARN --runtime "nodejs${NODE_RUNTIME_VERSION}"' + - 'aws lambda update-function-configuration --function-name $AWS_FB_LAMBDA_PRODUCTION_ARN --runtime "nodejs${NODE_RUNTIME_VERSION}" --environment "Variables={NODE_ENV=$TARGET_ENV,APPLICATION_ID=$ALEXA_FB_APPLICATION_ID,MTA_STATUS_URL=$MTA_STATUS_URL}"' + - 'aws lambda update-function-configuration --function-name $AWS_LAMBDA_PRODUCTION_ARN --runtime "nodejs${NODE_RUNTIME_VERSION}" --environment "Variables={NODE_ENV=$TARGET_ENV,APPLICATION_ID=$ALEXA_APPLICATION_ID,MTA_STATUS_URL=$MTA_STATUS_URL}"' + - 'aws lambda publish-version --function-name $AWS_LAMBDA_PRODUCTION_ARN --description "Branch: $CIRCLE_BRANCH SHA: $CIRCLE_SHA1 Github: $CIRCLE_COMPARE_URL Build Number: $CIRCLE_BUILD_NUM"' + - 'aws lambda publish-version --function-name $AWS_FB_LAMBDA_PRODUCTION_ARN --description "Branch: $CIRCLE_BRANCH SHA: $CIRCLE_SHA1 Github: $CIRCLE_COMPARE_URL Build Number: $CIRCLE_BUILD_NUM"' diff --git a/data/gtfs-realtime.proto b/data/gtfs-realtime.proto new file mode 100644 index 0000000..3d65f1e --- /dev/null +++ b/data/gtfs-realtime.proto @@ -0,0 +1,640 @@ +// 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://developers.google.com/transit/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. +// +// A feed depends on some external configuration: +// - The corresponding GTFS feed. +// - Feed application (updates, positions or alerts). A feed should contain only +// items of one specified application; all the other entities will be ignored. +// - Polling frequency +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; +} + +// Metadata about a feed, included in feed messages. +message FeedHeader { + // Version of the feed specification. + // The current version is 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; +} + +// 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; + + // 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; +} + +// +// 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; + } + + // 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; + + // The relation between this StopTime 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. + SCHEDULED = 0; + + // The stop is skipped, i.e., the vehicle will not stop at this stop. + // Arrival and departure are optional. + SKIPPED = 1; + + // No data is given for this stop. The main intention for this value is to + // give the predictions only for part of a trip, i.e., if the last update + // for a trip has a NO_DATA specifier, then StopTimes 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; + } + optional ScheduleRelationship schedule_relationship = 5 + [default = SCHEDULED]; + + // 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; + } + + // 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; + + // Moment at which the vehicle's real-time progress was measured. 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; + + // 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; +} + +// 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 degree of passenger occupancy of the vehicle. This field is still + // experimental, and subject to change. It may be formally adopted in the + // future. + enum OccupancyStatus { + // The vehicle is considered empty by most measures, and has few or no + // passengers onboard, but is still accepting passengers. + EMPTY = 0; + + // The vehicle has a relatively large percentage of seats available. + // What percentage of free seats out of the total seats available is to be + // considered large enough to fall into this category is determined at the + // discretion of the producer. + MANY_SEATS_AVAILABLE = 1; + + // The vehicle has a relatively small percentage of seats available. + // What percentage of free seats out of the total seats available is 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 can currently accommodate only standing passengers. + STANDING_ROOM_ONLY = 3; + + // The vehicle can currently accommodate only standing passengers + // and has limited space for them. + CRUSHED_STANDING_ROOM_ONLY = 4; + + // The vehicle is considered full by most measures, but may still be + // allowing passengers to board. + FULL = 5; + + // The vehicle is not accepting additional passengers. + NOT_ACCEPTING_PASSENGERS = 6; + + } + optional OccupancyStatus occupancy_status = 9; + + // 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; +} + +// 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; + } + 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; + + // 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; +} + +// +// 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; +} + +// 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; +} + +// 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. + 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. This field is + // still experimental, and subject to change. It may be formally adopted in + // the future. + 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. + ADDED = 1; + + // A trip that is running with no schedule associated to it, for example, if + // there is no schedule at all. + UNSCHEDULED = 2; + + // A trip that existed in the schedule but was removed. + CANCELED = 3; + } + 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; +} + +// 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; +} + +// 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; + + // 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; +} + +// 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; + } + // 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; +} diff --git a/data/nyc-subway.proto b/data/nyc-subway.proto new file mode 100644 index 0000000..fad3784 --- /dev/null +++ b/data/nyc-subway.proto @@ -0,0 +1,134 @@ +// +// NYCT Subway extensions for the GTFS-realtime protocol. +// +option java_package = "com.google.transit.realtime"; + +import "gtfs-realtime.proto"; + +message TripReplacementPeriod { + // The replacement period is for this route + optional string route_id = 1; + // The start time is omitted, the end time is currently now + 30 minutes for + // all routes of the A division + optional transit_realtime.TimeRange replacement_period = 2; +} + +// NYCT Subway extensions for the feed header +message NyctFeedHeader { + // Version of the NYCT Subway extensions + // The current version is 1.0 + required string nyct_subway_version = 1; + // For the NYCT Subway, the GTFS-realtime feed replaces any scheduled + // trip within the trip_replacement_period. + // This feed is a full dataset, it contains all trips starting + // in the trip_replacement_period. If a trip from the static GTFS is not + // found in the GTFS-realtime feed, it should be considered as cancelled. + // The replacement period can be different for each route, so here is + // a list of the routes where the trips in the feed replace all + // scheduled trips within the replacement period. + repeated TripReplacementPeriod trip_replacement_period = 2; +} + +extend transit_realtime.FeedHeader { + optional NyctFeedHeader nyct_feed_header = 1001; +} + +// NYCT Subway extensions for the trip descriptor +message NyctTripDescriptor { + // The nyct_train_id is meant for internal use only. It provides an + // easy way to associated GTFS-realtime trip identifiers with NYCT rail + // operations identifier + // + // The ATS office system assigns unique train identification (Train ID) to + // each train operating within or ready to enter the mainline of the + // monitored territory. An example of this is 06 0123+ PEL/BBR and is decoded + // as follows: + // + // The first character represents the trip type designator. 0 identifies a + // scheduled revenue trip. Other revenue trip values that are a result of a + // change to the base schedule include; [= reroute], [/ skip stop], [$ turn + // train] also known as shortly lined service. + // + // The second character 6 represents the trip line i.e. number 6 train The + // third set of characters identify the decoded origin time. The last + // character may be blank "on the whole minute" or + "30 seconds" + // + // Note: Origin times will not change when there is a trip type change. This + // is followed by a three character "Origin Location" / "Destination + // Location" + optional string train_id = 1; + + // This trip has been assigned to a physical train. If true, this trip is + // already underway or most likely will depart shortly. + // + // Train Assignment is a function of the Automatic Train Supervision (ATS) + // office system used by NYCT Rail Operations to monitor and track train + // movements. ATS provides the ability to "assign" the nyct_train_id + // attribute when a physical train is at its origin terminal. These assigned + // trips have the is_assigned field set in the TripDescriptor. + // + // When a train is at a terminal but has not been given a work program it is + // declared unassigned and is tagged as such. Unassigned trains can be moved + // to a storage location or assigned a nyct_train_id when a determination for + // service is made. + optional bool is_assigned = 2; + + // The direction the train is moving. + enum Direction { + NORTH = 1; + EAST = 2; + SOUTH = 3; + WEST = 4; + } + // Uptown and Bronx-bound trains are moving NORTH. + // Times Square Shuttle to Grand Central is also northbound. + // + // Downtown and Brooklyn-bound trains are moving SOUTH. + // Times Square Shuttle to Times Square is also southbound. + // + // EAST and WEST are not used currently. + optional Direction direction = 3; +} + +extend transit_realtime.TripDescriptor { + optional NyctTripDescriptor nyct_trip_descriptor = 1001; +} + +// NYCT Subway extensions for the stop time update +message NyctStopTimeUpdate { + // Provides the planned station arrival track. The following is the Manhattan + // track configurations: + // 1: southbound local + // 2: southbound express + // 3: northbound express + // 4: northbound local + // + // In the Bronx (except Dyre Ave line) + // M: bi-directional express (in the AM express to Manhattan, in the PM + // express away). + // + // The Dyre Ave line is configured: + // 1: southbound + // 2: northbound + // 3: bi-directional + optional string scheduled_track = 1; + + // This is the actual track that the train is operating on and can be used to + // determine if a train is operating according to its current schedule + // (plan). + // + // The actual track is known only shortly before the train reaches a station, + // typically not before it leaves the previous station. Therefore, the NYCT + // feed sets this field only for the first station of the remaining trip. + // + // Different actual and scheduled track is the result of manually rerouting a + // train off it scheduled path. When this occurs, prediction data may become + // unreliable since the train is no longer operating in accordance to its + // schedule. The rules engine for the 'countdown' clocks will remove this + // train from all schedule stations. + optional string actual_track = 2; +} + +extend transit_realtime.TripUpdate.StopTimeUpdate { + optional NyctStopTimeUpdate nyct_stop_time_update = 1001; +} diff --git a/data/slots/station-names.json b/data/slots/station-names.json new file mode 100644 index 0000000..e360b85 --- /dev/null +++ b/data/slots/station-names.json @@ -0,0 +1 @@ +[{"id":null,"name":{"value":"Astoria - Ditmars Blvd","synonyms":[]}},{"id":null,"name":{"value":"Astoria Blvd","synonyms":[]}},{"id":null,"name":{"value":"30 Av","synonyms":[]}},{"id":null,"name":{"value":"Broadway","synonyms":[]}},{"id":null,"name":{"value":"36 Av","synonyms":[]}},{"id":null,"name":{"value":"39 Av","synonyms":[]}},{"id":null,"name":{"value":"Lexington Av/59 St","synonyms":[]}},{"id":null,"name":{"value":"5 Av/59 St","synonyms":[]}},{"id":null,"name":{"value":"57 St - 7 Av","synonyms":[]}},{"id":null,"name":{"value":"49 St","synonyms":[]}},{"id":null,"name":{"value":"Times Sq - 42 St","synonyms":[]}},{"id":null,"name":{"value":"34 St - Herald Sq","synonyms":[]}},{"id":null,"name":{"value":"28 St","synonyms":[]}},{"id":null,"name":{"value":"23 St","synonyms":[]}},{"id":null,"name":{"value":"14 St - Union Sq","synonyms":[]}},{"id":null,"name":{"value":"8 St - NYU","synonyms":[]}},{"id":null,"name":{"value":"Prince St","synonyms":[]}},{"id":null,"name":{"value":"Canal St","synonyms":[]}},{"id":null,"name":{"value":"City Hall","synonyms":[]}},{"id":null,"name":{"value":"Cortlandt St","synonyms":[]}},{"id":null,"name":{"value":"Rector St","synonyms":[]}},{"id":null,"name":{"value":"Whitehall St","synonyms":[]}},{"id":null,"name":{"value":"Court St","synonyms":[]}},{"id":null,"name":{"value":"Jay St - MetroTech","synonyms":[]}},{"id":null,"name":{"value":"DeKalb Av","synonyms":[]}},{"id":null,"name":{"value":"Atlantic Av - Barclays Ctr","synonyms":[]}},{"id":null,"name":{"value":"Union St","synonyms":[]}},{"id":null,"name":{"value":"9 St","synonyms":[]}},{"id":null,"name":{"value":"Prospect Av","synonyms":[]}},{"id":null,"name":{"value":"25 St","synonyms":[]}},{"id":null,"name":{"value":"36 St","synonyms":[]}},{"id":null,"name":{"value":"45 St","synonyms":[]}},{"id":null,"name":{"value":"53 St","synonyms":[]}},{"id":null,"name":{"value":"59 St","synonyms":[]}},{"id":null,"name":{"value":"Bay Ridge Av","synonyms":[]}},{"id":null,"name":{"value":"77 St","synonyms":[]}},{"id":null,"name":{"value":"86 St","synonyms":[]}},{"id":null,"name":{"value":"Bay Ridge - 95 St","synonyms":[]}},{"id":null,"name":{"value":"7 Av","synonyms":[]}},{"id":null,"name":{"value":"Prospect Park","synonyms":[]}},{"id":null,"name":{"value":"Parkside Av","synonyms":[]}},{"id":null,"name":{"value":"Church Av","synonyms":[]}},{"id":null,"name":{"value":"Beverley Rd","synonyms":[]}},{"id":null,"name":{"value":"Cortelyou Rd","synonyms":[]}},{"id":null,"name":{"value":"Newkirk Plaza","synonyms":[]}},{"id":null,"name":{"value":"Avenue H","synonyms":[]}},{"id":null,"name":{"value":"Avenue J","synonyms":[]}},{"id":null,"name":{"value":"Avenue M","synonyms":[]}},{"id":null,"name":{"value":"Kings Hwy","synonyms":[]}},{"id":null,"name":{"value":"Avenue U","synonyms":[]}},{"id":null,"name":{"value":"Neck Rd","synonyms":[]}},{"id":null,"name":{"value":"Sheepshead Bay","synonyms":[]}},{"id":null,"name":{"value":"Brighton Beach","synonyms":[]}},{"id":null,"name":{"value":"Ocean Pkwy","synonyms":[]}},{"id":null,"name":{"value":"W 8 St - NY Aquarium","synonyms":[]}},{"id":null,"name":{"value":"Coney Island - Stillwell Av","synonyms":[]}},{"id":null,"name":{"value":"9 Av","synonyms":[]}},{"id":null,"name":{"value":"Fort Hamilton Pkwy","synonyms":[]}},{"id":null,"name":{"value":"50 St","synonyms":[]}},{"id":null,"name":{"value":"55 St","synonyms":[]}},{"id":null,"name":{"value":"62 St","synonyms":[]}},{"id":null,"name":{"value":"71 St","synonyms":[]}},{"id":null,"name":{"value":"79 St","synonyms":[]}},{"id":null,"name":{"value":"18 Av","synonyms":[]}},{"id":null,"name":{"value":"20 Av","synonyms":[]}},{"id":null,"name":{"value":"Bay Pkwy","synonyms":[]}},{"id":null,"name":{"value":"25 Av","synonyms":[]}},{"id":null,"name":{"value":"Bay 50 St","synonyms":[]}},{"id":null,"name":{"value":"8 Av","synonyms":[]}},{"id":null,"name":{"value":"New Utrecht Av","synonyms":[]}},{"id":null,"name":{"value":"121 St","synonyms":[]}},{"id":null,"name":{"value":"111 St","synonyms":[]}},{"id":null,"name":{"value":"104 St","synonyms":[]}},{"id":null,"name":{"value":"Woodhaven Blvd","synonyms":[]}},{"id":null,"name":{"value":"85 St - Forest Pkwy","synonyms":[]}},{"id":null,"name":{"value":"75 St","synonyms":[]}},{"id":null,"name":{"value":"Cypress Hills","synonyms":[]}},{"id":null,"name":{"value":"Crescent St","synonyms":[]}},{"id":null,"name":{"value":"Norwood Av","synonyms":[]}},{"id":null,"name":{"value":"Cleveland St","synonyms":[]}},{"id":null,"name":{"value":"Van Siclen Av","synonyms":[]}},{"id":null,"name":{"value":"Alabama Av","synonyms":[]}},{"id":null,"name":{"value":"Broadway Jct","synonyms":[]}},{"id":null,"name":{"value":"Chauncey St","synonyms":[]}},{"id":null,"name":{"value":"Halsey St","synonyms":[]}},{"id":null,"name":{"value":"Gates Av","synonyms":[]}},{"id":null,"name":{"value":"Kosciuszko St","synonyms":[]}},{"id":null,"name":{"value":"Myrtle Av","synonyms":[]}},{"id":null,"name":{"value":"Flushing Av","synonyms":[]}},{"id":null,"name":{"value":"Lorimer St","synonyms":[]}},{"id":null,"name":{"value":"Hewes St","synonyms":[]}},{"id":null,"name":{"value":"Marcy Av","synonyms":[]}},{"id":null,"name":{"value":"Essex St","synonyms":[]}},{"id":null,"name":{"value":"Bowery","synonyms":[]}},{"id":null,"name":{"value":"Chambers St","synonyms":[]}},{"id":null,"name":{"value":"Fulton St","synonyms":[]}},{"id":null,"name":{"value":"Broad St","synonyms":[]}},{"id":null,"name":{"value":"Middle Village - Metropolitan Av","synonyms":[]}},{"id":null,"name":{"value":"Fresh Pond Rd","synonyms":[]}},{"id":null,"name":{"value":"Forest Av","synonyms":[]}},{"id":null,"name":{"value":"Seneca Av","synonyms":[]}},{"id":null,"name":{"value":"Myrtle - Wyckoff Avs","synonyms":[]}},{"id":null,"name":{"value":"Knickerbocker Av","synonyms":[]}},{"id":null,"name":{"value":"Central Av","synonyms":[]}},{"id":null,"name":{"value":"6 Av","synonyms":[]}},{"id":null,"name":{"value":"Union Sq - 14 St","synonyms":[]}},{"id":null,"name":{"value":"3 Av","synonyms":[]}},{"id":null,"name":{"value":"1 Av","synonyms":[]}},{"id":null,"name":{"value":"Bedford Av","synonyms":[]}},{"id":null,"name":{"value":"Graham Av","synonyms":[]}},{"id":null,"name":{"value":"Grand St","synonyms":[]}},{"id":null,"name":{"value":"Montrose Av","synonyms":[]}},{"id":null,"name":{"value":"Morgan Av","synonyms":[]}},{"id":null,"name":{"value":"Jefferson St","synonyms":[]}},{"id":null,"name":{"value":"Wilson Av","synonyms":[]}},{"id":null,"name":{"value":"Bushwick Av - Aberdeen St","synonyms":[]}},{"id":null,"name":{"value":"Atlantic Av","synonyms":[]}},{"id":null,"name":{"value":"Sutter Av","synonyms":[]}},{"id":null,"name":{"value":"Livonia Av","synonyms":[]}},{"id":null,"name":{"value":"New Lots Av","synonyms":[]}},{"id":null,"name":{"value":"E 105 St","synonyms":[]}},{"id":null,"name":{"value":"Canarsie - Rockaway Pkwy","synonyms":[]}},{"id":null,"name":{"value":"Franklin Av","synonyms":[]}},{"id":null,"name":{"value":"Park Pl","synonyms":[]}},{"id":null,"name":{"value":"Botanic Garden","synonyms":[]}},{"id":null,"name":{"value":"Inwood - 207 St","synonyms":[]}},{"id":null,"name":{"value":"Dyckman St","synonyms":[]}},{"id":null,"name":{"value":"190 St","synonyms":[]}},{"id":null,"name":{"value":"181 St","synonyms":[]}},{"id":null,"name":{"value":"175 St","synonyms":[]}},{"id":null,"name":{"value":"168 St","synonyms":[]}},{"id":null,"name":{"value":"163 St - Amsterdam Av","synonyms":[]}},{"id":null,"name":{"value":"155 St","synonyms":[]}},{"id":null,"name":{"value":"145 St","synonyms":[]}},{"id":null,"name":{"value":"135 St","synonyms":[]}},{"id":null,"name":{"value":"125 St","synonyms":[]}},{"id":null,"name":{"value":"116 St","synonyms":[]}},{"id":null,"name":{"value":"Cathedral Pkwy (110 St)","synonyms":[]}},{"id":null,"name":{"value":"103 St","synonyms":[]}},{"id":null,"name":{"value":"96 St","synonyms":[]}},{"id":null,"name":{"value":"81 St - Museum of Natural History","synonyms":[]}},{"id":null,"name":{"value":"72 St","synonyms":[]}},{"id":null,"name":{"value":"59 St - Columbus Circle","synonyms":[]}},{"id":null,"name":{"value":"42 St - Port Authority Bus Terminal","synonyms":[]}},{"id":null,"name":{"value":"34 St - Penn Station","synonyms":[]}},{"id":null,"name":{"value":"14 St","synonyms":[]}},{"id":null,"name":{"value":"W 4 St","synonyms":[]}},{"id":null,"name":{"value":"Spring St","synonyms":[]}},{"id":null,"name":{"value":"World Trade Center","synonyms":[]}},{"id":null,"name":{"value":"High St","synonyms":[]}},{"id":null,"name":{"value":"Hoyt - Schermerhorn Sts","synonyms":[]}},{"id":null,"name":{"value":"Lafayette Av","synonyms":[]}},{"id":null,"name":{"value":"Clinton - Washington Avs","synonyms":[]}},{"id":null,"name":{"value":"Nostrand Av","synonyms":[]}},{"id":null,"name":{"value":"Kingston - Throop Avs","synonyms":[]}},{"id":null,"name":{"value":"Utica Av","synonyms":[]}},{"id":null,"name":{"value":"Ralph Av","synonyms":[]}},{"id":null,"name":{"value":"Rockaway Av","synonyms":[]}},{"id":null,"name":{"value":"Liberty Av","synonyms":[]}},{"id":null,"name":{"value":"Shepherd Av","synonyms":[]}},{"id":null,"name":{"value":"Euclid Av","synonyms":[]}},{"id":null,"name":{"value":"Grant Av","synonyms":[]}},{"id":null,"name":{"value":"80 St","synonyms":[]}},{"id":null,"name":{"value":"88 St","synonyms":[]}},{"id":null,"name":{"value":"Rockaway Blvd","synonyms":[]}},{"id":null,"name":{"value":"Ozone Park - Lefferts Blvd","synonyms":[]}},{"id":null,"name":{"value":"Aqueduct Racetrack","synonyms":[]}},{"id":null,"name":{"value":"Aqueduct - N Conduit Av","synonyms":[]}},{"id":null,"name":{"value":"Howard Beach - JFK Airport","synonyms":[]}},{"id":null,"name":{"value":"Broad Channel","synonyms":[]}},{"id":null,"name":{"value":"Beach 90 St","synonyms":[]}},{"id":null,"name":{"value":"Beach 98 St","synonyms":[]}},{"id":null,"name":{"value":"Beach 105 St","synonyms":[]}},{"id":null,"name":{"value":"Rockaway Park - Beach 116 St","synonyms":[]}},{"id":null,"name":{"value":"Beach 67 St","synonyms":[]}},{"id":null,"name":{"value":"Beach 60 St","synonyms":[]}},{"id":null,"name":{"value":"Beach 44 St","synonyms":[]}},{"id":null,"name":{"value":"Beach 36 St","synonyms":[]}},{"id":null,"name":{"value":"Beach 25 St","synonyms":[]}},{"id":null,"name":{"value":"Far Rockaway - Mott Av","synonyms":[]}},{"id":null,"name":{"value":"Norwood - 205 St","synonyms":[]}},{"id":null,"name":{"value":"Bedford Park Blvd","synonyms":[]}},{"id":null,"name":{"value":"Kingsbridge Rd","synonyms":[]}},{"id":null,"name":{"value":"Fordham Rd","synonyms":[]}},{"id":null,"name":{"value":"182-183 Sts","synonyms":[]}},{"id":null,"name":{"value":"Tremont Av","synonyms":[]}},{"id":null,"name":{"value":"174-175 Sts","synonyms":[]}},{"id":null,"name":{"value":"170 St","synonyms":[]}},{"id":null,"name":{"value":"167 St","synonyms":[]}},{"id":null,"name":{"value":"161 St - Yankee Stadium","synonyms":[]}},{"id":null,"name":{"value":"21 St - Queensbridge","synonyms":[]}},{"id":null,"name":{"value":"Roosevelt Island","synonyms":[]}},{"id":null,"name":{"value":"Lexington Av/63 St","synonyms":[]}},{"id":null,"name":{"value":"57 St","synonyms":[]}},{"id":null,"name":{"value":"47-50 Sts - Rockefeller Ctr","synonyms":[]}},{"id":null,"name":{"value":"42 St - Bryant Pk","synonyms":[]}},{"id":null,"name":{"value":"Broadway-Lafayette St","synonyms":[]}},{"id":null,"name":{"value":"2 Av","synonyms":[]}},{"id":null,"name":{"value":"Delancey St","synonyms":[]}},{"id":null,"name":{"value":"East Broadway","synonyms":[]}},{"id":null,"name":{"value":"York St","synonyms":[]}},{"id":null,"name":{"value":"Bergen St","synonyms":[]}},{"id":null,"name":{"value":"Carroll St","synonyms":[]}},{"id":null,"name":{"value":"Smith - 9 Sts","synonyms":[]}},{"id":null,"name":{"value":"4 Av","synonyms":[]}},{"id":null,"name":{"value":"15 St - Prospect Park","synonyms":[]}},{"id":null,"name":{"value":"Ditmas Av","synonyms":[]}},{"id":null,"name":{"value":"Avenue I","synonyms":[]}},{"id":null,"name":{"value":"Avenue N","synonyms":[]}},{"id":null,"name":{"value":"Avenue P","synonyms":[]}},{"id":null,"name":{"value":"Avenue X","synonyms":[]}},{"id":null,"name":{"value":"Neptune Av","synonyms":[]}},{"id":null,"name":{"value":"Jamaica - 179 St","synonyms":[]}},{"id":null,"name":{"value":"169 St","synonyms":[]}},{"id":null,"name":{"value":"Parsons Blvd","synonyms":[]}},{"id":null,"name":{"value":"Sutphin Blvd","synonyms":[]}},{"id":null,"name":{"value":"Briarwood - Van Wyck Blvd","synonyms":[]}},{"id":null,"name":{"value":"Kew Gardens - Union Tpke","synonyms":[]}},{"id":null,"name":{"value":"75 Av","synonyms":[]}},{"id":null,"name":{"value":"Forest Hills - 71 Av","synonyms":[]}},{"id":null,"name":{"value":"67 Av","synonyms":[]}},{"id":null,"name":{"value":"63 Dr - Rego Park","synonyms":[]}},{"id":null,"name":{"value":"Grand Av - Newtown","synonyms":[]}},{"id":null,"name":{"value":"Elmhurst Av","synonyms":[]}},{"id":null,"name":{"value":"Jackson Hts - Roosevelt Av","synonyms":[]}},{"id":null,"name":{"value":"65 St","synonyms":[]}},{"id":null,"name":{"value":"Northern Blvd","synonyms":[]}},{"id":null,"name":{"value":"46 St","synonyms":[]}},{"id":null,"name":{"value":"Steinway St","synonyms":[]}},{"id":null,"name":{"value":"Queens Plaza","synonyms":[]}},{"id":null,"name":{"value":"Court Sq","synonyms":[]}},{"id":null,"name":{"value":"Lexington Av/53 St","synonyms":[]}},{"id":null,"name":{"value":"5 Av/53 St","synonyms":[]}},{"id":null,"name":{"value":"Jamaica Center - Parsons/Archer","synonyms":[]}},{"id":null,"name":{"value":"Sutphin Blvd - Archer Av - JFK Airport","synonyms":[]}},{"id":null,"name":{"value":"Jamaica - Van Wyck","synonyms":[]}},{"id":null,"name":{"value":"21 St","synonyms":[]}},{"id":null,"name":{"value":"Greenpoint Av","synonyms":[]}},{"id":null,"name":{"value":"Nassau Av","synonyms":[]}},{"id":null,"name":{"value":"Metropolitan Av","synonyms":[]}},{"id":null,"name":{"value":"Myrtle - Willoughby Avs","synonyms":[]}},{"id":null,"name":{"value":"Bedford - Nostrand Avs","synonyms":[]}},{"id":null,"name":{"value":"Classon Av","synonyms":[]}},{"id":null,"name":{"value":"Van Cortlandt Park - 242 St","synonyms":[]}},{"id":null,"name":{"value":"238 St","synonyms":[]}},{"id":null,"name":{"value":"231 St","synonyms":[]}},{"id":null,"name":{"value":"Marble Hill - 225 St","synonyms":[]}},{"id":null,"name":{"value":"215 St","synonyms":[]}},{"id":null,"name":{"value":"207 St","synonyms":[]}},{"id":null,"name":{"value":"191 St","synonyms":[]}},{"id":null,"name":{"value":"168 St - Washington Hts","synonyms":[]}},{"id":null,"name":{"value":"157 St","synonyms":[]}},{"id":null,"name":{"value":"137 St - City College","synonyms":[]}},{"id":null,"name":{"value":"116 St - Columbia University","synonyms":[]}},{"id":null,"name":{"value":"Cathedral Pkwy","synonyms":[]}},{"id":null,"name":{"value":"66 St - Lincoln Center","synonyms":[]}},{"id":null,"name":{"value":"18 St","synonyms":[]}},{"id":null,"name":{"value":"Christopher St - Sheridan Sq","synonyms":[]}},{"id":null,"name":{"value":"Houston St","synonyms":[]}},{"id":null,"name":{"value":"Franklin St","synonyms":[]}},{"id":null,"name":{"value":"South Ferry Loop","synonyms":[]}},{"id":null,"name":{"value":"Wall St","synonyms":[]}},{"id":null,"name":{"value":"Clark St","synonyms":[]}},{"id":null,"name":{"value":"Borough Hall","synonyms":[]}},{"id":null,"name":{"value":"Hoyt St","synonyms":[]}},{"id":null,"name":{"value":"Nevins St","synonyms":[]}},{"id":null,"name":{"value":"Grand Army Plaza","synonyms":[]}},{"id":null,"name":{"value":"Eastern Pkwy - Brooklyn Museum","synonyms":[]}},{"id":null,"name":{"value":"Kingston Av","synonyms":[]}},{"id":null,"name":{"value":"Crown Hts - Utica Av","synonyms":[]}},{"id":null,"name":{"value":"Sutter Av - Rutland Rd","synonyms":[]}},{"id":null,"name":{"value":"Saratoga Av","synonyms":[]}},{"id":null,"name":{"value":"Junius St","synonyms":[]}},{"id":null,"name":{"value":"Pennsylvania Av","synonyms":[]}},{"id":null,"name":{"value":"President St","synonyms":[]}},{"id":null,"name":{"value":"Sterling St","synonyms":[]}},{"id":null,"name":{"value":"Winthrop St","synonyms":[]}},{"id":null,"name":{"value":"Beverly Rd","synonyms":[]}},{"id":null,"name":{"value":"Newkirk Av","synonyms":[]}},{"id":null,"name":{"value":"Flatbush Av - Brooklyn College","synonyms":[]}},{"id":null,"name":{"value":"Pelham Bay Park","synonyms":[]}},{"id":null,"name":{"value":"Buhre Av","synonyms":[]}},{"id":null,"name":{"value":"Middletown Rd","synonyms":[]}},{"id":null,"name":{"value":"Westchester Sq - E Tremont Av","synonyms":[]}},{"id":null,"name":{"value":"Zerega Av","synonyms":[]}},{"id":null,"name":{"value":"Castle Hill Av","synonyms":[]}},{"id":null,"name":{"value":"Parkchester","synonyms":[]}},{"id":null,"name":{"value":"St Lawrence Av","synonyms":[]}},{"id":null,"name":{"value":"Morrison Av- Sound View","synonyms":[]}},{"id":null,"name":{"value":"Elder Av","synonyms":[]}},{"id":null,"name":{"value":"Whitlock Av","synonyms":[]}},{"id":null,"name":{"value":"Hunts Point Av","synonyms":[]}},{"id":null,"name":{"value":"Longwood Av","synonyms":[]}},{"id":null,"name":{"value":"E 149 St","synonyms":[]}},{"id":null,"name":{"value":"E 143 St - St Mary's St","synonyms":[]}},{"id":null,"name":{"value":"Cypress Av","synonyms":[]}},{"id":null,"name":{"value":"Brook Av","synonyms":[]}},{"id":null,"name":{"value":"3 Av - 138 St","synonyms":[]}},{"id":null,"name":{"value":"Woodlawn","synonyms":[]}},{"id":null,"name":{"value":"Mosholu Pkwy","synonyms":[]}},{"id":null,"name":{"value":"Bedford Park Blvd - Lehman College","synonyms":[]}},{"id":null,"name":{"value":"183 St","synonyms":[]}},{"id":null,"name":{"value":"Burnside Av","synonyms":[]}},{"id":null,"name":{"value":"176 St","synonyms":[]}},{"id":null,"name":{"value":"Mt Eden Av","synonyms":[]}},{"id":null,"name":{"value":"149 St - Grand Concourse","synonyms":[]}},{"id":null,"name":{"value":"138 St - Grand Concourse","synonyms":[]}},{"id":null,"name":{"value":"110 St","synonyms":[]}},{"id":null,"name":{"value":"68 St - Hunter College","synonyms":[]}},{"id":null,"name":{"value":"51 St","synonyms":[]}},{"id":null,"name":{"value":"Grand Central - 42 St","synonyms":[]}},{"id":null,"name":{"value":"33 St","synonyms":[]}},{"id":null,"name":{"value":"Astor Pl","synonyms":[]}},{"id":null,"name":{"value":"Bleecker St","synonyms":[]}},{"id":null,"name":{"value":"Brooklyn Bridge - City Hall","synonyms":[]}},{"id":null,"name":{"value":"Bowling Green","synonyms":[]}},{"id":null,"name":{"value":"Wakefield - 241 St","synonyms":[]}},{"id":null,"name":{"value":"Nereid Av","synonyms":[]}},{"id":null,"name":{"value":"233 St","synonyms":[]}},{"id":null,"name":{"value":"225 St","synonyms":[]}},{"id":null,"name":{"value":"219 St","synonyms":[]}},{"id":null,"name":{"value":"Gun Hill Rd","synonyms":[]}},{"id":null,"name":{"value":"Burke Av","synonyms":[]}},{"id":null,"name":{"value":"Allerton Av","synonyms":[]}},{"id":null,"name":{"value":"Pelham Pkwy","synonyms":[]}},{"id":null,"name":{"value":"Bronx Park East","synonyms":[]}},{"id":null,"name":{"value":"E 180 St","synonyms":[]}},{"id":null,"name":{"value":"West Farms Sq - E Tremont Av","synonyms":[]}},{"id":null,"name":{"value":"174 St","synonyms":[]}},{"id":null,"name":{"value":"Freeman St","synonyms":[]}},{"id":null,"name":{"value":"Simpson St","synonyms":[]}},{"id":null,"name":{"value":"Intervale Av","synonyms":[]}},{"id":null,"name":{"value":"Jackson Av","synonyms":[]}},{"id":null,"name":{"value":"3 Av - 149 St","synonyms":[]}},{"id":null,"name":{"value":"Harlem - 148 St","synonyms":[]}},{"id":null,"name":{"value":"Central Park North (110 St)","synonyms":[]}},{"id":null,"name":{"value":"Eastchester - Dyre Av","synonyms":[]}},{"id":null,"name":{"value":"Baychester Av","synonyms":[]}},{"id":null,"name":{"value":"Morris Park","synonyms":[]}},{"id":null,"name":{"value":"Flushing - Main St","synonyms":[]}},{"id":null,"name":{"value":"Mets - Willets Point","synonyms":[]}},{"id":null,"name":{"value":"103 St - Corona Plaza","synonyms":[]}},{"id":null,"name":{"value":"Junction Blvd","synonyms":[]}},{"id":null,"name":{"value":"90 St - Elmhurst Av","synonyms":[]}},{"id":null,"name":{"value":"82 St - Jackson Hts","synonyms":[]}},{"id":null,"name":{"value":"74 St - Broadway","synonyms":[]}},{"id":null,"name":{"value":"69 St","synonyms":[]}},{"id":null,"name":{"value":"Woodside - 61 St","synonyms":[]}},{"id":null,"name":{"value":"52 St","synonyms":[]}},{"id":null,"name":{"value":"40 St","synonyms":[]}},{"id":null,"name":{"value":"Queensboro Plaza","synonyms":[]}},{"id":null,"name":{"value":"Hunters Point Av","synonyms":[]}},{"id":null,"name":{"value":"Vernon Blvd - Jackson Av","synonyms":[]}},{"id":null,"name":{"value":"5 Av","synonyms":[]}},{"id":null,"name":{"value":"34 St - 11 Av","synonyms":[]}},{"id":null,"name":{"value":"St George","synonyms":[]}},{"id":null,"name":{"value":"Tompkinsville","synonyms":[]}},{"id":null,"name":{"value":"Stapleton","synonyms":[]}},{"id":null,"name":{"value":"Clifton","synonyms":[]}},{"id":null,"name":{"value":"Grasmere","synonyms":[]}},{"id":null,"name":{"value":"Old Town","synonyms":[]}},{"id":null,"name":{"value":"Dongan Hills","synonyms":[]}},{"id":null,"name":{"value":"Jefferson Av","synonyms":[]}},{"id":null,"name":{"value":"Grant City","synonyms":[]}},{"id":null,"name":{"value":"New Dorp","synonyms":[]}},{"id":null,"name":{"value":"Oakwood Heights","synonyms":[]}},{"id":null,"name":{"value":"Bay Terrace","synonyms":[]}},{"id":null,"name":{"value":"Great Kills","synonyms":[]}},{"id":null,"name":{"value":"Eltingville","synonyms":[]}},{"id":null,"name":{"value":"Annadale","synonyms":[]}},{"id":null,"name":{"value":"Huguenot","synonyms":[]}},{"id":null,"name":{"value":"Prince's Bay","synonyms":[]}},{"id":null,"name":{"value":"Pleasant Plains","synonyms":[]}},{"id":null,"name":{"value":"Richmond Valley","synonyms":[]}},{"id":null,"name":{"value":"Tottenville","synonyms":[]}},{"id":null,"name":{"value":"Arthur Kill","synonyms":[]}}] \ No newline at end of file diff --git a/data/slots/subway-lines.json b/data/slots/subway-lines.json new file mode 100644 index 0000000..6ce11dd --- /dev/null +++ b/data/slots/subway-lines.json @@ -0,0 +1 @@ +[{"id":"1","name":{"value":"1","synonyms":[]}},{"id":"2","name":{"value":"2","synonyms":[]}},{"id":"3","name":{"value":"3","synonyms":[]}},{"id":"4","name":{"value":"4","synonyms":[]}},{"id":"5","name":{"value":"5","synonyms":[]}},{"id":"6","name":{"value":"6","synonyms":[]}},{"id":"7","name":{"value":"7","synonyms":[]}},{"id":"A","name":{"value":"A","synonyms":["alpha"]}},{"id":"C","name":{"value":"C","synonyms":["charlie"]}},{"id":"E","name":{"value":"E","synonyms":["echo"]}},{"id":"N","name":{"value":"N","synonyms":["november"]}},{"id":"Q","name":{"value":"Q","synonyms":["quebec"]}},{"id":"R","name":{"value":"R","synonyms":["romeo"]}},{"id":"W","name":{"value":"W","synonyms":["whiskey"]}},{"id":"B","name":{"value":"B","synonyms":["bravo"]}},{"id":"D","name":{"value":"D","synonyms":["delta"]}},{"id":"F","name":{"value":"F","synonyms":["foxtrot"]}},{"id":"M","name":{"value":"M","synonyms":["mike"]}},{"id":"L","name":{"value":"L","synonyms":["lima"]}},{"id":"G","name":{"value":"G","synonyms":["golf"]}},{"id":"S","name":{"value":"S","synonyms":["sierra","singapore"]}},{"id":"J","name":{"value":"J","synonyms":["juliet"]}},{"id":"Z","name":{"value":"Z","synonyms":["zulu"]}},{"id":"SIR","name":{"value":"SIR","synonyms":[]}}] \ No newline at end of file diff --git a/data/subway-stops.json b/data/subway-stops.json new file mode 100644 index 0000000..96cc1d0 --- /dev/null +++ b/data/subway-stops.json @@ -0,0 +1,495 @@ +[ +{"Station ID":"001","Complex ID":"001","GTFS Stop ID":"R01","Division":"BMT","Line":"Astoria","Stop Name":"Astoria - Ditmars Blvd","Borough":"Q","Daytime Routes":"N W","Structure":"Elevated","GTFS Latitude":"40.775036","GTFS Longitude":"-73.912034"}, +{"Station ID":"002","Complex ID":"002","GTFS Stop ID":"R03","Division":"BMT","Line":"Astoria","Stop Name":"Astoria Blvd","Borough":"Q","Daytime Routes":"N W","Structure":"Elevated","GTFS Latitude":"40.770258","GTFS Longitude":"-73.917843"}, +{"Station ID":"003","Complex ID":"003","GTFS Stop ID":"R04","Division":"BMT","Line":"Astoria","Stop Name":"30 Av","Borough":"Q","Daytime Routes":"N W","Structure":"Elevated","GTFS Latitude":"40.766779","GTFS Longitude":"-73.921479"}, +{"Station ID":"004","Complex ID":"004","GTFS Stop ID":"R05","Division":"BMT","Line":"Astoria","Stop Name":"Broadway","Borough":"Q","Daytime Routes":"N W","Structure":"Elevated","GTFS Latitude":"40.76182","GTFS Longitude":"-73.925508"}, +{"Station ID":"005","Complex ID":"005","GTFS Stop ID":"R06","Division":"BMT","Line":"Astoria","Stop Name":"36 Av","Borough":"Q","Daytime Routes":"N W","Structure":"Elevated","GTFS Latitude":"40.756804","GTFS Longitude":"-73.929575"}, +{"Station ID":"006","Complex ID":"006","GTFS Stop ID":"R08","Division":"BMT","Line":"Astoria","Stop Name":"39 Av","Borough":"Q","Daytime Routes":"N W","Structure":"Elevated","GTFS Latitude":"40.752882","GTFS Longitude":"-73.932755"}, +{"Station ID":"007","Complex ID":"613","GTFS Stop ID":"R11","Division":"BMT","Line":"Astoria","Stop Name":"Lexington Av/59 St","Borough":"M","Daytime Routes":"N W R","Structure":"Subway","GTFS Latitude":"40.76266","GTFS Longitude":"-73.967258"}, +{"Station ID":"008","Complex ID":"008","GTFS Stop ID":"R13","Division":"BMT","Line":"Astoria","Stop Name":"5 Av/59 St","Borough":"M","Daytime Routes":"N W R","Structure":"Subway","GTFS Latitude":"40.764811","GTFS Longitude":"-73.973347"}, +{"Station ID":"009","Complex ID":"009","GTFS Stop ID":"R14","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"57 St - 7 Av","Borough":"M","Daytime Routes":"N Q R W","Structure":"Subway","GTFS Latitude":"40.764664","GTFS Longitude":"-73.980658"}, +{"Station ID":"010","Complex ID":"010","GTFS Stop ID":"R15","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"49 St","Borough":"M","Daytime Routes":"N R W","Structure":"Subway","GTFS Latitude":"40.759901","GTFS Longitude":"-73.984139"}, +{"Station ID":"011","Complex ID":"611","GTFS Stop ID":"R16","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Times Sq - 42 St","Borough":"M","Daytime Routes":"N Q R W","Structure":"Subway","GTFS Latitude":"40.754672","GTFS Longitude":"-73.986754"}, +{"Station ID":"012","Complex ID":"607","GTFS Stop ID":"R17","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"34 St - Herald Sq","Borough":"M","Daytime Routes":"N Q R W","Structure":"Subway","GTFS Latitude":"40.749567","GTFS Longitude":"-73.98795"}, +{"Station ID":"013","Complex ID":"013","GTFS Stop ID":"R18","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"28 St","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.745494","GTFS Longitude":"-73.988691"}, +{"Station ID":"014","Complex ID":"014","GTFS Stop ID":"R19","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"23 St","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.741303","GTFS Longitude":"-73.989344"}, +{"Station ID":"015","Complex ID":"602","GTFS Stop ID":"R20","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"14 St - Union Sq","Borough":"M","Daytime Routes":"N Q R W","Structure":"Subway","GTFS Latitude":"40.735736","GTFS Longitude":"-73.990568"}, +{"Station ID":"016","Complex ID":"016","GTFS Stop ID":"R21","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"8 St - NYU","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.730328","GTFS Longitude":"-73.992629"}, +{"Station ID":"017","Complex ID":"017","GTFS Stop ID":"R22","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Prince St","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.724329","GTFS Longitude":"-73.997702"}, +{"Station ID":"018","Complex ID":"623","GTFS Stop ID":"R23","Division":"BMT","Line":"Broadway","Stop Name":"Canal St","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.719527","GTFS Longitude":"-74.001775"}, +{"Station ID":"019","Complex ID":"623","GTFS Stop ID":"Q01","Division":"BMT","Line":"Manhattan Bridge","Stop Name":"Canal St","Borough":"M","Daytime Routes":"N Q","Structure":"Subway","GTFS Latitude":"40.718383","GTFS Longitude":"-74.00046"}, +{"Station ID":"020","Complex ID":"020","GTFS Stop ID":"R24","Division":"BMT","Line":"Broadway","Stop Name":"City Hall","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.713282","GTFS Longitude":"-74.006978"}, +{"Station ID":"021","Complex ID":"021","GTFS Stop ID":"R25","Division":"BMT","Line":"Broadway","Stop Name":"Cortlandt St","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.710668","GTFS Longitude":"-74.011029"}, +{"Station ID":"022","Complex ID":"022","GTFS Stop ID":"R26","Division":"BMT","Line":"Broadway","Stop Name":"Rector St","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.70722","GTFS Longitude":"-74.013342"}, +{"Station ID":"023","Complex ID":"635","GTFS Stop ID":"R27","Division":"BMT","Line":"Broadway","Stop Name":"Whitehall St","Borough":"M","Daytime Routes":"R W","Structure":"Subway","GTFS Latitude":"40.703087","GTFS Longitude":"-74.012994"}, +{"Station ID":"024","Complex ID":"620","GTFS Stop ID":"R28","Division":"BMT","Line":"Broadway","Stop Name":"Court St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.6941","GTFS Longitude":"-73.991777"}, +{"Station ID":"025","Complex ID":"636","GTFS Stop ID":"R29","Division":"BMT","Line":"Broadway","Stop Name":"Jay St - MetroTech","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.69218","GTFS Longitude":"-73.985942"}, +{"Station ID":"026","Complex ID":"026","GTFS Stop ID":"R30","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"DeKalb Av","Borough":"Bk","Daytime Routes":"B Q R","Structure":"Subway","GTFS Latitude":"40.690635","GTFS Longitude":"-73.981824"}, +{"Station ID":"027","Complex ID":"617","GTFS Stop ID":"R31","Division":"BMT","Line":"4th Av","Stop Name":"Atlantic Av - Barclays Ctr","Borough":"Bk","Daytime Routes":"D N R","Structure":"Subway","GTFS Latitude":"40.683666","GTFS Longitude":"-73.97881"}, +{"Station ID":"028","Complex ID":"028","GTFS Stop ID":"R32","Division":"BMT","Line":"4th Av","Stop Name":"Union St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.677316","GTFS Longitude":"-73.98311"}, +{"Station ID":"029","Complex ID":"608","GTFS Stop ID":"R33","Division":"BMT","Line":"4th Av","Stop Name":"9 St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.670847","GTFS Longitude":"-73.988302"}, +{"Station ID":"030","Complex ID":"030","GTFS Stop ID":"R34","Division":"BMT","Line":"4th Av","Stop Name":"Prospect Av","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.665414","GTFS Longitude":"-73.992872"}, +{"Station ID":"031","Complex ID":"031","GTFS Stop ID":"R35","Division":"BMT","Line":"4th Av","Stop Name":"25 St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.660397","GTFS Longitude":"-73.998091"}, +{"Station ID":"032","Complex ID":"032","GTFS Stop ID":"R36","Division":"BMT","Line":"4th Av","Stop Name":"36 St","Borough":"Bk","Daytime Routes":"D N R","Structure":"Subway","GTFS Latitude":"40.655144","GTFS Longitude":"-74.003549"}, +{"Station ID":"033","Complex ID":"033","GTFS Stop ID":"R39","Division":"BMT","Line":"4th Av","Stop Name":"45 St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.648939","GTFS Longitude":"-74.010006"}, +{"Station ID":"034","Complex ID":"034","GTFS Stop ID":"R40","Division":"BMT","Line":"4th Av","Stop Name":"53 St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.645069","GTFS Longitude":"-74.014034"}, +{"Station ID":"035","Complex ID":"035","GTFS Stop ID":"R41","Division":"BMT","Line":"4th Av","Stop Name":"59 St","Borough":"Bk","Daytime Routes":"N R","Structure":"Subway","GTFS Latitude":"40.641362","GTFS Longitude":"-74.017881"}, +{"Station ID":"036","Complex ID":"036","GTFS Stop ID":"R42","Division":"BMT","Line":"4th Av","Stop Name":"Bay Ridge Av","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.634967","GTFS Longitude":"-74.023377"}, +{"Station ID":"037","Complex ID":"037","GTFS Stop ID":"R43","Division":"BMT","Line":"4th Av","Stop Name":"77 St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.629742","GTFS Longitude":"-74.02551"}, +{"Station ID":"038","Complex ID":"038","GTFS Stop ID":"R44","Division":"BMT","Line":"4th Av","Stop Name":"86 St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.622687","GTFS Longitude":"-74.028398"}, +{"Station ID":"039","Complex ID":"039","GTFS Stop ID":"R45","Division":"BMT","Line":"4th Av","Stop Name":"Bay Ridge - 95 St","Borough":"Bk","Daytime Routes":"R","Structure":"Subway","GTFS Latitude":"40.616622","GTFS Longitude":"-74.030876"}, +{"Station ID":"040","Complex ID":"617","GTFS Stop ID":"D24","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Atlantic Av - Barclays Ctr","Borough":"Bk","Daytime Routes":"B Q","Structure":"Subway","GTFS Latitude":"40.68446","GTFS Longitude":"-73.97689"}, +{"Station ID":"041","Complex ID":"041","GTFS Stop ID":"D25","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"7 Av","Borough":"Bk","Daytime Routes":"B Q","Structure":"Subway","GTFS Latitude":"40.67705","GTFS Longitude":"-73.972367"}, +{"Station ID":"042","Complex ID":"042","GTFS Stop ID":"D26","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Prospect Park","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.661614","GTFS Longitude":"-73.962246"}, +{"Station ID":"043","Complex ID":"043","GTFS Stop ID":"D27","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Parkside Av","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.655292","GTFS Longitude":"-73.961495"}, +{"Station ID":"044","Complex ID":"044","GTFS Stop ID":"D28","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Church Av","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.650527","GTFS Longitude":"-73.962982"}, +{"Station ID":"045","Complex ID":"045","GTFS Stop ID":"D29","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Beverley Rd","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.644031","GTFS Longitude":"-73.964492"}, +{"Station ID":"046","Complex ID":"046","GTFS Stop ID":"D30","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Cortelyou Rd","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.640927","GTFS Longitude":"-73.963891"}, +{"Station ID":"047","Complex ID":"047","GTFS Stop ID":"D31","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Newkirk Plaza","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.635082","GTFS Longitude":"-73.962793"}, +{"Station ID":"048","Complex ID":"048","GTFS Stop ID":"D32","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Avenue H","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.62927","GTFS Longitude":"-73.961639"}, +{"Station ID":"049","Complex ID":"049","GTFS Stop ID":"D33","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Avenue J","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.625039","GTFS Longitude":"-73.960803"}, +{"Station ID":"050","Complex ID":"050","GTFS Stop ID":"D34","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Avenue M","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.617618","GTFS Longitude":"-73.959399"}, +{"Station ID":"051","Complex ID":"051","GTFS Stop ID":"D35","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Kings Hwy","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.60867","GTFS Longitude":"-73.957734"}, +{"Station ID":"052","Complex ID":"052","GTFS Stop ID":"D37","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Avenue U","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.5993","GTFS Longitude":"-73.955929"}, +{"Station ID":"053","Complex ID":"053","GTFS Stop ID":"D38","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Neck Rd","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.595246","GTFS Longitude":"-73.955161"}, +{"Station ID":"054","Complex ID":"054","GTFS Stop ID":"D39","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Sheepshead Bay","Borough":"Bk","Daytime Routes":"B Q","Structure":"Open Cut","GTFS Latitude":"40.586896","GTFS Longitude":"-73.954155"}, +{"Station ID":"055","Complex ID":"055","GTFS Stop ID":"D40","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Brighton Beach","Borough":"Bk","Daytime Routes":"B Q","Structure":"Elevated","GTFS Latitude":"40.577621","GTFS Longitude":"-73.961376"}, +{"Station ID":"056","Complex ID":"056","GTFS Stop ID":"D41","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"Ocean Pkwy","Borough":"Bk","Daytime Routes":"Q","Structure":"Elevated","GTFS Latitude":"40.576312","GTFS Longitude":"-73.968501"}, +{"Station ID":"057","Complex ID":"057","GTFS Stop ID":"D42","Division":"BMT","Line":"Broadway - Brighton","Stop Name":"W 8 St - NY Aquarium","Borough":"Bk","Daytime Routes":"F Q","Structure":"Elevated","GTFS Latitude":"40.576127","GTFS Longitude":"-73.975939"}, +{"Station ID":"058","Complex ID":"058","GTFS Stop ID":"D43","Division":"BMT","Line":"Sea Beach / West End / Culver / Brighton","Stop Name":"Coney Island - Stillwell Av","Borough":"Bk","Daytime Routes":"D F N Q","Structure":"Viaduct","GTFS Latitude":"40.577422","GTFS Longitude":"-73.981233"}, +{"Station ID":"059","Complex ID":"059","GTFS Stop ID":"B12","Division":"BMT","Line":"West End","Stop Name":"9 Av","Borough":"Bk","Daytime Routes":"D","Structure":"Open Cut","GTFS Latitude":"40.646292","GTFS Longitude":"-73.994324"}, +{"Station ID":"060","Complex ID":"060","GTFS Stop ID":"B13","Division":"BMT","Line":"West End","Stop Name":"Fort Hamilton Pkwy","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.640914","GTFS Longitude":"-73.994304"}, +{"Station ID":"061","Complex ID":"061","GTFS Stop ID":"B14","Division":"BMT","Line":"West End","Stop Name":"50 St","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.63626","GTFS Longitude":"-73.994791"}, +{"Station ID":"062","Complex ID":"062","GTFS Stop ID":"B15","Division":"BMT","Line":"West End","Stop Name":"55 St","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.631435","GTFS Longitude":"-73.995476"}, +{"Station ID":"063","Complex ID":"615","GTFS Stop ID":"B16","Division":"BMT","Line":"West End","Stop Name":"62 St","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.626472","GTFS Longitude":"-73.996895"}, +{"Station ID":"064","Complex ID":"064","GTFS Stop ID":"B17","Division":"BMT","Line":"West End","Stop Name":"71 St","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.619589","GTFS Longitude":"-73.998864"}, +{"Station ID":"065","Complex ID":"065","GTFS Stop ID":"B18","Division":"BMT","Line":"West End","Stop Name":"79 St","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.613501","GTFS Longitude":"-74.00061"}, +{"Station ID":"066","Complex ID":"066","GTFS Stop ID":"B19","Division":"BMT","Line":"West End","Stop Name":"18 Av","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.607954","GTFS Longitude":"-74.001736"}, +{"Station ID":"067","Complex ID":"067","GTFS Stop ID":"B20","Division":"BMT","Line":"West End","Stop Name":"20 Av","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.604556","GTFS Longitude":"-73.998168"}, +{"Station ID":"068","Complex ID":"068","GTFS Stop ID":"B21","Division":"BMT","Line":"West End","Stop Name":"Bay Pkwy","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.601875","GTFS Longitude":"-73.993728"}, +{"Station ID":"069","Complex ID":"069","GTFS Stop ID":"B22","Division":"BMT","Line":"West End","Stop Name":"25 Av","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.597704","GTFS Longitude":"-73.986829"}, +{"Station ID":"070","Complex ID":"070","GTFS Stop ID":"B23","Division":"BMT","Line":"West End","Stop Name":"Bay 50 St","Borough":"Bk","Daytime Routes":"D","Structure":"Elevated","GTFS Latitude":"40.588841","GTFS Longitude":"-73.983765"}, +{"Station ID":"071","Complex ID":"071","GTFS Stop ID":"N02","Division":"BMT","Line":"Sea Beach","Stop Name":"8 Av","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.635064","GTFS Longitude":"-74.011719"}, +{"Station ID":"072","Complex ID":"072","GTFS Stop ID":"N03","Division":"BMT","Line":"Sea Beach","Stop Name":"Fort Hamilton Pkwy","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.631386","GTFS Longitude":"-74.005351"}, +{"Station ID":"073","Complex ID":"615","GTFS Stop ID":"N04","Division":"BMT","Line":"Sea Beach","Stop Name":"New Utrecht Av","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.624842","GTFS Longitude":"-73.996353"}, +{"Station ID":"074","Complex ID":"074","GTFS Stop ID":"N05","Division":"BMT","Line":"Sea Beach","Stop Name":"18 Av","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.620671","GTFS Longitude":"-73.990414"}, +{"Station ID":"075","Complex ID":"075","GTFS Stop ID":"N06","Division":"BMT","Line":"Sea Beach","Stop Name":"20 Av","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.61741","GTFS Longitude":"-73.985026"}, +{"Station ID":"076","Complex ID":"076","GTFS Stop ID":"N07","Division":"BMT","Line":"Sea Beach","Stop Name":"Bay Pkwy","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.611815","GTFS Longitude":"-73.981848"}, +{"Station ID":"077","Complex ID":"077","GTFS Stop ID":"N08","Division":"BMT","Line":"Sea Beach","Stop Name":"Kings Hwy","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.603923","GTFS Longitude":"-73.980353"}, +{"Station ID":"078","Complex ID":"078","GTFS Stop ID":"N09","Division":"BMT","Line":"Sea Beach","Stop Name":"Avenue U","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.597473","GTFS Longitude":"-73.979137"}, +{"Station ID":"079","Complex ID":"079","GTFS Stop ID":"N10","Division":"BMT","Line":"Sea Beach","Stop Name":"86 St","Borough":"Bk","Daytime Routes":"N","Structure":"Open Cut","GTFS Latitude":"40.592721","GTFS Longitude":"-73.97823"}, +{"Station ID":"080","Complex ID":"080","GTFS Stop ID":"J12","Division":"BMT","Line":"Jamaica","Stop Name":"121 St","Borough":"Q","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.700492","GTFS Longitude":"-73.828294"}, +{"Station ID":"081","Complex ID":"081","GTFS Stop ID":"J13","Division":"BMT","Line":"Jamaica","Stop Name":"111 St","Borough":"Q","Daytime Routes":"J","Structure":"Elevated","GTFS Latitude":"40.697418","GTFS Longitude":"-73.836345"}, +{"Station ID":"082","Complex ID":"082","GTFS Stop ID":"J14","Division":"BMT","Line":"Jamaica","Stop Name":"104 St","Borough":"Q","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.695178","GTFS Longitude":"-73.84433"}, +{"Station ID":"083","Complex ID":"083","GTFS Stop ID":"J15","Division":"BMT","Line":"Jamaica","Stop Name":"Woodhaven Blvd","Borough":"Q","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.693879","GTFS Longitude":"-73.851576"}, +{"Station ID":"084","Complex ID":"084","GTFS Stop ID":"J16","Division":"BMT","Line":"Jamaica","Stop Name":"85 St - Forest Pkwy","Borough":"Q","Daytime Routes":"J","Structure":"Elevated","GTFS Latitude":"40.692435","GTFS Longitude":"-73.86001"}, +{"Station ID":"085","Complex ID":"085","GTFS Stop ID":"J17","Division":"BMT","Line":"Jamaica","Stop Name":"75 St","Borough":"Q","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.691324","GTFS Longitude":"-73.867139"}, +{"Station ID":"086","Complex ID":"086","GTFS Stop ID":"J19","Division":"BMT","Line":"Jamaica","Stop Name":"Cypress Hills","Borough":"Bk","Daytime Routes":"J","Structure":"Elevated","GTFS Latitude":"40.689941","GTFS Longitude":"-73.87255"}, +{"Station ID":"087","Complex ID":"087","GTFS Stop ID":"J20","Division":"BMT","Line":"Jamaica","Stop Name":"Crescent St","Borough":"Bk","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.683194","GTFS Longitude":"-73.873785"}, +{"Station ID":"088","Complex ID":"088","GTFS Stop ID":"J21","Division":"BMT","Line":"Jamaica","Stop Name":"Norwood Av","Borough":"Bk","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.68141","GTFS Longitude":"-73.880039"}, +{"Station ID":"089","Complex ID":"089","GTFS Stop ID":"J22","Division":"BMT","Line":"Jamaica","Stop Name":"Cleveland St","Borough":"Bk","Daytime Routes":"J","Structure":"Elevated","GTFS Latitude":"40.679947","GTFS Longitude":"-73.884639"}, +{"Station ID":"090","Complex ID":"090","GTFS Stop ID":"J23","Division":"BMT","Line":"Jamaica","Stop Name":"Van Siclen Av","Borough":"Bk","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.678024","GTFS Longitude":"-73.891688"}, +{"Station ID":"091","Complex ID":"091","GTFS Stop ID":"J24","Division":"BMT","Line":"Jamaica","Stop Name":"Alabama Av","Borough":"Bk","Daytime Routes":"J","Structure":"Elevated","GTFS Latitude":"40.676992","GTFS Longitude":"-73.898654"}, +{"Station ID":"092","Complex ID":"621","GTFS Stop ID":"J27","Division":"BMT","Line":"Jamaica","Stop Name":"Broadway Jct","Borough":"Bk","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.679498","GTFS Longitude":"-73.904512"}, +{"Station ID":"093","Complex ID":"093","GTFS Stop ID":"J28","Division":"BMT","Line":"Jamaica","Stop Name":"Chauncey St","Borough":"Bk","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.682893","GTFS Longitude":"-73.910456"}, +{"Station ID":"094","Complex ID":"094","GTFS Stop ID":"J29","Division":"BMT","Line":"Jamaica","Stop Name":"Halsey St","Borough":"Bk","Daytime Routes":"J","Structure":"Elevated","GTFS Latitude":"40.68637","GTFS Longitude":"-73.916559"}, +{"Station ID":"095","Complex ID":"095","GTFS Stop ID":"J30","Division":"BMT","Line":"Jamaica","Stop Name":"Gates Av","Borough":"Bk","Daytime Routes":"J Z","Structure":"Elevated","GTFS Latitude":"40.68963","GTFS Longitude":"-73.92227"}, +{"Station ID":"096","Complex ID":"096","GTFS Stop ID":"J31","Division":"BMT","Line":"Jamaica","Stop Name":"Kosciuszko St","Borough":"Bk","Daytime Routes":"J","Structure":"Elevated","GTFS Latitude":"40.693342","GTFS Longitude":"-73.928814"}, +{"Station ID":"097","Complex ID":"097","GTFS Stop ID":"M11","Division":"BMT","Line":"Jamaica","Stop Name":"Myrtle Av","Borough":"Bk","Daytime Routes":"J M Z","Structure":"Elevated","GTFS Latitude":"40.697207","GTFS Longitude":"-73.935657"}, +{"Station ID":"098","Complex ID":"098","GTFS Stop ID":"M12","Division":"BMT","Line":"Jamaica","Stop Name":"Flushing Av","Borough":"Bk","Daytime Routes":"J M","Structure":"Elevated","GTFS Latitude":"40.70026","GTFS Longitude":"-73.941126"}, +{"Station ID":"099","Complex ID":"099","GTFS Stop ID":"M13","Division":"BMT","Line":"Jamaica","Stop Name":"Lorimer St","Borough":"Bk","Daytime Routes":"J M","Structure":"Elevated","GTFS Latitude":"40.703869","GTFS Longitude":"-73.947408"}, +{"Station ID":"100","Complex ID":"100","GTFS Stop ID":"M14","Division":"BMT","Line":"Jamaica","Stop Name":"Hewes St","Borough":"Bk","Daytime Routes":"J M","Structure":"Elevated","GTFS Latitude":"40.70687","GTFS Longitude":"-73.953431"}, +{"Station ID":"101","Complex ID":"101","GTFS Stop ID":"M16","Division":"BMT","Line":"Jamaica","Stop Name":"Marcy Av","Borough":"Bk","Daytime Routes":"J M Z","Structure":"Elevated","GTFS Latitude":"40.708359","GTFS Longitude":"-73.957757"}, +{"Station ID":"102","Complex ID":"625","GTFS Stop ID":"M18","Division":"BMT","Line":"Jamaica","Stop Name":"Essex St","Borough":"M","Daytime Routes":"J M Z","Structure":"Subway","GTFS Latitude":"40.718315","GTFS Longitude":"-73.987437"}, +{"Station ID":"103","Complex ID":"103","GTFS Stop ID":"M19","Division":"BMT","Line":"Jamaica","Stop Name":"Bowery","Borough":"M","Daytime Routes":"J Z","Structure":"Subway","GTFS Latitude":"40.72028","GTFS Longitude":"-73.993915"}, +{"Station ID":"104","Complex ID":"623","GTFS Stop ID":"M20","Division":"BMT","Line":"Jamaica","Stop Name":"Canal St","Borough":"M","Daytime Routes":"J Z","Structure":"Subway","GTFS Latitude":"40.718092","GTFS Longitude":"-73.999892"}, +{"Station ID":"105","Complex ID":"622","GTFS Stop ID":"M21","Division":"BMT","Line":"Jamaica","Stop Name":"Chambers St","Borough":"M","Daytime Routes":"J Z","Structure":"Subway","GTFS Latitude":"40.713243","GTFS Longitude":"-74.003401"}, +{"Station ID":"106","Complex ID":"628","GTFS Stop ID":"M22","Division":"BMT","Line":"Jamaica","Stop Name":"Fulton St","Borough":"M","Daytime Routes":"J Z","Structure":"Subway","GTFS Latitude":"40.710374","GTFS Longitude":"-74.007582"}, +{"Station ID":"107","Complex ID":"107","GTFS Stop ID":"M23","Division":"BMT","Line":"Jamaica","Stop Name":"Broad St","Borough":"M","Daytime Routes":"J Z","Structure":"Subway","GTFS Latitude":"40.706476","GTFS Longitude":"-74.011056"}, +{"Station ID":"108","Complex ID":"108","GTFS Stop ID":"M01","Division":"BMT","Line":"Myrtle Av","Stop Name":"Middle Village - Metropolitan Av","Borough":"Q","Daytime Routes":"M","Structure":"Elevated","GTFS Latitude":"40.711396","GTFS Longitude":"-73.889601"}, +{"Station ID":"109","Complex ID":"109","GTFS Stop ID":"M04","Division":"BMT","Line":"Myrtle Av","Stop Name":"Fresh Pond Rd","Borough":"Q","Daytime Routes":"M","Structure":"Elevated","GTFS Latitude":"40.706186","GTFS Longitude":"-73.895877"}, +{"Station ID":"110","Complex ID":"110","GTFS Stop ID":"M05","Division":"BMT","Line":"Myrtle Av","Stop Name":"Forest Av","Borough":"Q","Daytime Routes":"M","Structure":"Elevated","GTFS Latitude":"40.704423","GTFS Longitude":"-73.903077"}, +{"Station ID":"111","Complex ID":"111","GTFS Stop ID":"M06","Division":"BMT","Line":"Myrtle Av","Stop Name":"Seneca Av","Borough":"Q","Daytime Routes":"M","Structure":"Elevated","GTFS Latitude":"40.702762","GTFS Longitude":"-73.90774"}, +{"Station ID":"112","Complex ID":"630","GTFS Stop ID":"M08","Division":"BMT","Line":"Myrtle Av","Stop Name":"Myrtle - Wyckoff Avs","Borough":"Bk","Daytime Routes":"M","Structure":"Elevated","GTFS Latitude":"40.69943","GTFS Longitude":"-73.912385"}, +{"Station ID":"113","Complex ID":"113","GTFS Stop ID":"M09","Division":"BMT","Line":"Myrtle Av","Stop Name":"Knickerbocker Av","Borough":"Bk","Daytime Routes":"M","Structure":"Elevated","GTFS Latitude":"40.698664","GTFS Longitude":"-73.919711"}, +{"Station ID":"114","Complex ID":"114","GTFS Stop ID":"M10","Division":"BMT","Line":"Myrtle Av","Stop Name":"Central Av","Borough":"Bk","Daytime Routes":"M","Structure":"Elevated","GTFS Latitude":"40.697857","GTFS Longitude":"-73.927397"}, +{"Station ID":"115","Complex ID":"618","GTFS Stop ID":"L01","Division":"BMT","Line":"Canarsie","Stop Name":"8 Av","Borough":"M","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.739777","GTFS Longitude":"-74.002578"}, +{"Station ID":"116","Complex ID":"601","GTFS Stop ID":"L02","Division":"BMT","Line":"Canarsie","Stop Name":"6 Av","Borough":"M","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.737335","GTFS Longitude":"-73.996786"}, +{"Station ID":"117","Complex ID":"602","GTFS Stop ID":"L03","Division":"BMT","Line":"Canarsie","Stop Name":"Union Sq - 14 St","Borough":"M","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.734789","GTFS Longitude":"-73.99073"}, +{"Station ID":"118","Complex ID":"118","GTFS Stop ID":"L05","Division":"BMT","Line":"Canarsie","Stop Name":"3 Av","Borough":"M","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.732849","GTFS Longitude":"-73.986122"}, +{"Station ID":"119","Complex ID":"119","GTFS Stop ID":"L06","Division":"BMT","Line":"Canarsie","Stop Name":"1 Av","Borough":"M","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.730953","GTFS Longitude":"-73.981628"}, +{"Station ID":"120","Complex ID":"120","GTFS Stop ID":"L08","Division":"BMT","Line":"Canarsie","Stop Name":"Bedford Av","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.717304","GTFS Longitude":"-73.956872"}, +{"Station ID":"121","Complex ID":"629","GTFS Stop ID":"L10","Division":"BMT","Line":"Canarsie","Stop Name":"Lorimer St","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.714063","GTFS Longitude":"-73.950275"}, +{"Station ID":"122","Complex ID":"122","GTFS Stop ID":"L11","Division":"BMT","Line":"Canarsie","Stop Name":"Graham Av","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.714565","GTFS Longitude":"-73.944053"}, +{"Station ID":"123","Complex ID":"123","GTFS Stop ID":"L12","Division":"BMT","Line":"Canarsie","Stop Name":"Grand St","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.711926","GTFS Longitude":"-73.94067"}, +{"Station ID":"124","Complex ID":"124","GTFS Stop ID":"L13","Division":"BMT","Line":"Canarsie","Stop Name":"Montrose Av","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.707739","GTFS Longitude":"-73.93985"}, +{"Station ID":"125","Complex ID":"125","GTFS Stop ID":"L14","Division":"BMT","Line":"Canarsie","Stop Name":"Morgan Av","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.706152","GTFS Longitude":"-73.933147"}, +{"Station ID":"126","Complex ID":"126","GTFS Stop ID":"L15","Division":"BMT","Line":"Canarsie","Stop Name":"Jefferson St","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.706607","GTFS Longitude":"-73.922913"}, +{"Station ID":"127","Complex ID":"127","GTFS Stop ID":"L16","Division":"BMT","Line":"Canarsie","Stop Name":"DeKalb Av","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.703811","GTFS Longitude":"-73.918425"}, +{"Station ID":"128","Complex ID":"630","GTFS Stop ID":"L17","Division":"BMT","Line":"Canarsie","Stop Name":"Myrtle - Wyckoff Avs","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.699814","GTFS Longitude":"-73.911586"}, +{"Station ID":"129","Complex ID":"129","GTFS Stop ID":"L19","Division":"BMT","Line":"Canarsie","Stop Name":"Halsey St","Borough":"Q","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.695602","GTFS Longitude":"-73.904084"}, +{"Station ID":"130","Complex ID":"130","GTFS Stop ID":"L20","Division":"BMT","Line":"Canarsie","Stop Name":"Wilson Av","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.688764","GTFS Longitude":"-73.904046"}, +{"Station ID":"131","Complex ID":"131","GTFS Stop ID":"L21","Division":"BMT","Line":"Canarsie","Stop Name":"Bushwick Av - Aberdeen St","Borough":"Bk","Daytime Routes":"L","Structure":"Subway","GTFS Latitude":"40.682829","GTFS Longitude":"-73.905249"}, +{"Station ID":"132","Complex ID":"621","GTFS Stop ID":"L22","Division":"BMT","Line":"Canarsie","Stop Name":"Broadway Jct","Borough":"Bk","Daytime Routes":"L","Structure":"Elevated","GTFS Latitude":"40.678856","GTFS Longitude":"-73.90324"}, +{"Station ID":"133","Complex ID":"133","GTFS Stop ID":"L24","Division":"BMT","Line":"Canarsie","Stop Name":"Atlantic Av","Borough":"Bk","Daytime Routes":"L","Structure":"Elevated","GTFS Latitude":"40.675345","GTFS Longitude":"-73.903097"}, +{"Station ID":"134","Complex ID":"134","GTFS Stop ID":"L25","Division":"BMT","Line":"Canarsie","Stop Name":"Sutter Av","Borough":"Bk","Daytime Routes":"L","Structure":"Elevated","GTFS Latitude":"40.669367","GTFS Longitude":"-73.901975"}, +{"Station ID":"135","Complex ID":"135","GTFS Stop ID":"L26","Division":"BMT","Line":"Canarsie","Stop Name":"Livonia Av","Borough":"Bk","Daytime Routes":"L","Structure":"Elevated","GTFS Latitude":"40.664038","GTFS Longitude":"-73.900571"}, +{"Station ID":"136","Complex ID":"136","GTFS Stop ID":"L27","Division":"BMT","Line":"Canarsie","Stop Name":"New Lots Av","Borough":"Bk","Daytime Routes":"L","Structure":"Elevated","GTFS Latitude":"40.658733","GTFS Longitude":"-73.899232"}, +{"Station ID":"137","Complex ID":"137","GTFS Stop ID":"L28","Division":"BMT","Line":"Canarsie","Stop Name":"E 105 St","Borough":"Bk","Daytime Routes":"L","Structure":"At Grade","GTFS Latitude":"40.650573","GTFS Longitude":"-73.899485"}, +{"Station ID":"138","Complex ID":"138","GTFS Stop ID":"L29","Division":"BMT","Line":"Canarsie","Stop Name":"Canarsie - Rockaway Pkwy","Borough":"Bk","Daytime Routes":"L","Structure":"At Grade","GTFS Latitude":"40.646654","GTFS Longitude":"-73.90185"}, +{"Station ID":"139","Complex ID":"627","GTFS Stop ID":"S01","Division":"BMT","Line":"Franklin Shuttle","Stop Name":"Franklin Av","Borough":"Bk","Daytime Routes":"S","Structure":"Elevated","GTFS Latitude":"40.680596","GTFS Longitude":"-73.955827"}, +{"Station ID":"141","Complex ID":"141","GTFS Stop ID":"S03","Division":"BMT","Line":"Franklin Shuttle","Stop Name":"Park Pl","Borough":"Bk","Daytime Routes":"S","Structure":"Open Cut","GTFS Latitude":"40.674772","GTFS Longitude":"-73.957624"}, +{"Station ID":"142","Complex ID":"626","GTFS Stop ID":"S04","Division":"BMT","Line":"Franklin Shuttle","Stop Name":"Botanic Garden","Borough":"Bk","Daytime Routes":"S","Structure":"Open Cut","GTFS Latitude":"40.670343","GTFS Longitude":"-73.959245"}, +{"Station ID":"143","Complex ID":"143","GTFS Stop ID":"A02","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Inwood - 207 St","Borough":"M","Daytime Routes":"A","Structure":"Subway","GTFS Latitude":"40.868072","GTFS Longitude":"-73.919899"}, +{"Station ID":"144","Complex ID":"144","GTFS Stop ID":"A03","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Dyckman St","Borough":"M","Daytime Routes":"A","Structure":"Subway","GTFS Latitude":"40.865491","GTFS Longitude":"-73.927271"}, +{"Station ID":"145","Complex ID":"145","GTFS Stop ID":"A05","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"190 St","Borough":"M","Daytime Routes":"A","Structure":"Subway","GTFS Latitude":"40.859022","GTFS Longitude":"-73.93418"}, +{"Station ID":"146","Complex ID":"146","GTFS Stop ID":"A06","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"181 St","Borough":"M","Daytime Routes":"A","Structure":"Subway","GTFS Latitude":"40.851695","GTFS Longitude":"-73.937969"}, +{"Station ID":"147","Complex ID":"147","GTFS Stop ID":"A07","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"175 St","Borough":"M","Daytime Routes":"A","Structure":"Subway","GTFS Latitude":"40.847391","GTFS Longitude":"-73.939704"}, +{"Station ID":"148","Complex ID":"605","GTFS Stop ID":"A09","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"168 St","Borough":"M","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.840719","GTFS Longitude":"-73.939561"}, +{"Station ID":"149","Complex ID":"149","GTFS Stop ID":"A10","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"163 St - Amsterdam Av","Borough":"M","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.836013","GTFS Longitude":"-73.939892"}, +{"Station ID":"150","Complex ID":"150","GTFS Stop ID":"A11","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"155 St","Borough":"M","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.830518","GTFS Longitude":"-73.941514"}, +{"Station ID":"151","Complex ID":"151","GTFS Stop ID":"A12","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"145 St","Borough":"M","Daytime Routes":"A B C D","Structure":"Subway","GTFS Latitude":"40.824783","GTFS Longitude":"-73.944216"}, +{"Station ID":"152","Complex ID":"152","GTFS Stop ID":"A14","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"135 St","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.817894","GTFS Longitude":"-73.947649"}, +{"Station ID":"153","Complex ID":"153","GTFS Stop ID":"A15","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"125 St","Borough":"M","Daytime Routes":"A B C D","Structure":"Subway","GTFS Latitude":"40.811109","GTFS Longitude":"-73.952343"}, +{"Station ID":"154","Complex ID":"154","GTFS Stop ID":"A16","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"116 St","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.805085","GTFS Longitude":"-73.954882"}, +{"Station ID":"155","Complex ID":"155","GTFS Stop ID":"A17","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Cathedral Pkwy (110 St)","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.800603","GTFS Longitude":"-73.958161"}, +{"Station ID":"156","Complex ID":"156","GTFS Stop ID":"A18","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"103 St","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.796092","GTFS Longitude":"-73.961454"}, +{"Station ID":"157","Complex ID":"157","GTFS Stop ID":"A19","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"96 St","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.791642","GTFS Longitude":"-73.964696"}, +{"Station ID":"158","Complex ID":"158","GTFS Stop ID":"A20","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"86 St","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.785868","GTFS Longitude":"-73.968916"}, +{"Station ID":"159","Complex ID":"159","GTFS Stop ID":"A21","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"81 St - Museum of Natural History","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.781433","GTFS Longitude":"-73.972143"}, +{"Station ID":"160","Complex ID":"160","GTFS Stop ID":"A22","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"72 St","Borough":"M","Daytime Routes":"B C","Structure":"Subway","GTFS Latitude":"40.775594","GTFS Longitude":"-73.97641"}, +{"Station ID":"161","Complex ID":"614","GTFS Stop ID":"A24","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"59 St - Columbus Circle","Borough":"M","Daytime Routes":"A B C D","Structure":"Subway","GTFS Latitude":"40.768296","GTFS Longitude":"-73.981736"}, +{"Station ID":"162","Complex ID":"162","GTFS Stop ID":"A25","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"50 St","Borough":"M","Daytime Routes":"C E","Structure":"Subway","GTFS Latitude":"40.762456","GTFS Longitude":"-73.985984"}, +{"Station ID":"163","Complex ID":"611","GTFS Stop ID":"A27","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"42 St - Port Authority Bus Terminal","Borough":"M","Daytime Routes":"A C E","Structure":"Subway","GTFS Latitude":"40.757308","GTFS Longitude":"-73.989735"}, +{"Station ID":"164","Complex ID":"164","GTFS Stop ID":"A28","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"34 St - Penn Station","Borough":"M","Daytime Routes":"A C E","Structure":"Subway","GTFS Latitude":"40.752287","GTFS Longitude":"-73.993391"}, +{"Station ID":"165","Complex ID":"165","GTFS Stop ID":"A30","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"23 St","Borough":"M","Daytime Routes":"C E","Structure":"Subway","GTFS Latitude":"40.745906","GTFS Longitude":"-73.998041"}, +{"Station ID":"166","Complex ID":"618","GTFS Stop ID":"A31","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"14 St","Borough":"M","Daytime Routes":"A C E","Structure":"Subway","GTFS Latitude":"40.740893","GTFS Longitude":"-74.00169"}, +{"Station ID":"167","Complex ID":"167","GTFS Stop ID":"A32","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"W 4 St","Borough":"M","Daytime Routes":"A B C D E F M","Structure":"Subway","GTFS Latitude":"40.732338","GTFS Longitude":"-74.000495"}, +{"Station ID":"168","Complex ID":"168","GTFS Stop ID":"A33","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Spring St","Borough":"M","Daytime Routes":"C E","Structure":"Subway","GTFS Latitude":"40.726227","GTFS Longitude":"-74.003739"}, +{"Station ID":"169","Complex ID":"169","GTFS Stop ID":"A34","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Canal St","Borough":"M","Daytime Routes":"A C E","Structure":"Subway","GTFS Latitude":"40.720824","GTFS Longitude":"-74.005229"}, +{"Station ID":"170","Complex ID":"624","GTFS Stop ID":"A36","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Chambers St","Borough":"M","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.714111","GTFS Longitude":"-74.008585"}, +{"Station ID":"171","Complex ID":"624","GTFS Stop ID":"E01","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"World Trade Center","Borough":"M","Daytime Routes":"E","Structure":"Subway","GTFS Latitude":"40.712582","GTFS Longitude":"-74.009781"}, +{"Station ID":"172","Complex ID":"628","GTFS Stop ID":"A38","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Fulton St","Borough":"M","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.710197","GTFS Longitude":"-74.007691"}, +{"Station ID":"173","Complex ID":"173","GTFS Stop ID":"A40","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"High St","Borough":"Bk","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.699337","GTFS Longitude":"-73.990531"}, +{"Station ID":"174","Complex ID":"636","GTFS Stop ID":"A41","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Jay St - MetroTech","Borough":"Bk","Daytime Routes":"A C F","Structure":"Subway","GTFS Latitude":"40.692338","GTFS Longitude":"-73.987342"}, +{"Station ID":"175","Complex ID":"175","GTFS Stop ID":"A42","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Hoyt - Schermerhorn Sts","Borough":"Bk","Daytime Routes":"A C G","Structure":"Subway","GTFS Latitude":"40.688484","GTFS Longitude":"-73.985001"}, +{"Station ID":"176","Complex ID":"176","GTFS Stop ID":"A43","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Lafayette Av","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.686113","GTFS Longitude":"-73.973946"}, +{"Station ID":"177","Complex ID":"177","GTFS Stop ID":"A44","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Clinton - Washington Avs","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.683263","GTFS Longitude":"-73.965838"}, +{"Station ID":"178","Complex ID":"627","GTFS Stop ID":"A45","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Franklin Av","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.68138","GTFS Longitude":"-73.956848"}, +{"Station ID":"179","Complex ID":"179","GTFS Stop ID":"A46","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Nostrand Av","Borough":"Bk","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.680438","GTFS Longitude":"-73.950426"}, +{"Station ID":"180","Complex ID":"180","GTFS Stop ID":"A47","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Kingston - Throop Avs","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.679921","GTFS Longitude":"-73.940858"}, +{"Station ID":"181","Complex ID":"181","GTFS Stop ID":"A48","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Utica Av","Borough":"Bk","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.679364","GTFS Longitude":"-73.930729"}, +{"Station ID":"182","Complex ID":"182","GTFS Stop ID":"A49","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Ralph Av","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.678822","GTFS Longitude":"-73.920786"}, +{"Station ID":"183","Complex ID":"183","GTFS Stop ID":"A50","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Rockaway Av","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.67834","GTFS Longitude":"-73.911946"}, +{"Station ID":"184","Complex ID":"621","GTFS Stop ID":"A51","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Broadway Jct","Borough":"Bk","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.678334","GTFS Longitude":"-73.905316"}, +{"Station ID":"185","Complex ID":"185","GTFS Stop ID":"A52","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Liberty Av","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.674542","GTFS Longitude":"-73.896548"}, +{"Station ID":"186","Complex ID":"186","GTFS Stop ID":"A53","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Van Siclen Av","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.67271","GTFS Longitude":"-73.890358"}, +{"Station ID":"187","Complex ID":"187","GTFS Stop ID":"A54","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Shepherd Av","Borough":"Bk","Daytime Routes":"C","Structure":"Subway","GTFS Latitude":"40.67413","GTFS Longitude":"-73.88075"}, +{"Station ID":"188","Complex ID":"188","GTFS Stop ID":"A55","Division":"IND","Line":"8th Av - Fulton St","Stop Name":"Euclid Av","Borough":"Bk","Daytime Routes":"A C","Structure":"Subway","GTFS Latitude":"40.675377","GTFS Longitude":"-73.872106"}, +{"Station ID":"189","Complex ID":"189","GTFS Stop ID":"A57","Division":"IND","Line":"Liberty Av","Stop Name":"Grant Av","Borough":"Bk","Daytime Routes":"A","Structure":"Subway","GTFS Latitude":"40.677044","GTFS Longitude":"-73.86505"}, +{"Station ID":"190","Complex ID":"190","GTFS Stop ID":"A59","Division":"IND","Line":"Liberty Av","Stop Name":"80 St","Borough":"Q","Daytime Routes":"A","Structure":"Elevated","GTFS Latitude":"40.679371","GTFS Longitude":"-73.858992"}, +{"Station ID":"191","Complex ID":"191","GTFS Stop ID":"A60","Division":"IND","Line":"Liberty Av","Stop Name":"88 St","Borough":"Q","Daytime Routes":"A","Structure":"Elevated","GTFS Latitude":"40.679843","GTFS Longitude":"-73.85147"}, +{"Station ID":"192","Complex ID":"192","GTFS Stop ID":"A61","Division":"IND","Line":"Liberty Av","Stop Name":"Rockaway Blvd","Borough":"Q","Daytime Routes":"A","Structure":"Elevated","GTFS Latitude":"40.680429","GTFS Longitude":"-73.843853"}, +{"Station ID":"193","Complex ID":"193","GTFS Stop ID":"A63","Division":"IND","Line":"Liberty Av","Stop Name":"104 St","Borough":"Q","Daytime Routes":"A","Structure":"Elevated","GTFS Latitude":"40.681711","GTFS Longitude":"-73.837683"}, +{"Station ID":"194","Complex ID":"194","GTFS Stop ID":"A64","Division":"IND","Line":"Liberty Av","Stop Name":"111 St","Borough":"Q","Daytime Routes":"A","Structure":"Elevated","GTFS Latitude":"40.684331","GTFS Longitude":"-73.832163"}, +{"Station ID":"195","Complex ID":"195","GTFS Stop ID":"A65","Division":"IND","Line":"Liberty Av","Stop Name":"Ozone Park - Lefferts Blvd","Borough":"Q","Daytime Routes":"A","Structure":"Elevated","GTFS Latitude":"40.685951","GTFS Longitude":"-73.825798"}, +{"Station ID":"196","Complex ID":"196","GTFS Stop ID":"H01","Division":"IND","Line":"Rockaway","Stop Name":"Aqueduct Racetrack","Borough":"Q","Daytime Routes":"A","Structure":"At Grade","GTFS Latitude":"40.672097","GTFS Longitude":"-73.835919"}, +{"Station ID":"197","Complex ID":"197","GTFS Stop ID":"H02","Division":"IND","Line":"Rockaway","Stop Name":"Aqueduct - N Conduit Av","Borough":"Q","Daytime Routes":"A","Structure":"At Grade","GTFS Latitude":"40.668234","GTFS Longitude":"-73.834058"}, +{"Station ID":"198","Complex ID":"198","GTFS Stop ID":"H03","Division":"IND","Line":"Rockaway","Stop Name":"Howard Beach - JFK Airport","Borough":"Q","Daytime Routes":"A","Structure":"At Grade","GTFS Latitude":"40.660476","GTFS Longitude":"-73.830301"}, +{"Station ID":"199","Complex ID":"199","GTFS Stop ID":"H04","Division":"IND","Line":"Rockaway","Stop Name":"Broad Channel","Borough":"Q","Daytime Routes":"A S","Structure":"At Grade","GTFS Latitude":"40.608382","GTFS Longitude":"-73.815925"}, +{"Station ID":"200","Complex ID":"200","GTFS Stop ID":"H12","Division":"IND","Line":"Rockaway","Stop Name":"Beach 90 St","Borough":"Q","Daytime Routes":"A S","Structure":"Viaduct","GTFS Latitude":"40.588034","GTFS Longitude":"-73.813641"}, +{"Station ID":"201","Complex ID":"201","GTFS Stop ID":"H13","Division":"IND","Line":"Rockaway","Stop Name":"Beach 98 St","Borough":"Q","Daytime Routes":"A S","Structure":"Viaduct","GTFS Latitude":"40.585307","GTFS Longitude":"-73.820558"}, +{"Station ID":"202","Complex ID":"202","GTFS Stop ID":"H14","Division":"IND","Line":"Rockaway","Stop Name":"Beach 105 St","Borough":"Q","Daytime Routes":"A S","Structure":"Viaduct","GTFS Latitude":"40.583209","GTFS Longitude":"-73.827559"}, +{"Station ID":"203","Complex ID":"203","GTFS Stop ID":"H15","Division":"IND","Line":"Rockaway","Stop Name":"Rockaway Park - Beach 116 St","Borough":"Q","Daytime Routes":"A S","Structure":"At Grade","GTFS Latitude":"40.580903","GTFS Longitude":"-73.835592"}, +{"Station ID":"204","Complex ID":"204","GTFS Stop ID":"H06","Division":"IND","Line":"Rockaway","Stop Name":"Beach 67 St","Borough":"Q","Daytime Routes":"A","Structure":"Viaduct","GTFS Latitude":"40.590927","GTFS Longitude":"-73.796924"}, +{"Station ID":"205","Complex ID":"205","GTFS Stop ID":"H07","Division":"IND","Line":"Rockaway","Stop Name":"Beach 60 St","Borough":"Q","Daytime Routes":"A","Structure":"Viaduct","GTFS Latitude":"40.592374","GTFS Longitude":"-73.788522"}, +{"Station ID":"206","Complex ID":"206","GTFS Stop ID":"H08","Division":"IND","Line":"Rockaway","Stop Name":"Beach 44 St","Borough":"Q","Daytime Routes":"A","Structure":"Viaduct","GTFS Latitude":"40.592943","GTFS Longitude":"-73.776013"}, +{"Station ID":"207","Complex ID":"207","GTFS Stop ID":"H09","Division":"IND","Line":"Rockaway","Stop Name":"Beach 36 St","Borough":"Q","Daytime Routes":"A","Structure":"Viaduct","GTFS Latitude":"40.595398","GTFS Longitude":"-73.768175"}, +{"Station ID":"208","Complex ID":"208","GTFS Stop ID":"H10","Division":"IND","Line":"Rockaway","Stop Name":"Beach 25 St","Borough":"Q","Daytime Routes":"A","Structure":"Viaduct","GTFS Latitude":"40.600066","GTFS Longitude":"-73.761353"}, +{"Station ID":"209","Complex ID":"209","GTFS Stop ID":"H11","Division":"IND","Line":"Rockaway","Stop Name":"Far Rockaway - Mott Av","Borough":"Q","Daytime Routes":"A","Structure":"Viaduct","GTFS Latitude":"40.603995","GTFS Longitude":"-73.755405"}, +{"Station ID":"210","Complex ID":"210","GTFS Stop ID":"D01","Division":"IND","Line":"Concourse","Stop Name":"Norwood - 205 St","Borough":"Bx","Daytime Routes":"D","Structure":"Subway","GTFS Latitude":"40.874811","GTFS Longitude":"-73.878855"}, +{"Station ID":"211","Complex ID":"211","GTFS Stop ID":"D03","Division":"IND","Line":"Concourse","Stop Name":"Bedford Park Blvd","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.873244","GTFS Longitude":"-73.887138"}, +{"Station ID":"212","Complex ID":"212","GTFS Stop ID":"D04","Division":"IND","Line":"Concourse","Stop Name":"Kingsbridge Rd","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.866978","GTFS Longitude":"-73.893509"}, +{"Station ID":"213","Complex ID":"213","GTFS Stop ID":"D05","Division":"IND","Line":"Concourse","Stop Name":"Fordham Rd","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.861296","GTFS Longitude":"-73.897749"}, +{"Station ID":"214","Complex ID":"214","GTFS Stop ID":"D06","Division":"IND","Line":"Concourse","Stop Name":"182-183 Sts","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.856093","GTFS Longitude":"-73.900741"}, +{"Station ID":"215","Complex ID":"215","GTFS Stop ID":"D07","Division":"IND","Line":"Concourse","Stop Name":"Tremont Av","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.85041","GTFS Longitude":"-73.905227"}, +{"Station ID":"216","Complex ID":"216","GTFS Stop ID":"D08","Division":"IND","Line":"Concourse","Stop Name":"174-175 Sts","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.8459","GTFS Longitude":"-73.910136"}, +{"Station ID":"217","Complex ID":"217","GTFS Stop ID":"D09","Division":"IND","Line":"Concourse","Stop Name":"170 St","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.839306","GTFS Longitude":"-73.9134"}, +{"Station ID":"218","Complex ID":"218","GTFS Stop ID":"D10","Division":"IND","Line":"Concourse","Stop Name":"167 St","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.833771","GTFS Longitude":"-73.91844"}, +{"Station ID":"219","Complex ID":"604","GTFS Stop ID":"D11","Division":"IND","Line":"Concourse","Stop Name":"161 St - Yankee Stadium","Borough":"Bx","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.827905","GTFS Longitude":"-73.925651"}, +{"Station ID":"220","Complex ID":"220","GTFS Stop ID":"D12","Division":"IND","Line":"Concourse","Stop Name":"155 St","Borough":"M","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.830135","GTFS Longitude":"-73.938209"}, +{"Station ID":"221","Complex ID":"221","GTFS Stop ID":"B04","Division":"IND","Line":"63rd St","Stop Name":"21 St - Queensbridge","Borough":"Q","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.754203","GTFS Longitude":"-73.942836"}, +{"Station ID":"222","Complex ID":"222","GTFS Stop ID":"B06","Division":"IND","Line":"63rd St","Stop Name":"Roosevelt Island","Borough":"M","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.759145","GTFS Longitude":"-73.95326"}, +{"Station ID":"223","Complex ID":"223","GTFS Stop ID":"B08","Division":"IND","Line":"63rd St","Stop Name":"Lexington Av/63 St","Borough":"M","Daytime Routes":"F Q","Structure":"Subway","GTFS Latitude":"40.764629","GTFS Longitude":"-73.966113"}, +{"Station ID":"224","Complex ID":"224","GTFS Stop ID":"B10","Division":"IND","Line":"6th Av - Culver","Stop Name":"57 St","Borough":"M","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.763972","GTFS Longitude":"-73.97745"}, +{"Station ID":"225","Complex ID":"225","GTFS Stop ID":"D15","Division":"IND","Line":"6th Av - Culver","Stop Name":"47-50 Sts - Rockefeller Ctr","Borough":"M","Daytime Routes":"B D F M","Structure":"Subway","GTFS Latitude":"40.758663","GTFS Longitude":"-73.981329"}, +{"Station ID":"226","Complex ID":"609","GTFS Stop ID":"D16","Division":"IND","Line":"6th Av - Culver","Stop Name":"42 St - Bryant Pk","Borough":"M","Daytime Routes":"B D F M","Structure":"Subway","GTFS Latitude":"40.754222","GTFS Longitude":"-73.984569"}, +{"Station ID":"227","Complex ID":"607","GTFS Stop ID":"D17","Division":"IND","Line":"6th Av - Culver","Stop Name":"34 St - Herald Sq","Borough":"M","Daytime Routes":"B D F M","Structure":"Subway","GTFS Latitude":"40.749719","GTFS Longitude":"-73.987823"}, +{"Station ID":"228","Complex ID":"228","GTFS Stop ID":"D18","Division":"IND","Line":"6th Av - Culver","Stop Name":"23 St","Borough":"M","Daytime Routes":"F M","Structure":"Subway","GTFS Latitude":"40.742878","GTFS Longitude":"-73.992821"}, +{"Station ID":"229","Complex ID":"601","GTFS Stop ID":"D19","Division":"IND","Line":"6th Av - Culver","Stop Name":"14 St","Borough":"M","Daytime Routes":"F M","Structure":"Subway","GTFS Latitude":"40.738228","GTFS Longitude":"-73.996209"}, +{"Station ID":"230","Complex ID":"619","GTFS Stop ID":"D21","Division":"IND","Line":"6th Av - Culver","Stop Name":"Broadway-Lafayette St","Borough":"M","Daytime Routes":"B D F M","Structure":"Subway","GTFS Latitude":"40.725297","GTFS Longitude":"-73.996204"}, +{"Station ID":"231","Complex ID":"231","GTFS Stop ID":"D22","Division":"IND","Line":"6th Av - Culver","Stop Name":"Grand St","Borough":"M","Daytime Routes":"B D","Structure":"Subway","GTFS Latitude":"40.718267","GTFS Longitude":"-73.993753"}, +{"Station ID":"232","Complex ID":"232","GTFS Stop ID":"F14","Division":"IND","Line":"6th Av - Culver","Stop Name":"2 Av","Borough":"M","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.723402","GTFS Longitude":"-73.989938"}, +{"Station ID":"233","Complex ID":"625","GTFS Stop ID":"F15","Division":"IND","Line":"6th Av - Culver","Stop Name":"Delancey St","Borough":"M","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.718611","GTFS Longitude":"-73.988114"}, +{"Station ID":"234","Complex ID":"234","GTFS Stop ID":"F16","Division":"IND","Line":"6th Av - Culver","Stop Name":"East Broadway","Borough":"M","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.713715","GTFS Longitude":"-73.990173"}, +{"Station ID":"235","Complex ID":"235","GTFS Stop ID":"F18","Division":"IND","Line":"6th Av - Culver","Stop Name":"York St","Borough":"Bk","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.701397","GTFS Longitude":"-73.986751"}, +{"Station ID":"236","Complex ID":"236","GTFS Stop ID":"F20","Division":"IND","Line":"6th Av - Culver","Stop Name":"Bergen St","Borough":"Bk","Daytime Routes":"F G","Structure":"Subway","GTFS Latitude":"40.686145","GTFS Longitude":"-73.990862"}, +{"Station ID":"237","Complex ID":"237","GTFS Stop ID":"F21","Division":"IND","Line":"6th Av - Culver","Stop Name":"Carroll St","Borough":"Bk","Daytime Routes":"F G","Structure":"Subway","GTFS Latitude":"40.680303","GTFS Longitude":"-73.995048"}, +{"Station ID":"238","Complex ID":"238","GTFS Stop ID":"F22","Division":"IND","Line":"6th Av - Culver","Stop Name":"Smith - 9 Sts","Borough":"Bk","Daytime Routes":"F G","Structure":"Viaduct","GTFS Latitude":"40.67358","GTFS Longitude":"-73.995959"}, +{"Station ID":"239","Complex ID":"608","GTFS Stop ID":"F23","Division":"IND","Line":"6th Av - Culver","Stop Name":"4 Av","Borough":"Bk","Daytime Routes":"F G","Structure":"Viaduct","GTFS Latitude":"40.670272","GTFS Longitude":"-73.989779"}, +{"Station ID":"240","Complex ID":"240","GTFS Stop ID":"F24","Division":"IND","Line":"6th Av - Culver","Stop Name":"7 Av","Borough":"Bk","Daytime Routes":"F G","Structure":"Subway","GTFS Latitude":"40.666271","GTFS Longitude":"-73.980305"}, +{"Station ID":"241","Complex ID":"241","GTFS Stop ID":"F25","Division":"IND","Line":"6th Av - Culver","Stop Name":"15 St - Prospect Park","Borough":"Bk","Daytime Routes":"F G","Structure":"Subway","GTFS Latitude":"40.660365","GTFS Longitude":"-73.979493"}, +{"Station ID":"242","Complex ID":"242","GTFS Stop ID":"F26","Division":"IND","Line":"6th Av - Culver","Stop Name":"Fort Hamilton Pkwy","Borough":"Bk","Daytime Routes":"F G","Structure":"Subway","GTFS Latitude":"40.650782","GTFS Longitude":"-73.975776"}, +{"Station ID":"243","Complex ID":"243","GTFS Stop ID":"F27","Division":"IND","Line":"6th Av - Culver","Stop Name":"Church Av","Borough":"Bk","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.644041","GTFS Longitude":"-73.979678"}, +{"Station ID":"244","Complex ID":"244","GTFS Stop ID":"F29","Division":"IND","Line":"6th Av - Culver","Stop Name":"Ditmas Av","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.636119","GTFS Longitude":"-73.978172"}, +{"Station ID":"245","Complex ID":"245","GTFS Stop ID":"F30","Division":"IND","Line":"6th Av - Culver","Stop Name":"18 Av","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.629755","GTFS Longitude":"-73.976971"}, +{"Station ID":"246","Complex ID":"246","GTFS Stop ID":"F31","Division":"IND","Line":"6th Av - Culver","Stop Name":"Avenue I","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.625322","GTFS Longitude":"-73.976127"}, +{"Station ID":"247","Complex ID":"247","GTFS Stop ID":"F32","Division":"IND","Line":"6th Av - Culver","Stop Name":"Bay Pkwy","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.620769","GTFS Longitude":"-73.975264"}, +{"Station ID":"248","Complex ID":"248","GTFS Stop ID":"F33","Division":"IND","Line":"6th Av - Culver","Stop Name":"Avenue N","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.61514","GTFS Longitude":"-73.974197"}, +{"Station ID":"249","Complex ID":"249","GTFS Stop ID":"F34","Division":"IND","Line":"6th Av - Culver","Stop Name":"Avenue P","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.608944","GTFS Longitude":"-73.973022"}, +{"Station ID":"250","Complex ID":"250","GTFS Stop ID":"F35","Division":"IND","Line":"6th Av - Culver","Stop Name":"Kings Hwy","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.603217","GTFS Longitude":"-73.972361"}, +{"Station ID":"251","Complex ID":"251","GTFS Stop ID":"F36","Division":"IND","Line":"6th Av - Culver","Stop Name":"Avenue U","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.596063","GTFS Longitude":"-73.973357"}, +{"Station ID":"252","Complex ID":"252","GTFS Stop ID":"F38","Division":"IND","Line":"6th Av - Culver","Stop Name":"Avenue X","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.58962","GTFS Longitude":"-73.97425"}, +{"Station ID":"253","Complex ID":"253","GTFS Stop ID":"F39","Division":"IND","Line":"6th Av - Culver","Stop Name":"Neptune Av","Borough":"Bk","Daytime Routes":"F","Structure":"Elevated","GTFS Latitude":"40.581011","GTFS Longitude":"-73.974574"}, +{"Station ID":"254","Complex ID":"254","GTFS Stop ID":"F01","Division":"IND","Line":"Queens - Archer","Stop Name":"Jamaica - 179 St","Borough":"Q","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.712646","GTFS Longitude":"-73.783817"}, +{"Station ID":"255","Complex ID":"255","GTFS Stop ID":"F02","Division":"IND","Line":"Queens - Archer","Stop Name":"169 St","Borough":"Q","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.71047","GTFS Longitude":"-73.793604"}, +{"Station ID":"256","Complex ID":"256","GTFS Stop ID":"F03","Division":"IND","Line":"Queens - Archer","Stop Name":"Parsons Blvd","Borough":"Q","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.707564","GTFS Longitude":"-73.803326"}, +{"Station ID":"257","Complex ID":"257","GTFS Stop ID":"F04","Division":"IND","Line":"Queens - Archer","Stop Name":"Sutphin Blvd","Borough":"Q","Daytime Routes":"F","Structure":"Subway","GTFS Latitude":"40.70546","GTFS Longitude":"-73.810708"}, +{"Station ID":"258","Complex ID":"258","GTFS Stop ID":"F05","Division":"IND","Line":"Queens - Archer","Stop Name":"Briarwood - Van Wyck Blvd","Borough":"Q","Daytime Routes":"E F","Structure":"Subway","GTFS Latitude":"40.709179","GTFS Longitude":"-73.820574"}, +{"Station ID":"259","Complex ID":"259","GTFS Stop ID":"F06","Division":"IND","Line":"Queens - Archer","Stop Name":"Kew Gardens - Union Tpke","Borough":"Q","Daytime Routes":"E F","Structure":"Subway","GTFS Latitude":"40.714441","GTFS Longitude":"-73.831008"}, +{"Station ID":"260","Complex ID":"260","GTFS Stop ID":"F07","Division":"IND","Line":"Queens - Archer","Stop Name":"75 Av","Borough":"Q","Daytime Routes":"E F","Structure":"Subway","GTFS Latitude":"40.718331","GTFS Longitude":"-73.837324"}, +{"Station ID":"261","Complex ID":"261","GTFS Stop ID":"G08","Division":"IND","Line":"Queens - Archer","Stop Name":"Forest Hills - 71 Av","Borough":"Q","Daytime Routes":"E F M R","Structure":"Subway","GTFS Latitude":"40.721691","GTFS Longitude":"-73.844521"}, +{"Station ID":"262","Complex ID":"262","GTFS Stop ID":"G09","Division":"IND","Line":"Queens - Archer","Stop Name":"67 Av","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.726523","GTFS Longitude":"-73.852719"}, +{"Station ID":"263","Complex ID":"263","GTFS Stop ID":"G10","Division":"IND","Line":"Queens - Archer","Stop Name":"63 Dr - Rego Park","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.729846","GTFS Longitude":"-73.861604"}, +{"Station ID":"264","Complex ID":"264","GTFS Stop ID":"G11","Division":"IND","Line":"Queens - Archer","Stop Name":"Woodhaven Blvd","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.733106","GTFS Longitude":"-73.869229"}, +{"Station ID":"265","Complex ID":"265","GTFS Stop ID":"G12","Division":"IND","Line":"Queens - Archer","Stop Name":"Grand Av - Newtown","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.737015","GTFS Longitude":"-73.877223"}, +{"Station ID":"266","Complex ID":"266","GTFS Stop ID":"G13","Division":"IND","Line":"Queens - Archer","Stop Name":"Elmhurst Av","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.742454","GTFS Longitude":"-73.882017"}, +{"Station ID":"267","Complex ID":"616","GTFS Stop ID":"G14","Division":"IND","Line":"Queens - Archer","Stop Name":"Jackson Hts - Roosevelt Av","Borough":"Q","Daytime Routes":"E F M R","Structure":"Subway","GTFS Latitude":"40.746644","GTFS Longitude":"-73.891338"}, +{"Station ID":"268","Complex ID":"268","GTFS Stop ID":"G15","Division":"IND","Line":"Queens - Archer","Stop Name":"65 St","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.749669","GTFS Longitude":"-73.898453"}, +{"Station ID":"269","Complex ID":"269","GTFS Stop ID":"G16","Division":"IND","Line":"Queens - Archer","Stop Name":"Northern Blvd","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.752885","GTFS Longitude":"-73.906006"}, +{"Station ID":"270","Complex ID":"270","GTFS Stop ID":"G18","Division":"IND","Line":"Queens - Archer","Stop Name":"46 St","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.756312","GTFS Longitude":"-73.913333"}, +{"Station ID":"271","Complex ID":"271","GTFS Stop ID":"G19","Division":"IND","Line":"Queens - Archer","Stop Name":"Steinway St","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.756879","GTFS Longitude":"-73.92074"}, +{"Station ID":"272","Complex ID":"272","GTFS Stop ID":"G20","Division":"IND","Line":"Queens - Archer","Stop Name":"36 St","Borough":"Q","Daytime Routes":"M R","Structure":"Subway","GTFS Latitude":"40.752039","GTFS Longitude":"-73.928781"}, +{"Station ID":"273","Complex ID":"273","GTFS Stop ID":"G21","Division":"IND","Line":"Queens - Archer","Stop Name":"Queens Plaza","Borough":"Q","Daytime Routes":"E M R","Structure":"Subway","GTFS Latitude":"40.748973","GTFS Longitude":"-73.937243"}, +{"Station ID":"274","Complex ID":"606","GTFS Stop ID":"F09","Division":"IND","Line":"Queens - Archer","Stop Name":"Court Sq","Borough":"Q","Daytime Routes":"E M","Structure":"Subway","GTFS Latitude":"40.747846","GTFS Longitude":"-73.946"}, +{"Station ID":"275","Complex ID":"612","GTFS Stop ID":"F11","Division":"IND","Line":"Queens - Archer","Stop Name":"Lexington Av/53 St","Borough":"M","Daytime Routes":"E M","Structure":"Subway","GTFS Latitude":"40.757552","GTFS Longitude":"-73.969055"}, +{"Station ID":"276","Complex ID":"276","GTFS Stop ID":"F12","Division":"IND","Line":"Queens - Archer","Stop Name":"5 Av/53 St","Borough":"M","Daytime Routes":"E M","Structure":"Subway","GTFS Latitude":"40.760167","GTFS Longitude":"-73.975224"}, +{"Station ID":"277","Complex ID":"277","GTFS Stop ID":"D14","Division":"IND","Line":"Queens - Archer","Stop Name":"7 Av","Borough":"M","Daytime Routes":"B D E","Structure":"Subway","GTFS Latitude":"40.762862","GTFS Longitude":"-73.981637"}, +{"Station ID":"278","Complex ID":"278","GTFS Stop ID":"G05","Division":"IND","Line":"Queens - Archer","Stop Name":"Jamaica Center - Parsons/Archer","Borough":"Q","Daytime Routes":"E J Z","Structure":"Subway","GTFS Latitude":"40.702147","GTFS Longitude":"-73.801109"}, +{"Station ID":"279","Complex ID":"279","GTFS Stop ID":"G06","Division":"IND","Line":"Queens - Archer","Stop Name":"Sutphin Blvd - Archer Av - JFK Airport","Borough":"Q","Daytime Routes":"E J Z","Structure":"Subway","GTFS Latitude":"40.700486","GTFS Longitude":"-73.807969"}, +{"Station ID":"280","Complex ID":"280","GTFS Stop ID":"G07","Division":"IND","Line":"Queens - Archer","Stop Name":"Jamaica - Van Wyck","Borough":"Q","Daytime Routes":"E","Structure":"Subway","GTFS Latitude":"40.702566","GTFS Longitude":"-73.816859"}, +{"Station ID":"281","Complex ID":"606","GTFS Stop ID":"G22","Division":"IND","Line":"Crosstown","Stop Name":"Court Sq","Borough":"Q","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.746554","GTFS Longitude":"-73.943832"}, +{"Station ID":"282","Complex ID":"282","GTFS Stop ID":"G24","Division":"IND","Line":"Crosstown","Stop Name":"21 St","Borough":"Q","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.744065","GTFS Longitude":"-73.949724"}, +{"Station ID":"283","Complex ID":"283","GTFS Stop ID":"G26","Division":"IND","Line":"Crosstown","Stop Name":"Greenpoint Av","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.731352","GTFS Longitude":"-73.954449"}, +{"Station ID":"284","Complex ID":"284","GTFS Stop ID":"G28","Division":"IND","Line":"Crosstown","Stop Name":"Nassau Av","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.724635","GTFS Longitude":"-73.951277"}, +{"Station ID":"285","Complex ID":"629","GTFS Stop ID":"G29","Division":"IND","Line":"Crosstown","Stop Name":"Metropolitan Av","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.712792","GTFS Longitude":"-73.951418"}, +{"Station ID":"286","Complex ID":"286","GTFS Stop ID":"G30","Division":"IND","Line":"Crosstown","Stop Name":"Broadway","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.706092","GTFS Longitude":"-73.950308"}, +{"Station ID":"287","Complex ID":"287","GTFS Stop ID":"G31","Division":"IND","Line":"Crosstown","Stop Name":"Flushing Av","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.700377","GTFS Longitude":"-73.950234"}, +{"Station ID":"288","Complex ID":"288","GTFS Stop ID":"G32","Division":"IND","Line":"Crosstown","Stop Name":"Myrtle - Willoughby Avs","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.694568","GTFS Longitude":"-73.949046"}, +{"Station ID":"289","Complex ID":"289","GTFS Stop ID":"G33","Division":"IND","Line":"Crosstown","Stop Name":"Bedford - Nostrand Avs","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.689627","GTFS Longitude":"-73.953522"}, +{"Station ID":"290","Complex ID":"290","GTFS Stop ID":"G34","Division":"IND","Line":"Crosstown","Stop Name":"Classon Av","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.688873","GTFS Longitude":"-73.96007"}, +{"Station ID":"291","Complex ID":"291","GTFS Stop ID":"G35","Division":"IND","Line":"Crosstown","Stop Name":"Clinton - Washington Avs","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.688089","GTFS Longitude":"-73.966839"}, +{"Station ID":"292","Complex ID":"292","GTFS Stop ID":"G36","Division":"IND","Line":"Crosstown","Stop Name":"Fulton St","Borough":"Bk","Daytime Routes":"G","Structure":"Subway","GTFS Latitude":"40.687119","GTFS Longitude":"-73.975375"}, +{"Station ID":"293","Complex ID":"293","GTFS Stop ID":"101","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Van Cortlandt Park - 242 St","Borough":"Bx","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.889248","GTFS Longitude":"-73.898583"}, +{"Station ID":"294","Complex ID":"294","GTFS Stop ID":"103","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"238 St","Borough":"Bx","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.884667","GTFS Longitude":"-73.90087"}, +{"Station ID":"295","Complex ID":"295","GTFS Stop ID":"104","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"231 St","Borough":"Bx","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.878856","GTFS Longitude":"-73.904834"}, +{"Station ID":"296","Complex ID":"296","GTFS Stop ID":"106","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Marble Hill - 225 St","Borough":"M","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.874561","GTFS Longitude":"-73.909831"}, +{"Station ID":"297","Complex ID":"297","GTFS Stop ID":"107","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"215 St","Borough":"M","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.869444","GTFS Longitude":"-73.915279"}, +{"Station ID":"298","Complex ID":"298","GTFS Stop ID":"108","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"207 St","Borough":"M","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.864621","GTFS Longitude":"-73.918822"}, +{"Station ID":"299","Complex ID":"299","GTFS Stop ID":"109","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Dyckman St","Borough":"M","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.860531","GTFS Longitude":"-73.925536"}, +{"Station ID":"300","Complex ID":"300","GTFS Stop ID":"110","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"191 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.855225","GTFS Longitude":"-73.929412"}, +{"Station ID":"301","Complex ID":"301","GTFS Stop ID":"111","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"181 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.849505","GTFS Longitude":"-73.933596"}, +{"Station ID":"302","Complex ID":"605","GTFS Stop ID":"112","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"168 St - Washington Hts","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.840556","GTFS Longitude":"-73.940133"}, +{"Station ID":"303","Complex ID":"303","GTFS Stop ID":"113","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"157 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.834041","GTFS Longitude":"-73.94489"}, +{"Station ID":"304","Complex ID":"304","GTFS Stop ID":"114","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"145 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.826551","GTFS Longitude":"-73.95036"}, +{"Station ID":"305","Complex ID":"305","GTFS Stop ID":"115","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"137 St - City College","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.822008","GTFS Longitude":"-73.953676"}, +{"Station ID":"306","Complex ID":"306","GTFS Stop ID":"116","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"125 St","Borough":"M","Daytime Routes":"1","Structure":"Elevated","GTFS Latitude":"40.815581","GTFS Longitude":"-73.958372"}, +{"Station ID":"307","Complex ID":"307","GTFS Stop ID":"117","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"116 St - Columbia University","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.807722","GTFS Longitude":"-73.96411"}, +{"Station ID":"308","Complex ID":"308","GTFS Stop ID":"118","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Cathedral Pkwy","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.803967","GTFS Longitude":"-73.966847"}, +{"Station ID":"309","Complex ID":"309","GTFS Stop ID":"119","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"103 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.799446","GTFS Longitude":"-73.968379"}, +{"Station ID":"310","Complex ID":"310","GTFS Stop ID":"120","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"96 St","Borough":"M","Daytime Routes":"1 2 3","Structure":"Subway","GTFS Latitude":"40.793919","GTFS Longitude":"-73.972323"}, +{"Station ID":"311","Complex ID":"311","GTFS Stop ID":"121","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"86 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.788644","GTFS Longitude":"-73.976218"}, +{"Station ID":"312","Complex ID":"312","GTFS Stop ID":"122","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"79 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.783934","GTFS Longitude":"-73.979917"}, +{"Station ID":"313","Complex ID":"313","GTFS Stop ID":"123","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"72 St","Borough":"M","Daytime Routes":"1 2 3","Structure":"Subway","GTFS Latitude":"40.778453","GTFS Longitude":"-73.98197"}, +{"Station ID":"314","Complex ID":"314","GTFS Stop ID":"124","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"66 St - Lincoln Center","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.77344","GTFS Longitude":"-73.982209"}, +{"Station ID":"315","Complex ID":"614","GTFS Stop ID":"125","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"59 St - Columbus Circle","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.768247","GTFS Longitude":"-73.981929"}, +{"Station ID":"316","Complex ID":"316","GTFS Stop ID":"126","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"50 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.761728","GTFS Longitude":"-73.983849"}, +{"Station ID":"317","Complex ID":"611","GTFS Stop ID":"127","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Times Sq - 42 St","Borough":"M","Daytime Routes":"1 2 3","Structure":"Subway","GTFS Latitude":"40.75529","GTFS Longitude":"-73.987495"}, +{"Station ID":"318","Complex ID":"318","GTFS Stop ID":"128","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"34 St - Penn Station","Borough":"M","Daytime Routes":"1 2 3","Structure":"Subway","GTFS Latitude":"40.750373","GTFS Longitude":"-73.991057"}, +{"Station ID":"319","Complex ID":"319","GTFS Stop ID":"129","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"28 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.747215","GTFS Longitude":"-73.993365"}, +{"Station ID":"320","Complex ID":"320","GTFS Stop ID":"130","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"23 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.744081","GTFS Longitude":"-73.995657"}, +{"Station ID":"321","Complex ID":"321","GTFS Stop ID":"131","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"18 St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.74104","GTFS Longitude":"-73.997871"}, +{"Station ID":"322","Complex ID":"601","GTFS Stop ID":"132","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"14 St","Borough":"M","Daytime Routes":"1 2 3","Structure":"Subway","GTFS Latitude":"40.737826","GTFS Longitude":"-74.000201"}, +{"Station ID":"323","Complex ID":"323","GTFS Stop ID":"133","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Christopher St - Sheridan Sq","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.733422","GTFS Longitude":"-74.002906"}, +{"Station ID":"324","Complex ID":"324","GTFS Stop ID":"134","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Houston St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.728251","GTFS Longitude":"-74.005367"}, +{"Station ID":"325","Complex ID":"325","GTFS Stop ID":"135","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Canal St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.722854","GTFS Longitude":"-74.006277"}, +{"Station ID":"326","Complex ID":"326","GTFS Stop ID":"136","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Franklin St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.719318","GTFS Longitude":"-74.006886"}, +{"Station ID":"327","Complex ID":"327","GTFS Stop ID":"137","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Chambers St","Borough":"M","Daytime Routes":"1 2 3","Structure":"Subway","GTFS Latitude":"40.715478","GTFS Longitude":"-74.009266"}, +{"Station ID":"328","Complex ID":"328","GTFS Stop ID":"138","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Cortlandt St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.711835","GTFS Longitude":"-74.012188"}, +{"Station ID":"329","Complex ID":"329","GTFS Stop ID":"139","Division":"IRT","Line":"Broadway - 7Av","Stop Name":"Rector St","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.707513","GTFS Longitude":"-74.013783"}, +{"Station ID":"330","Complex ID":"635","GTFS Stop ID":"140","Division":"IRT","Line":"South Ferry Loop","Stop Name":"South Ferry Loop","Borough":"M","Daytime Routes":"1","Structure":"Subway","GTFS Latitude":"40.701411","GTFS Longitude":"-74.013205"}, +{"Station ID":"331","Complex ID":"624","GTFS Stop ID":"228","Division":"IRT","Line":"Clark St","Stop Name":"Park Pl","Borough":"M","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.713051","GTFS Longitude":"-74.008811"}, +{"Station ID":"332","Complex ID":"628","GTFS Stop ID":"229","Division":"IRT","Line":"Clark St","Stop Name":"Fulton St","Borough":"M","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.709416","GTFS Longitude":"-74.006571"}, +{"Station ID":"333","Complex ID":"333","GTFS Stop ID":"230","Division":"IRT","Line":"Clark St","Stop Name":"Wall St","Borough":"M","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.706821","GTFS Longitude":"-74.0091"}, +{"Station ID":"334","Complex ID":"334","GTFS Stop ID":"231","Division":"IRT","Line":"Clark St","Stop Name":"Clark St","Borough":"Bk","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.697466","GTFS Longitude":"-73.993086"}, +{"Station ID":"335","Complex ID":"620","GTFS Stop ID":"232","Division":"IRT","Line":"Clark St","Stop Name":"Borough Hall","Borough":"Bk","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.693219","GTFS Longitude":"-73.989998"}, +{"Station ID":"336","Complex ID":"336","GTFS Stop ID":"233","Division":"IRT","Line":"Eastern Pky","Stop Name":"Hoyt St","Borough":"Bk","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.690545","GTFS Longitude":"-73.985065"}, +{"Station ID":"337","Complex ID":"337","GTFS Stop ID":"234","Division":"IRT","Line":"Eastern Pky","Stop Name":"Nevins St","Borough":"Bk","Daytime Routes":"2 3 4 5","Structure":"Subway","GTFS Latitude":"40.688246","GTFS Longitude":"-73.980492"}, +{"Station ID":"338","Complex ID":"617","GTFS Stop ID":"235","Division":"IRT","Line":"Eastern Pky","Stop Name":"Atlantic Av - Barclays Ctr","Borough":"Bk","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.684359","GTFS Longitude":"-73.977666"}, +{"Station ID":"339","Complex ID":"339","GTFS Stop ID":"236","Division":"IRT","Line":"Eastern Pky","Stop Name":"Bergen St","Borough":"Bk","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.680829","GTFS Longitude":"-73.975098"}, +{"Station ID":"340","Complex ID":"340","GTFS Stop ID":"237","Division":"IRT","Line":"Eastern Pky","Stop Name":"Grand Army Plaza","Borough":"Bk","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.675235","GTFS Longitude":"-73.971046"}, +{"Station ID":"341","Complex ID":"341","GTFS Stop ID":"238","Division":"IRT","Line":"Eastern Pky","Stop Name":"Eastern Pkwy - Brooklyn Museum","Borough":"Bk","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.671987","GTFS Longitude":"-73.964375"}, +{"Station ID":"342","Complex ID":"626","GTFS Stop ID":"239","Division":"IRT","Line":"Eastern Pky","Stop Name":"Franklin Av","Borough":"Bk","Daytime Routes":"2 3 4 5","Structure":"Subway","GTFS Latitude":"40.670682","GTFS Longitude":"-73.958131"}, +{"Station ID":"343","Complex ID":"343","GTFS Stop ID":"248","Division":"IRT","Line":"Eastern Pky","Stop Name":"Nostrand Av","Borough":"Bk","Daytime Routes":"3","Structure":"Subway","GTFS Latitude":"40.669847","GTFS Longitude":"-73.950466"}, +{"Station ID":"344","Complex ID":"344","GTFS Stop ID":"249","Division":"IRT","Line":"Eastern Pky","Stop Name":"Kingston Av","Borough":"Bk","Daytime Routes":"3","Structure":"Subway","GTFS Latitude":"40.669399","GTFS Longitude":"-73.942161"}, +{"Station ID":"345","Complex ID":"345","GTFS Stop ID":"250","Division":"IRT","Line":"Eastern Pky","Stop Name":"Crown Hts - Utica Av","Borough":"Bk","Daytime Routes":"3 4","Structure":"Subway","GTFS Latitude":"40.668897","GTFS Longitude":"-73.932942"}, +{"Station ID":"346","Complex ID":"346","GTFS Stop ID":"251","Division":"IRT","Line":"Eastern Pky","Stop Name":"Sutter Av - Rutland Rd","Borough":"Bk","Daytime Routes":"3","Structure":"Elevated","GTFS Latitude":"40.664717","GTFS Longitude":"-73.92261"}, +{"Station ID":"347","Complex ID":"347","GTFS Stop ID":"252","Division":"IRT","Line":"Eastern Pky","Stop Name":"Saratoga Av","Borough":"Bk","Daytime Routes":"3","Structure":"Elevated","GTFS Latitude":"40.661453","GTFS Longitude":"-73.916327"}, +{"Station ID":"348","Complex ID":"348","GTFS Stop ID":"253","Division":"IRT","Line":"Eastern Pky","Stop Name":"Rockaway Av","Borough":"Bk","Daytime Routes":"3","Structure":"Elevated","GTFS Latitude":"40.662549","GTFS Longitude":"-73.908946"}, +{"Station ID":"349","Complex ID":"349","GTFS Stop ID":"254","Division":"IRT","Line":"Eastern Pky","Stop Name":"Junius St","Borough":"Bk","Daytime Routes":"3","Structure":"Elevated","GTFS Latitude":"40.663515","GTFS Longitude":"-73.902447"}, +{"Station ID":"350","Complex ID":"350","GTFS Stop ID":"255","Division":"IRT","Line":"Eastern Pky","Stop Name":"Pennsylvania Av","Borough":"Bk","Daytime Routes":"3","Structure":"Elevated","GTFS Latitude":"40.664635","GTFS Longitude":"-73.894895"}, +{"Station ID":"351","Complex ID":"351","GTFS Stop ID":"256","Division":"IRT","Line":"Eastern Pky","Stop Name":"Van Siclen Av","Borough":"Bk","Daytime Routes":"3","Structure":"Elevated","GTFS Latitude":"40.665449","GTFS Longitude":"-73.889395"}, +{"Station ID":"352","Complex ID":"352","GTFS Stop ID":"257","Division":"IRT","Line":"Eastern Pky","Stop Name":"New Lots Av","Borough":"Bk","Daytime Routes":"3","Structure":"Elevated","GTFS Latitude":"40.666235","GTFS Longitude":"-73.884079"}, +{"Station ID":"353","Complex ID":"353","GTFS Stop ID":"241","Division":"IRT","Line":"Nostrand","Stop Name":"President St","Borough":"Bk","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.667883","GTFS Longitude":"-73.950683"}, +{"Station ID":"354","Complex ID":"354","GTFS Stop ID":"242","Division":"IRT","Line":"Nostrand","Stop Name":"Sterling St","Borough":"Bk","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.662742","GTFS Longitude":"-73.95085"}, +{"Station ID":"355","Complex ID":"355","GTFS Stop ID":"243","Division":"IRT","Line":"Nostrand","Stop Name":"Winthrop St","Borough":"Bk","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.656652","GTFS Longitude":"-73.9502"}, +{"Station ID":"356","Complex ID":"356","GTFS Stop ID":"244","Division":"IRT","Line":"Nostrand","Stop Name":"Church Av","Borough":"Bk","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.650843","GTFS Longitude":"-73.949575"}, +{"Station ID":"357","Complex ID":"357","GTFS Stop ID":"245","Division":"IRT","Line":"Nostrand","Stop Name":"Beverly Rd","Borough":"Bk","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.645098","GTFS Longitude":"-73.948959"}, +{"Station ID":"358","Complex ID":"358","GTFS Stop ID":"246","Division":"IRT","Line":"Nostrand","Stop Name":"Newkirk Av","Borough":"Bk","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.639967","GTFS Longitude":"-73.948411"}, +{"Station ID":"359","Complex ID":"359","GTFS Stop ID":"247","Division":"IRT","Line":"Nostrand","Stop Name":"Flatbush Av - Brooklyn College","Borough":"Bk","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.632836","GTFS Longitude":"-73.947642"}, +{"Station ID":"360","Complex ID":"360","GTFS Stop ID":"601","Division":"IRT","Line":"Pelham","Stop Name":"Pelham Bay Park","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.852462","GTFS Longitude":"-73.828121"}, +{"Station ID":"361","Complex ID":"361","GTFS Stop ID":"602","Division":"IRT","Line":"Pelham","Stop Name":"Buhre Av","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.84681","GTFS Longitude":"-73.832569"}, +{"Station ID":"362","Complex ID":"362","GTFS Stop ID":"603","Division":"IRT","Line":"Pelham","Stop Name":"Middletown Rd","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.843863","GTFS Longitude":"-73.836322"}, +{"Station ID":"363","Complex ID":"363","GTFS Stop ID":"604","Division":"IRT","Line":"Pelham","Stop Name":"Westchester Sq - E Tremont Av","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.839892","GTFS Longitude":"-73.842952"}, +{"Station ID":"364","Complex ID":"364","GTFS Stop ID":"606","Division":"IRT","Line":"Pelham","Stop Name":"Zerega Av","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.836488","GTFS Longitude":"-73.847036"}, +{"Station ID":"365","Complex ID":"365","GTFS Stop ID":"607","Division":"IRT","Line":"Pelham","Stop Name":"Castle Hill Av","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.834255","GTFS Longitude":"-73.851222"}, +{"Station ID":"366","Complex ID":"366","GTFS Stop ID":"608","Division":"IRT","Line":"Pelham","Stop Name":"Parkchester","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.833226","GTFS Longitude":"-73.860816"}, +{"Station ID":"367","Complex ID":"367","GTFS Stop ID":"609","Division":"IRT","Line":"Pelham","Stop Name":"St Lawrence Av","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.831509","GTFS Longitude":"-73.867618"}, +{"Station ID":"368","Complex ID":"368","GTFS Stop ID":"610","Division":"IRT","Line":"Pelham","Stop Name":"Morrison Av- Sound View","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.829521","GTFS Longitude":"-73.874516"}, +{"Station ID":"369","Complex ID":"369","GTFS Stop ID":"611","Division":"IRT","Line":"Pelham","Stop Name":"Elder Av","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.828584","GTFS Longitude":"-73.879159"}, +{"Station ID":"370","Complex ID":"370","GTFS Stop ID":"612","Division":"IRT","Line":"Pelham","Stop Name":"Whitlock Av","Borough":"Bx","Daytime Routes":"6","Structure":"Elevated","GTFS Latitude":"40.826525","GTFS Longitude":"-73.886283"}, +{"Station ID":"371","Complex ID":"371","GTFS Stop ID":"613","Division":"IRT","Line":"Pelham","Stop Name":"Hunts Point Av","Borough":"Bx","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.820948","GTFS Longitude":"-73.890549"}, +{"Station ID":"372","Complex ID":"372","GTFS Stop ID":"614","Division":"IRT","Line":"Pelham","Stop Name":"Longwood Av","Borough":"Bx","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.816104","GTFS Longitude":"-73.896435"}, +{"Station ID":"373","Complex ID":"373","GTFS Stop ID":"615","Division":"IRT","Line":"Pelham","Stop Name":"E 149 St","Borough":"Bx","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.812118","GTFS Longitude":"-73.904098"}, +{"Station ID":"374","Complex ID":"374","GTFS Stop ID":"616","Division":"IRT","Line":"Pelham","Stop Name":"E 143 St - St Mary's St","Borough":"Bx","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.808719","GTFS Longitude":"-73.907657"}, +{"Station ID":"375","Complex ID":"375","GTFS Stop ID":"617","Division":"IRT","Line":"Pelham","Stop Name":"Cypress Av","Borough":"Bx","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.805368","GTFS Longitude":"-73.914042"}, +{"Station ID":"376","Complex ID":"376","GTFS Stop ID":"618","Division":"IRT","Line":"Pelham","Stop Name":"Brook Av","Borough":"Bx","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.807566","GTFS Longitude":"-73.91924"}, +{"Station ID":"377","Complex ID":"377","GTFS Stop ID":"619","Division":"IRT","Line":"Pelham","Stop Name":"3 Av - 138 St","Borough":"Bx","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.810476","GTFS Longitude":"-73.926138"}, +{"Station ID":"378","Complex ID":"378","GTFS Stop ID":"401","Division":"IRT","Line":"Jerome Av","Stop Name":"Woodlawn","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.886037","GTFS Longitude":"-73.878751"}, +{"Station ID":"379","Complex ID":"379","GTFS Stop ID":"402","Division":"IRT","Line":"Jerome Av","Stop Name":"Mosholu Pkwy","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.87975","GTFS Longitude":"-73.884655"}, +{"Station ID":"380","Complex ID":"380","GTFS Stop ID":"405","Division":"IRT","Line":"Jerome Av","Stop Name":"Bedford Park Blvd - Lehman College","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.873412","GTFS Longitude":"-73.890064"}, +{"Station ID":"381","Complex ID":"381","GTFS Stop ID":"406","Division":"IRT","Line":"Jerome Av","Stop Name":"Kingsbridge Rd","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.86776","GTFS Longitude":"-73.897174"}, +{"Station ID":"382","Complex ID":"382","GTFS Stop ID":"407","Division":"IRT","Line":"Jerome Av","Stop Name":"Fordham Rd","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.862803","GTFS Longitude":"-73.901034"}, +{"Station ID":"383","Complex ID":"383","GTFS Stop ID":"408","Division":"IRT","Line":"Jerome Av","Stop Name":"183 St","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.858407","GTFS Longitude":"-73.903879"}, +{"Station ID":"384","Complex ID":"384","GTFS Stop ID":"409","Division":"IRT","Line":"Jerome Av","Stop Name":"Burnside Av","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.853453","GTFS Longitude":"-73.907684"}, +{"Station ID":"385","Complex ID":"385","GTFS Stop ID":"410","Division":"IRT","Line":"Jerome Av","Stop Name":"176 St","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.84848","GTFS Longitude":"-73.911794"}, +{"Station ID":"386","Complex ID":"386","GTFS Stop ID":"411","Division":"IRT","Line":"Jerome Av","Stop Name":"Mt Eden Av","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.844434","GTFS Longitude":"-73.914685"}, +{"Station ID":"387","Complex ID":"387","GTFS Stop ID":"412","Division":"IRT","Line":"Jerome Av","Stop Name":"170 St","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.840075","GTFS Longitude":"-73.917791"}, +{"Station ID":"388","Complex ID":"388","GTFS Stop ID":"413","Division":"IRT","Line":"Jerome Av","Stop Name":"167 St","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.835537","GTFS Longitude":"-73.9214"}, +{"Station ID":"389","Complex ID":"604","GTFS Stop ID":"414","Division":"IRT","Line":"Jerome Av","Stop Name":"161 St - Yankee Stadium","Borough":"Bx","Daytime Routes":"4","Structure":"Elevated","GTFS Latitude":"40.827994","GTFS Longitude":"-73.925831"}, +{"Station ID":"390","Complex ID":"603","GTFS Stop ID":"415","Division":"IRT","Line":"Jerome Av","Stop Name":"149 St - Grand Concourse","Borough":"Bx","Daytime Routes":"4","Structure":"Subway","GTFS Latitude":"40.818375","GTFS Longitude":"-73.927351"}, +{"Station ID":"391","Complex ID":"391","GTFS Stop ID":"416","Division":"IRT","Line":"Jerome Av","Stop Name":"138 St - Grand Concourse","Borough":"Bx","Daytime Routes":"4 5","Structure":"Subway","GTFS Latitude":"40.813224","GTFS Longitude":"-73.929849"}, +{"Station ID":"392","Complex ID":"392","GTFS Stop ID":"621","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"125 St","Borough":"M","Daytime Routes":"4 5 6","Structure":"Subway","GTFS Latitude":"40.804138","GTFS Longitude":"-73.937594"}, +{"Station ID":"393","Complex ID":"393","GTFS Stop ID":"622","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"116 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.798629","GTFS Longitude":"-73.941617"}, +{"Station ID":"394","Complex ID":"394","GTFS Stop ID":"623","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"110 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.79502","GTFS Longitude":"-73.94425"}, +{"Station ID":"395","Complex ID":"395","GTFS Stop ID":"624","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"103 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.7906","GTFS Longitude":"-73.947478"}, +{"Station ID":"396","Complex ID":"396","GTFS Stop ID":"625","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"96 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.785672","GTFS Longitude":"-73.95107"}, +{"Station ID":"397","Complex ID":"397","GTFS Stop ID":"626","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"86 St","Borough":"M","Daytime Routes":"4 5 6","Structure":"Subway","GTFS Latitude":"40.779492","GTFS Longitude":"-73.955589"}, +{"Station ID":"398","Complex ID":"398","GTFS Stop ID":"627","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"77 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.77362","GTFS Longitude":"-73.959874"}, +{"Station ID":"399","Complex ID":"399","GTFS Stop ID":"628","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"68 St - Hunter College","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.768141","GTFS Longitude":"-73.96387"}, +{"Station ID":"400","Complex ID":"613","GTFS Stop ID":"629","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"59 St","Borough":"M","Daytime Routes":"4 5 6","Structure":"Subway","GTFS Latitude":"40.762526","GTFS Longitude":"-73.967967"}, +{"Station ID":"401","Complex ID":"612","GTFS Stop ID":"630","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"51 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.757107","GTFS Longitude":"-73.97192"}, +{"Station ID":"402","Complex ID":"610","GTFS Stop ID":"631","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Grand Central - 42 St","Borough":"M","Daytime Routes":"4 5 6","Structure":"Subway","GTFS Latitude":"40.751776","GTFS Longitude":"-73.976848"}, +{"Station ID":"403","Complex ID":"403","GTFS Stop ID":"632","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"33 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.746081","GTFS Longitude":"-73.982076"}, +{"Station ID":"404","Complex ID":"404","GTFS Stop ID":"633","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"28 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.74307","GTFS Longitude":"-73.984264"}, +{"Station ID":"405","Complex ID":"405","GTFS Stop ID":"634","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"23 St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.739864","GTFS Longitude":"-73.986599"}, +{"Station ID":"406","Complex ID":"602","GTFS Stop ID":"635","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"14 St - Union Sq","Borough":"M","Daytime Routes":"4 5 6","Structure":"Subway","GTFS Latitude":"40.734673","GTFS Longitude":"-73.989951"}, +{"Station ID":"407","Complex ID":"407","GTFS Stop ID":"636","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Astor Pl","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.730054","GTFS Longitude":"-73.99107"}, +{"Station ID":"408","Complex ID":"619","GTFS Stop ID":"637","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Bleecker St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.725915","GTFS Longitude":"-73.994659"}, +{"Station ID":"409","Complex ID":"409","GTFS Stop ID":"638","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Spring St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.722301","GTFS Longitude":"-73.997141"}, +{"Station ID":"410","Complex ID":"623","GTFS Stop ID":"639","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Canal St","Borough":"M","Daytime Routes":"6","Structure":"Subway","GTFS Latitude":"40.718803","GTFS Longitude":"-74.000193"}, +{"Station ID":"411","Complex ID":"622","GTFS Stop ID":"640","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Brooklyn Bridge - City Hall","Borough":"M","Daytime Routes":"4 5 6","Structure":"Subway","GTFS Latitude":"40.713065","GTFS Longitude":"-74.004131"}, +{"Station ID":"412","Complex ID":"628","GTFS Stop ID":"418","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Fulton St","Borough":"M","Daytime Routes":"4 5","Structure":"Subway","GTFS Latitude":"40.710368","GTFS Longitude":"-74.009509"}, +{"Station ID":"413","Complex ID":"413","GTFS Stop ID":"419","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Wall St","Borough":"M","Daytime Routes":"4 5","Structure":"Subway","GTFS Latitude":"40.707557","GTFS Longitude":"-74.011862"}, +{"Station ID":"414","Complex ID":"414","GTFS Stop ID":"420","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Bowling Green","Borough":"M","Daytime Routes":"4 5","Structure":"Subway","GTFS Latitude":"40.704817","GTFS Longitude":"-74.014065"}, +{"Station ID":"415","Complex ID":"620","GTFS Stop ID":"423","Division":"IRT","Line":"Eastern Pky","Stop Name":"Borough Hall","Borough":"Bk","Daytime Routes":"4 5","Structure":"Subway","GTFS Latitude":"40.692404","GTFS Longitude":"-73.990151"}, +{"Station ID":"416","Complex ID":"416","GTFS Stop ID":"201","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Wakefield - 241 St","Borough":"Bx","Daytime Routes":"2","Structure":"Elevated","GTFS Latitude":"40.903125","GTFS Longitude":"-73.85062"}, +{"Station ID":"417","Complex ID":"417","GTFS Stop ID":"204","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Nereid Av","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.898379","GTFS Longitude":"-73.854376"}, +{"Station ID":"418","Complex ID":"418","GTFS Stop ID":"205","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"233 St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.893193","GTFS Longitude":"-73.857473"}, +{"Station ID":"419","Complex ID":"419","GTFS Stop ID":"206","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"225 St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.888022","GTFS Longitude":"-73.860341"}, +{"Station ID":"420","Complex ID":"420","GTFS Stop ID":"207","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"219 St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.883895","GTFS Longitude":"-73.862633"}, +{"Station ID":"421","Complex ID":"421","GTFS Stop ID":"208","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Gun Hill Rd","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.87785","GTFS Longitude":"-73.866256"}, +{"Station ID":"422","Complex ID":"422","GTFS Stop ID":"209","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Burke Av","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.871356","GTFS Longitude":"-73.867164"}, +{"Station ID":"423","Complex ID":"423","GTFS Stop ID":"210","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Allerton Av","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.865462","GTFS Longitude":"-73.867352"}, +{"Station ID":"424","Complex ID":"424","GTFS Stop ID":"211","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Pelham Pkwy","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.857192","GTFS Longitude":"-73.867615"}, +{"Station ID":"425","Complex ID":"425","GTFS Stop ID":"212","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Bronx Park East","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.848828","GTFS Longitude":"-73.868457"}, +{"Station ID":"426","Complex ID":"426","GTFS Stop ID":"213","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"E 180 St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.841894","GTFS Longitude":"-73.873488"}, +{"Station ID":"427","Complex ID":"427","GTFS Stop ID":"214","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"West Farms Sq - E Tremont Av","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.840295","GTFS Longitude":"-73.880049"}, +{"Station ID":"428","Complex ID":"428","GTFS Stop ID":"215","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"174 St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.837288","GTFS Longitude":"-73.887734"}, +{"Station ID":"429","Complex ID":"429","GTFS Stop ID":"216","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Freeman St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.829993","GTFS Longitude":"-73.891865"}, +{"Station ID":"430","Complex ID":"430","GTFS Stop ID":"217","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Simpson St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.824073","GTFS Longitude":"-73.893064"}, +{"Station ID":"431","Complex ID":"431","GTFS Stop ID":"218","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Intervale Av","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.822181","GTFS Longitude":"-73.896736"}, +{"Station ID":"432","Complex ID":"432","GTFS Stop ID":"219","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Prospect Av","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.819585","GTFS Longitude":"-73.90177"}, +{"Station ID":"433","Complex ID":"433","GTFS Stop ID":"220","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Jackson Av","Borough":"Bx","Daytime Routes":"2 5","Structure":"Elevated","GTFS Latitude":"40.81649","GTFS Longitude":"-73.907807"}, +{"Station ID":"434","Complex ID":"434","GTFS Stop ID":"221","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"3 Av - 149 St","Borough":"Bx","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.816109","GTFS Longitude":"-73.917757"}, +{"Station ID":"435","Complex ID":"603","GTFS Stop ID":"222","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"149 St - Grand Concourse","Borough":"Bx","Daytime Routes":"2 5","Structure":"Subway","GTFS Latitude":"40.81841","GTFS Longitude":"-73.926718"}, +{"Station ID":"436","Complex ID":"436","GTFS Stop ID":"301","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Harlem - 148 St","Borough":"M","Daytime Routes":"3","Structure":"Subway","GTFS Latitude":"40.82388","GTFS Longitude":"-73.93647"}, +{"Station ID":"437","Complex ID":"437","GTFS Stop ID":"302","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"145 St","Borough":"M","Daytime Routes":"3","Structure":"Subway","GTFS Latitude":"40.820421","GTFS Longitude":"-73.936245"}, +{"Station ID":"438","Complex ID":"438","GTFS Stop ID":"224","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"135 St","Borough":"M","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.814229","GTFS Longitude":"-73.94077"}, +{"Station ID":"439","Complex ID":"439","GTFS Stop ID":"225","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"125 St","Borough":"M","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.807754","GTFS Longitude":"-73.945495"}, +{"Station ID":"440","Complex ID":"440","GTFS Stop ID":"226","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"116 St","Borough":"M","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.802098","GTFS Longitude":"-73.949625"}, +{"Station ID":"441","Complex ID":"441","GTFS Stop ID":"227","Division":"IRT","Line":"Lenox - White Plains Rd","Stop Name":"Central Park North (110 St)","Borough":"M","Daytime Routes":"2 3","Structure":"Subway","GTFS Latitude":"40.799075","GTFS Longitude":"-73.951822"}, +{"Station ID":"442","Complex ID":"442","GTFS Stop ID":"501","Division":"IRT","Line":"Dyre Av","Stop Name":"Eastchester - Dyre Av","Borough":"Bx","Daytime Routes":"5","Structure":"At Grade","GTFS Latitude":"40.8883","GTFS Longitude":"-73.830834"}, +{"Station ID":"443","Complex ID":"443","GTFS Stop ID":"502","Division":"IRT","Line":"Dyre Av","Stop Name":"Baychester Av","Borough":"Bx","Daytime Routes":"5","Structure":"Open Cut","GTFS Latitude":"40.878663","GTFS Longitude":"-73.838591"}, +{"Station ID":"444","Complex ID":"444","GTFS Stop ID":"503","Division":"IRT","Line":"Dyre Av","Stop Name":"Gun Hill Rd","Borough":"Bx","Daytime Routes":"5","Structure":"Open Cut","GTFS Latitude":"40.869526","GTFS Longitude":"-73.846384"}, +{"Station ID":"445","Complex ID":"445","GTFS Stop ID":"504","Division":"IRT","Line":"Dyre Av","Stop Name":"Pelham Pkwy","Borough":"Bx","Daytime Routes":"5","Structure":"Open Cut","GTFS Latitude":"40.858985","GTFS Longitude":"-73.855359"}, +{"Station ID":"446","Complex ID":"446","GTFS Stop ID":"505","Division":"IRT","Line":"Dyre Av","Stop Name":"Morris Park","Borough":"Bx","Daytime Routes":"5","Structure":"Open Cut","GTFS Latitude":"40.854364","GTFS Longitude":"-73.860495"}, +{"Station ID":"447","Complex ID":"447","GTFS Stop ID":"701","Division":"IRT","Line":"Flushing","Stop Name":"Flushing - Main St","Borough":"Q","Daytime Routes":"7","Structure":"Subway","GTFS Latitude":"40.7596","GTFS Longitude":"-73.83003"}, +{"Station ID":"448","Complex ID":"448","GTFS Stop ID":"702","Division":"IRT","Line":"Flushing","Stop Name":"Mets - Willets Point","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.754622","GTFS Longitude":"-73.845625"}, +{"Station ID":"449","Complex ID":"449","GTFS Stop ID":"705","Division":"IRT","Line":"Flushing","Stop Name":"111 St","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.75173","GTFS Longitude":"-73.855334"}, +{"Station ID":"450","Complex ID":"450","GTFS Stop ID":"706","Division":"IRT","Line":"Flushing","Stop Name":"103 St - Corona Plaza","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.749865","GTFS Longitude":"-73.8627"}, +{"Station ID":"451","Complex ID":"451","GTFS Stop ID":"707","Division":"IRT","Line":"Flushing","Stop Name":"Junction Blvd","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.749145","GTFS Longitude":"-73.869527"}, +{"Station ID":"452","Complex ID":"452","GTFS Stop ID":"708","Division":"IRT","Line":"Flushing","Stop Name":"90 St - Elmhurst Av","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.748408","GTFS Longitude":"-73.876613"}, +{"Station ID":"453","Complex ID":"453","GTFS Stop ID":"709","Division":"IRT","Line":"Flushing","Stop Name":"82 St - Jackson Hts","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.747659","GTFS Longitude":"-73.883697"}, +{"Station ID":"454","Complex ID":"616","GTFS Stop ID":"710","Division":"IRT","Line":"Flushing","Stop Name":"74 St - Broadway","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.746848","GTFS Longitude":"-73.891394"}, +{"Station ID":"455","Complex ID":"455","GTFS Stop ID":"711","Division":"IRT","Line":"Flushing","Stop Name":"69 St","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.746325","GTFS Longitude":"-73.896403"}, +{"Station ID":"456","Complex ID":"456","GTFS Stop ID":"712","Division":"IRT","Line":"Flushing","Stop Name":"Woodside - 61 St","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.74563","GTFS Longitude":"-73.902984"}, +{"Station ID":"457","Complex ID":"457","GTFS Stop ID":"713","Division":"IRT","Line":"Flushing","Stop Name":"52 St","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.744149","GTFS Longitude":"-73.912549"}, +{"Station ID":"458","Complex ID":"458","GTFS Stop ID":"714","Division":"IRT","Line":"Flushing","Stop Name":"46 St","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.743132","GTFS Longitude":"-73.918435"}, +{"Station ID":"459","Complex ID":"459","GTFS Stop ID":"715","Division":"IRT","Line":"Flushing","Stop Name":"40 St","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.743781","GTFS Longitude":"-73.924016"}, +{"Station ID":"460","Complex ID":"460","GTFS Stop ID":"716","Division":"IRT","Line":"Flushing","Stop Name":"33 St","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.744587","GTFS Longitude":"-73.930997"}, +{"Station ID":"461","Complex ID":"461","GTFS Stop ID":"718","Division":"IRT","Line":"Flushing","Stop Name":"Queensboro Plaza","Borough":"Q","Daytime Routes":"7 N W","Structure":"Elevated","GTFS Latitude":"40.750582","GTFS Longitude":"-73.940202"}, +{"Station ID":"462","Complex ID":"606","GTFS Stop ID":"719","Division":"IRT","Line":"Flushing","Stop Name":"Court Sq","Borough":"Q","Daytime Routes":"7","Structure":"Elevated","GTFS Latitude":"40.747023","GTFS Longitude":"-73.945264"}, +{"Station ID":"463","Complex ID":"463","GTFS Stop ID":"720","Division":"IRT","Line":"Flushing","Stop Name":"Hunters Point Av","Borough":"Q","Daytime Routes":"7","Structure":"Subway","GTFS Latitude":"40.742216","GTFS Longitude":"-73.948916"}, +{"Station ID":"464","Complex ID":"464","GTFS Stop ID":"721","Division":"IRT","Line":"Flushing","Stop Name":"Vernon Blvd - Jackson Av","Borough":"Q","Daytime Routes":"7","Structure":"Subway","GTFS Latitude":"40.742626","GTFS Longitude":"-73.953581"}, +{"Station ID":"465","Complex ID":"610","GTFS Stop ID":"723","Division":"IRT","Line":"Flushing","Stop Name":"Grand Central - 42 St","Borough":"M","Daytime Routes":"7","Structure":"Subway","GTFS Latitude":"40.751431","GTFS Longitude":"-73.976041"}, +{"Station ID":"466","Complex ID":"609","GTFS Stop ID":"724","Division":"IRT","Line":"Flushing","Stop Name":"5 Av","Borough":"M","Daytime Routes":"7","Structure":"Subway","GTFS Latitude":"40.753821","GTFS Longitude":"-73.981963"}, +{"Station ID":"467","Complex ID":"611","GTFS Stop ID":"725","Division":"IRT","Line":"Flushing","Stop Name":"Times Sq - 42 St","Borough":"M","Daytime Routes":"7","Structure":"Subway","GTFS Latitude":"40.755477","GTFS Longitude":"-73.987691"}, +{"Station ID":"468","Complex ID":"611","GTFS Stop ID":"902","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Times Sq - 42 St","Borough":"M","Daytime Routes":"S","Structure":"Subway","GTFS Latitude":"40.755983","GTFS Longitude":"-73.986229"}, +{"Station ID":"469","Complex ID":"610","GTFS Stop ID":"901","Division":"IRT","Line":"Lexington - Shuttle","Stop Name":"Grand Central - 42 St","Borough":"M","Daytime Routes":"S","Structure":"Subway","GTFS Latitude":"40.752769","GTFS Longitude":"-73.979189"}, +{"Station ID":"471","Complex ID":"471","GTFS Stop ID":"726","Division":"IRT","Line":"Flushing","Stop Name":"34 St - 11 Av","Borough":"M","Daytime Routes":"7","Structure":"Subway","GTFS Latitude":"40.755882","GTFS Longitude":"-74.00191"}, +{"Station ID":"475","Complex ID":"475","GTFS Stop ID":"Q05","Division":"IND","Line":"Second Av","Stop Name":"96 St","Borough":"M","Daytime Routes":"Q","Structure":"Subway","GTFS Latitude":"40.784318","GTFS Longitude":"-73.947152"}, +{"Station ID":"476","Complex ID":"476","GTFS Stop ID":"Q04","Division":"IND","Line":"Second Av","Stop Name":"86 St","Borough":"M","Daytime Routes":"Q","Structure":"Subway","GTFS Latitude":"40.777891","GTFS Longitude":"-73.951787"}, +{"Station ID":"477","Complex ID":"477","GTFS Stop ID":"Q03","Division":"IND","Line":"Second Av","Stop Name":"72 St","Borough":"M","Daytime Routes":"Q","Structure":"Subway","GTFS Latitude":"40.768799","GTFS Longitude":"-73.958424"}, +{"Station ID":"501","Complex ID":"501","GTFS Stop ID":"S31","Division":"SIR","Line":"Staten Island","Stop Name":"St George","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.643748","GTFS Longitude":"-74.073643"}, +{"Station ID":"502","Complex ID":"502","GTFS Stop ID":"S30","Division":"SIR","Line":"Staten Island","Stop Name":"Tompkinsville","Borough":"SI","Daytime Routes":"SIR","Structure":"At Grade","GTFS Latitude":"40.636949","GTFS Longitude":"-74.074835"}, +{"Station ID":"503","Complex ID":"503","GTFS Stop ID":"S29","Division":"SIR","Line":"Staten Island","Stop Name":"Stapleton","Borough":"SI","Daytime Routes":"SIR","Structure":"Elevated","GTFS Latitude":"40.627915","GTFS Longitude":"-74.075162"}, +{"Station ID":"504","Complex ID":"504","GTFS Stop ID":"S28","Division":"SIR","Line":"Staten Island","Stop Name":"Clifton","Borough":"SI","Daytime Routes":"SIR","Structure":"Elevated","GTFS Latitude":"40.621319","GTFS Longitude":"-74.071402"}, +{"Station ID":"505","Complex ID":"505","GTFS Stop ID":"S27","Division":"SIR","Line":"Staten Island","Stop Name":"Grasmere","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.603117","GTFS Longitude":"-74.084087"}, +{"Station ID":"506","Complex ID":"506","GTFS Stop ID":"S26","Division":"SIR","Line":"Staten Island","Stop Name":"Old Town","Borough":"SI","Daytime Routes":"SIR","Structure":"Embankment","GTFS Latitude":"40.596612","GTFS Longitude":"-74.087368"}, +{"Station ID":"507","Complex ID":"507","GTFS Stop ID":"S25","Division":"SIR","Line":"Staten Island","Stop Name":"Dongan Hills","Borough":"SI","Daytime Routes":"SIR","Structure":"Embankment","GTFS Latitude":"40.588849","GTFS Longitude":"-74.09609"}, +{"Station ID":"508","Complex ID":"508","GTFS Stop ID":"S24","Division":"SIR","Line":"Staten Island","Stop Name":"Jefferson Av","Borough":"SI","Daytime Routes":"SIR","Structure":"Embankment","GTFS Latitude":"40.583591","GTFS Longitude":"-74.103338"}, +{"Station ID":"509","Complex ID":"509","GTFS Stop ID":"S23","Division":"SIR","Line":"Staten Island","Stop Name":"Grant City","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.578965","GTFS Longitude":"-74.109704"}, +{"Station ID":"510","Complex ID":"510","GTFS Stop ID":"S22","Division":"SIR","Line":"Staten Island","Stop Name":"New Dorp","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.57348","GTFS Longitude":"-74.11721"}, +{"Station ID":"511","Complex ID":"511","GTFS Stop ID":"S21","Division":"SIR","Line":"Staten Island","Stop Name":"Oakwood Heights","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.56511","GTFS Longitude":"-74.12632"}, +{"Station ID":"512","Complex ID":"512","GTFS Stop ID":"S20","Division":"SIR","Line":"Staten Island","Stop Name":"Bay Terrace","Borough":"SI","Daytime Routes":"SIR","Structure":"Embankment","GTFS Latitude":"40.5564","GTFS Longitude":"-74.136907"}, +{"Station ID":"513","Complex ID":"513","GTFS Stop ID":"S19","Division":"SIR","Line":"Staten Island","Stop Name":"Great Kills","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.551231","GTFS Longitude":"-74.151399"}, +{"Station ID":"514","Complex ID":"514","GTFS Stop ID":"S18","Division":"SIR","Line":"Staten Island","Stop Name":"Eltingville","Borough":"SI","Daytime Routes":"SIR","Structure":"Embankment","GTFS Latitude":"40.544601","GTFS Longitude":"-74.16457"}, +{"Station ID":"515","Complex ID":"515","GTFS Stop ID":"S17","Division":"SIR","Line":"Staten Island","Stop Name":"Annadale","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.54046","GTFS Longitude":"-74.178217"}, +{"Station ID":"516","Complex ID":"516","GTFS Stop ID":"S16","Division":"SIR","Line":"Staten Island","Stop Name":"Huguenot","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.533674","GTFS Longitude":"-74.191794"}, +{"Station ID":"517","Complex ID":"517","GTFS Stop ID":"S15","Division":"SIR","Line":"Staten Island","Stop Name":"Prince's Bay","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.525507","GTFS Longitude":"-74.200064"}, +{"Station ID":"518","Complex ID":"518","GTFS Stop ID":"S14","Division":"SIR","Line":"Staten Island","Stop Name":"Pleasant Plains","Borough":"SI","Daytime Routes":"SIR","Structure":"Embankment","GTFS Latitude":"40.52241","GTFS Longitude":"-74.217847"}, +{"Station ID":"519","Complex ID":"519","GTFS Stop ID":"S13","Division":"SIR","Line":"Staten Island","Stop Name":"Richmond Valley","Borough":"SI","Daytime Routes":"SIR","Structure":"Open Cut","GTFS Latitude":"40.519631","GTFS Longitude":"-74.229141"}, +{"Station ID":"522","Complex ID":"522","GTFS Stop ID":"S09","Division":"SIR","Line":"Staten Island","Stop Name":"Tottenville","Borough":"SI","Daytime Routes":"SIR","Structure":"At Grade","GTFS Latitude":"40.512764","GTFS Longitude":"-74.251961"}, +{"Station ID":"523","Complex ID":"523","GTFS Stop ID":"S11","Division":"SIR","Line":"Staten Island","Stop Name":"Arthur Kill","Borough":"SI","Daytime Routes":"SIR","Structure":"At Grade","GTFS Latitude":"40.516578","GTFS Longitude":"-74.242096"} +] \ No newline at end of file diff --git a/handlers/check-favorite-lines-status.js b/handlers/check-favorite-lines-status.js new file mode 100644 index 0000000..24e5946 --- /dev/null +++ b/handlers/check-favorite-lines-status.js @@ -0,0 +1,29 @@ +const _ = require('lodash'); + +// Speech Helpers +const literalize = require('../speech-helpers/literalize.js'); +const statusToSpeech = require('../speech-helpers/status-to-speech.js'); + +// Services +const fetchMTAStatus = require('../services/fetch-mta-status.js'); + +// Utilities +const withServiceIssues = require('../utilities/with-service-issues.js'); + +module.exports = function() { + let watchedTrains = (this.attributes["trackedTrainLines"] || []); + fetchMTAStatus(statuses => { + + watchedTrainsWithIssues = _(statuses) + .filter(withServiceIssues) + .filter(status => watchedTrains.includes(status.nameGroup)) + .value(); + + if(watchedTrainsWithIssues.length > 0) { + let statusMessages = watchedTrainsWithIssues.map(status => statusToSpeech(status.nameGroup, status.status)); + this.emit(':tell', `There are issues with your commute. ${statusMessages.join(' ')}`); + } else { + this.emit(':tell', `Your commute is looking good, bam!`) + } + }); +} diff --git a/handlers/check-favorite-lines.js b/handlers/check-favorite-lines.js new file mode 100644 index 0000000..8c0d615 --- /dev/null +++ b/handlers/check-favorite-lines.js @@ -0,0 +1,8 @@ +const literalize = require('../speech-helpers/literalize.js'); +const pluralize = require('pluralize'); + +module.exports = function() { + let watchedTrains = (this.attributes["trackedTrainLines"] || []).map(literalize); + + this.emit(":tell", `You're watching the ${watchedTrains.join(", ")} ${pluralize('train', watchedTrains.length)}. `); +} diff --git a/handlers/store-commute.js b/handlers/store-commute.js new file mode 100644 index 0000000..8af3d14 --- /dev/null +++ b/handlers/store-commute.js @@ -0,0 +1,10 @@ +module.exports = function() { + let { subwayStation, subwayDirection, subwayLine } = this.event.request.intent.slots; + + if(this.event.request.dialogState === 'COMPLETED') { + this.emit(':tell', 'thank you'); + } else { + console.log(JSON.stringify(this.event)); + this.emit(':delegate'); + } +} diff --git a/handlers/store-favorite-line.js b/handlers/store-favorite-line.js new file mode 100644 index 0000000..6327b1f --- /dev/null +++ b/handlers/store-favorite-line.js @@ -0,0 +1,20 @@ +const fetchMTAStatus = require('../services/fetch-mta-status.js'); + +const closestLineMatcher = require('../utilities/closest-line-matcher.js'); +const literalize = require('../speech-helpers/literalize.js'); + +module.exports = function(alexa) { + let heardNameGroup = this.event.request.intent.slots.subwayLineOrGroup.value; + + if(!heardNameGroup) { this.emit(':tell', "Sorry, I didn't hear a subway line or group I recognized") }; + + fetchMTAStatus(statuses => { + let closestLine = closestLineMatcher(statuses, 'nameGroup', heardNameGroup); + let currentTrackedLines = new Set(this.attributes["trackedTrainLines"] || []); + currentTrackedLines.add(closestLine.nameGroup); + + this.attributes["trackedTrainLines"] = Array.from(currentTrackedLines); + + this.emit(':tell', `Okay, I added ${literalize(closestLine.nameGroup)} trains to your watch list. bam!`); + }); +} diff --git a/index.js b/index.js index d74ca27..5bb3212 100644 --- a/index.js +++ b/index.js @@ -1,37 +1,33 @@ require('isomorphic-fetch'); +const AWS = require("aws-sdk"); const uuidv4 = require("uuid/v4"); var env = process.env.NODE_ENV || 'development'; +const logRequests = process.env.LOG_REQUESTS === 'true'; +const applicationId = process.env.APPLICATION_ID; -if(env !== 'production') { - require('dotenv').load({ path: '.env.' + env }); -} +const _ = require('lodash'); +const Alexa = require('alexa-sdk'); -var applicationId = process.env.APPLICATION_ID; -var mtaStatusURL = process.env.MTA_STATUS_URL; +const statusToSpeech = require('./speech-helpers/status-to-speech.js'); +const fetchMTAStatus = require('./services/fetch-mta-status.js'); -var _ = require('lodash'); -var levenshtein = require('fast-levenshtein'); -var Alexa = require('alexa-sdk'); -var currentMTAStatus = require('./current-mta-status.js'); -var statusToSpeech = require('./status-to-speech.js'); +// Handlers +const storeFavoriteLineHandler = require('./handlers/store-favorite-line.js'); +const checkFavoriteLinesHandler = require('./handlers/check-favorite-lines.js'); +const checkFavoriteLinesStatusHandler = require('./handlers/check-favorite-lines-status.js'); +const storeCommuteHandler = require('./handlers/store-commute.js'); -var fetchStatus = function(callback) { - return fetch(mtaStatusURL).then(function(response) { - return response.text() - }).then(function(body) { - currentMTAStatus(body, callback); - }); -}; - -const affectedServiceStatusesBuilder = (statuses) => { - let notGoodService = status => status.status !== 'GOOD SERVICE'; +// Utilities +const closestLineMatcher = require('./utilities/closest-line-matcher.js'); +const withServiceIssues = require('./utilities/with-service-issues.js'); - let affectedServices = statuses - .filter(notGoodService) +if(env === 'test') { require('dotenv').config(); }; - return _(affectedServices) +const affectedServiceStatusesBuilder = (statuses) => { + return _(statuses) + .filter(withServiceIssues) .groupBy('status') .map((lines, status, collection) => { lines = lines.map(status => status.nameGroup); @@ -40,7 +36,7 @@ const affectedServiceStatusesBuilder = (statuses) => { }; var fullStatusUpdateHandler = function() { - fetchStatus(statuses => { + fetchMTAStatus(statuses => { let affectedServiceStatuses = affectedServiceStatusesBuilder(statuses); if(affectedServiceStatuses.length === 0) { @@ -56,22 +52,13 @@ var handlers = { statusOfLine: function () { var self = this; var nameGroup = self.event.request.intent.slots.subwayLineOrGroup.value; - var closestStatus = null; var badQueryResponse = function() { self.emit(':tell', "Sorry, I didn't hear a subway line I understand"); } if(nameGroup) { - fetchStatus(function(statuses) { - if(nameGroup.length > 1) { - closestStatus = _.minBy(statuses, function(status) { - return levenshtein.get(status.nameGroup, nameGroup.toUpperCase()); - }); - } else { - closestStatus = _.find(statuses, function(status) { - return status.nameGroup.search(nameGroup.toUpperCase()) !== -1; - }); - } + fetchMTAStatus(function(statuses) { + let closestStatus = closestLineMatcher(statuses, 'nameGroup', nameGroup); if(closestStatus) { if(closestStatus.description) { @@ -90,11 +77,16 @@ var handlers = { }, fullStatusUpdate: fullStatusUpdateHandler, + storeFavoriteLine: storeFavoriteLineHandler, + checkFavoriteLines: checkFavoriteLinesHandler, + checkFavoriteLinesStatus: checkFavoriteLinesStatusHandler, + + storeCommute: storeCommuteHandler, Unhandled: fullStatusUpdateHandler }; exports.flashBriefingHandler = (event, context, callback) => { - fetchStatus(statuses => { + fetchMTAStatus(statuses => { let affectedServiceStatuses = affectedServiceStatusesBuilder(statuses); let message; @@ -119,12 +111,21 @@ exports.flashBriefingHandler = (event, context, callback) => { }; exports.handler = function(event, context, callback){ - if(env === 'production') { - console.log(event.request); // Log to Cloudwatch - } + if(logRequests) console.log(event); var alexa = Alexa.handler(event, context); alexa.appId = applicationId; + + if(env === 'test') { + alexa.dynamoDBClient = new AWS.DynamoDB({ + apiVersion: '2012-08-10', + endpoint: "http://localhost:8000", + region: "us-east-1" + }); + } + + alexa.dynamoDBTableName = `nyc-subway-${env}`; + alexa.registerHandlers(handlers); alexa.execute(); }; diff --git a/intents.json b/intents.json index 1a49a27..2fb5844 100644 --- a/intents.json +++ b/intents.json @@ -11,6 +11,21 @@ { "intent": "fullStatusUpdate", "slots": [] + }, + { + "intent": "storeFavoriteLine", + "slots":[ + { + "name": "subwayLineOrGroup", + "type": "SUBWAY_LINE_OR_GROUP" + } + ] + }, + { + "intent": "checkFavoriteLines" + }, + { + "intent": "checkFavoriteLinesStatus" } ] } diff --git a/package.json b/package.json index e05c596..8542c4f 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,29 @@ "main": "index.js", "author": "Damon Aw ", "scripts": { - "release": "rm -f subway.zip && yarn --production && zip -r subway.zip . -x *.git*", + "data:convert_csv_stops_to_json": "csvtojson ./assets/mta/Stations.csv > ./values/subway-stops.json", + "data:slots:generate_station_names": "node ./scripts/clean-station-names.js > ./data/slots/station-names.json", + "data:slots:generate_subway_lines": "node ./scripts/generate-subway-lines.js > ./data/slots/subway-lines.json", + "dynamodb:download": "mkdir -p downloads && mkdir -p dynamodb_local && wget -N https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.tar.gz -P ./downloads && tar -xvf ./downloads/dynamodb_local_latest.tar.gz -C ./dynamodb_local", + "dynamodb:start": "java -Djava.library.path=./dynamodb_local/DynamoDBLocal_lib -jar ./dynamodb_local/DynamoDBLocal.jar -sharedDb -inMemory", + "release": "rm -f subway.zip && yarn --production && zip -r subway.zip . -x '*.git*' -x 'tests/*' -x 'downloads/*' -x 'assets/*' -x 'dynamodb_local/*'", "test": "NODE_ENV=test ava" }, "ava": { "files": [ + "tests/**/*-test.js", "tests/*-test.js" ], "timeout": "6000", "verbose": true }, "dependencies": { - "alexa-sdk": "^1.0.6", + "alexa-sdk": "git+https://github.com/daemonsy/alexa-skills-kit-sdk-for-nodejs", "fast-levenshtein": "^2.0.6", "isomorphic-fetch": "^2.2.1", "lodash": "^4.17.4", "pluralize": "^3.1.0", + "protobufjs": "^6.8.0", "sanitize-html": "^1.13.0", "uuid": "^3.1.0", "xml2js": "^0.4.17" @@ -28,7 +35,8 @@ "license": "MIT", "devDependencies": { "ava": "^0.17.0", - "dotenv": "^2.0.0", + "csvtojson": "^1.1.7", + "dotenv": "^4.0.0", "fetch-mock": "^5.8.0", "lambda-tester": "^2.6.1" } diff --git a/current-mta-status.js b/parsers/current-mta-status.js similarity index 79% rename from current-mta-status.js rename to parsers/current-mta-status.js index 38db4d2..0aa8a93 100644 --- a/current-mta-status.js +++ b/parsers/current-mta-status.js @@ -1,5 +1,5 @@ -var parseXML = require('xml2js').parseString; -var serviceDetailsCleaner = require('./service-details-cleaner'); +const parseXML = require('xml2js').parseString; +const serviceDetailsCleaner = require('./service-details-cleaner'); module.exports = function(mtaStatusXML, callback) { parseXML(mtaStatusXML, { normalize: true, trim: true }, function(error, results) { diff --git a/parsers/service-details-cleaner.js b/parsers/service-details-cleaner.js new file mode 100644 index 0000000..7befb85 --- /dev/null +++ b/parsers/service-details-cleaner.js @@ -0,0 +1,12 @@ +const sanitize = require('sanitize-html'); +const MATCHERS = { + br: /\s*/g +} + +module.exports = function(detailsText) { + let text = detailsText.replace(MATCHERS.br, '\n'); // BRs to newline + + return sanitize(text, { + allowedTags: [] + }); +}; diff --git a/scripts/clean-station-names.js b/scripts/clean-station-names.js new file mode 100644 index 0000000..19e9451 --- /dev/null +++ b/scripts/clean-station-names.js @@ -0,0 +1,12 @@ +const subwayStops = require('../values/subway-stops.js'); +const _ = require('lodash'); + +process.stdout.write( + JSON.stringify( + _(subwayStops) + .map(stopData => stopData["stopName"]) + .uniq() + .map(stopName => ({ id: null, name: { value: stopName, synonyms: [] }})) + .value() + ) +); diff --git a/scripts/generate-subway-lines.js b/scripts/generate-subway-lines.js new file mode 100644 index 0000000..cc8d6ac --- /dev/null +++ b/scripts/generate-subway-lines.js @@ -0,0 +1,37 @@ +const _ = require('lodash'); + +const subwayLines = [ + '1', '2', '3', + '4', '5', '6', + '7', + 'A', 'C', 'E', + 'N', 'Q', 'R', 'W', + 'B', 'D', 'F', 'M', + 'L', 'G', + 'S', + 'J', 'Z', + 'SIR' +]; + +const synonyms = { + 'A': ['alpha'], + 'C': ['charlie'], + 'E': ['echo'], + 'N': ['november'], + 'Q': ['quebec'], + 'R': ['romeo'], + 'W': ['whiskey'], + 'B': ['bravo'], + 'D': ['delta'], + 'F': ['foxtrot'], + 'M': ['mike'], + 'L': ['lima'], + 'G': ['golf'], + 'S': ['sierra', 'singapore'], + 'J': ['juliet'], + 'Z': ['zulu'] +}; + +process.stdout.write( + JSON.stringify(subwayLines.map(line => ({ id: line, name: { value: line, synonyms: synonyms[line] || [] }}))) +); diff --git a/service-details-cleaner.js b/service-details-cleaner.js deleted file mode 100644 index ae45b64..0000000 --- a/service-details-cleaner.js +++ /dev/null @@ -1,12 +0,0 @@ -var sanitize = require('sanitize-html'); -var MATCHERS = { - br: /\s*/g -} - -module.exports = function(detailsText) { - var text = detailsText.replace(MATCHERS.br, '\n'); // BRs to linebreaks - - return sanitize(text, { - allowedTags: [] - }); -}; diff --git a/services/fetch-mta-status.js b/services/fetch-mta-status.js new file mode 100644 index 0000000..1adc8d8 --- /dev/null +++ b/services/fetch-mta-status.js @@ -0,0 +1,8 @@ +const MTA_STATUS_URL = process.env.MTA_STATUS_URL; +const currentMTAStatus = require('../parsers/current-mta-status.js'); + +module.exports = function(callback) { + return fetch(MTA_STATUS_URL) + .then(response => response.text()) + .then(body => currentMTAStatus(body, callback)); +}; diff --git a/speech-helpers/literalize.js b/speech-helpers/literalize.js new file mode 100644 index 0000000..40e8496 --- /dev/null +++ b/speech-helpers/literalize.js @@ -0,0 +1 @@ +module.exports = (nameGroup) => nameGroup.split("").join("-") diff --git a/status-to-speech.js b/speech-helpers/status-to-speech.js similarity index 100% rename from status-to-speech.js rename to speech-helpers/status-to-speech.js diff --git a/tests/fixtures/events/check-favorite-lines-status.json b/tests/fixtures/events/check-favorite-lines-status.json new file mode 100644 index 0000000..d2eead0 --- /dev/null +++ b/tests/fixtures/events/check-favorite-lines-status.json @@ -0,0 +1,29 @@ +{ + "session": { + "sessionId": "SessionId.530c26f5-0c12-49d7-84a0-ef08bbce41da", + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "attributes": { + "trackedTrainLines": [ + "ACE", + "NQR" + ] + }, + "user": { + "userId": "amzn1.ask.account.AFAKUB5FUTW5AXKNQ7ZVBGQWW7EKCO2V5XIW447VAUBZM2YYKTKPXYNOSCR4DT2VDIBJ6SG2LSY3SESF56RGJNAF77EG547QF3TDYRLBFXJFPZC4SZ5PMWQRZ64B3Q22LYNN7R6COCX6WWALHWF6SHT234QXMD23SWTLZXKDAV4NILWHGRMDOJJQ2VQLO6RL4UTX6NCYQUH5PHY" + }, + "new": true + }, + "request": { + "type": "IntentRequest", + "requestId": "EdwRequestId.51403ae1-2358-4f5d-9df2-c11d417fb8a7", + "locale": "en-US", + "timestamp": "2017-07-01T18:21:35Z", + "intent": { + "name": "checkFavoriteLinesStatus", + "slots": {} + } + }, + "version": "1.0" +} diff --git a/tests/fixtures/events/check-favorite-lines.json b/tests/fixtures/events/check-favorite-lines.json new file mode 100644 index 0000000..c635def --- /dev/null +++ b/tests/fixtures/events/check-favorite-lines.json @@ -0,0 +1,33 @@ +{ + "session": { + "sessionId": "SessionId.36f74d27-e2aa-44d7-8017-d375e2d05835", + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "attributes": { + "trackedTrainLines": [ + "ACE", + "L", + "456", + "BDFM", + "G", + "123" + ] + }, + "user": { + "userId": "amzn1.ask.account.AFAKUB5FUTW5AXKNQ7ZVBGQWW7EKCO2V5XIW447VAUBZM2YYKTKPXYNOSCR4DT2VDIBJ6SG2LSY3SESF56RGJNAF77EG547QF3TDYRLBFXJFPZC4SZ5PMWQRZ64B3Q22LYNN7R6COCX6WWALHWF6SHT234QXMD23SWTLZXKDAV4NILWHGRMDOJJQ2VQLO6RL4UTX6NCYQUH5PHY" + }, + "new": false + }, + "request": { + "type": "IntentRequest", + "requestId": "EdwRequestId.161e08a5-9b43-417c-9fcf-084c8a9f41fb", + "locale": "en-US", + "timestamp": "2017-07-01T16:59:45Z", + "intent": { + "name": "checkFavoriteLines", + "slots": {} + } + }, + "version": "1.0" +} diff --git a/tests/fixtures/events/store-commute-start.json b/tests/fixtures/events/store-commute-start.json new file mode 100644 index 0000000..685f1ca --- /dev/null +++ b/tests/fixtures/events/store-commute-start.json @@ -0,0 +1,59 @@ +{ + "version": "1.0", + "session": { + "new": true, + "sessionId": "amzn1.echo-api.session.02c67291-9e9a-4ca5-bef8-c19b642426c4", + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "user": { + "userId": "amzn1.ask.account.AG7TBVHS7QUDLBU6N65BSUJMZZTQ6CFD4YFQELQRLXB3M4UV64MQ7RJ5CPWXYALQ3QJ665TJ7OIF3ZT4RMC5NQRPH5OWB4TMQTC46REKNEYDBLUN6OJ7OLXYHGEUOLZYRA3CQGGSLOSOFQTEVG4DNKVRN3NIVPK2YYUCAFJ64ODXBDNE5YNAXDX7GQATDLNGZR7G5KMDNTHZR2I" + }, + "attributes": {} + }, + "context": { + "AudioPlayer": { + "playerActivity": "STOPPED" + }, + "System": { + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "user": { + "userId": "amzn1.ask.account.AG7TBVHS7QUDLBU6N65BSUJMZZTQ6CFD4YFQELQRLXB3M4UV64MQ7RJ5CPWXYALQ3QJ665TJ7OIF3ZT4RMC5NQRPH5OWB4TMQTC46REKNEYDBLUN6OJ7OLXYHGEUOLZYRA3CQGGSLOSOFQTEVG4DNKVRN3NIVPK2YYUCAFJ64ODXBDNE5YNAXDX7GQATDLNGZR7G5KMDNTHZR2I" + }, + "device": { + "deviceId": "amzn1.ask.device.AEGQ5USV2TVZTMTG7AXEFTAK5FA4GCTGJWPKJJYMWCFA3E4ADMSX6V7UYVNDBFNUVE2FFWHIZEUBFGWELKJLN243XVK7MURJXUD5O7HFHWAQNFDJAWPSELUAO3NX2RECP6QEZEICXGE2ULYJFUYGSWSNEFRA", + "supportedInterfaces": { + "AudioPlayer": {} + } + }, + "apiEndpoint": "https://api.amazonalexa.com" + } + }, + "request": { + "type": "IntentRequest", + "requestId": "amzn1.echo-api.request.f6c656ec-0bc0-4fc6-bb89-91747b4718c7", + "timestamp": "2017-07-07T21:55:46Z", + "locale": "en-US", + "intent": { + "name": "storeCommute", + "confirmationStatus": "NONE", + "slots": { + "subwayStation": { + "name": "subwayStation", + "confirmationStatus": "NONE" + }, + "subwayDirection": { + "name": "subwayDirection", + "confirmationStatus": "NONE" + }, + "subwayLine": { + "name": "subwayLine", + "confirmationStatus": "NONE" + } + } + }, + "dialogState": "STARTED" + } +} diff --git a/tests/fixtures/events/store-commute-subway-line.json b/tests/fixtures/events/store-commute-subway-line.json new file mode 100644 index 0000000..5aa7fd1 --- /dev/null +++ b/tests/fixtures/events/store-commute-subway-line.json @@ -0,0 +1,78 @@ +{ + "version": "1.0", + "session": { + "new": false, + "sessionId": "amzn1.echo-api.session.02c67291-9e9a-4ca5-bef8-c19b642426c4", + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "user": { + "userId": "amzn1.ask.account.AG7TBVHS7QUDLBU6N65BSUJMZZTQ6CFD4YFQELQRLXB3M4UV64MQ7RJ5CPWXYALQ3QJ665TJ7OIF3ZT4RMC5NQRPH5OWB4TMQTC46REKNEYDBLUN6OJ7OLXYHGEUOLZYRA3CQGGSLOSOFQTEVG4DNKVRN3NIVPK2YYUCAFJ64ODXBDNE5YNAXDX7GQATDLNGZR7G5KMDNTHZR2I" + }, + "attributes": {} + }, + "context": { + "AudioPlayer": { + "playerActivity": "STOPPED" + }, + "System": { + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "user": { + "userId": "amzn1.ask.account.AG7TBVHS7QUDLBU6N65BSUJMZZTQ6CFD4YFQELQRLXB3M4UV64MQ7RJ5CPWXYALQ3QJ665TJ7OIF3ZT4RMC5NQRPH5OWB4TMQTC46REKNEYDBLUN6OJ7OLXYHGEUOLZYRA3CQGGSLOSOFQTEVG4DNKVRN3NIVPK2YYUCAFJ64ODXBDNE5YNAXDX7GQATDLNGZR7G5KMDNTHZR2I" + }, + "device": { + "deviceId": "amzn1.ask.device.AEGQ5USV2TVZTMTG7AXEFTAK5FA4GCTGJWPKJJYMWCFA3E4ADMSX6V7UYVNDBFNUVE2FFWHIZEUBFGWELKJLN243XVK7MURJXUD5O7HFHWAQNFDJAWPSELUAO3NX2RECP6QEZEICXGE2ULYJFUYGSWSNEFRA", + "supportedInterfaces": { + "AudioPlayer": {} + } + }, + "apiEndpoint": "https://api.amazonalexa.com" + } + }, + "request": { + "type": "IntentRequest", + "requestId": "amzn1.echo-api.request.ff88ca27-f12f-4ab1-9cc2-02b52cea1ec7", + "timestamp": "2017-07-07T21:55:59Z", + "locale": "en-US", + "intent": { + "name": "storeCommute", + "confirmationStatus": "NONE", + "slots": { + "subwayStation": { + "name": "subwayStation", + "confirmationStatus": "NONE" + }, + "subwayDirection": { + "name": "subwayDirection", + "confirmationStatus": "NONE" + }, + "subwayLine": { + "name": "subwayLine", + "value": "R", + "resolutions": { + "resolutionsPerAuthority": [ + { + "authority": "amzn1.er-authority.echo-sdk.amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae.SUBWAY_LINE", + "status": { + "code": "ER_SUCCESS_MATCH" + }, + "values": [ + { + "value": { + "name": "R", + "id": "e1e1d3d40573127e9ee0480caf1283d6" + } + } + ] + } + ] + }, + "confirmationStatus": "NONE" + } + } + }, + "dialogState": "IN_PROGRESS" + } +} diff --git a/tests/fixtures/events/store-favorite-line-ace.json b/tests/fixtures/events/store-favorite-line-ace.json new file mode 100644 index 0000000..e72451b --- /dev/null +++ b/tests/fixtures/events/store-favorite-line-ace.json @@ -0,0 +1,29 @@ +{ + "session": { + "sessionId": "SessionId.fea02aa4-0e49-4f22-ab37-d818ee1c8f32", + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "attributes": {}, + "user": { + "userId": "amzn1.ask.account.AFAKUB5FUTW5AXKNQ7ZVBGQWW7EKCO2V5XIW447VAUBZM2YYKTKPXYNOSCR4DT2VDIBJ6SG2LSY3SESF56RGJNAF77EG547QF3TDYRLBFXJFPZC4SZ5PMWQRZ64B3Q22LYNN7R6COCX6WWALHWF6SHT234QXMD23SWTLZXKDAV4NILWHGRMDOJJQ2VQLO6RL4UTX6NCYQUH5PHY" + }, + "new": true + }, + "request": { + "type": "IntentRequest", + "requestId": "EdwRequestId.648ced7d-3e26-4372-9b4f-f89d23a24c6a", + "locale": "en-US", + "timestamp": "2017-06-30T02:46:44Z", + "intent": { + "name": "storeFavoriteLine", + "slots": { + "subwayLineOrGroup": { + "name": "subwayLineOrGroup", + "value": "ace" + } + } + } + }, + "version": "1.0" +} diff --git a/tests/fixtures/events/store-favorite-line-seven.json b/tests/fixtures/events/store-favorite-line-seven.json new file mode 100644 index 0000000..df2e835 --- /dev/null +++ b/tests/fixtures/events/store-favorite-line-seven.json @@ -0,0 +1,29 @@ +{ + "session": { + "sessionId": "SessionId.fea02aa4-0e49-4f22-ab37-d818ee1c8f32", + "application": { + "applicationId": "amzn1.ask.skill.4fe3808f-fda4-4bfc-8e53-07b9f3b3baae" + }, + "attributes": {}, + "user": { + "userId": "amzn1.ask.account.AFAKUB5FUTW5AXKNQ7ZVBGQWW7EKCO2V5XIW447VAUBZM2YYKTKPXYNOSCR4DT2VDIBJ6SG2LSY3SESF56RGJNAF77EG547QF3TDYRLBFXJFPZC4SZ5PMWQRZ64B3Q22LYNN7R6COCX6WWALHWF6SHT234QXMD23SWTLZXKDAV4NILWHGRMDOJJQ2VQLO6RL4UTX6NCYQUH5PHY" + }, + "new": false + }, + "request": { + "type": "IntentRequest", + "requestId": "EdwRequestId.cb4f5ce6-d838-4898-9caf-7789aedda93e", + "locale": "en-US", + "timestamp": "2017-06-30T02:47:32Z", + "intent": { + "name": "storeFavoriteLine", + "slots": { + "subwayLineOrGroup": { + "name": "subwayLineOrGroup", + "value": "7" + } + } + } + }, + "version": "1.0" +} diff --git a/tests/handlers/check-favorite-lines-status-test.js b/tests/handlers/check-favorite-lines-status-test.js new file mode 100644 index 0000000..bf9404f --- /dev/null +++ b/tests/handlers/check-favorite-lines-status-test.js @@ -0,0 +1,28 @@ +import fs from 'fs'; +import test from 'ava'; + +import LambdaTester from 'lambda-tester'; +import fetchMock from 'fetch-mock'; + +import checkFavoriteLinesStatus from '../../handlers/check-favorite-lines-status.js'; +import createAlexaHandler from '../helpers/create-alexa-handler.js'; + +test.beforeEach(t => { + fetchMock.once(process.env.MTA_STATUS_URL, fs.readFileSync(process.cwd() + '/tests/fixtures/mta-status.xml', 'utf-8')); +}) + +test.afterEach(fetchMock.restore); + +test(`handling "to check my commute"`, async t => { + t.plan(2); + + const event = JSON.parse(fs.readFileSync(process.cwd() + '/tests/fixtures/events/check-favorite-lines-status.json')); + const alexaHandler = createAlexaHandler({ checkFavoriteLinesStatus }) + + const result = await LambdaTester(alexaHandler) + .event(event) + .expectSucceed(r => r); + + t.true(result.response.outputSpeech.ssml.includes(`A-C-E line is experiencing delays`)); + t.true(result.response.outputSpeech.ssml.includes(`N-Q-R line is undergoing planned work`)); +}); diff --git a/tests/handlers/check-favorite-lines-test.js b/tests/handlers/check-favorite-lines-test.js new file mode 100644 index 0000000..bc134ba --- /dev/null +++ b/tests/handlers/check-favorite-lines-test.js @@ -0,0 +1,20 @@ +import fs from 'fs'; +import test from 'ava'; + +import LambdaTester from 'lambda-tester'; + +import checkFavoriteLines from '../../handlers/check-favorite-lines.js'; +import createAlexaHandler from '../helpers/create-alexa-handler.js'; + +test(`handling "what's on my watchlist?"`, async t => { + t.plan(1); + + const event = JSON.parse(fs.readFileSync(process.cwd() + '/tests/fixtures/events/check-favorite-lines.json')); + const alexaHandler = createAlexaHandler({ checkFavoriteLines }) + + const result = await LambdaTester(alexaHandler) + .event(event) + .expectSucceed(r => r); + + t.true(result.response.outputSpeech.ssml.includes(`You're watching the A-C-E, L, 4-5-6, B-D-F-M, G, 1-2-3 trains`)); +}); diff --git a/tests/handlers/store-commute-test.js b/tests/handlers/store-commute-test.js new file mode 100644 index 0000000..7f36c14 --- /dev/null +++ b/tests/handlers/store-commute-test.js @@ -0,0 +1,33 @@ +import test from 'ava'; + +import LambdaTester from 'lambda-tester'; +import getTestEvent from '../helpers/get-test-event.js'; + +import storeCommute from '../../handlers/store-commute.js'; +import createAlexaHandler from '../helpers/create-alexa-handler.js'; + +test(`Handling the start of the dialog`, async t => { + t.plan(1); + + const event = getTestEvent('store-commute-start'); + const alexaHandler = createAlexaHandler({ storeCommute }); + + const result = await LambdaTester(alexaHandler) + .event(event) + .expectSucceed(r => r); + + t.is(result.response.directives[0].type, "Dialog.Delegate") +}); + +test(`collecting subwayLine and a valid input is given`, async t => { + t.plan(1); + + const event = getTestEvent('store-commute-subway-line'); + const alexaHandler = createAlexaHandler({ storeCommute }); + + const result = await LambdaTester(alexaHandler) + .event(event) + .expectSucceed(r => r); + + t.is(result.response.directives[0].type, "Dialog.Delegate"); +}); diff --git a/tests/handlers/store-favorite-line-test.js b/tests/handlers/store-favorite-line-test.js new file mode 100644 index 0000000..d9bf908 --- /dev/null +++ b/tests/handlers/store-favorite-line-test.js @@ -0,0 +1,47 @@ +import fs from 'fs'; +import test from 'ava'; +import uuidv4 from "uuid/v4"; + +import LambdaTester from 'lambda-tester'; +import fetchMock from 'fetch-mock'; + +import storeFavoriteLine from '../../handlers/store-favorite-line.js'; +import createAlexaHandler from '../helpers/create-alexa-handler.js'; + +import dynamoDBClient from "../helpers/dynamo-db-client.js"; + +test.beforeEach(t => { + fetchMock.once(process.env.MTA_STATUS_URL, fs.readFileSync(process.cwd() + '/tests/fixtures/mta-status.xml', 'utf-8')); +}); + +test.afterEach(fetchMock.restore); + +const readParams = function(tableName, event) { + return { + TableName: tableName, + ConsistentRead: true, + Key: { + userId: { + S: event.session.user.userId + } + } + } +} +test.cb('handling "tell NYC subway to track the ACE train"', t => { + t.plan(1); + + const event = JSON.parse(fs.readFileSync(process.cwd() + '/tests/fixtures/events/store-favorite-line-ace.json')); + const tableName = uuidv4(); + const alexaHandler = createAlexaHandler({ storeFavoriteLine }, tableName) + + LambdaTester(alexaHandler) + .event(event) + .expectSucceed(r => { + setTimeout(() => { + dynamoDBClient.getItem(readParams(tableName, event), (error, data) => { + t.is(data.Item.mapAttr.M.trackedTrainLines.L[0].S, "ACE"); + t.end(); + }); + }, 100); + }); +}); diff --git a/tests/helpers/create-alexa-handler.js b/tests/helpers/create-alexa-handler.js new file mode 100644 index 0000000..1e65c9a --- /dev/null +++ b/tests/helpers/create-alexa-handler.js @@ -0,0 +1,18 @@ +const Alexa = require('alexa-sdk'); +const dynamoDBClient = require('./dynamo-db-client.js'); +const uuidv4 = require('uuid/v4'); + +module.exports = function(handlers, tableName) { + let allHandlers = Object.assign({}, handlers, { Unhandled: function() { this.emit(":tell", "Encountered an unhandled function") } }); + + return (event, context, callback) => { + var alexa = Alexa.handler(event, context); + alexa.appId = process.env.APPLICATION_ID; + + alexa.dynamoDBClient = dynamoDBClient; + alexa.dynamoDBTableName = tableName; + + alexa.registerHandlers(allHandlers); + alexa.execute(); + }; +} diff --git a/tests/helpers/dynamo-db-client.js b/tests/helpers/dynamo-db-client.js new file mode 100644 index 0000000..bd09e51 --- /dev/null +++ b/tests/helpers/dynamo-db-client.js @@ -0,0 +1,7 @@ +const AWS = require('aws-sdk'); + +module.exports = new AWS.DynamoDB({ + apiVersion: '2012-08-10', + endpoint: "http://localhost:8000", + region: "us-east-1" +}); diff --git a/tests/helpers/get-test-event.js b/tests/helpers/get-test-event.js new file mode 100644 index 0000000..bb32cca --- /dev/null +++ b/tests/helpers/get-test-event.js @@ -0,0 +1,5 @@ +const fs = require('fs'); + +module.exports = (eventName) => JSON.parse( + fs.readFileSync(`${process.cwd()}/tests/fixtures/events/${eventName}.json`) +); diff --git a/tests/index-test.js b/tests/index-test.js index 99cf2ff..c3274b4 100644 --- a/tests/index-test.js +++ b/tests/index-test.js @@ -1,4 +1,6 @@ import fs from 'fs'; +import { spawn } from 'child_process'; +import dynamoDBClient from "./helpers/dynamo-db-client.js"; import test from 'ava'; import LambdaTester from 'lambda-tester'; @@ -39,7 +41,7 @@ test.serial('handling "ask subway status to check on the line?" an fetchMock.restore(); }); -test.serial('handling "ask subway status to check on the line?" and the service the service is good', async t => { +test.serial('handling "ask subway status to check on the line?" and the service is good', async t => { t.plan(2); const statusOfLineEvent = JSON.parse(fs.readFileSync(process.cwd() + '/tests/fixtures/events/status-of-line.json')); @@ -83,6 +85,7 @@ test.serial('handling "ask subway status for an update and there are bad service .expectSucceed(r => r); let speechMarkup = result.response.outputSpeech.ssml; + t.true(speechMarkup.search("1-2-3, B-D-F-M, J-Z, N-Q-R") !== -1); t.true(speechMarkup.search('A-C-E') !== -1); t.true(speechMarkup.search('Good service on all other lines. ') !== -1); diff --git a/tests/literalize-test.js b/tests/literalize-test.js new file mode 100644 index 0000000..5f291ea --- /dev/null +++ b/tests/literalize-test.js @@ -0,0 +1,7 @@ +import test from 'ava'; + +import literalize from "../speech-helpers/literalize.js"; + +test('literalize adds dashes across a speech token', t => { + t.is(literalize("ACE"), "A-C-E"); +}); diff --git a/tests/service-details-cleaner-test.js b/tests/service-details-cleaner-test.js index 273fc54..424f922 100644 --- a/tests/service-details-cleaner-test.js +++ b/tests/service-details-cleaner-test.js @@ -2,7 +2,7 @@ import test from 'ava'; import fs from 'fs'; import { parseString } from 'xml2js' -import { default as serviceDetailsCleaner } from '../service-details-cleaner.js'; +import { default as serviceDetailsCleaner } from '../parsers/service-details-cleaner.js'; test('removes all linebreaks', t => { t.plan(1); diff --git a/tests/status-to-speech-test.js b/tests/status-to-speech-test.js index 3e31703..9260ff4 100644 --- a/tests/status-to-speech-test.js +++ b/tests/status-to-speech-test.js @@ -1,6 +1,6 @@ import test from 'ava'; -import statusToSpeech from '../status-to-speech.js'; +import statusToSpeech from '../speech-helpers/status-to-speech.js'; test('Given a service status, it builds the right speech"', t => { t.plan(4); diff --git a/utilities/closest-line-matcher.js b/utilities/closest-line-matcher.js new file mode 100644 index 0000000..4ac7429 --- /dev/null +++ b/utilities/closest-line-matcher.js @@ -0,0 +1,17 @@ +const _ = require('lodash'); +const levenshtein = require('fast-levenshtein'); + +module.exports = function(statuses, key, potentialValue) { + let closetStatus; + + if(potentialValue.length > 1) { + closestStatus = _.minBy(statuses, function(status) { + return levenshtein.get(status[key], potentialValue.toUpperCase()); + }); + } else { + closestStatus = _.find(statuses, function(status) { + return status[key].search(potentialValue.toUpperCase()) !== -1; + }); + } + return closestStatus; +} diff --git a/utilities/with-service-issues.js b/utilities/with-service-issues.js new file mode 100644 index 0000000..8b538c3 --- /dev/null +++ b/utilities/with-service-issues.js @@ -0,0 +1 @@ +module.exports = serviceStatus => serviceStatus.status !== 'GOOD SERVICE'; diff --git a/utterances.txt b/utterances.txt index f9d0b0d..1a9a3cc 100644 --- a/utterances.txt +++ b/utterances.txt @@ -5,3 +5,17 @@ statusOfLine what is the status of {subwayLineOrGroup} fullStatusUpdate for a service update fullStatusUpdate for a full service update fullStatusUpdate for an update +storeFavoriteLine my favorite line is {subwayLineOrGroup} +storeFavoriteLine to favorite the {subwayLineOrGroup} train +storeFavoriteLine to watch the {subwayLineOrGroup} train +checkFavoriteLines what is on my watchlist +checkFavoriteLines what are my favorite trains +checkFavoriteLinesStatus to check my commute +checkFavoriteLinesStatus how is my commute + + +removeFavoriteLine to forget the {subwayLineOrGroup} +resetFavoriteLine to forget all my tracked lines +checkFavoriteLines to check my favorite lines +checkFavoriteLines what is the status of my favorite lines? +checkFavoriteLines to check my commute diff --git a/values/subway-stops.js b/values/subway-stops.js new file mode 100644 index 0000000..4599604 --- /dev/null +++ b/values/subway-stops.js @@ -0,0 +1,6 @@ +const fs = require('fs'); +const _ = require('lodash'); + +module.exports = JSON.parse(fs.readFileSync(process.cwd() + '/data/subway-stops.json')).map(station => + _.transform(station, (result, value, key) => result[_.camelCase(key)] = value) +); diff --git a/yarn.lock b/yarn.lock index fa154f5..0e0578c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,64 @@ # yarn lockfile v1 +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + +"@types/long@^3.0.31": + version "3.0.31" + resolved "https://registry.yarnpkg.com/@types/long/-/long-3.0.31.tgz#08635b0d0d322676940c1a88a7a9cef661c6f34a" + +"@types/node@^7.0.29": + version "7.0.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.33.tgz#ae3c53ad01d7e9d62c7f1a85c5f7500d59b9d25b" + abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -alexa-sdk@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/alexa-sdk/-/alexa-sdk-1.0.6.tgz#4d1a8c728de837fbb3bde53e1328d05b8c7ee73b" +"alexa-sdk@git+https://github.com/daemonsy/alexa-skills-kit-sdk-for-nodejs": + version "1.0.10" + resolved "git+https://github.com/daemonsy/alexa-skills-kit-sdk-for-nodejs#779ddfa1d86bdb89e69b4d0bfd3e834ac7fc6f33" dependencies: aws-sdk "^2.4.7" i18next "^3.4.1" @@ -1107,6 +1158,13 @@ crypto-browserify@1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-1.0.9.tgz#cc5449685dfb85eb11c9828acc7cb87ab5bbfcc0" +csvtojson@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/csvtojson/-/csvtojson-1.1.7.tgz#17ded07aec0d8c01f2d6f6871cfa36ab88b149b1" + dependencies: + lodash "^4.17.3" + strip-bom "1.0.0" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1199,6 +1257,10 @@ dotenv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + duplexer2@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -1347,6 +1409,10 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + fn-name@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" @@ -1920,7 +1986,7 @@ lodash.isequal@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" -lodash@^4.0.0, lodash@^4.17.4, lodash@^4.2.0: +lodash@^4.0.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -1928,6 +1994,10 @@ lodash@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.5.0.tgz#19bb3f4d51278f0b8c818ed145c74ecf9fe40e6d" +long@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + loose-envify@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" @@ -2368,6 +2438,24 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +protobufjs@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.0.tgz#04e85493c4e1653878ec283f18bc78b1e7c5d5a2" + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^3.0.31" + "@types/node" "^7.0.29" + long "^3.2.0" + pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -2724,6 +2812,13 @@ strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" +strip-bom@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"