├── Google └── import-location-history.py ├── README.md ├── TLS ├── .gitignore └── generate-CA.sh ├── gtfs ├── .gitignore ├── All_Line_6_trains_in_real_time.png ├── README.md ├── agency.txt ├── calendar.txt ├── calendar_dates.txt ├── gtfs.py ├── gtfs.sh.sample ├── routes.txt ├── shapes.txt ├── stop_times.txt ├── stops.txt ├── transfers.txt └── trips.txt ├── icinga ├── .gitignore ├── Makefile ├── README.md ├── check_gw.py ├── check_mqtt.py ├── config.mk.sample ├── gw-commands.src ├── gw-generic.src ├── gw-hosts.cfg.sample ├── gw-services.cfg ├── mqtt-commands.src ├── mqtt-hosts.cfg.sample └── mqtt-services.cfg ├── message-feeds ├── forecastio-feed.py └── meteoalarmeu-feed.py └── mosquitto-setup.sh /Google/import-location-history.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import json 5 | from paho.mqtt import client, publish 6 | 7 | class ProtocolAction(argparse.Action): 8 | def __call__(self, parser, namespace, value, option_string=None): 9 | setattr(namespace, self.dest, getattr(client, value)) 10 | 11 | parser = argparse.ArgumentParser(description='Import Google Location History into OwnTracks') 12 | parser.add_argument('-H', '--host', default='localhost', help='MQTT host (localhost)') 13 | parser.add_argument('-p', '--port', type=int, default=1883, help='MQTT port (1883)') 14 | parser.add_argument('--protocol', action=ProtocolAction, default=client.MQTTv31, help='MQTT protocol (MQTTv31)') 15 | parser.add_argument('--cacerts', help='Path to files containing trusted CA certificates') 16 | parser.add_argument('--cert', help='Path to file containing TLS client certificate') 17 | parser.add_argument('--key', help='Path to file containing TLS client private key') 18 | parser.add_argument('--tls-version', help='TLS protocol version') 19 | parser.add_argument('--ciphers', help='List of TLS ciphers') 20 | parser.add_argument('-u', '--username', help='MQTT username') 21 | parser.add_argument('-P', '--password', help='MQTT password') 22 | parser.add_argument('-i', '--clientid', help='MQTT client-ID') 23 | parser.add_argument('-t', '--topic', required=True, help='MQTT topic') 24 | parser.add_argument('filename', help='Path to file containing JSON-formatted data from Google Location History exported by Google Takeout') 25 | args = parser.parse_args() 26 | 27 | messages = [] 28 | with open(args.filename) as lh: 29 | lh_data = json.load(lh) 30 | for location in lh_data['locations']: 31 | location_keys = location.keys() 32 | payload = { 33 | '_type': 'location', 34 | 'tid': 'Go' 35 | } 36 | if 'timestampMs' in location_keys: 37 | payload['tst'] = int(location['timestampMs']) // 1000 38 | if 'latitudeE7' in location_keys: 39 | payload['lat'] = location['latitudeE7'] / 10000000 40 | if 'longitudeE7' in location_keys: 41 | payload['lon'] = location['longitudeE7'] / 10000000 42 | if 'accuracy' in location_keys: 43 | payload['acc'] = location['accuracy'] 44 | if 'altitude' in location_keys: 45 | payload['alt'] = location['altitude'] 46 | messages.append( 47 | { 48 | 'topic': args.topic, 49 | 'payload': json.dumps(payload), 50 | 'qos': 2 51 | } 52 | ) 53 | del lh_data 54 | 55 | if args.username != None: 56 | auth={ 57 | 'username': args.username, 58 | 'password': args.password 59 | } 60 | else: 61 | auth = None 62 | 63 | if args.cacerts != None: 64 | tls = { 65 | 'ca_certs': args.cacerts, 66 | 'certfile': args.cert, 67 | 'keyfile': args.key, 68 | 'tls_version': args.tls_version, 69 | 'ciphers': args.ciphers 70 | } 71 | else: 72 | tls = None 73 | 74 | publish.multiple( 75 | messages, 76 | hostname=args.host, 77 | port=args.port, 78 | client_id=args.clientid, 79 | auth=auth, 80 | tls=tls 81 | ) 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OwnTracks Tools 2 | 3 | ### mosquitto-setup.sh 4 | 5 | Shell script to create a default OwnTracks configuration for the Mosquitto broker 6 | 7 | ### TLS/ 8 | 9 | Utility to create TLS CA Certificate and server certificate for OwnTracks 10 | 11 | ### icinga/ 12 | 13 | Icinga / Nagios check scripts and sample configurations to monitor MQTT broker and Greenwich devices 14 | 15 | ### message-feeds/ 16 | 17 | experimental message feeds for OwnTracks (GeoHash) Messaging 18 | 19 | ### General Transit Feed Specification (GTFS) 20 | 21 | Via GTFS static and realtime Transit information is available. 22 | A demo for NYC public transport. 23 | 24 | ### Google/import-location-history.py 25 | Reads a JSON export of Google Location History from 26 | [Google Takeout](https://takeout.google.com/settings/takeout) and publishes all of its locations 27 | to MQTT. Useful for importing Google Location History into OwnTracks Recorder 28 | -------------------------------------------------------------------------------- /TLS/.gitignore: -------------------------------------------------------------------------------- 1 | *.crt 2 | *.key 3 | *.csr 4 | *.srl 5 | *.p12 6 | -------------------------------------------------------------------------------- /TLS/generate-CA.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #(@)generate-CA.sh - Create CA key-pair and server key-pair signed by CA 3 | 4 | # Copyright (c) 2013-2020 Jan-Piet Mens 5 | # All rights reserved. 6 | # 7 | # Redistribution and use in source and binary forms, with or without 8 | # modification, are permitted provided that the following conditions are met: 9 | # 10 | # 1. Redistributions of source code must retain the above copyright notice, 11 | # this list of conditions and the following disclaimer. 12 | # 2. Redistributions in binary form must reproduce the above copyright 13 | # notice, this list of conditions and the following disclaimer in the 14 | # documentation and/or other materials provided with the distribution. 15 | # 3. Neither the name of mosquitto nor the names of its 16 | # contributors may be used to endorse or promote products derived from 17 | # this software without specific prior written permission. 18 | # 19 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 | # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 | # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 | # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 | # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 | # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 | # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 | # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 | # POSSIBILITY OF SUCH DAMAGE. 30 | 31 | # 32 | # Usage: 33 | # ./generate-CA.sh creates ca.crt and server.{key,crt} 34 | # ./generate-CA.sh hostname creates hostname.{key,crt} 35 | # ./generate-CA.sh client email creates email.{key,crt} 36 | # 37 | # Set the following optional environment variables before invocation 38 | # to add the specified IP addresses and/or hostnames to the subjAltName list 39 | # These contain white-space-separated values 40 | # 41 | # IPLIST="172.13.14.15 192.168.1.1" 42 | # HOSTLIST="a.example.com b.example.com" 43 | 44 | set -e 45 | 46 | export LANG=C 47 | 48 | kind=server 49 | 50 | if [ $# -ne 2 ]; then 51 | kind=server 52 | host=$(hostname -f) 53 | if [ -n "$1" ]; then 54 | host="$1" 55 | fi 56 | else 57 | kind=client 58 | CLIENT="$2" 59 | fi 60 | 61 | [ -z "$USER" ] && USER=root 62 | 63 | DIR=${TARGET:='.'} 64 | # A space-separated list of alternate hostnames (subjAltName) 65 | # may be empty "" 66 | ALTHOSTNAMES=${HOSTLIST} 67 | ALTADDRESSES=${IPLIST} 68 | CA_ORG='/O=OwnTracks.org/OU=generate-CA/emailAddress=nobody@example.net' 69 | CA_DN="/CN=An MQTT broker${CA_ORG}" 70 | CACERT=${DIR}/ca 71 | SERVER="${DIR}/${host}" 72 | SERVER_DN="/CN=${host}$CA_ORG" 73 | keybits=4096 74 | openssl=$(which openssl) 75 | MOSQUITTOUSER=${MOSQUITTOUSER:=$USER} 76 | 77 | # Signature Algorithm. To find out which are supported by your 78 | # version of OpenSSL, run `openssl dgst -help` and set your 79 | # signature algorithm here. For example: 80 | # 81 | # defaultmd="-sha256" 82 | # 83 | defaultmd="-sha512" 84 | 85 | function maxdays() { 86 | nowyear=$(date +%Y) 87 | years=$(expr 2032 - $nowyear) 88 | days=$(expr $years '*' 365) 89 | 90 | echo $days 91 | } 92 | 93 | function getipaddresses() { 94 | /sbin/ifconfig | 95 | grep -v tunnel | 96 | sed -En '/inet6? /p' | 97 | sed -Ee 's/inet6? (addr:)?//' | 98 | awk '{print $1;}' | 99 | sed -e 's/[%/].*//' | 100 | egrep -v '(::1|127\.0\.0\.1)' # omit loopback to add it later 101 | } 102 | 103 | 104 | function addresslist() { 105 | 106 | ALIST="" 107 | for a in $(getipaddresses); do 108 | ALIST="${ALIST}IP:$a," 109 | done 110 | ALIST="${ALIST}IP:127.0.0.1,IP:::1," 111 | 112 | for ip in $(echo ${ALTADDRESSES}); do 113 | ALIST="${ALIST}IP:${ip}," 114 | done 115 | for h in $(echo ${ALTHOSTNAMES}); do 116 | ALIST="${ALIST}DNS:$h," 117 | done 118 | ALIST="${ALIST}DNS:${host},DNS:localhost" 119 | echo $ALIST 120 | 121 | } 122 | 123 | days=$(maxdays) 124 | 125 | server_days=825 # https://support.apple.com/en-us/HT210176 126 | 127 | if [ -n "$CAKILLFILES" ]; then 128 | rm -f $CACERT.??? $SERVER.??? $CACERT.srl 129 | fi 130 | 131 | if [ ! -f $CACERT.crt ]; then 132 | 133 | # ____ _ 134 | # / ___| / \ 135 | # | | / _ \ 136 | # | |___ / ___ \ 137 | # \____/_/ \_\ 138 | # 139 | 140 | # Create un-encrypted (!) key 141 | $openssl req -newkey rsa:${keybits} -x509 -nodes $defaultmd -days $days -extensions v3_ca -keyout $CACERT.key -out $CACERT.crt -subj "${CA_DN}" 142 | echo "Created CA certificate in $CACERT.crt" 143 | $openssl x509 -in $CACERT.crt -nameopt multiline -subject -noout 144 | 145 | chmod 400 $CACERT.key 146 | chmod 444 $CACERT.crt 147 | chown $MOSQUITTOUSER $CACERT.* 148 | echo "Warning: the CA key is not encrypted; store it safely!" 149 | fi 150 | 151 | 152 | if [ $kind == 'server' ]; then 153 | 154 | # ____ 155 | # / ___| ___ _ ____ _____ _ __ 156 | # \___ \ / _ \ '__\ \ / / _ \ '__| 157 | # ___) | __/ | \ V / __/ | 158 | # |____/ \___|_| \_/ \___|_| 159 | # 160 | 161 | if [ ! -f $SERVER.key ]; then 162 | echo "--- Creating server key and signing request" 163 | $openssl genrsa -out $SERVER.key $keybits 164 | $openssl req -new $defaultmd \ 165 | -out $SERVER.csr \ 166 | -key $SERVER.key \ 167 | -subj "${SERVER_DN}" 168 | chmod 400 $SERVER.key 169 | chown $MOSQUITTOUSER $SERVER.key 170 | fi 171 | 172 | if [ -f $SERVER.csr -a ! -f $SERVER.crt ]; then 173 | 174 | # There's no way to pass subjAltName on the CLI so 175 | # create a cnf file and use that. 176 | 177 | CNF=`mktemp /tmp/cacnf.XXXXXXXX` || { echo "$0: can't create temp file" >&2; exit 1; } 178 | sed -e 's/^.*%%% //' > $CNF <<\!ENDconfig 179 | %%% [ JPMextensions ] 180 | %%% basicConstraints = critical,CA:false 181 | %%% nsCertType = server 182 | %%% keyUsage = nonRepudiation, digitalSignature, keyEncipherment 183 | %%% extendedKeyUsage = serverAuth 184 | %%% nsComment = "Broker Certificate" 185 | %%% subjectKeyIdentifier = hash 186 | %%% authorityKeyIdentifier = keyid,issuer:always 187 | %%% subjectAltName = $ENV::SUBJALTNAME 188 | %%% # issuerAltName = issuer:copy 189 | %%% ## nsCaRevocationUrl = http://mqttitude.org/carev/ 190 | %%% ## nsRevocationUrl = http://mqttitude.org/carev/ 191 | %%% certificatePolicies = ia5org,@polsection 192 | %%% 193 | %%% [polsection] 194 | %%% policyIdentifier = 1.3.5.8 195 | %%% CPS.1 = "http://localhost" 196 | %%% userNotice.1 = @notice 197 | %%% 198 | %%% [notice] 199 | %%% explicitText = "This CA is for a local MQTT broker installation only" 200 | %%% organization = "OwnTracks" 201 | %%% noticeNumbers = 1 202 | 203 | !ENDconfig 204 | 205 | SUBJALTNAME="$(addresslist)" 206 | export SUBJALTNAME # Use environment. Because I can. ;-) 207 | 208 | echo "--- Creating and signing server certificate" 209 | $openssl x509 -req $defaultmd \ 210 | -in $SERVER.csr \ 211 | -CA $CACERT.crt \ 212 | -CAkey $CACERT.key \ 213 | -CAcreateserial \ 214 | -CAserial "${DIR}/ca.srl" \ 215 | -out $SERVER.crt \ 216 | -days $server_days \ 217 | -extfile ${CNF} \ 218 | -extensions JPMextensions 219 | 220 | rm -f $CNF 221 | chmod 444 $SERVER.crt 222 | chown $MOSQUITTOUSER $SERVER.crt 223 | fi 224 | else 225 | # ____ _ _ _ 226 | # / ___| (_) ___ _ __ | |_ 227 | # | | | | |/ _ \ '_ \| __| 228 | # | |___| | | __/ | | | |_ 229 | # \____|_|_|\___|_| |_|\__| 230 | # 231 | 232 | if [ ! -f $CLIENT.key ]; then 233 | echo "--- Creating client key and signing request" 234 | $openssl genrsa -out $CLIENT.key $keybits 235 | 236 | CNF=`mktemp /tmp/cacnf-req.XXXXXXXX` || { echo "$0: can't create temp file" >&2; exit 1; } 237 | # Mosquitto's use_identity_as_username takes the CN attribute 238 | # so we're populating that with the client's name 239 | sed -e 's/^.*%%% //' > $CNF <&2; exit 1; } 263 | sed -e 's/^.*%%% //' > $CNF <<\!ENDClientconfig 264 | %%% [ JPMclientextensions ] 265 | %%% basicConstraints = critical,CA:false 266 | %%% subjectAltName = email:copy 267 | %%% nsCertType = client,email 268 | %%% extendedKeyUsage = clientAuth,emailProtection 269 | %%% keyUsage = digitalSignature, keyEncipherment, keyAgreement 270 | %%% nsComment = "Client Broker Certificate" 271 | %%% subjectKeyIdentifier = hash 272 | %%% authorityKeyIdentifier = keyid,issuer:always 273 | 274 | !ENDClientconfig 275 | 276 | SUBJALTNAME="$(addresslist)" 277 | export SUBJALTNAME # Use environment. Because I can. ;-) 278 | 279 | echo "--- Creating and signing client certificate" 280 | $openssl x509 -req $defaultmd \ 281 | -in $CLIENT.csr \ 282 | -CA $CACERT.crt \ 283 | -CAkey $CACERT.key \ 284 | -CAcreateserial \ 285 | -CAserial "${DIR}/ca.srl" \ 286 | -out $CLIENT.crt \ 287 | -days $days \ 288 | -extfile ${CNF} \ 289 | -extensions JPMclientextensions 290 | 291 | rm -f $CNF 292 | chmod 444 $CLIENT.crt 293 | fi 294 | fi 295 | -------------------------------------------------------------------------------- /gtfs/.gitignore: -------------------------------------------------------------------------------- 1 | gtfs.sh 2 | -------------------------------------------------------------------------------- /gtfs/All_Line_6_trains_in_real_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/owntracks/tools/dac60bf26a74d05aaa87166e574c070c9e63d0bd/gtfs/All_Line_6_trains_in_real_time.png -------------------------------------------------------------------------------- /gtfs/README.md: -------------------------------------------------------------------------------- 1 | # General Transit Feed Specification (GTFS) 2 | 3 | Via GTFS static and realtime Transit information is available. 4 | 5 | ### Static 6 | https://developers.google.com/transit/gtfs/?hl=en 7 | 8 | with a number of public feeds 9 | https://code.google.com/p/googletransitdatafeed/wiki/PublicFeeds 10 | 11 | ### Realtime 12 | https://developers.google.com/transit/gtfs-realtime/?hl=en 13 | 14 | https://code.google.com/p/googletransitdatafeed/wiki/PublicFeedsNonGTFS 15 | 16 | ### Sample 17 | 18 | To run the sample program 19 | - run pip install --upgrade gtfs-realtime-bindings 20 | - copy gtfs.sh.sample to gtfs.sh and edit 21 | - you will need an mta apikey and credentials of your mqtt broker 22 | 23 | The sample programm will 24 | - read the necessary static reference files, 25 | - publish the content to mqtt (currently commented), 26 | - contact the realtime server 27 | - publish the realtime location information and info for the 28 | trains on the selected route 29 | 30 | The .txt files are static files downloaded from mta 31 | -------------------------------------------------------------------------------- /gtfs/agency.txt: -------------------------------------------------------------------------------- 1 | agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone 2 | MTA NYCT,MTA New York City Transit, http://www.mta.info,America/New_York,en,718-330-1234 -------------------------------------------------------------------------------- /gtfs/calendar.txt: -------------------------------------------------------------------------------- 1 | service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date 2 | A20150614WKD,1,1,1,1,1,0,0,20150614,20161231 3 | A20150614SAT,0,0,0,0,0,1,0,20150614,20161231 4 | A20150614SUN,0,0,0,0,0,0,1,20150614,20161231 5 | B20150614WKD,1,1,1,1,1,0,0,20150614,20161231 6 | B20150614SAT,0,0,0,0,0,1,0,20150614,20161231 7 | B20150614SUN,0,0,0,0,0,0,1,20150614,20161231 8 | R20150510WKD,1,1,1,1,1,0,0,20150510,20161231 9 | R20150510SAT,0,0,0,0,0,1,0,20150510,20161231 10 | R20150510SUN,0,0,0,0,0,0,1,20150510,20161231 11 | S20150510MON,1,0,0,0,0,0,0,20150510,20161231 12 | -------------------------------------------------------------------------------- /gtfs/calendar_dates.txt: -------------------------------------------------------------------------------- 1 | service_id,date,exception_type 2 | A20150614WKD,20150907,2 3 | A20150614SUN,20150907,1 4 | A20150614WKD,20151126,2 5 | A20150614SUN,20151126,1 6 | B20150614WKD,20150907,2 7 | B20150614SUN,20150907,1 8 | B20150614WKD,20151126,2 9 | B20150614SUN,20151126,1 10 | -------------------------------------------------------------------------------- /gtfs/gtfs.py: -------------------------------------------------------------------------------- 1 | import json 2 | import paho.mqtt.client as mqtt 3 | import csv 4 | import time 5 | from os import getenv 6 | from time import sleep 7 | from google.transit import gtfs_realtime_pb2 8 | import urllib 9 | 10 | username = getenv('USER') 11 | password = getenv('PASS') 12 | apikey = getenv('APIKEY') 13 | match = getenv('MATCH') 14 | 15 | disconnected = False 16 | connected = False 17 | sent = 0 18 | tst = int(time.time()) 19 | stops = {} 20 | trips = {} 21 | 22 | def on_connect(client, userdata, flags, rc): 23 | print("Connected with result code "+str(rc)) 24 | global connected 25 | connected = True 26 | 27 | def on_publish(client, userdata, mid): 28 | #print("published(%d)" % mid) 29 | global sent 30 | sent = sent + 1 31 | 32 | def on_disconnect(client, userdata, rc): 33 | print("disconnected %d" % rc) 34 | global disconnected 35 | disconnected = True 36 | 37 | client = mqtt.Client() 38 | client.on_connect = on_connect 39 | client.on_publish = on_publish 40 | client.on_disconnect = on_disconnect 41 | if username != None: 42 | client.username_pw_set(username, password=password) 43 | client.connect("localhost", 1883, 60) 44 | client.loop_start() 45 | 46 | while connected == False: 47 | print 'connecting' 48 | sleep(1) 49 | 50 | agency_id = 'agency_id' 51 | 52 | #ignoring shapes.txt 53 | #ignoring calendar.txt 54 | #ignoring calendar_dates.txt 55 | #ignoring transfers.txt 56 | #ignoring stop_times.txt 57 | 58 | input = open('agency.txt', 'rb') 59 | reader = csv.reader(input) 60 | for line in reader: 61 | (agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone)=line 62 | payloaddict = dict(_type='agency',agency_id = agency_id, agency_name = agency_name, agency_url = agency_url, agency_timezone = agency_timezone, agency_lang = agency_lang ,agency_phone = agency_phone) 63 | #client.publish('gtfs/%s' % (agency_id), payload=json.dumps(payloaddict), qos=0, retain=True) 64 | #print 'pub: ' + 'gtfs/%s' % (agency_id) 65 | input.close() 66 | 67 | input = open('stops.txt', 'rb') 68 | reader = csv.reader(input) 69 | for line in reader: 70 | #print line 71 | (stop_id,stop_code,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url,location_type,parent_station)=line 72 | 73 | #print "%s %s %s" % (stop_id, stop_lat, stop_lon) 74 | payloaddict = dict(_type='stop',stop_id = stop_id, stop_code = stop_code, stop_name = stop_name, stop_desc = stop_desc, stop_lat = stop_lat ,stop_lon = stop_lon,zone_id = zone_id,stop_url = stop_url,location_type = location_type ,parent_station = parent_station) 75 | stops[stop_id] = payloaddict 76 | #client.publish('gtfs/%s/stops/%s' % (agency_id, stop_id), payload=json.dumps(payloaddict), qos=0, retain=True) 77 | #print 'pub: ' + 'gtfs/%s/stops/%s' % (agency_id, stop_id) 78 | 79 | if parent_station == '': 80 | payloaddict = dict(_type='location', tid = stop_id, lat = stop_lat, lon = stop_lon,parent_station = parent_station, tst = tst) 81 | #client.publish('owntracks/%s/%s' % (agency_id, stop_id), payload=json.dumps(payloaddict), qos=0, retain=True) 82 | #print 'pub: ' + 'owntracks/%s/%s' % (agency_id, stop_id) 83 | payloaddict = dict(_type='card', name = stop_name) 84 | #client.publish('owntracks/%s/%s/info' % (agency_id, stop_id), payload=json.dumps(payloaddict), qos=0, retain=True) 85 | #print 'pub: ' + 'owntracks/%s/%s/info' % (agency_id, stop_id) 86 | input.close() 87 | 88 | input = open('trips.txt', 'rb') 89 | reader = csv.reader(input) 90 | for line in reader: 91 | (route_id,service_id,trip_id,trip_headsign,direction_id,block_id,shape_id)=line 92 | payloaddict = dict(_type='trip',route_id = route_id, service_id = service_id, trip_id = trip_id, trip_headsign = trip_headsign, direction_id = direction_id ,block_id = block_id,shape_id = shape_id) 93 | trips[trip_id[13:]] = payloaddict 94 | #client.publish('gtfs/%s/routes/%s/%s' % (agency_id, route_id, trip_id), payload=json.dumps(payloaddict), qos=0, retain=True) 95 | #print 'pub: ' + 'gtfs/%s/routes/%s/%s' % (agency_id, route_id, trip_id) 96 | #client.publish('ontracks/%s/%s' % (agency_id, trip_id[13:]), payload=None, qos=0, retain=True) 97 | #print 'pub: ' + 'owntracks/%s/%s' % (agency_id, trip_id) 98 | input.close() 99 | 100 | input = open('routes.txt', 'rb') 101 | reader = csv.reader(input) 102 | for line in reader: 103 | (route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color)=line 104 | payloaddict = dict(_type='route',route_id = route_id, agency_id = agency_id, route_short_name = route_short_name, route_long_name = route_long_name, route_desc = route_desc ,route_type = route_type,route_url = route_url, route_color = route_color, route_text_color = route_text_color) 105 | #client.publish('gtfs/%s/routes/%s' % (agency_id, route_id), payload=json.dumps(payloaddict), qos=0, retain=True) 106 | #print 'pub: ' + 'gtfs/%s/routes/%s' % (agency_id, route_id) 107 | input.close() 108 | 109 | while True: 110 | 111 | feed = gtfs_realtime_pb2.FeedMessage() 112 | response = urllib.urlopen('http://datamine.mta.info/mta_esi.php?key=%s&feed_id=1' % apikey) 113 | print 'parsing' 114 | feed.ParseFromString(response.read()) 115 | for entity in feed.entity: 116 | print entity 117 | if entity.HasField('trip_update'): 118 | trip_update = entity.trip_update 119 | #print trip_update 120 | if trip_update.HasField('trip'): 121 | trip = trip_update.trip 122 | #print trip 123 | trip_id = trip.trip_id 124 | route_id = trip.route_id 125 | if route_id == match: 126 | #print trip_id 127 | for StopTimeUpdate in trip_update.stop_time_update: 128 | #print StopTimeUpdate 129 | stop_id = StopTimeUpdate.stop_id 130 | if StopTimeUpdate.HasField('arrival'): 131 | arrival = StopTimeUpdate.arrival 132 | #print arrival 133 | if arrival.HasField('time'): 134 | #print time 135 | time = arrival.time 136 | stop = stops[stop_id] 137 | stop_lat = stop['stop_lat'] 138 | stop_lon = stop['stop_lon'] 139 | #print stop_lat, stop_lon 140 | trip = trips.get(trip_id) 141 | if trip != None: 142 | direction_id = trip['direction_id'] 143 | trip_headsign = trip['trip_headsign'] 144 | payloaddict = dict(_type='card', name = trip_headsign) 145 | client.publish('owntracks/%s/%s/info' % (agency_id, trip_id), payload=json.dumps(payloaddict), qos=0, retain=True) 146 | print 'pub: ' + 'owntracks/%s/%s/info' % (agency_id, trip_id) 147 | else: 148 | direction_id = 0 149 | if direction_id == 0: 150 | cog = 0 151 | else: 152 | cog = 180 153 | payloaddict = dict(_type='location', tid = route_id, lat = stop_lat, lon = stop_lon, tst = time, cog = cog) 154 | client.publish('owntracks/%s/%s' % (agency_id, trip_id), payload=json.dumps(payloaddict), qos=0, retain=True) 155 | print 'pub: ' + 'owntracks/%s/%s' % (agency_id, trip_id) 156 | break 157 | 158 | 159 | for n in range(1, 6): 160 | print 'sleeping' 161 | sleep(10) 162 | 163 | client.disconnect() 164 | while disconnected == False: 165 | print "disconnecting" 166 | sleep(1) 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /gtfs/gtfs.sh.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | export APIKEY= 3 | export USER= 4 | export PASS= 5 | export MATCH="6" # the string of the route_id to match in order to limit updates 6 | python gtfs.py 7 | -------------------------------------------------------------------------------- /gtfs/routes.txt: -------------------------------------------------------------------------------- 1 | route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color 2 | 1,MTA NYCT,1,Broadway - 7 Avenue Local,"Trains operate between 242 St in the Bronx and South Ferry in Manhattan, most times",1,http://web.mta.info/nyct/service/pdf/t1cur.pdf,EE352E, 3 | 2,MTA NYCT,2,7 Avenue Express,"Trains operate between Wakefield-241 St, Bronx, and Flatbush Av-Brooklyn College, Brooklyn, at all times. Trains operate local in Bronx and Brooklyn. Trains operate express in Manhattan except late night when it operates local.",1,http://web.mta.info/nyct/service/pdf/t2cur.pdf,EE352E, 4 | 3,MTA NYCT,3,7 Avenue Express,"Trains operate between 148 St, 7 Av, Manhattan, and New Lots Av, Brooklyn, at all times except late nights. During late nights, trains operate only in Manhattan between 148 St, 7 Av and Times Square-42 St.",1,http://web.mta.info/nyct/service/pdf/t3cur.pdf,EE352E, 5 | 4,MTA NYCT,4,Lexington Avenue Express,"Trains operate daily between Woodlawn/Jerome Av, Bronx, and Utica Av/Eastern Pkwy, Brooklyn, running express in Manhattan and Brooklyn. During late night and early morning hours, trains runs local in Manhattan and Brooklyn, and extends beyond Utica Av to New Lots/Livonia Avs, Brooklyn.",1,http://web.mta.info/nyct/service/pdf/t4cur.pdf,00933C, 6 | 5,MTA NYCT,5,Lexington Avenue Express,"Weekdays daytime, most trains operate between either Dyre Av or 238 St-Nereid Av, Bronx, and Flatbush Av-Brooklyn College, Brooklyn. At all other times except during late nights, trains operate between Dyre Av, Bronx, and Bowling Green, Manhattan. During late nights trains operate only in the Bronx between Dyre Av and E 180 St/MorrisPark Av. Customers who ride during late night hours can transfer to 2 service at the E 180 St Station. At all times, trains operate express in Manhattan and Brooklyn. Weekdays, trains in the Bronx operate express from E 180 St to 149 St-3 Av during morning rush hours (from about 6 AM to 9 AM), and from 149 St-3 Av to E 180 St during the evening rush hours (from about 4 PM to 7 PM).",1,http://web.mta.info/nyct/service/pdf/t5cur.pdf,00933C, 7 | 5X,MTA NYCT,5X,Lexington Avenue Express,"Weekdays daytime, most trains operate between either Dyre Av or 238 St-Nereid Av, Bronx, and Flatbush Av-Brooklyn College, Brooklyn. At all other times except during late nights, trains operate between Dyre Av, Bronx, and Bowling Green, Manhattan. During late nights trains operate only in the Bronx between Dyre Av and E 180 St/MorrisPark Av. Customers who ride during late night hours can transfer to 2 service at the E 180 St Station. At all times, trains operate express in Manhattan and Brooklyn. Weekdays, trains in the Bronx operate express from E 180 St to 149 St-3 Av during morning rush hours (from about 6 AM to 9 AM), and from 149 St-3 Av to E 180 St during the evening rush hours (from about 4 PM to 7 PM).",1,http://web.mta.info/nyct/service/pdf/t5cur.pdf,00933C, 8 | 6,MTA NYCT,6,Lexington Avenue Local,"Local trains operate between Pelham Bay Park/Bruckner Expwy, Bronx, and Brooklyn Bridge/City Hall, Manhattan, at all times.",1,http://web.mta.info/nyct/service/pdf/t6cur.pdf,00933C, 9 | 6X,MTA NYCT,6X,Lexington Avenue Express,"Express trains operate between Pelham Bay Park/Bruckner Expwy, Bronx, and Brooklyn Bridge/City Hall, Manhattan, weekday mornings toward Manhattan. Weekday afternoons and evenings, these trains operate express to the Bronx.",1,http://web.mta.info/nyct/service/pdf/t6cur.pdf,00A65C, 10 | 7,MTA NYCT,7,Flushing Local,"Trains operate between Main St-Flushing, Queens, and 11th Av-34th St, at all times. ",1,http://web.mta.info/nyct/service/pdf/t7cur.pdf,B933AD, 11 | 7X,MTA NYCT,7X,Flushing Express,"Trains operate between Main St-Flushing, Queens, and 11th Av-34th St, Manhattan, weekday mornings toward Manhattan. Weekday afternoons and evenings, these trains operate express to Queens.",1,http://web.mta.info/nyct/service/pdf/t7cur.pdf,B933AD, 12 | GS,MTA NYCT,S,42 St Shuttle,"Operates in Manhattan between Grand Central and Times Square. The shuttle provides a free transfer between 4, 5, 6, and 7 service at Grand Central-42 St and A, C, E, N, Q, R, W, 1, 2, 3, and 7 service at Times Square-42 St. The shuttle runs at all times except during late nights, from about 12 midnight to 6 AM.",1,http://web.mta.info/nyct/service/pdf/t0cur.pdf,6D6E71, 13 | A,MTA NYCT,A,8 Avenue Express,"Trains operate between Inwood-207 St, Manhattan and Far Rockaway-Mott Avenue, Queens at all times. Also from about 6 AM until about midnight, additional trains operate between Inwood-207 St and Lefferts Boulevard (trains typically alternate between Lefferts Blvd and Far Rockaway). During weekday morning rush hours, special trains, denoted in the schedule by a diamond symbol, operate from Rockaway Park-Beach 116 St, Queens, toward Manhattan. These trains make local stops between Rockaway Park and Broad Channel. Similarly, in the evening rush hour special trains leave Manhattan operating toward Rockaway Park-Beach 116 St, Queens.",1,http://web.mta.info/nyct/service/pdf/tacur.pdf,2850AD,FFFFFF 14 | B,MTA NYCT,B,6 Avenue Express,"Trains operate, weekdays only, between 145 St, Manhattan, and Brighton Beach, Brooklyn at all times except late nights. The route extends to Bedford Park Blvd, Bronx, during rush hours.",1,http://web.mta.info/nyct/service/pdf/tbcur.pdf,FF6319, 15 | C,MTA NYCT,C,8 Avenue Local,"Trains operate between 168 St, Manhattan, and Euclid Av, Brooklyn, daily from about 6 AM to 11 PM.",1,http://web.mta.info/nyct/service/pdf/tccur.pdf,2850AD,FFFFFF 16 | D,MTA NYCT,D,6 Avenue Express,"Trains operate, at all times, from 205 Street, Bronx, to Stillwell Avenue, Brooklyn via Central Park West and 6th Avenue in Manhattan, and via the Manhattan Bridge to and from Brooklyn. When in Brooklyn trains operate via 4th Avenue then through Bensonhurst to Coney Island. Trains typically operate local in the Bronx, express in Manhattan, and local in Brooklyn. But please note that Bronx rush hour trains operate express (peak direction ONLY), and Brooklyn trains operate express along the 4th Avenue segment (all times except late nights).",1,http://web.mta.info/nyct/service/pdf/tdcur.pdf,FF6319, 17 | E,MTA NYCT,E,8 Avenue Local,"Trains operate between Jamaica Center (Parsons/Archer), Queens, and World Trade Center, Manhattan, at all times.",1,http://web.mta.info/nyct/service/pdf/tecur.pdf,2850AD,FFFFFF 18 | F,MTA NYCT,F,Queens Blvd Express/ 6 Av Local,"Trains operate at all times between Jamaica, Queens, and Stillwell Av, Brooklyn via the 63 St Connector (serving 21 St-Queensbridge, Roosevelt Island, Lexington Av-63 St, and 57 St-6 Av). F trains operate express along Queens Blvd at all times. Trains do not serve Queens Plaza, 23 St-Ely Av, Lexington Av-53 St and 5 Av-53 St.",1,http://web.mta.info/nyct/service/pdf/tfcur.pdf,FF6319, 19 | FS,MTA NYCT,S,Franklin Avenue Shuttle,"Train provides full time connecting service between the A and C at the Franklin Av/Fulton St station, and the Q at the Prospect Park/Empire Blvd station. A free transfer is also available at the Botanic Garden/Eastern Parkway Station to the 2, 3, 4, and 5 service.",1,http://web.mta.info/nyct/service/pdf/tscur.pdf,, 20 | G,MTA NYCT,G,Brooklyn-Queens Crosstown,"Trains operate between Court Square, Queens and Church Av, Brooklyn weekdays, and all weekend. Weekday evenings and late nights, trains operate between Forest Hill-71 Av, Queens and Church Av, Brooklyn.",1,http://web.mta.info/nyct/service/pdf/tgcur.pdf,6CBE45, 21 | J,MTA NYCT,J,Nassau St Local,"Trains operate weekdays between Jamaica Center (Parsons/Archer), Queens, and Broad St, Manhattan. During weekdays, Trains going to Manhattan run express in Brooklyn between Myrtle Av and Marcy Av from about 7 AM to 1 PM and from Manhattan from 1:30 PM and 8 PM. During weekday rush hours, trains provide skip-stop service. Skip-stop service means that some stations are served by J trains, some stations are served by the Z trains, and some stations are served by both J and Z trains. J/Z skip-stop service runs towards Manhattan from about 7 AM to 8:15 AM and from Manhattan from about 4:30 PM to 5:45 PM.",1,http://web.mta.info/nyct/service/pdf/tjcur.pdf,996633, 22 | L,MTA NYCT,L,14 St-Canarsie Local,"Trains operate between 8 Av/14 St, Manhattan, and Rockaway Pkwy/Canarsie, Brooklyn, 24 hours daily.",1,http://web.mta.info/nyct/service/pdf/tlcur.pdf,A7A9AC, 23 | M,MTA NYCT,M,QNS BLVD-6th AVE/ Myrtle Local,"Trains operate between Middle Village-Metropolitan Avenue, Queens and Myrtle Avenue, Brooklyn at all times. Service is extended weekdays (except late nights) Continental Ave, Queens, All trains provide local service.",1,http://web.mta.info/nyct/service/pdf/tmcur.pdf,FF6319, 24 | N,MTA NYCT,N,Broadway Express,"Trains operate from Ditmars Boulevard, Queens, to Stillwell Avenue, Brooklyn, at all times. N trains in Manhattan operate along Broadway and across the Manhattan Bridge to and from Brooklyn. Trains in Brooklyn operate along 4th Avenue, then through Borough Park to Gravesend. Trains typically operate local in Queens, and either express or local in Manhattan and Brooklyn, depending on the time. Late night trains operate via Whitehall Street, Manhattan. Late night service is local.",1,http://web.mta.info/nyct/service/pdf/tncur.pdf,FCCC0A, 25 | Q,MTA NYCT,Q,Broadway Express,"Trains operate between Astoria, Queens, and Stillwell Av, Brooklyn except nights. During late nights trains will operate from 57th Street/7th Avenue, Manhattan, and Stillwell Av, Brooklyn. Trains operate express from 34th St. via Broadway to Canal Street, except late nights when trains operate express 34th to Canal(lower level), cross into Brooklyn via Manhattan Bridge, then operate local to and from Stillwell Av.",1,http://web.mta.info/nyct/service/pdf/tqcur.pdf,FCCC0A, 26 | R,MTA NYCT,R,Broadway Local,"Trains operate local between Forest Hills-71 Av, Queens, and 95 St/4 Av, Brooklyn, at all times except late nights. During late nights, trains operate only in Brooklyn between 36 St and 95 St/4 Av.",1,http://web.mta.info/nyct/service/pdf/trcur.pdf,FCCC0A, 27 | H,MTA NYCT,S,Rockaway Park Shuttle,"Service operates at all times between Broad Channel, and Rockaway Park, Queens.",1,http://web.mta.info/nyct/service/pdf/thcur.pdf,, 28 | Z,MTA NYCT,Z,Nassau St Express,"During weekday rush hours, J and Z trains provide skip-stop service. Skip-stop service means that some stations are served by J trains, some stations are served by the Z trains, and some stations are served by both J and Z trains. J/Z skip-stop service runs towards Manhattan from about 7 AM to 8:15 AM and from Manhattan from about 4:30 PM to 5:45 PM.",1,http://web.mta.info/nyct/service/pdf/tjcur.pdf,996633, 29 | SI,MTA NYCT,SIR,Staten Island Railway,"Service runs 24 hours a day between the St George and Tottenville terminals. At the St George terminal, customers can make connections with Staten Island Ferry service to Manhattan.",2,http://web.mta.info/nyct/service/pdf/sircur.pdf,, 30 | -------------------------------------------------------------------------------- /gtfs/stops.txt: -------------------------------------------------------------------------------- 1 | stop_id,stop_code,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url,location_type,parent_station 2 | 101,,Van Cortlandt Park - 242 St,,40.889248,-73.898583,,,1, 3 | 101N,,Van Cortlandt Park - 242 St,,40.889248,-73.898583,,,0,101 4 | 101S,,Van Cortlandt Park - 242 St,,40.889248,-73.898583,,,0,101 5 | 103,,238 St,,40.884667,-73.90087,,,1, 6 | 103N,,238 St,,40.884667,-73.90087,,,0,103 7 | 103S,,238 St,,40.884667,-73.90087,,,0,103 8 | 104,,231 St,,40.878856,-73.904834,,,1, 9 | 104N,,231 St,,40.878856,-73.904834,,,0,104 10 | 104S,,231 St,,40.878856,-73.904834,,,0,104 11 | 106,,Marble Hill - 225 St,,40.874561,-73.909831,,,1, 12 | 106N,,Marble Hill - 225 St,,40.874561,-73.909831,,,0,106 13 | 106S,,Marble Hill - 225 St,,40.874561,-73.909831,,,0,106 14 | 107,,215 St,,40.869444,-73.915279,,,1, 15 | 107N,,215 St,,40.869444,-73.915279,,,0,107 16 | 107S,,215 St,,40.869444,-73.915279,,,0,107 17 | 108,,207 St,,40.864621,-73.918822,,,1, 18 | 108N,,207 St,,40.864621,-73.918822,,,0,108 19 | 108S,,207 St,,40.864621,-73.918822,,,0,108 20 | 109,,Dyckman St,,40.860531,-73.925536,,,1, 21 | 109N,,Dyckman St,,40.860531,-73.925536,,,0,109 22 | 109S,,Dyckman St,,40.860531,-73.925536,,,0,109 23 | 110,,191 St,,40.855225,-73.929412,,,1, 24 | 110N,,191 St,,40.855225,-73.929412,,,0,110 25 | 110S,,191 St,,40.855225,-73.929412,,,0,110 26 | 111,,181 St,,40.849505,-73.933596,,,1, 27 | 111N,,181 St,,40.849505,-73.933596,,,0,111 28 | 111S,,181 St,,40.849505,-73.933596,,,0,111 29 | 112,,168 St - Washington Hts,,40.840556,-73.940133,,,1, 30 | 112N,,168 St - Washington Hts,,40.840556,-73.940133,,,0,112 31 | 112S,,168 St - Washington Hts,,40.840556,-73.940133,,,0,112 32 | 113,,157 St,,40.834041,-73.94489,,,1, 33 | 113N,,157 St,,40.834041,-73.94489,,,0,113 34 | 113S,,157 St,,40.834041,-73.94489,,,0,113 35 | 114,,145 St,,40.826551,-73.95036,,,1, 36 | 114N,,145 St,,40.826551,-73.95036,,,0,114 37 | 114S,,145 St,,40.826551,-73.95036,,,0,114 38 | 115,,137 St - City College,,40.822008,-73.953676,,,1, 39 | 115N,,137 St - City College,,40.822008,-73.953676,,,0,115 40 | 115S,,137 St - City College,,40.822008,-73.953676,,,0,115 41 | 116,,125 St,,40.815581,-73.958372,,,1, 42 | 116N,,125 St,,40.815581,-73.958372,,,0,116 43 | 116S,,125 St,,40.815581,-73.958372,,,0,116 44 | 117,,116 St - Columbia University,,40.807722,-73.96411,,,1, 45 | 117N,,116 St - Columbia University,,40.807722,-73.96411,,,0,117 46 | 117S,,116 St - Columbia University,,40.807722,-73.96411,,,0,117 47 | 118,,Cathedral Pkwy,,40.803967,-73.966847,,,1, 48 | 118N,,Cathedral Pkwy,,40.803967,-73.966847,,,0,118 49 | 118S,,Cathedral Pkwy,,40.803967,-73.966847,,,0,118 50 | 119,,103 St,,40.799446,-73.968379,,,1, 51 | 119N,,103 St,,40.799446,-73.968379,,,0,119 52 | 119S,,103 St,,40.799446,-73.968379,,,0,119 53 | 120,,96 St,,40.793919,-73.972323,,,1, 54 | 120N,,96 St,,40.793919,-73.972323,,,0,120 55 | 120S,,96 St,,40.793919,-73.972323,,,0,120 56 | 121,,86 St,,40.788644,-73.976218,,,1, 57 | 121N,,86 St,,40.788644,-73.976218,,,0,121 58 | 121S,,86 St,,40.788644,-73.976218,,,0,121 59 | 122,,79 St,,40.783934,-73.979917,,,1, 60 | 122N,,79 St,,40.783934,-73.979917,,,0,122 61 | 122S,,79 St,,40.783934,-73.979917,,,0,122 62 | 123,,72 St,,40.778453,-73.98197,,,1, 63 | 123N,,72 St,,40.778453,-73.98197,,,0,123 64 | 123S,,72 St,,40.778453,-73.98197,,,0,123 65 | 124,,66 St - Lincoln Center,,40.77344,-73.982209,,,1, 66 | 124N,,66 St - Lincoln Center,,40.77344,-73.982209,,,0,124 67 | 124S,,66 St - Lincoln Center,,40.77344,-73.982209,,,0,124 68 | 125,,59 St - Columbus Circle,,40.768247,-73.981929,,,1, 69 | 125N,,59 St - Columbus Circle,,40.768247,-73.981929,,,0,125 70 | 125S,,59 St - Columbus Circle,,40.768247,-73.981929,,,0,125 71 | 126,,50 St,,40.761728,-73.983849,,,1, 72 | 126N,,50 St,,40.761728,-73.983849,,,0,126 73 | 126S,,50 St,,40.761728,-73.983849,,,0,126 74 | 127,,Times Sq - 42 St,,40.75529,-73.987495,,,1, 75 | 127N,,Times Sq - 42 St,,40.75529,-73.987495,,,0,127 76 | 127S,,Times Sq - 42 St,,40.75529,-73.987495,,,0,127 77 | 128,,34 St - Penn Station,,40.750373,-73.991057,,,1, 78 | 128N,,34 St - Penn Station,,40.750373,-73.991057,,,0,128 79 | 128S,,34 St - Penn Station,,40.750373,-73.991057,,,0,128 80 | 129,,28 St,,40.747215,-73.993365,,,1, 81 | 129N,,28 St,,40.747215,-73.993365,,,0,129 82 | 129S,,28 St,,40.747215,-73.993365,,,0,129 83 | 130,,23 St,,40.744081,-73.995657,,,1, 84 | 130N,,23 St,,40.744081,-73.995657,,,0,130 85 | 130S,,23 St,,40.744081,-73.995657,,,0,130 86 | 131,,18 St,,40.74104,-73.997871,,,1, 87 | 131N,,18 St,,40.74104,-73.997871,,,0,131 88 | 131S,,18 St,,40.74104,-73.997871,,,0,131 89 | 132,,14 St,,40.737826,-74.000201,,,1, 90 | 132N,,14 St,,40.737826,-74.000201,,,0,132 91 | 132S,,14 St,,40.737826,-74.000201,,,0,132 92 | 133,,Christopher St - Sheridan Sq,,40.733422,-74.002906,,,1, 93 | 133N,,Christopher St - Sheridan Sq,,40.733422,-74.002906,,,0,133 94 | 133S,,Christopher St - Sheridan Sq,,40.733422,-74.002906,,,0,133 95 | 134,,Houston St,,40.728251,-74.005367,,,1, 96 | 134N,,Houston St,,40.728251,-74.005367,,,0,134 97 | 134S,,Houston St,,40.728251,-74.005367,,,0,134 98 | 135,,Canal St,,40.722854,-74.006277,,,1, 99 | 135N,,Canal St,,40.722854,-74.006277,,,0,135 100 | 135S,,Canal St,,40.722854,-74.006277,,,0,135 101 | 136,,Franklin St,,40.719318,-74.006886,,,1, 102 | 136N,,Franklin St,,40.719318,-74.006886,,,0,136 103 | 136S,,Franklin St,,40.719318,-74.006886,,,0,136 104 | 137,,Chambers St,,40.715478,-74.009266,,,1, 105 | 137N,,Chambers St,,40.715478,-74.009266,,,0,137 106 | 137S,,Chambers St,,40.715478,-74.009266,,,0,137 107 | 138,,Cortlandt St,,40.711835,-74.012188,,,1, 108 | 138N,,Cortlandt St,,40.711835,-74.012188,,,0,138 109 | 138S,,Cortlandt St,,40.711835,-74.012188,,,0,138 110 | 139,,Rector St,,40.707513,-74.013783,,,1, 111 | 139N,,Rector St,,40.707513,-74.013783,,,0,139 112 | 139S,,Rector St,,40.707513,-74.013783,,,0,139 113 | 140,,South Ferry Loop,,40.701411,-74.013205,,,1, 114 | 140N,,South Ferry Loop,,40.701411,-74.013205,,,0,140 115 | 140S,,South Ferry Loop,,40.701411,-74.013205,,,0,140 116 | 201,,Wakefield - 241 St,,40.903125,-73.85062,,,1, 117 | 201N,,Wakefield - 241 St,,40.903125,-73.85062,,,0,201 118 | 201S,,Wakefield - 241 St,,40.903125,-73.85062,,,0,201 119 | 204,,Nereid Av,,40.898379,-73.854376,,,1, 120 | 204N,,Nereid Av,,40.898379,-73.854376,,,0,204 121 | 204S,,Nereid Av,,40.898379,-73.854376,,,0,204 122 | 205,,233 St,,40.893193,-73.857473,,,1, 123 | 205N,,233 St,,40.893193,-73.857473,,,0,205 124 | 205S,,233 St,,40.893193,-73.857473,,,0,205 125 | 206,,225 St,,40.888022,-73.860341,,,1, 126 | 206N,,225 St,,40.888022,-73.860341,,,0,206 127 | 206S,,225 St,,40.888022,-73.860341,,,0,206 128 | 207,,219 St,,40.883895,-73.862633,,,1, 129 | 207N,,219 St,,40.883895,-73.862633,,,0,207 130 | 207S,,219 St,,40.883895,-73.862633,,,0,207 131 | 208,,Gun Hill Rd,,40.87785,-73.866256,,,1, 132 | 208N,,Gun Hill Rd,,40.87785,-73.866256,,,0,208 133 | 208S,,Gun Hill Rd,,40.87785,-73.866256,,,0,208 134 | 209,,Burke Av,,40.871356,-73.867164,,,1, 135 | 209N,,Burke Av,,40.871356,-73.867164,,,0,209 136 | 209S,,Burke Av,,40.871356,-73.867164,,,0,209 137 | 210,,Allerton Av,,40.865462,-73.867352,,,1, 138 | 210N,,Allerton Av,,40.865462,-73.867352,,,0,210 139 | 210S,,Allerton Av,,40.865462,-73.867352,,,0,210 140 | 211,,Pelham Pkwy,,40.857192,-73.867615,,,1, 141 | 211N,,Pelham Pkwy,,40.857192,-73.867615,,,0,211 142 | 211S,,Pelham Pkwy,,40.857192,-73.867615,,,0,211 143 | 212,,Bronx Park East,,40.848828,-73.868457,,,1, 144 | 212N,,Bronx Park East,,40.848828,-73.868457,,,0,212 145 | 212S,,Bronx Park East,,40.848828,-73.868457,,,0,212 146 | 213,,E 180 St,,40.841894,-73.873488,,,1, 147 | 213N,,E 180 St,,40.841894,-73.873488,,,0,213 148 | 213S,,E 180 St,,40.841894,-73.873488,,,0,213 149 | 214,,West Farms Sq - E Tremont Av,,40.840295,-73.880049,,,1, 150 | 214N,,West Farms Sq - E Tremont Av,,40.840295,-73.880049,,,0,214 151 | 214S,,West Farms Sq - E Tremont Av,,40.840295,-73.880049,,,0,214 152 | 215,,174 St,,40.837288,-73.887734,,,1, 153 | 215N,,174 St,,40.837288,-73.887734,,,0,215 154 | 215S,,174 St,,40.837288,-73.887734,,,0,215 155 | 216,,Freeman St,,40.829993,-73.891865,,,1, 156 | 216N,,Freeman St,,40.829993,-73.891865,,,0,216 157 | 216S,,Freeman St,,40.829993,-73.891865,,,0,216 158 | 217,,Simpson St,,40.824073,-73.893064,,,1, 159 | 217N,,Simpson St,,40.824073,-73.893064,,,0,217 160 | 217S,,Simpson St,,40.824073,-73.893064,,,0,217 161 | 218,,Intervale Av,,40.822181,-73.896736,,,1, 162 | 218N,,Intervale Av,,40.822181,-73.896736,,,0,218 163 | 218S,,Intervale Av,,40.822181,-73.896736,,,0,218 164 | 219,,Prospect Av,,40.819585,-73.90177,,,1, 165 | 219N,,Prospect Av,,40.819585,-73.90177,,,0,219 166 | 219S,,Prospect Av,,40.819585,-73.90177,,,0,219 167 | 220,,Jackson Av,,40.81649,-73.907807,,,1, 168 | 220N,,Jackson Av,,40.81649,-73.907807,,,0,220 169 | 220S,,Jackson Av,,40.81649,-73.907807,,,0,220 170 | 221,,3 Av - 149 St,,40.816109,-73.917757,,,1, 171 | 221N,,3 Av - 149 St,,40.816109,-73.917757,,,0,221 172 | 221S,,3 Av - 149 St,,40.816109,-73.917757,,,0,221 173 | 222,,149 St - Grand Concourse,,40.81841,-73.926718,,,1, 174 | 222N,,149 St - Grand Concourse,,40.81841,-73.926718,,,0,222 175 | 222S,,149 St - Grand Concourse,,40.81841,-73.926718,,,0,222 176 | 224,,135 St,,40.814229,-73.94077,,,1, 177 | 224N,,135 St,,40.814229,-73.94077,,,0,224 178 | 224S,,135 St,,40.814229,-73.94077,,,0,224 179 | 225,,125 St,,40.807754,-73.945495,,,1, 180 | 225N,,125 St,,40.807754,-73.945495,,,0,225 181 | 225S,,125 St,,40.807754,-73.945495,,,0,225 182 | 226,,116 St,,40.802098,-73.949625,,,1, 183 | 226N,,116 St,,40.802098,-73.949625,,,0,226 184 | 226S,,116 St,,40.802098,-73.949625,,,0,226 185 | 227,,Central Park North (110 St),,40.799075,-73.951822,,,1, 186 | 227N,,Central Park North (110 St),,40.799075,-73.951822,,,0,227 187 | 227S,,Central Park North (110 St),,40.799075,-73.951822,,,0,227 188 | 228,,Park Pl,,40.713051,-74.008811,,,1, 189 | 228N,,Park Pl,,40.713051,-74.008811,,,0,228 190 | 228S,,Park Pl,,40.713051,-74.008811,,,0,228 191 | 229,,Fulton St,,40.709416,-74.006571,,,1, 192 | 229N,,Fulton St,,40.709416,-74.006571,,,0,229 193 | 229S,,Fulton St,,40.709416,-74.006571,,,0,229 194 | 230,,Wall St,,40.706821,-74.0091,,,1, 195 | 230N,,Wall St,,40.706821,-74.0091,,,0,230 196 | 230S,,Wall St,,40.706821,-74.0091,,,0,230 197 | 231,,Clark St,,40.697466,-73.993086,,,1, 198 | 231N,,Clark St,,40.697466,-73.993086,,,0,231 199 | 231S,,Clark St,,40.697466,-73.993086,,,0,231 200 | 232,,Borough Hall,,40.693219,-73.989998,,,1, 201 | 232N,,Borough Hall,,40.693219,-73.989998,,,0,232 202 | 232S,,Borough Hall,,40.693219,-73.989998,,,0,232 203 | 233,,Hoyt St,,40.690545,-73.985065,,,1, 204 | 233N,,Hoyt St,,40.690545,-73.985065,,,0,233 205 | 233S,,Hoyt St,,40.690545,-73.985065,,,0,233 206 | 234,,Nevins St,,40.688246,-73.980492,,,1, 207 | 234N,,Nevins St,,40.688246,-73.980492,,,0,234 208 | 234S,,Nevins St,,40.688246,-73.980492,,,0,234 209 | 235,,Atlantic Av - Barclays Ctr,,40.684359,-73.977666,,,1, 210 | 235N,,Atlantic Av - Barclays Ctr,,40.684359,-73.977666,,,0,235 211 | 235S,,Atlantic Av - Barclays Ctr,,40.684359,-73.977666,,,0,235 212 | 236,,Bergen St,,40.680829,-73.975098,,,1, 213 | 236N,,Bergen St,,40.680829,-73.975098,,,0,236 214 | 236S,,Bergen St,,40.680829,-73.975098,,,0,236 215 | 237,,Grand Army Plaza,,40.675235,-73.971046,,,1, 216 | 237N,,Grand Army Plaza,,40.675235,-73.971046,,,0,237 217 | 237S,,Grand Army Plaza,,40.675235,-73.971046,,,0,237 218 | 238,,Eastern Pkwy - Brooklyn Museum,,40.671987,-73.964375,,,1, 219 | 238N,,Eastern Pkwy - Brooklyn Museum,,40.671987,-73.964375,,,0,238 220 | 238S,,Eastern Pkwy - Brooklyn Museum,,40.671987,-73.964375,,,0,238 221 | 239,,Franklin Av,,40.670682,-73.958131,,,1, 222 | 239N,,Franklin Av,,40.670682,-73.958131,,,0,239 223 | 239S,,Franklin Av,,40.670682,-73.958131,,,0,239 224 | 241,,President St,,40.667883,-73.950683,,,1, 225 | 241N,,President St,,40.667883,-73.950683,,,0,241 226 | 241S,,President St,,40.667883,-73.950683,,,0,241 227 | 242,,Sterling St,,40.662742,-73.95085,,,1, 228 | 242N,,Sterling St,,40.662742,-73.95085,,,0,242 229 | 242S,,Sterling St,,40.662742,-73.95085,,,0,242 230 | 243,,Winthrop St,,40.656652,-73.9502,,,1, 231 | 243N,,Winthrop St,,40.656652,-73.9502,,,0,243 232 | 243S,,Winthrop St,,40.656652,-73.9502,,,0,243 233 | 244,,Church Av,,40.650843,-73.949575,,,1, 234 | 244N,,Church Av,,40.650843,-73.949575,,,0,244 235 | 244S,,Church Av,,40.650843,-73.949575,,,0,244 236 | 245,,Beverly Rd,,40.645098,-73.948959,,,1, 237 | 245N,,Beverly Rd,,40.645098,-73.948959,,,0,245 238 | 245S,,Beverly Rd,,40.645098,-73.948959,,,0,245 239 | 246,,Newkirk Av,,40.639967,-73.948411,,,1, 240 | 246N,,Newkirk Av,,40.639967,-73.948411,,,0,246 241 | 246S,,Newkirk Av,,40.639967,-73.948411,,,0,246 242 | 247,,Flatbush Av - Brooklyn College,,40.632836,-73.947642,,,1, 243 | 247N,,Flatbush Av - Brooklyn College,,40.632836,-73.947642,,,0,247 244 | 247S,,Flatbush Av - Brooklyn College,,40.632836,-73.947642,,,0,247 245 | 248,,Nostrand Av,,40.669847,-73.950466,,,1, 246 | 248N,,Nostrand Av,,40.669847,-73.950466,,,0,248 247 | 248S,,Nostrand Av,,40.669847,-73.950466,,,0,248 248 | 249,,Kingston Av,,40.669399,-73.942161,,,1, 249 | 249N,,Kingston Av,,40.669399,-73.942161,,,0,249 250 | 249S,,Kingston Av,,40.669399,-73.942161,,,0,249 251 | 250,,Crown Hts - Utica Av,,40.668897,-73.932942,,,1, 252 | 250N,,Crown Hts - Utica Av,,40.668897,-73.932942,,,0,250 253 | 250S,,Crown Hts - Utica Av,,40.668897,-73.932942,,,0,250 254 | 251,,Sutter Av - Rutland Rd,,40.664717,-73.92261,,,1, 255 | 251N,,Sutter Av - Rutland Rd,,40.664717,-73.92261,,,0,251 256 | 251S,,Sutter Av - Rutland Rd,,40.664717,-73.92261,,,0,251 257 | 252,,Saratoga Av,,40.661453,-73.916327,,,1, 258 | 252N,,Saratoga Av,,40.661453,-73.916327,,,0,252 259 | 252S,,Saratoga Av,,40.661453,-73.916327,,,0,252 260 | 253,,Rockaway Av,,40.662549,-73.908946,,,1, 261 | 253N,,Rockaway Av,,40.662549,-73.908946,,,0,253 262 | 253S,,Rockaway Av,,40.662549,-73.908946,,,0,253 263 | 254,,Junius St,,40.663515,-73.902447,,,1, 264 | 254N,,Junius St,,40.663515,-73.902447,,,0,254 265 | 254S,,Junius St,,40.663515,-73.902447,,,0,254 266 | 255,,Pennsylvania Av,,40.664635,-73.894895,,,1, 267 | 255N,,Pennsylvania Av,,40.664635,-73.894895,,,0,255 268 | 255S,,Pennsylvania Av,,40.664635,-73.894895,,,0,255 269 | 256,,Van Siclen Av,,40.665449,-73.889395,,,1, 270 | 256N,,Van Siclen Av,,40.665449,-73.889395,,,0,256 271 | 256S,,Van Siclen Av,,40.665449,-73.889395,,,0,256 272 | 257,,New Lots Av,,40.666235,-73.884079,,,1, 273 | 257N,,New Lots Av,,40.666235,-73.884079,,,0,257 274 | 257S,,New Lots Av,,40.666235,-73.884079,,,0,257 275 | 301,,Harlem - 148 St,,40.82388,-73.93647,,,1, 276 | 301N,,Harlem - 148 St,,40.82388,-73.93647,,,0,301 277 | 301S,,Harlem - 148 St,,40.82388,-73.93647,,,0,301 278 | 302,,145 St,,40.820421,-73.936245,,,1, 279 | 302N,,145 St,,40.820421,-73.936245,,,0,302 280 | 302S,,145 St,,40.820421,-73.936245,,,0,302 281 | 401,,Woodlawn,,40.886037,-73.878751,,,1, 282 | 401N,,Woodlawn,,40.886037,-73.878751,,,0,401 283 | 401S,,Woodlawn,,40.886037,-73.878751,,,0,401 284 | 402,,Mosholu Pkwy,,40.87975,-73.884655,,,1, 285 | 402N,,Mosholu Pkwy,,40.87975,-73.884655,,,0,402 286 | 402S,,Mosholu Pkwy,,40.87975,-73.884655,,,0,402 287 | 405,,Bedford Park Blvd - Lehman College,,40.873412,-73.890064,,,1, 288 | 405N,,Bedford Park Blvd - Lehman College,,40.873412,-73.890064,,,0,405 289 | 405S,,Bedford Park Blvd - Lehman College,,40.873412,-73.890064,,,0,405 290 | 406,,Kingsbridge Rd,,40.86776,-73.897174,,,1, 291 | 406N,,Kingsbridge Rd,,40.86776,-73.897174,,,0,406 292 | 406S,,Kingsbridge Rd,,40.86776,-73.897174,,,0,406 293 | 407,,Fordham Rd,,40.862803,-73.901034,,,1, 294 | 407N,,Fordham Rd,,40.862803,-73.901034,,,0,407 295 | 407S,,Fordham Rd,,40.862803,-73.901034,,,0,407 296 | 408,,183 St,,40.858407,-73.903879,,,1, 297 | 408N,,183 St,,40.858407,-73.903879,,,0,408 298 | 408S,,183 St,,40.858407,-73.903879,,,0,408 299 | 409,,Burnside Av,,40.853453,-73.907684,,,1, 300 | 409N,,Burnside Av,,40.853453,-73.907684,,,0,409 301 | 409S,,Burnside Av,,40.853453,-73.907684,,,0,409 302 | 410,,176 St,,40.84848,-73.911794,,,1, 303 | 410N,,176 St,,40.84848,-73.911794,,,0,410 304 | 410S,,176 St,,40.84848,-73.911794,,,0,410 305 | 411,,Mt Eden Av,,40.844434,-73.914685,,,1, 306 | 411N,,Mt Eden Av,,40.844434,-73.914685,,,0,411 307 | 411S,,Mt Eden Av,,40.844434,-73.914685,,,0,411 308 | 412,,170 St,,40.840075,-73.917791,,,1, 309 | 412N,,170 St,,40.840075,-73.917791,,,0,412 310 | 412S,,170 St,,40.840075,-73.917791,,,0,412 311 | 413,,167 St,,40.835537,-73.9214,,,1, 312 | 413N,,167 St,,40.835537,-73.9214,,,0,413 313 | 413S,,167 St,,40.835537,-73.9214,,,0,413 314 | 414,,161 St - Yankee Stadium,,40.827994,-73.925831,,,1, 315 | 414N,,161 St - Yankee Stadium,,40.827994,-73.925831,,,0,414 316 | 414S,,161 St - Yankee Stadium,,40.827994,-73.925831,,,0,414 317 | 415,,149 St - Grand Concourse,,40.818375,-73.927351,,,1, 318 | 415N,,149 St - Grand Concourse,,40.818375,-73.927351,,,0,415 319 | 415S,,149 St - Grand Concourse,,40.818375,-73.927351,,,0,415 320 | 416,,138 St - Grand Concourse,,40.813224,-73.929849,,,1, 321 | 416N,,138 St - Grand Concourse,,40.813224,-73.929849,,,0,416 322 | 416S,,138 St - Grand Concourse,,40.813224,-73.929849,,,0,416 323 | 418,,Fulton St,,40.710368,-74.009509,,,1, 324 | 418N,,Fulton St,,40.710368,-74.009509,,,0,418 325 | 418S,,Fulton St,,40.710368,-74.009509,,,0,418 326 | 419,,Wall St,,40.707557,-74.011862,,,1, 327 | 419N,,Wall St,,40.707557,-74.011862,,,0,419 328 | 419S,,Wall St,,40.707557,-74.011862,,,0,419 329 | 420,,Bowling Green,,40.704817,-74.014065,,,1, 330 | 420N,,Bowling Green,,40.704817,-74.014065,,,0,420 331 | 420S,,Bowling Green,,40.704817,-74.014065,,,0,420 332 | 423,,Borough Hall,,40.692404,-73.990151,,,1, 333 | 423N,,Borough Hall,,40.692404,-73.990151,,,0,423 334 | 423S,,Borough Hall,,40.692404,-73.990151,,,0,423 335 | 501,,Eastchester - Dyre Av,,40.8883,-73.830834,,,1, 336 | 501N,,Eastchester - Dyre Av,,40.8883,-73.830834,,,0,501 337 | 501S,,Eastchester - Dyre Av,,40.8883,-73.830834,,,0,501 338 | 502,,Baychester Av,,40.878663,-73.838591,,,1, 339 | 502N,,Baychester Av,,40.878663,-73.838591,,,0,502 340 | 502S,,Baychester Av,,40.878663,-73.838591,,,0,502 341 | 503,,Gun Hill Rd,,40.869526,-73.846384,,,1, 342 | 503N,,Gun Hill Rd,,40.869526,-73.846384,,,0,503 343 | 503S,,Gun Hill Rd,,40.869526,-73.846384,,,0,503 344 | 504,,Pelham Pkwy,,40.858985,-73.855359,,,1, 345 | 504N,,Pelham Pkwy,,40.858985,-73.855359,,,0,504 346 | 504S,,Pelham Pkwy,,40.858985,-73.855359,,,0,504 347 | 505,,Morris Park,,40.854364,-73.860495,,,1, 348 | 505N,,Morris Park,,40.854364,-73.860495,,,0,505 349 | 505S,,Morris Park,,40.854364,-73.860495,,,0,505 350 | 601,,Pelham Bay Park,,40.852462,-73.828121,,,1, 351 | 601N,,Pelham Bay Park,,40.852462,-73.828121,,,0,601 352 | 601S,,Pelham Bay Park,,40.852462,-73.828121,,,0,601 353 | 602,,Buhre Av,,40.84681,-73.832569,,,1, 354 | 602N,,Buhre Av,,40.84681,-73.832569,,,0,602 355 | 602S,,Buhre Av,,40.84681,-73.832569,,,0,602 356 | 603,,Middletown Rd,,40.843863,-73.836322,,,1, 357 | 603N,,Middletown Rd,,40.843863,-73.836322,,,0,603 358 | 603S,,Middletown Rd,,40.843863,-73.836322,,,0,603 359 | 604,,Westchester Sq - E Tremont Av,,40.839892,-73.842952,,,1, 360 | 604N,,Westchester Sq - E Tremont Av,,40.839892,-73.842952,,,0,604 361 | 604S,,Westchester Sq - E Tremont Av,,40.839892,-73.842952,,,0,604 362 | 606,,Zerega Av,,40.836488,-73.847036,,,1, 363 | 606N,,Zerega Av,,40.836488,-73.847036,,,0,606 364 | 606S,,Zerega Av,,40.836488,-73.847036,,,0,606 365 | 607,,Castle Hill Av,,40.834255,-73.851222,,,1, 366 | 607N,,Castle Hill Av,,40.834255,-73.851222,,,0,607 367 | 607S,,Castle Hill Av,,40.834255,-73.851222,,,0,607 368 | 608,,Parkchester,,40.833226,-73.860816,,,1, 369 | 608N,,Parkchester,,40.833226,-73.860816,,,0,608 370 | 608S,,Parkchester,,40.833226,-73.860816,,,0,608 371 | 609,,St Lawrence Av,,40.831509,-73.867618,,,1, 372 | 609N,,St Lawrence Av,,40.831509,-73.867618,,,0,609 373 | 609S,,St Lawrence Av,,40.831509,-73.867618,,,0,609 374 | 610,,Morrison Av- Sound View,,40.829521,-73.874516,,,1, 375 | 610N,,Morrison Av- Sound View,,40.829521,-73.874516,,,0,610 376 | 610S,,Morrison Av- Sound View,,40.829521,-73.874516,,,0,610 377 | 611,,Elder Av,,40.828584,-73.879159,,,1, 378 | 611N,,Elder Av,,40.828584,-73.879159,,,0,611 379 | 611S,,Elder Av,,40.828584,-73.879159,,,0,611 380 | 612,,Whitlock Av,,40.826525,-73.886283,,,1, 381 | 612N,,Whitlock Av,,40.826525,-73.886283,,,0,612 382 | 612S,,Whitlock Av,,40.826525,-73.886283,,,0,612 383 | 613,,Hunts Point Av,,40.820948,-73.890549,,,1, 384 | 613N,,Hunts Point Av,,40.820948,-73.890549,,,0,613 385 | 613S,,Hunts Point Av,,40.820948,-73.890549,,,0,613 386 | 614,,Longwood Av,,40.816104,-73.896435,,,1, 387 | 614N,,Longwood Av,,40.816104,-73.896435,,,0,614 388 | 614S,,Longwood Av,,40.816104,-73.896435,,,0,614 389 | 615,,E 149 St,,40.812118,-73.904098,,,1, 390 | 615N,,E 149 St,,40.812118,-73.904098,,,0,615 391 | 615S,,E 149 St,,40.812118,-73.904098,,,0,615 392 | 616,,E 143 St - St Mary's St,,40.808719,-73.907657,,,1, 393 | 616N,,E 143 St - St Mary's St,,40.808719,-73.907657,,,0,616 394 | 616S,,E 143 St - St Mary's St,,40.808719,-73.907657,,,0,616 395 | 617,,Cypress Av,,40.805368,-73.914042,,,1, 396 | 617N,,Cypress Av,,40.805368,-73.914042,,,0,617 397 | 617S,,Cypress Av,,40.805368,-73.914042,,,0,617 398 | 618,,Brook Av,,40.807566,-73.91924,,,1, 399 | 618N,,Brook Av,,40.807566,-73.91924,,,0,618 400 | 618S,,Brook Av,,40.807566,-73.91924,,,0,618 401 | 619,,3 Av - 138 St,,40.810476,-73.926138,,,1, 402 | 619N,,3 Av - 138 St,,40.810476,-73.926138,,,0,619 403 | 619S,,3 Av - 138 St,,40.810476,-73.926138,,,0,619 404 | 621,,125 St,,40.804138,-73.937594,,,1, 405 | 621N,,125 St,,40.804138,-73.937594,,,0,621 406 | 621S,,125 St,,40.804138,-73.937594,,,0,621 407 | 622,,116 St,,40.798629,-73.941617,,,1, 408 | 622N,,116 St,,40.798629,-73.941617,,,0,622 409 | 622S,,116 St,,40.798629,-73.941617,,,0,622 410 | 623,,110 St,,40.79502,-73.94425,,,1, 411 | 623N,,110 St,,40.79502,-73.94425,,,0,623 412 | 623S,,110 St,,40.79502,-73.94425,,,0,623 413 | 624,,103 St,,40.7906,-73.947478,,,1, 414 | 624N,,103 St,,40.7906,-73.947478,,,0,624 415 | 624S,,103 St,,40.7906,-73.947478,,,0,624 416 | 625,,96 St,,40.785672,-73.95107,,,1, 417 | 625N,,96 St,,40.785672,-73.95107,,,0,625 418 | 625S,,96 St,,40.785672,-73.95107,,,0,625 419 | 626,,86 St,,40.779492,-73.955589,,,1, 420 | 626N,,86 St,,40.779492,-73.955589,,,0,626 421 | 626S,,86 St,,40.779492,-73.955589,,,0,626 422 | 627,,77 St,,40.77362,-73.959874,,,1, 423 | 627N,,77 St,,40.77362,-73.959874,,,0,627 424 | 627S,,77 St,,40.77362,-73.959874,,,0,627 425 | 628,,68 St - Hunter College,,40.768141,-73.96387,,,1, 426 | 628N,,68 St - Hunter College,,40.768141,-73.96387,,,0,628 427 | 628S,,68 St - Hunter College,,40.768141,-73.96387,,,0,628 428 | 629,,59 St,,40.762526,-73.967967,,,1, 429 | 629N,,59 St,,40.762526,-73.967967,,,0,629 430 | 629S,,59 St,,40.762526,-73.967967,,,0,629 431 | 630,,51 St,,40.757107,-73.97192,,,1, 432 | 630N,,51 St,,40.757107,-73.97192,,,0,630 433 | 630S,,51 St,,40.757107,-73.97192,,,0,630 434 | 631,,Grand Central - 42 St,,40.751776,-73.976848,,,1, 435 | 631N,,Grand Central - 42 St,,40.751776,-73.976848,,,0,631 436 | 631S,,Grand Central - 42 St,,40.751776,-73.976848,,,0,631 437 | 632,,33 St,,40.746081,-73.982076,,,1, 438 | 632N,,33 St,,40.746081,-73.982076,,,0,632 439 | 632S,,33 St,,40.746081,-73.982076,,,0,632 440 | 633,,28 St,,40.74307,-73.984264,,,1, 441 | 633N,,28 St,,40.74307,-73.984264,,,0,633 442 | 633S,,28 St,,40.74307,-73.984264,,,0,633 443 | 634,,23 St,,40.739864,-73.986599,,,1, 444 | 634N,,23 St,,40.739864,-73.986599,,,0,634 445 | 634S,,23 St,,40.739864,-73.986599,,,0,634 446 | 635,,14 St - Union Sq,,40.734673,-73.989951,,,1, 447 | 635N,,14 St - Union Sq,,40.734673,-73.989951,,,0,635 448 | 635S,,14 St - Union Sq,,40.734673,-73.989951,,,0,635 449 | 636,,Astor Pl,,40.730054,-73.99107,,,1, 450 | 636N,,Astor Pl,,40.730054,-73.99107,,,0,636 451 | 636S,,Astor Pl,,40.730054,-73.99107,,,0,636 452 | 637,,Bleecker St,,40.725915,-73.994659,,,1, 453 | 637N,,Bleecker St,,40.725915,-73.994659,,,0,637 454 | 637S,,Bleecker St,,40.725915,-73.994659,,,0,637 455 | 638,,Spring St,,40.722301,-73.997141,,,1, 456 | 638N,,Spring St,,40.722301,-73.997141,,,0,638 457 | 638S,,Spring St,,40.722301,-73.997141,,,0,638 458 | 639,,Canal St,,40.718803,-74.000193,,,1, 459 | 639N,,Canal St,,40.718803,-74.000193,,,0,639 460 | 639S,,Canal St,,40.718803,-74.000193,,,0,639 461 | 640,,Brooklyn Bridge - City Hall,,40.713065,-74.004131,,,1, 462 | 640N,,Brooklyn Bridge - City Hall,,40.713065,-74.004131,,,0,640 463 | 640S,,Brooklyn Bridge - City Hall,,40.713065,-74.004131,,,0,640 464 | 701,,Flushing - Main St,,40.7596,-73.83003,,,1, 465 | 701N,,Flushing - Main St,,40.7596,-73.83003,,,0,701 466 | 701S,,Flushing - Main St,,40.7596,-73.83003,,,0,701 467 | 702,,Mets - Willets Point,,40.754622,-73.845625,,,1, 468 | 702N,,Mets - Willets Point,,40.754622,-73.845625,,,0,702 469 | 702S,,Mets - Willets Point,,40.754622,-73.845625,,,0,702 470 | 705,,111 St,,40.75173,-73.855334,,,1, 471 | 705N,,111 St,,40.75173,-73.855334,,,0,705 472 | 705S,,111 St,,40.75173,-73.855334,,,0,705 473 | 706,,103 St - Corona Plaza,,40.749865,-73.8627,,,1, 474 | 706N,,103 St - Corona Plaza,,40.749865,-73.8627,,,0,706 475 | 706S,,103 St - Corona Plaza,,40.749865,-73.8627,,,0,706 476 | 707,,Junction Blvd,,40.749145,-73.869527,,,1, 477 | 707N,,Junction Blvd,,40.749145,-73.869527,,,0,707 478 | 707S,,Junction Blvd,,40.749145,-73.869527,,,0,707 479 | 708,,90 St - Elmhurst Av,,40.748408,-73.876613,,,1, 480 | 708N,,90 St - Elmhurst Av,,40.748408,-73.876613,,,0,708 481 | 708S,,90 St - Elmhurst Av,,40.748408,-73.876613,,,0,708 482 | 709,,82 St - Jackson Hts,,40.747659,-73.883697,,,1, 483 | 709N,,82 St - Jackson Hts,,40.747659,-73.883697,,,0,709 484 | 709S,,82 St - Jackson Hts,,40.747659,-73.883697,,,0,709 485 | 710,,74 St - Broadway,,40.746848,-73.891394,,,1, 486 | 710N,,74 St - Broadway,,40.746848,-73.891394,,,0,710 487 | 710S,,74 St - Broadway,,40.746848,-73.891394,,,0,710 488 | 711,,69 St,,40.746325,-73.896403,,,1, 489 | 711N,,69 St,,40.746325,-73.896403,,,0,711 490 | 711S,,69 St,,40.746325,-73.896403,,,0,711 491 | 712,,Woodside - 61 St,,40.74563,-73.902984,,,1, 492 | 712N,,Woodside - 61 St,,40.74563,-73.902984,,,0,712 493 | 712S,,Woodside - 61 St,,40.74563,-73.902984,,,0,712 494 | 713,,52 St,,40.744149,-73.912549,,,1, 495 | 713N,,52 St,,40.744149,-73.912549,,,0,713 496 | 713S,,52 St,,40.744149,-73.912549,,,0,713 497 | 714,,46 St,,40.743132,-73.918435,,,1, 498 | 714N,,46 St,,40.743132,-73.918435,,,0,714 499 | 714S,,46 St,,40.743132,-73.918435,,,0,714 500 | 715,,40 St,,40.743781,-73.924016,,,1, 501 | 715N,,40 St,,40.743781,-73.924016,,,0,715 502 | 715S,,40 St,,40.743781,-73.924016,,,0,715 503 | 716,,33 St,,40.744587,-73.930997,,,1, 504 | 716N,,33 St,,40.744587,-73.930997,,,0,716 505 | 716S,,33 St,,40.744587,-73.930997,,,0,716 506 | 718,,Queensboro Plaza,,40.750582,-73.940202,,,1, 507 | 718N,,Queensboro Plaza,,40.750582,-73.940202,,,0,718 508 | 718S,,Queensboro Plaza,,40.750582,-73.940202,,,0,718 509 | 719,,Court Sq,,40.747023,-73.945264,,,1, 510 | 719N,,Court Sq,,40.747023,-73.945264,,,0,719 511 | 719S,,Court Sq,,40.747023,-73.945264,,,0,719 512 | 720,,Hunters Point Av,,40.742216,-73.948916,,,1, 513 | 720N,,Hunters Point Av,,40.742216,-73.948916,,,0,720 514 | 720S,,Hunters Point Av,,40.742216,-73.948916,,,0,720 515 | 721,,Vernon Blvd - Jackson Av,,40.742626,-73.953581,,,1, 516 | 721N,,Vernon Blvd - Jackson Av,,40.742626,-73.953581,,,0,721 517 | 721S,,Vernon Blvd - Jackson Av,,40.742626,-73.953581,,,0,721 518 | 723,,Grand Central - 42 St,,40.751431,-73.976041,,,1, 519 | 723N,,Grand Central - 42 St,,40.751431,-73.976041,,,0,723 520 | 723S,,Grand Central - 42 St,,40.751431,-73.976041,,,0,723 521 | 724,,5 Av,,40.753821,-73.981963,,,1, 522 | 724N,,5 Av,,40.753821,-73.981963,,,0,724 523 | 724S,,5 Av,,40.753821,-73.981963,,,0,724 524 | 725,,Times Sq - 42 St,,40.755477,-73.987691,,,1, 525 | 725N,,Times Sq - 42 St,,40.755477,-73.987691,,,0,725 526 | 725S,,Times Sq - 42 St,,40.755477,-73.987691,,,0,725 527 | 726,,34 St - 11 Av,,40.755882,-74.001910,,,1, 528 | 726N,,34 St - 11 Av,,40.755882,-74.001910,,,0,726 529 | 726S,,34 St - 11 Av,,40.755882,-74.001910,,,0,726 530 | 901,,Grand Central - 42 St,,40.752769,-73.979189,,,1, 531 | 901N,,Grand Central - 42 St,,40.752769,-73.979189,,,0,901 532 | 901S,,Grand Central - 42 St,,40.752769,-73.979189,,,0,901 533 | 902,,Times Sq - 42 St,,40.755983,-73.986229,,,1, 534 | 902N,,Times Sq - 42 St,,40.755983,-73.986229,,,0,902 535 | 902S,,Times Sq - 42 St,,40.755983,-73.986229,,,0,902 536 | A02,,Inwood - 207 St,,40.868072,-73.919899,,,1, 537 | A02N,,Inwood - 207 St,,40.868072,-73.919899,,,0,A02 538 | A02S,,Inwood - 207 St,,40.868072,-73.919899,,,0,A02 539 | A03,,Dyckman St,,40.865491,-73.927271,,,1, 540 | A03N,,Dyckman St,,40.865491,-73.927271,,,0,A03 541 | A03S,,Dyckman St,,40.865491,-73.927271,,,0,A03 542 | A05,,190 St,,40.859022,-73.93418,,,1, 543 | A05N,,190 St,,40.859022,-73.93418,,,0,A05 544 | A05S,,190 St,,40.859022,-73.93418,,,0,A05 545 | A06,,181 St,,40.851695,-73.937969,,,1, 546 | A06N,,181 St,,40.851695,-73.937969,,,0,A06 547 | A06S,,181 St,,40.851695,-73.937969,,,0,A06 548 | A07,,175 St,,40.847391,-73.939704,,,1, 549 | A07N,,175 St,,40.847391,-73.939704,,,0,A07 550 | A07S,,175 St,,40.847391,-73.939704,,,0,A07 551 | A09,,168 St,,40.840719,-73.939561,,,1, 552 | A09N,,168 St,,40.840719,-73.939561,,,0,A09 553 | A09S,,168 St,,40.840719,-73.939561,,,0,A09 554 | A10,,163 St - Amsterdam Av,,40.836013,-73.939892,,,1, 555 | A10N,,163 St - Amsterdam Av,,40.836013,-73.939892,,,0,A10 556 | A10S,,163 St - Amsterdam Av,,40.836013,-73.939892,,,0,A10 557 | A11,,155 St,,40.830518,-73.941514,,,1, 558 | A11N,,155 St,,40.830518,-73.941514,,,0,A11 559 | A11S,,155 St,,40.830518,-73.941514,,,0,A11 560 | A12,,145 St,,40.824783,-73.944216,,,1, 561 | A12N,,145 St,,40.824783,-73.944216,,,0,A12 562 | A12S,,145 St,,40.824783,-73.944216,,,0,A12 563 | A14,,135 St,,40.817894,-73.947649,,,1, 564 | A14N,,135 St,,40.817894,-73.947649,,,0,A14 565 | A14S,,135 St,,40.817894,-73.947649,,,0,A14 566 | A15,,125 St,,40.811109,-73.952343,,,1, 567 | A15N,,125 St,,40.811109,-73.952343,,,0,A15 568 | A15S,,125 St,,40.811109,-73.952343,,,0,A15 569 | A16,,116 St,,40.805085,-73.954882,,,1, 570 | A16N,,116 St,,40.805085,-73.954882,,,0,A16 571 | A16S,,116 St,,40.805085,-73.954882,,,0,A16 572 | A17,,Cathedral Pkwy (110 St),,40.800603,-73.958161,,,1, 573 | A17N,,Cathedral Pkwy (110 St),,40.800603,-73.958161,,,0,A17 574 | A17S,,Cathedral Pkwy (110 St),,40.800603,-73.958161,,,0,A17 575 | A18,,103 St,,40.796092,-73.961454,,,1, 576 | A18N,,103 St,,40.796092,-73.961454,,,0,A18 577 | A18S,,103 St,,40.796092,-73.961454,,,0,A18 578 | A19,,96 St,,40.791642,-73.964696,,,1, 579 | A19N,,96 St,,40.791642,-73.964696,,,0,A19 580 | A19S,,96 St,,40.791642,-73.964696,,,0,A19 581 | A20,,86 St,,40.785868,-73.968916,,,1, 582 | A20N,,86 St,,40.785868,-73.968916,,,0,A20 583 | A20S,,86 St,,40.785868,-73.968916,,,0,A20 584 | A21,,81 St - Museum of Natural History,,40.781433,-73.972143,,,1, 585 | A21N,,81 St - Museum of Natural History,,40.781433,-73.972143,,,0,A21 586 | A21S,,81 St - Museum of Natural History,,40.781433,-73.972143,,,0,A21 587 | A22,,72 St,,40.775594,-73.97641,,,1, 588 | A22N,,72 St,,40.775594,-73.97641,,,0,A22 589 | A22S,,72 St,,40.775594,-73.97641,,,0,A22 590 | A24,,59 St - Columbus Circle,,40.768296,-73.981736,,,1, 591 | A24N,,59 St - Columbus Circle,,40.768296,-73.981736,,,0,A24 592 | A24S,,59 St - Columbus Circle,,40.768296,-73.981736,,,0,A24 593 | A25,,50 St,,40.762456,-73.985984,,,1, 594 | A25N,,50 St,,40.762456,-73.985984,,,0,A25 595 | A25S,,50 St,,40.762456,-73.985984,,,0,A25 596 | A27,,42 St - Port Authority Bus Terminal,,40.757308,-73.989735,,,1, 597 | A27N,,42 St - Port Authority Bus Terminal,,40.757308,-73.989735,,,0,A27 598 | A27S,,42 St - Port Authority Bus Terminal,,40.757308,-73.989735,,,0,A27 599 | A28,,34 St - Penn Station,,40.752287,-73.993391,,,1, 600 | A28N,,34 St - Penn Station,,40.752287,-73.993391,,,0,A28 601 | A28S,,34 St - Penn Station,,40.752287,-73.993391,,,0,A28 602 | A30,,23 St,,40.745906,-73.998041,,,1, 603 | A30N,,23 St,,40.745906,-73.998041,,,0,A30 604 | A30S,,23 St,,40.745906,-73.998041,,,0,A30 605 | A31,,14 St,,40.740893,-74.00169,,,1, 606 | A31N,,14 St,,40.740893,-74.00169,,,0,A31 607 | A31S,,14 St,,40.740893,-74.00169,,,0,A31 608 | A32,,W 4 St,,40.732338,-74.000495,,,1, 609 | A32N,,W 4 St,,40.732338,-74.000495,,,0,A32 610 | A32S,,W 4 St,,40.732338,-74.000495,,,0,A32 611 | A33,,Spring St,,40.726227,-74.003739,,,1, 612 | A33N,,Spring St,,40.726227,-74.003739,,,0,A33 613 | A33S,,Spring St,,40.726227,-74.003739,,,0,A33 614 | A34,,Canal St,,40.720824,-74.005229,,,1, 615 | A34N,,Canal St,,40.720824,-74.005229,,,0,A34 616 | A34S,,Canal St,,40.720824,-74.005229,,,0,A34 617 | A36,,Chambers St,,40.714111,-74.008585,,,1, 618 | A36N,,Chambers St,,40.714111,-74.008585,,,0,A36 619 | A36S,,Chambers St,,40.714111,-74.008585,,,0,A36 620 | A38,,Fulton St,,40.710197,-74.007691,,,1, 621 | A38N,,Fulton St,,40.710197,-74.007691,,,0,A38 622 | A38S,,Fulton St,,40.710197,-74.007691,,,0,A38 623 | A40,,High St,,40.699337,-73.990531,,,1, 624 | A40N,,High St,,40.699337,-73.990531,,,0,A40 625 | A40S,,High St,,40.699337,-73.990531,,,0,A40 626 | A41,,Jay St - MetroTech,,40.692338,-73.987342,,,1, 627 | A41N,,Jay St - MetroTech,,40.692338,-73.987342,,,0,A41 628 | A41S,,Jay St - MetroTech,,40.692338,-73.987342,,,0,A41 629 | A42,,Hoyt - Schermerhorn Sts,,40.688484,-73.985001,,,1, 630 | A42N,,Hoyt - Schermerhorn Sts,,40.688484,-73.985001,,,0,A42 631 | A42S,,Hoyt - Schermerhorn Sts,,40.688484,-73.985001,,,0,A42 632 | A43,,Lafayette Av,,40.686113,-73.973946,,,1, 633 | A43N,,Lafayette Av,,40.686113,-73.973946,,,0,A43 634 | A43S,,Lafayette Av,,40.686113,-73.973946,,,0,A43 635 | A44,,Clinton - Washington Avs,,40.683263,-73.965838,,,1, 636 | A44N,,Clinton - Washington Avs,,40.683263,-73.965838,,,0,A44 637 | A44S,,Clinton - Washington Avs,,40.683263,-73.965838,,,0,A44 638 | A45,,Franklin Av,,40.68138,-73.956848,,,1, 639 | A45N,,Franklin Av,,40.68138,-73.956848,,,0,A45 640 | A45S,,Franklin Av,,40.68138,-73.956848,,,0,A45 641 | A46,,Nostrand Av,,40.680438,-73.950426,,,1, 642 | A46N,,Nostrand Av,,40.680438,-73.950426,,,0,A46 643 | A46S,,Nostrand Av,,40.680438,-73.950426,,,0,A46 644 | A47,,Kingston - Throop Avs,,40.679921,-73.940858,,,1, 645 | A47N,,Kingston - Throop Avs,,40.679921,-73.940858,,,0,A47 646 | A47S,,Kingston - Throop Avs,,40.679921,-73.940858,,,0,A47 647 | A48,,Utica Av,,40.679364,-73.930729,,,1, 648 | A48N,,Utica Av,,40.679364,-73.930729,,,0,A48 649 | A48S,,Utica Av,,40.679364,-73.930729,,,0,A48 650 | A49,,Ralph Av,,40.678822,-73.920786,,,1, 651 | A49N,,Ralph Av,,40.678822,-73.920786,,,0,A49 652 | A49S,,Ralph Av,,40.678822,-73.920786,,,0,A49 653 | A50,,Rockaway Av,,40.67834,-73.911946,,,1, 654 | A50N,,Rockaway Av,,40.67834,-73.911946,,,0,A50 655 | A50S,,Rockaway Av,,40.67834,-73.911946,,,0,A50 656 | A51,,Broadway Jct,,40.678334,-73.905316,,,1, 657 | A51N,,Broadway Jct,,40.678334,-73.905316,,,0,A51 658 | A51S,,Broadway Jct,,40.678334,-73.905316,,,0,A51 659 | A52,,Liberty Av,,40.674542,-73.896548,,,1, 660 | A52N,,Liberty Av,,40.674542,-73.896548,,,0,A52 661 | A52S,,Liberty Av,,40.674542,-73.896548,,,0,A52 662 | A53,,Van Siclen Av,,40.67271,-73.890358,,,1, 663 | A53N,,Van Siclen Av,,40.67271,-73.890358,,,0,A53 664 | A53S,,Van Siclen Av,,40.67271,-73.890358,,,0,A53 665 | A54,,Shepherd Av,,40.67413,-73.88075,,,1, 666 | A54N,,Shepherd Av,,40.67413,-73.88075,,,0,A54 667 | A54S,,Shepherd Av,,40.67413,-73.88075,,,0,A54 668 | A55,,Euclid Av,,40.675377,-73.872106,,,1, 669 | A55N,,Euclid Av,,40.675377,-73.872106,,,0,A55 670 | A55S,,Euclid Av,,40.675377,-73.872106,,,0,A55 671 | A57,,Grant Av,,40.677044,-73.86505,,,1, 672 | A57N,,Grant Av,,40.677044,-73.86505,,,0,A57 673 | A57S,,Grant Av,,40.677044,-73.86505,,,0,A57 674 | A59,,80 St,,40.679371,-73.858992,,,1, 675 | A59N,,80 St,,40.679371,-73.858992,,,0,A59 676 | A59S,,80 St,,40.679371,-73.858992,,,0,A59 677 | A60,,88 St,,40.679843,-73.85147,,,1, 678 | A60N,,88 St,,40.679843,-73.85147,,,0,A60 679 | A60S,,88 St,,40.679843,-73.85147,,,0,A60 680 | A61,,Rockaway Blvd,,40.680429,-73.843853,,,1, 681 | A61N,,Rockaway Blvd,,40.680429,-73.843853,,,0,A61 682 | A61S,,Rockaway Blvd,,40.680429,-73.843853,,,0,A61 683 | A63,,104 St,,40.681711,-73.837683,,,1, 684 | A63N,,104 St,,40.681711,-73.837683,,,0,A63 685 | A63S,,104 St,,40.681711,-73.837683,,,0,A63 686 | A64,,111 St,,40.684331,-73.832163,,,1, 687 | A64N,,111 St,,40.684331,-73.832163,,,0,A64 688 | A64S,,111 St,,40.684331,-73.832163,,,0,A64 689 | A65,,Ozone Park - Lefferts Blvd,,40.685951,-73.825798,,,1, 690 | A65N,,Ozone Park - Lefferts Blvd,,40.685951,-73.825798,,,0,A65 691 | A65S,,Ozone Park - Lefferts Blvd,,40.685951,-73.825798,,,0,A65 692 | B04,,21 St - Queensbridge,,40.754203,-73.942836,,,1, 693 | B04N,,21 St - Queensbridge,,40.754203,-73.942836,,,0,B04 694 | B04S,,21 St - Queensbridge,,40.754203,-73.942836,,,0,B04 695 | B06,,Roosevelt Island,,40.759145,-73.95326,,,1, 696 | B06N,,Roosevelt Island,,40.759145,-73.95326,,,0,B06 697 | B06S,,Roosevelt Island,,40.759145,-73.95326,,,0,B06 698 | B08,,Lexington Av/63 St,,40.764629,-73.966113,,,1, 699 | B08N,,Lexington Av/63 St,,40.764629,-73.966113,,,0,B08 700 | B08S,,Lexington Av/63 St,,40.764629,-73.966113,,,0,B08 701 | B10,,57 St,,40.763972,-73.97745,,,1, 702 | B10N,,57 St,,40.763972,-73.97745,,,0,B10 703 | B10S,,57 St,,40.763972,-73.97745,,,0,B10 704 | B12,,9 Av,,40.646292,-73.994324,,,1, 705 | B12N,,9 Av,,40.646292,-73.994324,,,0,B12 706 | B12S,,9 Av,,40.646292,-73.994324,,,0,B12 707 | B13,,Fort Hamilton Pkwy,,40.640914,-73.994304,,,1, 708 | B13N,,Fort Hamilton Pkwy,,40.640914,-73.994304,,,0,B13 709 | B13S,,Fort Hamilton Pkwy,,40.640914,-73.994304,,,0,B13 710 | B14,,50 St,,40.63626,-73.994791,,,1, 711 | B14N,,50 St,,40.63626,-73.994791,,,0,B14 712 | B14S,,50 St,,40.63626,-73.994791,,,0,B14 713 | B15,,55 St,,40.631435,-73.995476,,,1, 714 | B15N,,55 St,,40.631435,-73.995476,,,0,B15 715 | B15S,,55 St,,40.631435,-73.995476,,,0,B15 716 | B16,,62 St,,40.626472,-73.996895,,,1, 717 | B16N,,62 St,,40.626472,-73.996895,,,0,B16 718 | B16S,,62 St,,40.626472,-73.996895,,,0,B16 719 | B17,,71 St,,40.619589,-73.998864,,,1, 720 | B17N,,71 St,,40.619589,-73.998864,,,0,B17 721 | B17S,,71 St,,40.619589,-73.998864,,,0,B17 722 | B18,,79 St,,40.613501,-74.00061,,,1, 723 | B18N,,79 St,,40.613501,-74.00061,,,0,B18 724 | B18S,,79 St,,40.613501,-74.00061,,,0,B18 725 | B19,,18 Av,,40.607954,-74.001736,,,1, 726 | B19N,,18 Av,,40.607954,-74.001736,,,0,B19 727 | B19S,,18 Av,,40.607954,-74.001736,,,0,B19 728 | B20,,20 Av,,40.604556,-73.998168,,,1, 729 | B20N,,20 Av,,40.604556,-73.998168,,,0,B20 730 | B20S,,20 Av,,40.604556,-73.998168,,,0,B20 731 | B21,,Bay Pkwy,,40.601875,-73.993728,,,1, 732 | B21N,,Bay Pkwy,,40.601875,-73.993728,,,0,B21 733 | B21S,,Bay Pkwy,,40.601875,-73.993728,,,0,B21 734 | B22,,25 Av,,40.597704,-73.986829,,,1, 735 | B22N,,25 Av,,40.597704,-73.986829,,,0,B22 736 | B22S,,25 Av,,40.597704,-73.986829,,,0,B22 737 | B23,,Bay 50 St,,40.588841,-73.983765,,,1, 738 | B23N,,Bay 50 St,,40.588841,-73.983765,,,0,B23 739 | B23S,,Bay 50 St,,40.588841,-73.983765,,,0,B23 740 | D01,,Norwood - 205 St,,40.874811,-73.878855,,,1, 741 | D01N,,Norwood - 205 St,,40.874811,-73.878855,,,0,D01 742 | D01S,,Norwood - 205 St,,40.874811,-73.878855,,,0,D01 743 | D03,,Bedford Park Blvd,,40.873244,-73.887138,,,1, 744 | D03N,,Bedford Park Blvd,,40.873244,-73.887138,,,0,D03 745 | D03S,,Bedford Park Blvd,,40.873244,-73.887138,,,0,D03 746 | D04,,Kingsbridge Rd,,40.866978,-73.893509,,,1, 747 | D04N,,Kingsbridge Rd,,40.866978,-73.893509,,,0,D04 748 | D04S,,Kingsbridge Rd,,40.866978,-73.893509,,,0,D04 749 | D05,,Fordham Rd,,40.861296,-73.897749,,,1, 750 | D05N,,Fordham Rd,,40.861296,-73.897749,,,0,D05 751 | D05S,,Fordham Rd,,40.861296,-73.897749,,,0,D05 752 | D06,,182-183 Sts,,40.856093,-73.900741,,,1, 753 | D06N,,182-183 Sts,,40.856093,-73.900741,,,0,D06 754 | D06S,,182-183 Sts,,40.856093,-73.900741,,,0,D06 755 | D07,,Tremont Av,,40.85041,-73.905227,,,1, 756 | D07N,,Tremont Av,,40.85041,-73.905227,,,0,D07 757 | D07S,,Tremont Av,,40.85041,-73.905227,,,0,D07 758 | D08,,174-175 Sts,,40.8459,-73.910136,,,1, 759 | D08N,,174-175 Sts,,40.8459,-73.910136,,,0,D08 760 | D08S,,174-175 Sts,,40.8459,-73.910136,,,0,D08 761 | D09,,170 St,,40.839306,-73.9134,,,1, 762 | D09N,,170 St,,40.839306,-73.9134,,,0,D09 763 | D09S,,170 St,,40.839306,-73.9134,,,0,D09 764 | D10,,167 St,,40.833771,-73.91844,,,1, 765 | D10N,,167 St,,40.833771,-73.91844,,,0,D10 766 | D10S,,167 St,,40.833771,-73.91844,,,0,D10 767 | D11,,161 St - Yankee Stadium,,40.827905,-73.925651,,,1, 768 | D11N,,161 St - Yankee Stadium,,40.827905,-73.925651,,,0,D11 769 | D11S,,161 St - Yankee Stadium,,40.827905,-73.925651,,,0,D11 770 | D12,,155 St,,40.830135,-73.938209,,,1, 771 | D12N,,155 St,,40.830135,-73.938209,,,0,D12 772 | D12S,,155 St,,40.830135,-73.938209,,,0,D12 773 | D13,,145 St,,40.824783,-73.944216,,,1, 774 | D13N,,145 St,,40.824783,-73.944216,,,0,D13 775 | D13S,,145 St,,40.824783,-73.944216,,,0,D13 776 | D14,,7 Av,,40.762862,-73.981637,,,1, 777 | D14N,,7 Av,,40.762862,-73.981637,,,0,D14 778 | D14S,,7 Av,,40.762862,-73.981637,,,0,D14 779 | D15,,47-50 Sts - Rockefeller Ctr,,40.758663,-73.981329,,,1, 780 | D15N,,47-50 Sts - Rockefeller Ctr,,40.758663,-73.981329,,,0,D15 781 | D15S,,47-50 Sts - Rockefeller Ctr,,40.758663,-73.981329,,,0,D15 782 | D16,,42 St - Bryant Pk,,40.754222,-73.984569,,,1, 783 | D16N,,42 St - Bryant Pk,,40.754222,-73.984569,,,0,D16 784 | D16S,,42 St - Bryant Pk,,40.754222,-73.984569,,,0,D16 785 | D17,,34 St - Herald Sq,,40.749719,-73.987823,,,1, 786 | D17N,,34 St - Herald Sq,,40.749719,-73.987823,,,0,D17 787 | D17S,,34 St - Herald Sq,,40.749719,-73.987823,,,0,D17 788 | D18,,23 St,,40.742878,-73.992821,,,1, 789 | D18N,,23 St,,40.742878,-73.992821,,,0,D18 790 | D18S,,23 St,,40.742878,-73.992821,,,0,D18 791 | D19,,14 St,,40.738228,-73.996209,,,1, 792 | D19N,,14 St,,40.738228,-73.996209,,,0,D19 793 | D19S,,14 St,,40.738228,-73.996209,,,0,D19 794 | D20,,W 4 St,,40.732338,-74.000495,,,1, 795 | D20N,,W 4 St,,40.732338,-74.000495,,,0,D20 796 | D20S,,W 4 St,,40.732338,-74.000495,,,0,D20 797 | D21,,Broadway-Lafayette St,,40.725297,-73.996204,,,1, 798 | D21N,,Broadway-Lafayette St,,40.725297,-73.996204,,,0,D21 799 | D21S,,Broadway-Lafayette St,,40.725297,-73.996204,,,0,D21 800 | D22,,Grand St,,40.718267,-73.993753,,,1, 801 | D22N,,Grand St,,40.718267,-73.993753,,,0,D22 802 | D22S,,Grand St,,40.718267,-73.993753,,,0,D22 803 | D24,,Atlantic Av - Barclays Ctr,,40.68446,-73.97689,,,1, 804 | D24N,,Atlantic Av - Barclays Ctr,,40.68446,-73.97689,,,0,D24 805 | D24S,,Atlantic Av - Barclays Ctr,,40.68446,-73.97689,,,0,D24 806 | D25,,7 Av,,40.67705,-73.972367,,,1, 807 | D25N,,7 Av,,40.67705,-73.972367,,,0,D25 808 | D25S,,7 Av,,40.67705,-73.972367,,,0,D25 809 | D26,,Prospect Park,,40.661614,-73.962246,,,1, 810 | D26N,,Prospect Park,,40.661614,-73.962246,,,0,D26 811 | D26S,,Prospect Park,,40.661614,-73.962246,,,0,D26 812 | D27,,Parkside Av,,40.655292,-73.961495,,,1, 813 | D27N,,Parkside Av,,40.655292,-73.961495,,,0,D27 814 | D27S,,Parkside Av,,40.655292,-73.961495,,,0,D27 815 | D28,,Church Av,,40.650527,-73.962982,,,1, 816 | D28N,,Church Av,,40.650527,-73.962982,,,0,D28 817 | D28S,,Church Av,,40.650527,-73.962982,,,0,D28 818 | D29,,Beverley Rd,,40.644031,-73.964492,,,1, 819 | D29N,,Beverley Rd,,40.644031,-73.964492,,,0,D29 820 | D29S,,Beverley Rd,,40.644031,-73.964492,,,0,D29 821 | D30,,Cortelyou Rd,,40.640927,-73.963891,,,1, 822 | D30N,,Cortelyou Rd,,40.640927,-73.963891,,,0,D30 823 | D30S,,Cortelyou Rd,,40.640927,-73.963891,,,0,D30 824 | D31,,Newkirk Plaza,,40.635082,-73.962793,,,1, 825 | D31N,,Newkirk Plaza,,40.635082,-73.962793,,,0,D31 826 | D31S,,Newkirk Plaza,,40.635082,-73.962793,,,0,D31 827 | D32,,Avenue H,,40.62927,-73.961639,,,1, 828 | D32N,,Avenue H,,40.62927,-73.961639,,,0,D32 829 | D32S,,Avenue H,,40.62927,-73.961639,,,0,D32 830 | D33,,Avenue J,,40.625039,-73.960803,,,1, 831 | D33N,,Avenue J,,40.625039,-73.960803,,,0,D33 832 | D33S,,Avenue J,,40.625039,-73.960803,,,0,D33 833 | D34,,Avenue M,,40.617618,-73.959399,,,1, 834 | D34N,,Avenue M,,40.617618,-73.959399,,,0,D34 835 | D34S,,Avenue M,,40.617618,-73.959399,,,0,D34 836 | D35,,Kings Hwy,,40.60867,-73.957734,,,1, 837 | D35N,,Kings Hwy,,40.60867,-73.957734,,,0,D35 838 | D35S,,Kings Hwy,,40.60867,-73.957734,,,0,D35 839 | D37,,Avenue U,,40.5993,-73.955929,,,1, 840 | D37N,,Avenue U,,40.5993,-73.955929,,,0,D37 841 | D37S,,Avenue U,,40.5993,-73.955929,,,0,D37 842 | D38,,Neck Rd,,40.595246,-73.955161,,,1, 843 | D38N,,Neck Rd,,40.595246,-73.955161,,,0,D38 844 | D38S,,Neck Rd,,40.595246,-73.955161,,,0,D38 845 | D39,,Sheepshead Bay,,40.586896,-73.954155,,,1, 846 | D39N,,Sheepshead Bay,,40.586896,-73.954155,,,0,D39 847 | D39S,,Sheepshead Bay,,40.586896,-73.954155,,,0,D39 848 | D40,,Brighton Beach,,40.577621,-73.961376,,,1, 849 | D40N,,Brighton Beach,,40.577621,-73.961376,,,0,D40 850 | D40S,,Brighton Beach,,40.577621,-73.961376,,,0,D40 851 | D41,,Ocean Pkwy,,40.576312,-73.968501,,,1, 852 | D41N,,Ocean Pkwy,,40.576312,-73.968501,,,0,D41 853 | D41S,,Ocean Pkwy,,40.576312,-73.968501,,,0,D41 854 | D42,,W 8 St - NY Aquarium,,40.576127,-73.975939,,,1, 855 | D42N,,W 8 St - NY Aquarium,,40.576127,-73.975939,,,0,D42 856 | D42S,,W 8 St - NY Aquarium,,40.576127,-73.975939,,,0,D42 857 | D43,,Coney Island - Stillwell Av,,40.577422,-73.981233,,,1, 858 | D43N,,Coney Island - Stillwell Av,,40.577422,-73.981233,,,0,D43 859 | D43S,,Coney Island - Stillwell Av,,40.577422,-73.981233,,,0,D43 860 | E01,,World Trade Center,,40.712582,-74.009781,,,1, 861 | E01N,,World Trade Center,,40.712582,-74.009781,,,0,E01 862 | E01S,,World Trade Center,,40.712582,-74.009781,,,0,E01 863 | F01,,Jamaica - 179 St,,40.712646,-73.783817,,,1, 864 | F01N,,Jamaica - 179 St,,40.712646,-73.783817,,,0,F01 865 | F01S,,Jamaica - 179 St,,40.712646,-73.783817,,,0,F01 866 | F02,,169 St,,40.71047,-73.793604,,,1, 867 | F02N,,169 St,,40.71047,-73.793604,,,0,F02 868 | F02S,,169 St,,40.71047,-73.793604,,,0,F02 869 | F03,,Parsons Blvd,,40.707564,-73.803326,,,1, 870 | F03N,,Parsons Blvd,,40.707564,-73.803326,,,0,F03 871 | F03S,,Parsons Blvd,,40.707564,-73.803326,,,0,F03 872 | F04,,Sutphin Blvd,,40.70546,-73.810708,,,1, 873 | F04N,,Sutphin Blvd,,40.70546,-73.810708,,,0,F04 874 | F04S,,Sutphin Blvd,,40.70546,-73.810708,,,0,F04 875 | F05,,Briarwood - Van Wyck Blvd,,40.709179,-73.820574,,,1, 876 | F05N,,Briarwood - Van Wyck Blvd,,40.709179,-73.820574,,,0,F05 877 | F05S,,Briarwood - Van Wyck Blvd,,40.709179,-73.820574,,,0,F05 878 | F06,,Kew Gardens - Union Tpke,,40.714441,-73.831008,,,1, 879 | F06N,,Kew Gardens - Union Tpke,,40.714441,-73.831008,,,0,F06 880 | F06S,,Kew Gardens - Union Tpke,,40.714441,-73.831008,,,0,F06 881 | F07,,75 Av,,40.718331,-73.837324,,,1, 882 | F07N,,75 Av,,40.718331,-73.837324,,,0,F07 883 | F07S,,75 Av,,40.718331,-73.837324,,,0,F07 884 | F09,,Court Sq,,40.747846,-73.946,,,1, 885 | F09N,,Court Sq,,40.747846,-73.946,,,0,F09 886 | F09S,,Court Sq,,40.747846,-73.946,,,0,F09 887 | F11,,Lexington Av/53 St,,40.757552,-73.969055,,,1, 888 | F11N,,Lexington Av/53 St,,40.757552,-73.969055,,,0,F11 889 | F11S,,Lexington Av/53 St,,40.757552,-73.969055,,,0,F11 890 | F12,,5 Av/53 St,,40.760167,-73.975224,,,1, 891 | F12N,,5 Av/53 St,,40.760167,-73.975224,,,0,F12 892 | F12S,,5 Av/53 St,,40.760167,-73.975224,,,0,F12 893 | F14,,2 Av,,40.723402,-73.989938,,,1, 894 | F14N,,2 Av,,40.723402,-73.989938,,,0,F14 895 | F14S,,2 Av,,40.723402,-73.989938,,,0,F14 896 | F15,,Delancey St,,40.718611,-73.988114,,,1, 897 | F15N,,Delancey St,,40.718611,-73.988114,,,0,F15 898 | F15S,,Delancey St,,40.718611,-73.988114,,,0,F15 899 | F16,,East Broadway,,40.713715,-73.990173,,,1, 900 | F16N,,East Broadway,,40.713715,-73.990173,,,0,F16 901 | F16S,,East Broadway,,40.713715,-73.990173,,,0,F16 902 | F18,,York St,,40.701397,-73.986751,,,1, 903 | F18N,,York St,,40.701397,-73.986751,,,0,F18 904 | F18S,,York St,,40.701397,-73.986751,,,0,F18 905 | F20,,Bergen St,,40.686145,-73.990862,,,1, 906 | F20N,,Bergen St,,40.686145,-73.990862,,,0,F20 907 | F20S,,Bergen St,,40.686145,-73.990862,,,0,F20 908 | F21,,Carroll St,,40.680303,-73.995048,,,1, 909 | F21N,,Carroll St,,40.680303,-73.995048,,,0,F21 910 | F21S,,Carroll St,,40.680303,-73.995048,,,0,F21 911 | F22,,Smith - 9 Sts,,40.67358,-73.995959,,,1, 912 | F22N,,Smith - 9 Sts,,40.67358,-73.995959,,,0,F22 913 | F22S,,Smith - 9 Sts,,40.67358,-73.995959,,,0,F22 914 | F23,,4 Av,,40.670272,-73.989779,,,1, 915 | F23N,,4 Av,,40.670272,-73.989779,,,0,F23 916 | F23S,,4 Av,,40.670272,-73.989779,,,0,F23 917 | F24,,7 Av,,40.666271,-73.980305,,,1, 918 | F24N,,7 Av,,40.666271,-73.980305,,,0,F24 919 | F24S,,7 Av,,40.666271,-73.980305,,,0,F24 920 | F25,,15 St - Prospect Park,,40.660365,-73.979493,,,1, 921 | F25N,,15 St - Prospect Park,,40.660365,-73.979493,,,0,F25 922 | F25S,,15 St - Prospect Park,,40.660365,-73.979493,,,0,F25 923 | F26,,Fort Hamilton Pkwy,,40.650782,-73.975776,,,1, 924 | F26N,,Fort Hamilton Pkwy,,40.650782,-73.975776,,,0,F26 925 | F26S,,Fort Hamilton Pkwy,,40.650782,-73.975776,,,0,F26 926 | F27,,Church Av,,40.644041,-73.979678,,,1, 927 | F27N,,Church Av,,40.644041,-73.979678,,,0,F27 928 | F27S,,Church Av,,40.644041,-73.979678,,,0,F27 929 | F29,,Ditmas Av,,40.636119,-73.978172,,,1, 930 | F29N,,Ditmas Av,,40.636119,-73.978172,,,0,F29 931 | F29S,,Ditmas Av,,40.636119,-73.978172,,,0,F29 932 | F30,,18 Av,,40.629755,-73.976971,,,1, 933 | F30N,,18 Av,,40.629755,-73.976971,,,0,F30 934 | F30S,,18 Av,,40.629755,-73.976971,,,0,F30 935 | F31,,Avenue I,,40.625322,-73.976127,,,1, 936 | F31N,,Avenue I,,40.625322,-73.976127,,,0,F31 937 | F31S,,Avenue I,,40.625322,-73.976127,,,0,F31 938 | F32,,Bay Pkwy,,40.620769,-73.975264,,,1, 939 | F32N,,Bay Pkwy,,40.620769,-73.975264,,,0,F32 940 | F32S,,Bay Pkwy,,40.620769,-73.975264,,,0,F32 941 | F33,,Avenue N,,40.61514,-73.974197,,,1, 942 | F33N,,Avenue N,,40.61514,-73.974197,,,0,F33 943 | F33S,,Avenue N,,40.61514,-73.974197,,,0,F33 944 | F34,,Avenue P,,40.608944,-73.973022,,,1, 945 | F34N,,Avenue P,,40.608944,-73.973022,,,0,F34 946 | F34S,,Avenue P,,40.608944,-73.973022,,,0,F34 947 | F35,,Kings Hwy,,40.603217,-73.972361,,,1, 948 | F35N,,Kings Hwy,,40.603217,-73.972361,,,0,F35 949 | F35S,,Kings Hwy,,40.603217,-73.972361,,,0,F35 950 | F36,,Avenue U,,40.596063,-73.973357,,,1, 951 | F36N,,Avenue U,,40.596063,-73.973357,,,0,F36 952 | F36S,,Avenue U,,40.596063,-73.973357,,,0,F36 953 | F38,,Avenue X,,40.58962,-73.97425,,,1, 954 | F38N,,Avenue X,,40.58962,-73.97425,,,0,F38 955 | F38S,,Avenue X,,40.58962,-73.97425,,,0,F38 956 | F39,,Neptune Av,,40.581011,-73.974574,,,1, 957 | F39N,,Neptune Av,,40.581011,-73.974574,,,0,F39 958 | F39S,,Neptune Av,,40.581011,-73.974574,,,0,F39 959 | G05,,Jamaica Center - Parsons/Archer,,40.702147,-73.801109,,,1, 960 | G05N,,Jamaica Center - Parsons/Archer,,40.702147,-73.801109,,,0,G05 961 | G05S,,Jamaica Center - Parsons/Archer,,40.702147,-73.801109,,,0,G05 962 | G06,,Sutphin Blvd - Archer Av - JFK Airport,,40.700486,-73.807969,,,1, 963 | G06N,,Sutphin Blvd - Archer Av - JFK Airport,,40.700486,-73.807969,,,0,G06 964 | G06S,,Sutphin Blvd - Archer Av - JFK Airport,,40.700486,-73.807969,,,0,G06 965 | G07,,Jamaica - Van Wyck,,40.702566,-73.816859,,,1, 966 | G07N,,Jamaica - Van Wyck,,40.702566,-73.816859,,,0,G07 967 | G07S,,Jamaica - Van Wyck,,40.702566,-73.816859,,,0,G07 968 | G08,,Forest Hills - 71 Av,,40.721691,-73.844521,,,1, 969 | G08N,,Forest Hills - 71 Av,,40.721691,-73.844521,,,0,G08 970 | G08S,,Forest Hills - 71 Av,,40.721691,-73.844521,,,0,G08 971 | G09,,67 Av,,40.726523,-73.852719,,,1, 972 | G09N,,67 Av,,40.726523,-73.852719,,,0,G09 973 | G09S,,67 Av,,40.726523,-73.852719,,,0,G09 974 | G10,,63 Dr - Rego Park,,40.729846,-73.861604,,,1, 975 | G10N,,63 Dr - Rego Park,,40.729846,-73.861604,,,0,G10 976 | G10S,,63 Dr - Rego Park,,40.729846,-73.861604,,,0,G10 977 | G11,,Woodhaven Blvd,,40.733106,-73.869229,,,1, 978 | G11N,,Woodhaven Blvd,,40.733106,-73.869229,,,0,G11 979 | G11S,,Woodhaven Blvd,,40.733106,-73.869229,,,0,G11 980 | G12,,Grand Av - Newtown,,40.737015,-73.877223,,,1, 981 | G12N,,Grand Av - Newtown,,40.737015,-73.877223,,,0,G12 982 | G12S,,Grand Av - Newtown,,40.737015,-73.877223,,,0,G12 983 | G13,,Elmhurst Av,,40.742454,-73.882017,,,1, 984 | G13N,,Elmhurst Av,,40.742454,-73.882017,,,0,G13 985 | G13S,,Elmhurst Av,,40.742454,-73.882017,,,0,G13 986 | G14,,Jackson Hts - Roosevelt Av,,40.746644,-73.891338,,,1, 987 | G14N,,Jackson Hts - Roosevelt Av,,40.746644,-73.891338,,,0,G14 988 | G14S,,Jackson Hts - Roosevelt Av,,40.746644,-73.891338,,,0,G14 989 | G15,,65 St,,40.749669,-73.898453,,,1, 990 | G15N,,65 St,,40.749669,-73.898453,,,0,G15 991 | G15S,,65 St,,40.749669,-73.898453,,,0,G15 992 | G16,,Northern Blvd,,40.752885,-73.906006,,,1, 993 | G16N,,Northern Blvd,,40.752885,-73.906006,,,0,G16 994 | G16S,,Northern Blvd,,40.752885,-73.906006,,,0,G16 995 | G18,,46 St,,40.756312,-73.913333,,,1, 996 | G18N,,46 St,,40.756312,-73.913333,,,0,G18 997 | G18S,,46 St,,40.756312,-73.913333,,,0,G18 998 | G19,,Steinway St,,40.756879,-73.92074,,,1, 999 | G19N,,Steinway St,,40.756879,-73.92074,,,0,G19 1000 | G19S,,Steinway St,,40.756879,-73.92074,,,0,G19 1001 | G20,,36 St,,40.752039,-73.928781,,,1, 1002 | G20N,,36 St,,40.752039,-73.928781,,,0,G20 1003 | G20S,,36 St,,40.752039,-73.928781,,,0,G20 1004 | G21,,Queens Plaza,,40.748973,-73.937243,,,1, 1005 | G21N,,Queens Plaza,,40.748973,-73.937243,,,0,G21 1006 | G21S,,Queens Plaza,,40.748973,-73.937243,,,0,G21 1007 | G22,,Court Sq,,40.746554,-73.943832,,,1, 1008 | G22N,,Court Sq,,40.746554,-73.943832,,,0,G22 1009 | G22S,,Court Sq,,40.746554,-73.943832,,,0,G22 1010 | G24,,21 St,,40.744065,-73.949724,,,1, 1011 | G24N,,21 St,,40.744065,-73.949724,,,0,G24 1012 | G24S,,21 St,,40.744065,-73.949724,,,0,G24 1013 | G26,,Greenpoint Av,,40.731352,-73.954449,,,1, 1014 | G26N,,Greenpoint Av,,40.731352,-73.954449,,,0,G26 1015 | G26S,,Greenpoint Av,,40.731352,-73.954449,,,0,G26 1016 | G28,,Nassau Av,,40.724635,-73.951277,,,1, 1017 | G28N,,Nassau Av,,40.724635,-73.951277,,,0,G28 1018 | G28S,,Nassau Av,,40.724635,-73.951277,,,0,G28 1019 | G29,,Metropolitan Av,,40.712792,-73.951418,,,1, 1020 | G29N,,Metropolitan Av,,40.712792,-73.951418,,,0,G29 1021 | G29S,,Metropolitan Av,,40.712792,-73.951418,,,0,G29 1022 | G30,,Broadway,,40.706092,-73.950308,,,1, 1023 | G30N,,Broadway,,40.706092,-73.950308,,,0,G30 1024 | G30S,,Broadway,,40.706092,-73.950308,,,0,G30 1025 | G31,,Flushing Av,,40.700377,-73.950234,,,1, 1026 | G31N,,Flushing Av,,40.700377,-73.950234,,,0,G31 1027 | G31S,,Flushing Av,,40.700377,-73.950234,,,0,G31 1028 | G32,,Myrtle - Willoughby Avs,,40.694568,-73.949046,,,1, 1029 | G32N,,Myrtle - Willoughby Avs,,40.694568,-73.949046,,,0,G32 1030 | G32S,,Myrtle - Willoughby Avs,,40.694568,-73.949046,,,0,G32 1031 | G33,,Bedford - Nostrand Avs,,40.689627,-73.953522,,,1, 1032 | G33N,,Bedford - Nostrand Avs,,40.689627,-73.953522,,,0,G33 1033 | G33S,,Bedford - Nostrand Avs,,40.689627,-73.953522,,,0,G33 1034 | G34,,Classon Av,,40.688873,-73.96007,,,1, 1035 | G34N,,Classon Av,,40.688873,-73.96007,,,0,G34 1036 | G34S,,Classon Av,,40.688873,-73.96007,,,0,G34 1037 | G35,,Clinton - Washington Avs,,40.688089,-73.966839,,,1, 1038 | G35N,,Clinton - Washington Avs,,40.688089,-73.966839,,,0,G35 1039 | G35S,,Clinton - Washington Avs,,40.688089,-73.966839,,,0,G35 1040 | G36,,Fulton St,,40.687119,-73.975375,,,1, 1041 | G36N,,Fulton St,,40.687119,-73.975375,,,0,G36 1042 | G36S,,Fulton St,,40.687119,-73.975375,,,0,G36 1043 | H01,,Aqueduct Racetrack,,40.668234,-73.834058,,,1, 1044 | H01N,,Aqueduct Racetrack,,40.668234,-73.834058,,,0,H01 1045 | H01S,,Aqueduct Racetrack,,40.668234,-73.834058,,,0,H01 1046 | H02,,Aqueduct - N Conduit Av,,40.668234,-73.834058,,,1, 1047 | H02N,,Aqueduct - N Conduit Av,,40.668234,-73.834058,,,0,H02 1048 | H02S,,Aqueduct - N Conduit Av,,40.668234,-73.834058,,,0,H02 1049 | H03,,Howard Beach - JFK Airport,,40.660476,-73.830301,,,1, 1050 | H03N,,Howard Beach - JFK Airport,,40.660476,-73.830301,,,0,H03 1051 | H03S,,Howard Beach - JFK Airport,,40.660476,-73.830301,,,0,H03 1052 | H04,,Broad Channel,,40.608382,-73.815925,,,1, 1053 | H04N,,Broad Channel,,40.608382,-73.815925,,,0,H04 1054 | H04S,,Broad Channel,,40.608382,-73.815925,,,0,H04 1055 | H06,,Beach 67 St,,40.590927,-73.796924,,,1, 1056 | H06N,,Beach 67 St,,40.590927,-73.796924,,,0,H06 1057 | H06S,,Beach 67 St,,40.590927,-73.796924,,,0,H06 1058 | H07,,Beach 60 St,,40.592374,-73.788522,,,1, 1059 | H07N,,Beach 60 St,,40.592374,-73.788522,,,0,H07 1060 | H07S,,Beach 60 St,,40.592374,-73.788522,,,0,H07 1061 | H08,,Beach 44 St,,40.592943,-73.776013,,,1, 1062 | H08N,,Beach 44 St,,40.592943,-73.776013,,,0,H08 1063 | H08S,,Beach 44 St,,40.592943,-73.776013,,,0,H08 1064 | H09,,Beach 36 St,,40.595398,-73.768175,,,1, 1065 | H09N,,Beach 36 St,,40.595398,-73.768175,,,0,H09 1066 | H09S,,Beach 36 St,,40.595398,-73.768175,,,0,H09 1067 | H10,,Beach 25 St,,40.600066,-73.761353,,,1, 1068 | H10N,,Beach 25 St,,40.600066,-73.761353,,,0,H10 1069 | H10S,,Beach 25 St,,40.600066,-73.761353,,,0,H10 1070 | H11,,Far Rockaway - Mott Av,,40.603995,-73.755405,,,1, 1071 | H11N,,Far Rockaway - Mott Av,,40.603995,-73.755405,,,0,H11 1072 | H11S,,Far Rockaway - Mott Av,,40.603995,-73.755405,,,0,H11 1073 | H12,,Beach 90 St,,40.588034,-73.813641,,,1, 1074 | H12N,,Beach 90 St,,40.588034,-73.813641,,,0,H12 1075 | H12S,,Beach 90 St,,40.588034,-73.813641,,,0,H12 1076 | H13,,Beach 98 St,,40.585307,-73.820558,,,1, 1077 | H13N,,Beach 98 St,,40.585307,-73.820558,,,0,H13 1078 | H13S,,Beach 98 St,,40.585307,-73.820558,,,0,H13 1079 | H14,,Beach 105 St,,40.583209,-73.827559,,,1, 1080 | H14N,,Beach 105 St,,40.583209,-73.827559,,,0,H14 1081 | H14S,,Beach 105 St,,40.583209,-73.827559,,,0,H14 1082 | H15,,Rockaway Park - Beach 116 St,,40.580903,-73.835592,,,1, 1083 | H15N,,Rockaway Park - Beach 116 St,,40.580903,-73.835592,,,0,H15 1084 | H15S,,Rockaway Park - Beach 116 St,,40.580903,-73.835592,,,0,H15 1085 | J12,,121 St,,40.700492,-73.828294,,,1, 1086 | J12N,,121 St,,40.700492,-73.828294,,,0,J12 1087 | J12S,,121 St,,40.700492,-73.828294,,,0,J12 1088 | J13,,111 St,,40.697418,-73.836345,,,1, 1089 | J13N,,111 St,,40.697418,-73.836345,,,0,J13 1090 | J13S,,111 St,,40.697418,-73.836345,,,0,J13 1091 | J14,,104 St,,40.695178,-73.84433,,,1, 1092 | J14N,,104 St,,40.695178,-73.84433,,,0,J14 1093 | J14S,,104 St,,40.695178,-73.84433,,,0,J14 1094 | J15,,Woodhaven Blvd,,40.693879,-73.851576,,,1, 1095 | J15N,,Woodhaven Blvd,,40.693879,-73.851576,,,0,J15 1096 | J15S,,Woodhaven Blvd,,40.693879,-73.851576,,,0,J15 1097 | J16,,85 St - Forest Pkwy,,40.692435,-73.86001,,,1, 1098 | J16N,,85 St - Forest Pkwy,,40.692435,-73.86001,,,0,J16 1099 | J16S,,85 St - Forest Pkwy,,40.692435,-73.86001,,,0,J16 1100 | J17,,75 St,,40.691324,-73.867139,,,1, 1101 | J17N,,75 St,,40.691324,-73.867139,,,0,J17 1102 | J17S,,75 St,,40.691324,-73.867139,,,0,J17 1103 | J19,,Cypress Hills,,40.689941,-73.87255,,,1, 1104 | J19N,,Cypress Hills,,40.689941,-73.87255,,,0,J19 1105 | J19S,,Cypress Hills,,40.689941,-73.87255,,,0,J19 1106 | J20,,Crescent St,,40.683194,-73.873785,,,1, 1107 | J20N,,Crescent St,,40.683194,-73.873785,,,0,J20 1108 | J20S,,Crescent St,,40.683194,-73.873785,,,0,J20 1109 | J21,,Norwood Av,,40.68141,-73.880039,,,1, 1110 | J21N,,Norwood Av,,40.68141,-73.880039,,,0,J21 1111 | J21S,,Norwood Av,,40.68141,-73.880039,,,0,J21 1112 | J22,,Cleveland St,,40.679947,-73.884639,,,1, 1113 | J22N,,Cleveland St,,40.679947,-73.884639,,,0,J22 1114 | J22S,,Cleveland St,,40.679947,-73.884639,,,0,J22 1115 | J23,,Van Siclen Av,,40.678024,-73.891688,,,1, 1116 | J23N,,Van Siclen Av,,40.678024,-73.891688,,,0,J23 1117 | J23S,,Van Siclen Av,,40.678024,-73.891688,,,0,J23 1118 | J24,,Alabama Av,,40.676992,-73.898654,,,1, 1119 | J24N,,Alabama Av,,40.676992,-73.898654,,,0,J24 1120 | J24S,,Alabama Av,,40.676992,-73.898654,,,0,J24 1121 | J27,,Broadway Jct,,40.679498,-73.904512,,,1, 1122 | J27N,,Broadway Jct,,40.679498,-73.904512,,,0,J27 1123 | J27S,,Broadway Jct,,40.679498,-73.904512,,,0,J27 1124 | J28,,Chauncey St,,40.682893,-73.910456,,,1, 1125 | J28N,,Chauncey St,,40.682893,-73.910456,,,0,J28 1126 | J28S,,Chauncey St,,40.682893,-73.910456,,,0,J28 1127 | J29,,Halsey St,,40.68637,-73.916559,,,1, 1128 | J29N,,Halsey St,,40.68637,-73.916559,,,0,J29 1129 | J29S,,Halsey St,,40.68637,-73.916559,,,0,J29 1130 | J30,,Gates Av,,40.68963,-73.92227,,,1, 1131 | J30N,,Gates Av,,40.68963,-73.92227,,,0,J30 1132 | J30S,,Gates Av,,40.68963,-73.92227,,,0,J30 1133 | J31,,Kosciuszko St,,40.693342,-73.928814,,,1, 1134 | J31N,,Kosciuszko St,,40.693342,-73.928814,,,0,J31 1135 | J31S,,Kosciuszko St,,40.693342,-73.928814,,,0,J31 1136 | L01,,8 Av,,40.739777,-74.002578,,,1, 1137 | L01N,,8 Av,,40.739777,-74.002578,,,0,L01 1138 | L01S,,8 Av,,40.739777,-74.002578,,,0,L01 1139 | L02,,6 Av,,40.737335,-73.996786,,,1, 1140 | L02N,,6 Av,,40.737335,-73.996786,,,0,L02 1141 | L02S,,6 Av,,40.737335,-73.996786,,,0,L02 1142 | L03,,Union Sq - 14 St,,40.734789,-73.99073,,,1, 1143 | L03N,,Union Sq - 14 St,,40.734789,-73.99073,,,0,L03 1144 | L03S,,Union Sq - 14 St,,40.734789,-73.99073,,,0,L03 1145 | L05,,3 Av,,40.732849,-73.986122,,,1, 1146 | L05N,,3 Av,,40.732849,-73.986122,,,0,L05 1147 | L05S,,3 Av,,40.732849,-73.986122,,,0,L05 1148 | L06,,1 Av,,40.730953,-73.981628,,,1, 1149 | L06N,,1 Av,,40.730953,-73.981628,,,0,L06 1150 | L06S,,1 Av,,40.730953,-73.981628,,,0,L06 1151 | L08,,Bedford Av,,40.717304,-73.956872,,,1, 1152 | L08N,,Bedford Av,,40.717304,-73.956872,,,0,L08 1153 | L08S,,Bedford Av,,40.717304,-73.956872,,,0,L08 1154 | L10,,Lorimer St,,40.714063,-73.950275,,,1, 1155 | L10N,,Lorimer St,,40.714063,-73.950275,,,0,L10 1156 | L10S,,Lorimer St,,40.714063,-73.950275,,,0,L10 1157 | L11,,Graham Av,,40.714565,-73.944053,,,1, 1158 | L11N,,Graham Av,,40.714565,-73.944053,,,0,L11 1159 | L11S,,Graham Av,,40.714565,-73.944053,,,0,L11 1160 | L12,,Grand St,,40.711926,-73.94067,,,1, 1161 | L12N,,Grand St,,40.711926,-73.94067,,,0,L12 1162 | L12S,,Grand St,,40.711926,-73.94067,,,0,L12 1163 | L13,,Montrose Av,,40.707739,-73.93985,,,1, 1164 | L13N,,Montrose Av,,40.707739,-73.93985,,,0,L13 1165 | L13S,,Montrose Av,,40.707739,-73.93985,,,0,L13 1166 | L14,,Morgan Av,,40.706152,-73.933147,,,1, 1167 | L14N,,Morgan Av,,40.706152,-73.933147,,,0,L14 1168 | L14S,,Morgan Av,,40.706152,-73.933147,,,0,L14 1169 | L15,,Jefferson St,,40.706607,-73.922913,,,1, 1170 | L15N,,Jefferson St,,40.706607,-73.922913,,,0,L15 1171 | L15S,,Jefferson St,,40.706607,-73.922913,,,0,L15 1172 | L16,,DeKalb Av,,40.703811,-73.918425,,,1, 1173 | L16N,,DeKalb Av,,40.703811,-73.918425,,,0,L16 1174 | L16S,,DeKalb Av,,40.703811,-73.918425,,,0,L16 1175 | L17,,Myrtle - Wyckoff Avs,,40.699814,-73.911586,,,1, 1176 | L17N,,Myrtle - Wyckoff Avs,,40.699814,-73.911586,,,0,L17 1177 | L17S,,Myrtle - Wyckoff Avs,,40.699814,-73.911586,,,0,L17 1178 | L19,,Halsey St,,40.695602,-73.904084,,,1, 1179 | L19N,,Halsey St,,40.695602,-73.904084,,,0,L19 1180 | L19S,,Halsey St,,40.695602,-73.904084,,,0,L19 1181 | L20,,Wilson Av,,40.688764,-73.904046,,,1, 1182 | L20N,,Wilson Av,,40.688764,-73.904046,,,0,L20 1183 | L20S,,Wilson Av,,40.688764,-73.904046,,,0,L20 1184 | L21,,Bushwick Av - Aberdeen St,,40.682829,-73.905249,,,1, 1185 | L21N,,Bushwick Av - Aberdeen St,,40.682829,-73.905249,,,0,L21 1186 | L21S,,Bushwick Av - Aberdeen St,,40.682829,-73.905249,,,0,L21 1187 | L22,,Broadway Jct,,40.678856,-73.90324,,,1, 1188 | L22N,,Broadway Jct,,40.678856,-73.90324,,,0,L22 1189 | L22S,,Broadway Jct,,40.678856,-73.90324,,,0,L22 1190 | L24,,Atlantic Av,,40.675345,-73.903097,,,1, 1191 | L24N,,Atlantic Av,,40.675345,-73.903097,,,0,L24 1192 | L24S,,Atlantic Av,,40.675345,-73.903097,,,0,L24 1193 | L25,,Sutter Av,,40.669367,-73.901975,,,1, 1194 | L25N,,Sutter Av,,40.669367,-73.901975,,,0,L25 1195 | L25S,,Sutter Av,,40.669367,-73.901975,,,0,L25 1196 | L26,,Livonia Av,,40.664038,-73.900571,,,1, 1197 | L26N,,Livonia Av,,40.664038,-73.900571,,,0,L26 1198 | L26S,,Livonia Av,,40.664038,-73.900571,,,0,L26 1199 | L27,,New Lots Av,,40.658733,-73.899232,,,1, 1200 | L27N,,New Lots Av,,40.658733,-73.899232,,,0,L27 1201 | L27S,,New Lots Av,,40.658733,-73.899232,,,0,L27 1202 | L28,,E 105 St,,40.650573,-73.899485,,,1, 1203 | L28N,,E 105 St,,40.650573,-73.899485,,,0,L28 1204 | L28S,,E 105 St,,40.650573,-73.899485,,,0,L28 1205 | L29,,Canarsie - Rockaway Pkwy,,40.646654,-73.90185,,,1, 1206 | L29N,,Canarsie - Rockaway Pkwy,,40.646654,-73.90185,,,0,L29 1207 | L29S,,Canarsie - Rockaway Pkwy,,40.646654,-73.90185,,,0,L29 1208 | M01,,Middle Village - Metropolitan Av,,40.711396,-73.889601,,,1, 1209 | M01N,,Middle Village - Metropolitan Av,,40.711396,-73.889601,,,0,M01 1210 | M01S,,Middle Village - Metropolitan Av,,40.711396,-73.889601,,,0,M01 1211 | M04,,Fresh Pond Rd,,40.706186,-73.895877,,,1, 1212 | M04N,,Fresh Pond Rd,,40.706186,-73.895877,,,0,M04 1213 | M04S,,Fresh Pond Rd,,40.706186,-73.895877,,,0,M04 1214 | M05,,Forest Av,,40.704423,-73.903077,,,1, 1215 | M05N,,Forest Av,,40.704423,-73.903077,,,0,M05 1216 | M05S,,Forest Av,,40.704423,-73.903077,,,0,M05 1217 | M06,,Seneca Av,,40.702762,-73.90774,,,1, 1218 | M06N,,Seneca Av,,40.702762,-73.90774,,,0,M06 1219 | M06S,,Seneca Av,,40.702762,-73.90774,,,0,M06 1220 | M08,,Myrtle - Wyckoff Avs,,40.69943,-73.912385,,,1, 1221 | M08N,,Myrtle - Wyckoff Avs,,40.69943,-73.912385,,,0,M08 1222 | M08S,,Myrtle - Wyckoff Avs,,40.69943,-73.912385,,,0,M08 1223 | M09,,Knickerbocker Av,,40.698664,-73.919711,,,1, 1224 | M09N,,Knickerbocker Av,,40.698664,-73.919711,,,0,M09 1225 | M09S,,Knickerbocker Av,,40.698664,-73.919711,,,0,M09 1226 | M10,,Central Av,,40.697857,-73.927397,,,1, 1227 | M10N,,Central Av,,40.697857,-73.927397,,,0,M10 1228 | M10S,,Central Av,,40.697857,-73.927397,,,0,M10 1229 | M11,,Myrtle Av,,40.697207,-73.935657,,,1, 1230 | M11N,,Myrtle Av,,40.697207,-73.935657,,,0,M11 1231 | M11S,,Myrtle Av,,40.697207,-73.935657,,,0,M11 1232 | M12,,Flushing Av,,40.70026,-73.941126,,,1, 1233 | M12N,,Flushing Av,,40.70026,-73.941126,,,0,M12 1234 | M12S,,Flushing Av,,40.70026,-73.941126,,,0,M12 1235 | M13,,Lorimer St,,40.703869,-73.947408,,,1, 1236 | M13N,,Lorimer St,,40.703869,-73.947408,,,0,M13 1237 | M13S,,Lorimer St,,40.703869,-73.947408,,,0,M13 1238 | M14,,Hewes St,,40.70687,-73.953431,,,1, 1239 | M14N,,Hewes St,,40.70687,-73.953431,,,0,M14 1240 | M14S,,Hewes St,,40.70687,-73.953431,,,0,M14 1241 | M16,,Marcy Av,,40.708359,-73.957757,,,1, 1242 | M16N,,Marcy Av,,40.708359,-73.957757,,,0,M16 1243 | M16S,,Marcy Av,,40.708359,-73.957757,,,0,M16 1244 | M18,,Essex St,,40.718315,-73.987437,,,1, 1245 | M18N,,Essex St,,40.718315,-73.987437,,,0,M18 1246 | M18S,,Essex St,,40.718315,-73.987437,,,0,M18 1247 | M19,,Bowery,,40.72028,-73.993915,,,1, 1248 | M19N,,Bowery,,40.72028,-73.993915,,,0,M19 1249 | M19S,,Bowery,,40.72028,-73.993915,,,0,M19 1250 | M20,,Canal St,,40.718092,-73.999892,,,1, 1251 | M20N,,Canal St,,40.718092,-73.999892,,,0,M20 1252 | M20S,,Canal St,,40.718092,-73.999892,,,0,M20 1253 | M21,,Chambers St,,40.713243,-74.003401,,,1, 1254 | M21N,,Chambers St,,40.713243,-74.003401,,,0,M21 1255 | M21S,,Chambers St,,40.713243,-74.003401,,,0,M21 1256 | M22,,Fulton St,,40.710374,-74.007582,,,1, 1257 | M22N,,Fulton St,,40.710374,-74.007582,,,0,M22 1258 | M22S,,Fulton St,,40.710374,-74.007582,,,0,M22 1259 | M23,,Broad St,,40.706476,-74.011056,,,1, 1260 | M23N,,Broad St,,40.706476,-74.011056,,,0,M23 1261 | M23S,,Broad St,,40.706476,-74.011056,,,0,M23 1262 | N02,,8 Av,,40.635064,-74.011719,,,1, 1263 | N02N,,8 Av,,40.635064,-74.011719,,,0,N02 1264 | N02S,,8 Av,,40.635064,-74.011719,,,0,N02 1265 | N03,,Fort Hamilton Pkwy,,40.631386,-74.005351,,,1, 1266 | N03N,,Fort Hamilton Pkwy,,40.631386,-74.005351,,,0,N03 1267 | N03S,,Fort Hamilton Pkwy,,40.631386,-74.005351,,,0,N03 1268 | N04,,New Utrecht Av,,40.624842,-73.996353,,,1, 1269 | N04N,,New Utrecht Av,,40.624842,-73.996353,,,0,N04 1270 | N04S,,New Utrecht Av,,40.624842,-73.996353,,,0,N04 1271 | N05,,18 Av,,40.620671,-73.990414,,,1, 1272 | N05N,,18 Av,,40.620671,-73.990414,,,0,N05 1273 | N05S,,18 Av,,40.620671,-73.990414,,,0,N05 1274 | N06,,20 Av,,40.61741,-73.985026,,,1, 1275 | N06N,,20 Av,,40.61741,-73.985026,,,0,N06 1276 | N06S,,20 Av,,40.61741,-73.985026,,,0,N06 1277 | N07,,Bay Pkwy,,40.611815,-73.981848,,,1, 1278 | N07N,,Bay Pkwy,,40.611815,-73.981848,,,0,N07 1279 | N07S,,Bay Pkwy,,40.611815,-73.981848,,,0,N07 1280 | N08,,Kings Hwy,,40.603923,-73.980353,,,1, 1281 | N08N,,Kings Hwy,,40.603923,-73.980353,,,0,N08 1282 | N08S,,Kings Hwy,,40.603923,-73.980353,,,0,N08 1283 | N09,,Avenue U,,40.597473,-73.979137,,,1, 1284 | N09N,,Avenue U,,40.597473,-73.979137,,,0,N09 1285 | N09S,,Avenue U,,40.597473,-73.979137,,,0,N09 1286 | N10,,86 St,,40.592721,-73.97823,,,1, 1287 | N10N,,86 St,,40.592721,-73.97823,,,0,N10 1288 | N10S,,86 St,,40.592721,-73.97823,,,0,N10 1289 | Q01,,Canal St,,40.718383,-74.00046,,,1, 1290 | Q01N,,Canal St,,40.718383,-74.00046,,,0,Q01 1291 | Q01S,,Canal St,,40.718383,-74.00046,,,0,Q01 1292 | R01,,Astoria - Ditmars Blvd,,40.775036,-73.912034,,,1, 1293 | R01N,,Astoria - Ditmars Blvd,,40.775036,-73.912034,,,0,R01 1294 | R01S,,Astoria - Ditmars Blvd,,40.775036,-73.912034,,,0,R01 1295 | R03,,Astoria Blvd,,40.770258,-73.917843,,,1, 1296 | R03N,,Astoria Blvd,,40.770258,-73.917843,,,0,R03 1297 | R03S,,Astoria Blvd,,40.770258,-73.917843,,,0,R03 1298 | R04,,30 Av,,40.766779,-73.921479,,,1, 1299 | R04N,,30 Av,,40.766779,-73.921479,,,0,R04 1300 | R04S,,30 Av,,40.766779,-73.921479,,,0,R04 1301 | R05,,Broadway,,40.76182,-73.925508,,,1, 1302 | R05N,,Broadway,,40.76182,-73.925508,,,0,R05 1303 | R05S,,Broadway,,40.76182,-73.925508,,,0,R05 1304 | R06,,36 Av,,40.756804,-73.929575,,,1, 1305 | R06N,,36 Av,,40.756804,-73.929575,,,0,R06 1306 | R06S,,36 Av,,40.756804,-73.929575,,,0,R06 1307 | R08,,39 Av,,40.752882,-73.932755,,,1, 1308 | R08N,,39 Av,,40.752882,-73.932755,,,0,R08 1309 | R08S,,39 Av,,40.752882,-73.932755,,,0,R08 1310 | R09,,Queensboro Plaza,,40.750582,-73.940202,,,1, 1311 | R09N,,Queensboro Plaza,,40.750582,-73.940202,,,0,R09 1312 | R09S,,Queensboro Plaza,,40.750582,-73.940202,,,0,R09 1313 | R11,,Lexington Av/59 St,,40.76266,-73.967258,,,1, 1314 | R11N,,Lexington Av/59 St,,40.76266,-73.967258,,,0,R11 1315 | R11S,,Lexington Av/59 St,,40.76266,-73.967258,,,0,R11 1316 | R13,,5 Av/59 St,,40.764811,-73.973347,,,1, 1317 | R13N,,5 Av/59 St,,40.764811,-73.973347,,,0,R13 1318 | R13S,,5 Av/59 St,,40.764811,-73.973347,,,0,R13 1319 | R14,,57 St - 7 Av,,40.764664,-73.980658,,,1, 1320 | R14N,,57 St - 7 Av,,40.764664,-73.980658,,,0,R14 1321 | R14S,,57 St - 7 Av,,40.764664,-73.980658,,,0,R14 1322 | R15,,49 St,,40.759901,-73.984139,,,1, 1323 | R15N,,49 St,,40.759901,-73.984139,,,0,R15 1324 | R15S,,49 St,,40.759901,-73.984139,,,0,R15 1325 | R16,,Times Sq - 42 St,,40.754672,-73.986754,,,1, 1326 | R16N,,Times Sq - 42 St,,40.754672,-73.986754,,,0,R16 1327 | R16S,,Times Sq - 42 St,,40.754672,-73.986754,,,0,R16 1328 | R17,,34 St - Herald Sq,,40.749567,-73.98795,,,1, 1329 | R17N,,34 St - Herald Sq,,40.749567,-73.98795,,,0,R17 1330 | R17S,,34 St - Herald Sq,,40.749567,-73.98795,,,0,R17 1331 | R18,,28 St,,40.745494,-73.988691,,,1, 1332 | R18N,,28 St,,40.745494,-73.988691,,,0,R18 1333 | R18S,,28 St,,40.745494,-73.988691,,,0,R18 1334 | R19,,23 St,,40.741303,-73.989344,,,1, 1335 | R19N,,23 St,,40.741303,-73.989344,,,0,R19 1336 | R19S,,23 St,,40.741303,-73.989344,,,0,R19 1337 | R20,,14 St - Union Sq,,40.735736,-73.990568,,,1, 1338 | R20N,,14 St - Union Sq,,40.735736,-73.990568,,,0,R20 1339 | R20S,,14 St - Union Sq,,40.735736,-73.990568,,,0,R20 1340 | R21,,8 St - NYU,,40.730328,-73.992629,,,1, 1341 | R21N,,8 St - NYU,,40.730328,-73.992629,,,0,R21 1342 | R21S,,8 St - NYU,,40.730328,-73.992629,,,0,R21 1343 | R22,,Prince St,,40.724329,-73.997702,,,1, 1344 | R22N,,Prince St,,40.724329,-73.997702,,,0,R22 1345 | R22S,,Prince St,,40.724329,-73.997702,,,0,R22 1346 | R23,,Canal St,,40.719527,-74.001775,,,1, 1347 | R23N,,Canal St,,40.719527,-74.001775,,,0,R23 1348 | R23S,,Canal St,,40.719527,-74.001775,,,0,R23 1349 | R24,,City Hall,,40.713282,-74.006978,,,1, 1350 | R24N,,City Hall,,40.713282,-74.006978,,,0,R24 1351 | R24S,,City Hall,,40.713282,-74.006978,,,0,R24 1352 | R25,,Cortlandt St,,40.710668,-74.011029,,,1, 1353 | R25N,,Cortlandt St,,40.710668,-74.011029,,,0,R25 1354 | R25S,,Cortlandt St,,40.710668,-74.011029,,,0,R25 1355 | R26,,Rector St,,40.70722,-74.013342,,,1, 1356 | R26N,,Rector St,,40.70722,-74.013342,,,0,R26 1357 | R26S,,Rector St,,40.70722,-74.013342,,,0,R26 1358 | R27,,Whitehall St,,40.703087,-74.012994,,,1, 1359 | R27N,,Whitehall St,,40.703087,-74.012994,,,0,R27 1360 | R27S,,Whitehall St,,40.703087,-74.012994,,,0,R27 1361 | R28,,Court St,,40.6941,-73.991777,,,1, 1362 | R28N,,Court St,,40.6941,-73.991777,,,0,R28 1363 | R28S,,Court St,,40.6941,-73.991777,,,0,R28 1364 | R29,,Jay St - MetroTech,,40.69218,-73.985942,,,1, 1365 | R29N,,Jay St - MetroTech,,40.69218,-73.985942,,,0,R29 1366 | R29S,,Jay St - MetroTech,,40.69218,-73.985942,,,0,R29 1367 | R30,,DeKalb Av,,40.690635,-73.981824,,,1, 1368 | R30N,,DeKalb Av,,40.690635,-73.981824,,,0,R30 1369 | R30S,,DeKalb Av,,40.690635,-73.981824,,,0,R30 1370 | R31,,Atlantic Av - Barclays Ctr,,40.683666,-73.97881,,,1, 1371 | R31N,,Atlantic Av - Barclays Ctr,,40.683666,-73.97881,,,0,R31 1372 | R31S,,Atlantic Av - Barclays Ctr,,40.683666,-73.97881,,,0,R31 1373 | R32,,Union St,,40.677316,-73.98311,,,1, 1374 | R32N,,Union St,,40.677316,-73.98311,,,0,R32 1375 | R32S,,Union St,,40.677316,-73.98311,,,0,R32 1376 | R33,,9 St,,40.670847,-73.988302,,,1, 1377 | R33N,,9 St,,40.670847,-73.988302,,,0,R33 1378 | R33S,,9 St,,40.670847,-73.988302,,,0,R33 1379 | R34,,Prospect Av,,40.665414,-73.992872,,,1, 1380 | R34N,,Prospect Av,,40.665414,-73.992872,,,0,R34 1381 | R34S,,Prospect Av,,40.665414,-73.992872,,,0,R34 1382 | R35,,25 St,,40.660397,-73.998091,,,1, 1383 | R35N,,25 St,,40.660397,-73.998091,,,0,R35 1384 | R35S,,25 St,,40.660397,-73.998091,,,0,R35 1385 | R36,,36 St,,40.655144,-74.003549,,,1, 1386 | R36N,,36 St,,40.655144,-74.003549,,,0,R36 1387 | R36S,,36 St,,40.655144,-74.003549,,,0,R36 1388 | R39,,45 St,,40.648939,-74.010006,,,1, 1389 | R39N,,45 St,,40.648939,-74.010006,,,0,R39 1390 | R39S,,45 St,,40.648939,-74.010006,,,0,R39 1391 | R40,,53 St,,40.645069,-74.014034,,,1, 1392 | R40N,,53 St,,40.645069,-74.014034,,,0,R40 1393 | R40S,,53 St,,40.645069,-74.014034,,,0,R40 1394 | R41,,59 St,,40.641362,-74.017881,,,1, 1395 | R41N,,59 St,,40.641362,-74.017881,,,0,R41 1396 | R41S,,59 St,,40.641362,-74.017881,,,0,R41 1397 | R42,,Bay Ridge Av,,40.634967,-74.023377,,,1, 1398 | R42N,,Bay Ridge Av,,40.634967,-74.023377,,,0,R42 1399 | R42S,,Bay Ridge Av,,40.634967,-74.023377,,,0,R42 1400 | R43,,77 St,,40.629742,-74.02551,,,1, 1401 | R43N,,77 St,,40.629742,-74.02551,,,0,R43 1402 | R43S,,77 St,,40.629742,-74.02551,,,0,R43 1403 | R44,,86 St,,40.622687,-74.028398,,,1, 1404 | R44N,,86 St,,40.622687,-74.028398,,,0,R44 1405 | R44S,,86 St,,40.622687,-74.028398,,,0,R44 1406 | R45,,Bay Ridge - 95 St,,40.616622,-74.030876,,,1, 1407 | R45N,,Bay Ridge - 95 St,,40.616622,-74.030876,,,0,R45 1408 | R45S,,Bay Ridge - 95 St,,40.616622,-74.030876,,,0,R45 1409 | S01,,Franklin Av,,40.680596,-73.955827,,,1, 1410 | S01N,,Franklin Av,,40.680596,-73.955827,,,0,S01 1411 | S01S,,Franklin Av,,40.680596,-73.955827,,,0,S01 1412 | S03,,Park Pl,,40.674772,-73.957624,,,1, 1413 | S03N,,Park Pl,,40.674772,-73.957624,,,0,S03 1414 | S03S,,Park Pl,,40.674772,-73.957624,,,0,S03 1415 | S04,,Botanic Garden,,40.670343,-73.959245,,,1, 1416 | S04N,,Botanic Garden,,40.670343,-73.959245,,,0,S04 1417 | S04S,,Botanic Garden,,40.670343,-73.959245,,,0,S04 1418 | S09,,Tottenville,,40.512764,-74.251961,,,1, 1419 | S09N,,Tottenville,,40.512764,-74.251961,,,0,S09 1420 | S09S,,Tottenville,,40.512764,-74.251961,,,0,S09 1421 | S10,,Atlantic,,40.515401,-74.245689,,,1, 1422 | S10N,,Atlantic,,40.515401,-74.245689,,,0,S10 1423 | S10S,,Atlantic,,40.515401,-74.245689,,,0,S10 1424 | S12,,Nassau,,40.517812,-74.238373,,,1, 1425 | S12N,,Nassau,,40.517812,-74.238373,,,0,S12 1426 | S12S,,Nassau,,40.517812,-74.238373,,,0,S12 1427 | S13,,Richmond Valley,,40.519631,-74.229141,,,1, 1428 | S13N,,Richmond Valley,,40.519631,-74.229141,,,0,S13 1429 | S13S,,Richmond Valley,,40.519631,-74.229141,,,0,S13 1430 | S14,,Pleasant Plains,,40.52241,-74.217847,,,1, 1431 | S14N,,Pleasant Plains,,40.52241,-74.217847,,,0,S14 1432 | S14S,,Pleasant Plains,,40.52241,-74.217847,,,0,S14 1433 | S15,,Prince's Bay,,40.525507,-74.200064,,,1, 1434 | S15N,,Prince's Bay,,40.525507,-74.200064,,,0,S15 1435 | S15S,,Prince's Bay,,40.525507,-74.200064,,,0,S15 1436 | S16,,Huguenot,,40.533674,-74.191794,,,1, 1437 | S16N,,Huguenot,,40.533674,-74.191794,,,0,S16 1438 | S16S,,Huguenot,,40.533674,-74.191794,,,0,S16 1439 | S17,,Annadale,,40.54046,-74.178217,,,1, 1440 | S17N,,Annadale,,40.54046,-74.178217,,,0,S17 1441 | S17S,,Annadale,,40.54046,-74.178217,,,0,S17 1442 | S18,,Eltingville,,40.544601,-74.16457,,,1, 1443 | S18N,,Eltingville,,40.544601,-74.16457,,,0,S18 1444 | S18S,,Eltingville,,40.544601,-74.16457,,,0,S18 1445 | S19,,Great Kills,,40.551231,-74.151399,,,1, 1446 | S19N,,Great Kills,,40.551231,-74.151399,,,0,S19 1447 | S19S,,Great Kills,,40.551231,-74.151399,,,0,S19 1448 | S20,,Bay Terrace,,40.5564,-74.136907,,,1, 1449 | S20N,,Bay Terrace,,40.5564,-74.136907,,,0,S20 1450 | S20S,,Bay Terrace,,40.5564,-74.136907,,,0,S20 1451 | S21,,Oakwood Heights,,40.56511,-74.12632,,,1, 1452 | S21N,,Oakwood Heights,,40.56511,-74.12632,,,0,S21 1453 | S21S,,Oakwood Heights,,40.56511,-74.12632,,,0,S21 1454 | S22,,New Dorp,,40.57348,-74.11721,,,1, 1455 | S22N,,New Dorp,,40.57348,-74.11721,,,0,S22 1456 | S22S,,New Dorp,,40.57348,-74.11721,,,0,S22 1457 | S23,,Grant City,,40.578965,-74.109704,,,1, 1458 | S23N,,Grant City,,40.578965,-74.109704,,,0,S23 1459 | S23S,,Grant City,,40.578965,-74.109704,,,0,S23 1460 | S24,,Jefferson Av,,40.583591,-74.103338,,,1, 1461 | S24N,,Jefferson Av,,40.583591,-74.103338,,,0,S24 1462 | S24S,,Jefferson Av,,40.583591,-74.103338,,,0,S24 1463 | S25,,Dongan Hills,,40.588849,-74.09609,,,1, 1464 | S25N,,Dongan Hills,,40.588849,-74.09609,,,0,S25 1465 | S25S,,Dongan Hills,,40.588849,-74.09609,,,0,S25 1466 | S26,,Old Town,,40.596612,-74.087368,,,1, 1467 | S26N,,Old Town,,40.596612,-74.087368,,,0,S26 1468 | S26S,,Old Town,,40.596612,-74.087368,,,0,S26 1469 | S27,,Grasmere,,40.603117,-74.084087,,,1, 1470 | S27N,,Grasmere,,40.603117,-74.084087,,,0,S27 1471 | S27S,,Grasmere,,40.603117,-74.084087,,,0,S27 1472 | S28,,Clifton,,40.621319,-74.071402,,,1, 1473 | S28N,,Clifton,,40.621319,-74.071402,,,0,S28 1474 | S28S,,Clifton,,40.621319,-74.071402,,,0,S28 1475 | S29,,Stapleton,,40.627915,-74.075162,,,1, 1476 | S29N,,Stapleton,,40.627915,-74.075162,,,0,S29 1477 | S29S,,Stapleton,,40.627915,-74.075162,,,0,S29 1478 | S30,,Tompkinsville,,40.636949,-74.074835,,,1, 1479 | S30N,,Tompkinsville,,40.636949,-74.074835,,,0,S30 1480 | S30S,,Tompkinsville,,40.636949,-74.074835,,,0,S30 1481 | S31,,St George,,40.643748,-74.073643,,,1, 1482 | S31N,,St George,,40.643748,-74.073643,,,0,S31 1483 | S31S,,St George,,40.643748,-74.073643,,,0,S31 1484 | -------------------------------------------------------------------------------- /gtfs/transfers.txt: -------------------------------------------------------------------------------- 1 | from_stop_id,to_stop_id,transfer_type,min_transfer_time 2 | 101,101,2,180 3 | 103,103,2,180 4 | 104,104,2,180 5 | 106,106,2,180 6 | 107,107,2,180 7 | 108,108,2,180 8 | 109,109,2,180 9 | 110,110,2,180 10 | 111,111,2,180 11 | 112,112,2,180 12 | 112,A09,2,180 13 | 113,113,2,180 14 | 114,114,2,180 15 | 115,115,2,180 16 | 116,116,2,180 17 | 117,117,2,180 18 | 118,118,2,180 19 | 119,119,2,180 20 | 120,120,2,180 21 | 121,121,2,180 22 | 122,122,2,180 23 | 123,123,2,0 24 | 124,124,2,180 25 | 125,125,2,180 26 | 125,A24,2,180 27 | 126,126,2,180 28 | 127,127,2,0 29 | 127,725,2,180 30 | 127,902,2,180 31 | 127,A27,2,300 32 | 127,R16,2,180 33 | 128,128,2,300 34 | 129,129,2,180 35 | 130,130,2,180 36 | 131,131,2,180 37 | 132,132,2,0 38 | 132,D19,2,300 39 | 132,L02,2,180 40 | 133,133,2,180 41 | 134,134,2,180 42 | 135,135,2,180 43 | 136,136,2,180 44 | 137,137,2,180 45 | 138,138,2,180 46 | 139,139,2,180 47 | 140,140,2,180 48 | 140,R27,2,120 49 | 201,201,2,180 50 | 204,204,2,180 51 | 205,205,2,180 52 | 206,206,2,180 53 | 207,207,2,180 54 | 208,208,2,180 55 | 209,209,2,180 56 | 210,210,2,180 57 | 211,211,2,180 58 | 212,212,2,180 59 | 213,213,2,180 60 | 214,214,2,180 61 | 215,215,2,180 62 | 216,216,2,180 63 | 217,217,2,180 64 | 218,218,2,180 65 | 219,219,2,180 66 | 220,220,2,180 67 | 221,221,2,180 68 | 222,222,2,180 69 | 222,415,2,180 70 | 227,227,2,0 71 | 228,228,2,180 72 | 228,A36,2,180 73 | 228,E01,2,180 74 | 229,229,2,180 75 | 229,418,2,300 76 | 229,A38,2,180 77 | 229,M22,2,300 78 | 230,230,2,180 79 | 231,231,2,180 80 | 232,232,2,180 81 | 232,423,2,300 82 | 232,R28,2,180 83 | 233,233,2,180 84 | 234,234,2,0 85 | 235,235,2,300 86 | 235,D24,2,180 87 | 235,R31,2,180 88 | 236,236,2,180 89 | 237,237,2,180 90 | 238,238,2,180 91 | 239,239,2,0 92 | 239,S04,2,180 93 | 241,241,2,180 94 | 242,242,2,180 95 | 243,243,2,180 96 | 244,244,2,180 97 | 245,245,2,180 98 | 246,246,2,180 99 | 247,247,2,180 100 | 248,248,2,180 101 | 249,249,2,180 102 | 250,250,2,0 103 | 251,251,2,180 104 | 252,252,2,180 105 | 253,253,2,180 106 | 254,254,2,180 107 | 254,L26,2,300 108 | 255,255,2,180 109 | 256,256,2,180 110 | 257,257,2,180 111 | 301,301,2,180 112 | 302,302,2,180 113 | 401,401,2,180 114 | 402,402,2,180 115 | 405,405,2,180 116 | 406,406,2,180 117 | 407,407,2,180 118 | 408,408,2,180 119 | 409,409,2,0 120 | 410,410,2,180 121 | 411,411,2,180 122 | 412,412,2,180 123 | 413,413,2,180 124 | 414,414,2,180 125 | 414,D11,2,180 126 | 415,222,2,180 127 | 415,415,2,0 128 | 416,416,2,180 129 | 418,229,2,300 130 | 418,418,2,180 131 | 418,A38,2,180 132 | 418,M22,2,300 133 | 419,419,2,180 134 | 420,420,2,180 135 | 423,232,2,300 136 | 423,423,2,180 137 | 423,R28,2,180 138 | 501,501,2,180 139 | 502,502,2,180 140 | 503,503,2,180 141 | 504,504,2,180 142 | 505,505,2,180 143 | 601,601,2,180 144 | 602,602,2,180 145 | 603,603,2,180 146 | 604,604,2,180 147 | 606,606,2,180 148 | 607,607,2,180 149 | 608,608,2,0 150 | 609,609,2,180 151 | 610,610,2,180 152 | 611,611,2,180 153 | 612,612,2,180 154 | 613,613,2,0 155 | 614,614,2,180 156 | 615,615,2,180 157 | 616,616,2,180 158 | 617,617,2,180 159 | 618,618,2,180 160 | 619,619,2,0 161 | 621,621,2,180 162 | 622,622,2,180 163 | 623,623,2,180 164 | 624,624,2,180 165 | 625,625,2,180 166 | 626,626,2,180 167 | 627,627,2,180 168 | 628,628,2,180 169 | 629,629,2,180 170 | 629,B08,2,300 171 | 629,R11,2,180 172 | 630,630,2,180 173 | 630,F11,2,180 174 | 631,631,2,0 175 | 631,723,2,180 176 | 631,901,2,180 177 | 632,632,2,180 178 | 633,633,2,180 179 | 634,634,2,180 180 | 635,635,2,0 181 | 635,L03,2,180 182 | 635,R20,2,180 183 | 636,636,2,180 184 | 637,637,2,180 185 | 637,D21,2,180 186 | 638,638,2,180 187 | 639,639,2,180 188 | 639,M20,2,180 189 | 639,Q01,2,180 190 | 639,R23,2,180 191 | 640,640,2,0 192 | 640,M21,2,180 193 | 701,701,2,180 194 | 702,702,2,180 195 | 705,705,2,180 196 | 706,706,2,180 197 | 707,707,2,0 198 | 708,708,2,180 199 | 709,709,2,180 200 | 710,710,2,180 201 | 710,G14,2,180 202 | 711,711,2,180 203 | 712,712,2,0 204 | 713,713,2,180 205 | 714,714,2,180 206 | 715,715,2,180 207 | 716,716,2,180 208 | 718,718,2,0 209 | 718,R09,2,0 210 | 719,719,2,180 211 | 719,F09,2,300 212 | 719,G22,2,180 213 | 720,720,2,180 214 | 721,721,2,180 215 | 723,631,2,180 216 | 723,723,2,180 217 | 723,901,2,300 218 | 724,724,2,180 219 | 724,D16,2,180 220 | 725,127,2,180 221 | 725,725,2,180 222 | 725,902,2,300 223 | 725,A27,2,180 224 | 725,R16,2,180 225 | 901,631,2,180 226 | 901,723,2,300 227 | 901,901,2,180 228 | 902,127,2,180 229 | 902,725,2,300 230 | 902,902,2,180 231 | 902,A27,2,300 232 | 902,R16,2,180 233 | A02,A02,2,180 234 | A03,A03,2,180 235 | A05,A05,2,180 236 | A06,A06,2,180 237 | A07,A07,2,180 238 | A09,112,2,180 239 | A09,A09,2,0 240 | A10,A10,2,180 241 | A11,A11,2,180 242 | A12,A12,2,0 243 | A12,D13,2,180 244 | A14,A14,2,180 245 | A15,A15,2,0 246 | A16,A16,2,180 247 | A17,A17,2,180 248 | A18,A18,2,180 249 | A19,A19,2,180 250 | A20,A20,2,180 251 | A21,A21,2,180 252 | A22,A22,2,180 253 | A24,125,2,180 254 | A24,A24,2,0 255 | A25,A25,2,180 256 | A27,127,2,300 257 | A27,725,2,180 258 | A27,902,2,300 259 | A27,A27,2,0 260 | A27,R16,2,300 261 | A28,A28,2,300 262 | A30,A30,2,180 263 | A31,A31,2,0 264 | A31,L01,2,90 265 | A32,A32,2,0 266 | A32,D20,2,180 267 | A33,A33,2,180 268 | A34,A34,2,0 269 | A36,228,2,180 270 | A36,A36,2,180 271 | A36,E01,2,300 272 | A38,229,2,180 273 | A38,418,2,180 274 | A38,A38,2,180 275 | A38,M22,2,180 276 | A40,A40,2,180 277 | A41,A41,2,180 278 | A41,R29,2,90 279 | A42,A42,2,180 280 | A43,A43,2,180 281 | A44,A44,2,180 282 | A45,A45,2,180 283 | A45,S01,2,180 284 | A46,A46,2,180 285 | A47,A47,2,180 286 | A48,A48,2,0 287 | A49,A49,2,180 288 | A50,A50,2,180 289 | A51,A51,2,0 290 | A51,J27,2,180 291 | A51,L22,2,180 292 | A52,A52,2,180 293 | A53,A53,2,180 294 | A54,A54,2,180 295 | A55,A55,2,0 296 | A57,A57,2,180 297 | A59,A59,2,180 298 | A60,A60,2,180 299 | A61,A61,2,180 300 | A63,A63,2,180 301 | A64,A64,2,180 302 | A65,A65,2,180 303 | B04,B04,2,180 304 | B06,B06,2,180 305 | B08,629,2,300 306 | B08,B08,2,180 307 | B08,R11,2,300 308 | B10,B10,2,180 309 | B12,B12,2,180 310 | B13,B13,2,180 311 | B14,B14,2,180 312 | B15,B15,2,180 313 | B16,B16,2,180 314 | B16,N04,2,180 315 | B17,B17,2,180 316 | B18,B18,2,180 317 | B19,B19,2,180 318 | B20,B20,2,180 319 | B21,B21,2,180 320 | B22,B22,2,180 321 | B23,B23,2,180 322 | D01,D01,2,180 323 | D03,D03,2,0 324 | D04,D04,2,0 325 | D05,D05,2,0 326 | D06,D06,2,180 327 | D07,D07,2,0 328 | D08,D08,2,180 329 | D09,D09,2,180 330 | D10,D10,2,180 331 | D11,414,2,180 332 | D11,D11,2,180 333 | D12,D12,2,180 334 | D13,A12,2,180 335 | D13,D13,2,0 336 | D14,D14,2,180 337 | D15,D15,2,300 338 | D16,724,2,180 339 | D16,D16,2,0 340 | D17,D17,2,0 341 | D17,R17,2,180 342 | D18,D18,2,180 343 | D19,132,2,300 344 | D19,D19,2,180 345 | D19,L02,2,180 346 | D20,A32,2,180 347 | D20,D20,2,0 348 | D21,637,2,180 349 | D21,D21,2,0 350 | D22,D22,2,180 351 | D24,235,2,180 352 | D24,D24,2,180 353 | D24,R31,2,300 354 | D25,D25,2,180 355 | D26,D26,2,180 356 | D27,D27,2,180 357 | D28,D28,2,0 358 | D29,D29,2,180 359 | D30,D30,2,180 360 | D31,D31,2,0 361 | D32,D32,2,180 362 | D33,D33,2,180 363 | D34,D34,2,180 364 | D35,D35,2,0 365 | D37,D37,2,180 366 | D38,D38,2,180 367 | D39,D39,2,0 368 | D40,D40,2,300 369 | D41,D41,2,180 370 | D42,D42,2,180 371 | D43,D43,2,180 372 | E01,228,2,180 373 | E01,A36,2,300 374 | E01,E01,2,180 375 | F01,F01,2,180 376 | F02,F02,2,180 377 | F03,F03,2,180 378 | F04,F04,2,180 379 | F06,F06,2,0 380 | F07,F07,2,180 381 | F09,719,2,300 382 | F09,F09,2,180 383 | F09,G22,2,180 384 | F11,630,2,180 385 | F11,F11,2,180 386 | F12,F12,2,180 387 | F14,F14,2,300 388 | F15,F15,2,180 389 | F15,M18,2,180 390 | F16,F16,2,180 391 | F18,F18,2,180 392 | F21,F21,2,180 393 | F22,F22,2,180 394 | F23,F23,2,180 395 | F23,R33,2,180 396 | F24,F24,2,0 397 | F25,F25,2,180 398 | F26,F26,2,180 399 | F27,F27,2,0 400 | F29,F29,2,180 401 | F30,F30,2,180 402 | F31,F31,2,180 403 | F32,F32,2,180 404 | F33,F33,2,180 405 | F34,F34,2,180 406 | F35,F35,2,180 407 | F36,F36,2,180 408 | F38,F38,2,180 409 | F39,F39,2,180 410 | G05,G05,2,180 411 | G06,G06,2,180 412 | G07,G07,2,180 413 | G08,G08,2,0 414 | G09,G09,2,180 415 | G10,G10,2,180 416 | G11,G11,2,180 417 | G12,G12,2,180 418 | G13,G13,2,180 419 | G14,710,2,180 420 | G14,G14,2,180 421 | G15,G15,2,180 422 | G16,G16,2,180 423 | G18,G18,2,180 424 | G19,G19,2,180 425 | G20,G20,2,180 426 | G21,G21,2,180 427 | G22,719,2,180 428 | G22,F09,2,180 429 | G22,G22,2,180 430 | G24,G24,2,180 431 | G26,G26,2,180 432 | G28,G28,2,180 433 | G29,G29,2,180 434 | G29,L10,2,180 435 | G30,G30,2,180 436 | G31,G31,2,180 437 | G32,G32,2,180 438 | G33,G33,2,180 439 | G34,G34,2,180 440 | G35,G35,2,180 441 | G36,G36,2,180 442 | H02,H02,2,180 443 | H03,H03,2,180 444 | H04,H04,2,180 445 | H06,H06,2,180 446 | H07,H07,2,180 447 | H08,H08,2,180 448 | H09,H09,2,180 449 | H10,H10,2,180 450 | H11,H11,2,180 451 | H12,H12,2,180 452 | H13,H13,2,180 453 | H14,H14,2,180 454 | H15,H15,2,180 455 | J12,J12,2,180 456 | J13,J13,2,180 457 | J14,J14,2,180 458 | J15,J15,2,180 459 | J16,J16,2,180 460 | J17,J17,2,180 461 | J19,J19,2,180 462 | J20,J20,2,180 463 | J21,J21,2,180 464 | J22,J22,2,180 465 | J23,J23,2,180 466 | J24,J24,2,180 467 | J27,A51,2,180 468 | J27,J27,2,0 469 | J27,L22,2,180 470 | J28,J28,2,180 471 | J29,J29,2,180 472 | J30,J30,2,180 473 | J31,J31,2,180 474 | L01,A31,2,90 475 | L01,L01,2,180 476 | L02,132,2,180 477 | L02,D19,2,180 478 | L02,L02,2,180 479 | L03,635,2,180 480 | L03,L03,2,180 481 | L03,R20,2,180 482 | L05,L05,2,180 483 | L06,L06,2,180 484 | L08,L08,2,180 485 | L10,G29,2,180 486 | L10,L10,2,180 487 | L11,L11,2,180 488 | L12,L12,2,180 489 | L13,L13,2,180 490 | L14,L14,2,180 491 | L15,L15,2,180 492 | L16,L16,2,180 493 | L17,L17,2,180 494 | L17,M08,2,180 495 | L19,L19,2,180 496 | L20,L20,2,180 497 | L21,L21,2,180 498 | L22,A51,2,180 499 | L22,J27,2,180 500 | L22,L22,2,180 501 | L24,L24,2,180 502 | L25,L25,2,180 503 | L26,254,2,300 504 | L26,L26,2,180 505 | L27,L27,2,180 506 | L28,L28,2,180 507 | L29,L29,2,180 508 | M01,M01,2,180 509 | M04,M04,2,180 510 | M05,M05,2,180 511 | M06,M06,2,180 512 | M08,L17,2,180 513 | M08,M08,2,180 514 | M09,M09,2,180 515 | M10,M10,2,180 516 | M11,M11,2,0 517 | M12,M12,2,180 518 | M13,M13,2,180 519 | M14,M14,2,180 520 | M16,M16,2,0 521 | M18,F15,2,180 522 | M18,M18,2,180 523 | M19,M19,2,180 524 | M20,639,2,180 525 | M20,M20,2,180 526 | M20,Q01,2,180 527 | M20,R23,2,300 528 | M21,640,2,180 529 | M21,M21,2,180 530 | M22,229,2,300 531 | M22,418,2,300 532 | M22,A38,2,180 533 | M22,M22,2,180 534 | M23,M23,2,180 535 | N02,N02,2,180 536 | N03,N03,2,180 537 | N04,B16,2,180 538 | N04,N04,2,180 539 | N05,N05,2,180 540 | N06,N06,2,180 541 | N07,N07,2,180 542 | N08,N08,2,180 543 | N09,N09,2,180 544 | N10,N10,2,180 545 | Q01,639,2,180 546 | Q01,M20,2,180 547 | Q01,Q01,2,180 548 | Q01,R23,2,180 549 | R01,R01,2,180 550 | R03,R03,2,0 551 | R04,R04,2,180 552 | R05,R05,2,180 553 | R06,R06,2,180 554 | R08,R08,2,180 555 | R09,718,2,0 556 | R09,R09,2,180 557 | R11,629,2,180 558 | R11,B08,2,300 559 | R11,R11,2,0 560 | R13,R13,2,180 561 | R14,R14,2,180 562 | R15,R15,2,180 563 | R16,127,2,180 564 | R16,725,2,180 565 | R16,902,2,180 566 | R16,A27,2,300 567 | R16,R16,2,0 568 | R17,D17,2,180 569 | R17,R17,2,0 570 | R18,R18,2,180 571 | R19,R19,2,180 572 | R20,635,2,180 573 | R20,L03,2,180 574 | R20,R20,2,0 575 | R21,R21,2,180 576 | R22,R22,2,180 577 | R23,639,2,180 578 | R23,M20,2,300 579 | R23,Q01,2,180 580 | R23,R23,2,180 581 | R24,R24,2,180 582 | R26,R26,2,180 583 | R27,R27,2,180 584 | R27,140,2,120 585 | R28,232,2,180 586 | R28,423,2,180 587 | R28,R28,2,180 588 | R29,R29,2,180 589 | R29,A41,2,90 590 | R30,R30,2,180 591 | R31,235,2,180 592 | R31,D24,2,300 593 | R31,R31,2,0 594 | R32,R32,2,180 595 | R33,F23,2,180 596 | R33,R33,2,180 597 | R34,R34,2,180 598 | R35,R35,2,180 599 | R36,R36,2,0 600 | R39,R39,2,180 601 | R40,R40,2,180 602 | R41,R41,2,0 603 | R42,R42,2,180 604 | R43,R43,2,180 605 | R44,R44,2,180 606 | R45,R45,2,180 607 | S01,A45,2,180 608 | S01,S01,2,180 609 | S03,S03,2,180 610 | S04,239,2,180 611 | S04,S04,2,180 612 | -------------------------------------------------------------------------------- /icinga/.gitignore: -------------------------------------------------------------------------------- 1 | config.mk 2 | *-hosts.cfg 3 | gw-.cfg 4 | gw-*.cfg 5 | mqtt-commands.cfg 6 | -------------------------------------------------------------------------------- /icinga/Makefile: -------------------------------------------------------------------------------- 1 | include config.mk 2 | 3 | ALLPLUGINS = check_gw.py check_mqtt.py 4 | ALLOBJECTS = gw-commands.cfg mqtt-commands.cfg gw-generic.cfg 5 | ALLCONFIGS = gw-hosts.cfg mqtt-hosts.cfg gw-services.cfg mqtt-services.cfg 6 | 7 | all : $(ALLPLUGINS) $(ALLOBJECTS) $(ALLCONFIGS) 8 | 9 | 10 | %.cfg: %.src config.mk Makefile *.src 11 | sed -e s#%PLUGINS#$(PLUGINS)# \ 12 | -e s#%USER#$(USER)# \ 13 | -e s#%PORTNO#$(PORTNO)# \ 14 | -e s#%BROKER#$(BROKER)# \ 15 | -e s#%PASSWORD#$(PASSWORD)# \ 16 | $< > $@ 17 | 18 | clean : 19 | rm -v -f $(ALLOBJECTS) 20 | 21 | install : all install-plugins install-objects 22 | 23 | install-objects : $(ALLOBJECTS) $(ALLCONFIGS) 24 | $(INSTALL) -v -m 644 $? ${OBJECTS} 25 | 26 | install-plugins : $(ALLPLUGINS) 27 | $(INSTALL) -v -m 755 $? ${PLUGINS} 28 | 29 | uninstall : uninstall-plugins uninstall-objects 30 | 31 | uninstall-objects: 32 | (cd ${OBJECTS}; rm -v -f $(ALLOBJECTS) $(ALLCONFIGS)) 33 | 34 | uninstall-plugins: 35 | (cd ${PLUGINS}; rm -v -f $(ALLPLUGINS)) 36 | -------------------------------------------------------------------------------- /icinga/README.md: -------------------------------------------------------------------------------- 1 | # ICINGA configuration 2 | 3 | 1. make a copy of mqtt-hosts.cfg.sample to mqtt-hosts.cfg and edit 4 | 2. make a copy of gw-hosts.cfg.sample to gw-hosts.cfg and edit 5 | 3. edit config.mk 6 | 4. run make 7 | 5. run make install with as a priviledged user to acces the nagios plugins and icinga objects directories 8 | -------------------------------------------------------------------------------- /icinga/check_gw.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import sys 5 | import os 6 | import time 7 | import ssl 8 | import getopt 9 | import datetime 10 | import json 11 | 12 | import paho.mqtt.client as paho 13 | import json 14 | 15 | topic = None 16 | mode = None 17 | switched = False 18 | 19 | def usage(): 20 | print "check-gw -m mode -h hostname/address -p port -t topic [-u userId -w password] [-c cafile] [-s]" 21 | 22 | def aged(msg): 23 | fmt = "%s %-14s %-40s %s" 24 | 25 | topic = str(msg.topic) 26 | payload = str(msg.payload) 27 | 28 | try: 29 | data = json.loads(payload) 30 | except: 31 | try: 32 | values = payload.split(',') 33 | try: 34 | tstamp = int(values[1], 16) 35 | except: 36 | tstamp = 0 37 | if tstamp > time.time() - 6 * 1.5 * 3600: 38 | return 0 39 | else: 40 | return 1 41 | except: 42 | print fmt % (retained, tstamp, topic, payload) 43 | return 2 44 | 45 | if type(data) is not dict: 46 | print fmt % (retained, tstamp, topic, payload) 47 | return 48 | 49 | time_str = None 50 | if '_type' in data: 51 | if data['_type'] == 'location': 52 | if 'tst' in data: 53 | try: 54 | tstamp = int(data['tst']) 55 | except: 56 | tstamp = 0 57 | if tstamp > time.time() - 6 * 1.5 * 3600: 58 | return 0 59 | else: 60 | return 1 61 | else: 62 | return 2 63 | else: 64 | return 2 65 | else: 66 | return 2 67 | 68 | def on_connect(mosq, userdata, rc): 69 | global returnValue 70 | if rc != 0: 71 | sys.exit(3) 72 | else: 73 | if mode == 'status': 74 | mosq.subscribe('%s/status' % topic) 75 | elif mode == 'gpio7': 76 | mosq.subscribe('%s/gpio/7' % topic) 77 | elif mode == 'vbatt': 78 | mosq.subscribe('%s/voltage/batt' % topic) 79 | elif mode == 'vext': 80 | mosq.subscribe('%s/voltage/ext' % topic) 81 | elif mode == 'age': 82 | mosq.subscribe('%s' % topic) 83 | else: 84 | usage() 85 | returnValue = 3 86 | 87 | def on_disconnect(mosq, userdata, rc): 88 | global returnValue 89 | print "GW disconnect %d" % rc 90 | if returnValue == -1: 91 | returnValue = 2 92 | 93 | def on_subscribe(client, userdata, mid, granted_qos): 94 | pass 95 | 96 | def on_message(mosq, userdata, message): 97 | global returnValue 98 | print message.payload 99 | if mode == 'status': 100 | if message.payload == "0": 101 | returnValue = 2 102 | elif message.payload == "1": 103 | returnValue = 0 104 | else: 105 | if switched: 106 | returnValue = 0 107 | else: 108 | returnValue = 1 109 | elif mode == 'gpio7': 110 | if message.payload == "0": 111 | returnValue = 1 112 | else: 113 | returnValue = 0 114 | elif mode == 'vbatt': 115 | try: 116 | voltage = float(message.payload) 117 | except: 118 | voltage = 0 119 | if voltage > 3.6: 120 | returnValue = 0 121 | else: 122 | returnValue = 1 123 | elif mode == 'vext': 124 | try: 125 | voltage = float(message.payload) 126 | except: 127 | voltage = 0 128 | if voltage >= 12.0: 129 | returnValue = 0 130 | else: 131 | if switched: 132 | returnValue = 0 133 | else: 134 | returnValue = 1 135 | elif mode == 'age': 136 | returnValue = aged(message) 137 | else: 138 | returnValue = 3 139 | 140 | def main(argv): 141 | global returnValue 142 | clientID = "check-gw-%d" % os.getpid() 143 | host = 'localhost' 144 | userId = None 145 | password = None 146 | port = 1883 147 | cafile = None 148 | 149 | try: 150 | opts, args = getopt.getopt(argv, "sm:h:p:u:w:t:c:", ["switched", "mode", "host", "port", "userId", "password", "topic", "cafile"]) 151 | except getopt.GetoptError as e: 152 | usage() 153 | print "GW getopt 3" 154 | sys.exit(3) 155 | 156 | for opt, arg in opts: 157 | if opt in ('-h', '--host'): 158 | host = arg 159 | if opt in ('-p', '--port'): 160 | port = arg 161 | if opt in ('-u', '--userId'): 162 | userId = arg 163 | if opt in ('-w', '--password'): 164 | password = arg 165 | if opt in ('-t', '--topic'): 166 | global topic 167 | topic = arg 168 | if opt in ('-c', '--cafile'): 169 | cafile = arg 170 | if opt in ('-m', '--mode'): 171 | global mode 172 | mode = arg 173 | if opt in ('-s', '--switched'): 174 | global switched 175 | switched = True 176 | 177 | mosq = paho.Client(clientID, clean_session=True, userdata=None) 178 | mosq.on_connect = on_connect 179 | mosq.on_disconnect = on_disconnect 180 | mosq.on_subscribe = on_subscribe 181 | mosq.on_message = on_message 182 | if userId != None: 183 | mosq.username_pw_set(userId,password) 184 | if cafile != None: 185 | mosq.tls_set(cafile) 186 | mosq.tls_insecure_set(True) 187 | 188 | try: 189 | mosq.connect(host, port, 60) 190 | except: 191 | print "GW connect exception 2" 192 | sys.exit(2) 193 | 194 | timeout = time.time() + 3 195 | while returnValue == -1: 196 | if time.time() > timeout: 197 | print "GW timeout" 198 | returnValue = 2 199 | mosq.loop() 200 | 201 | mosq.disconnect() 202 | exit(returnValue) 203 | 204 | returnValue = -1 205 | 206 | if __name__ == '__main__': 207 | main(sys.argv[1:]) 208 | 209 | -------------------------------------------------------------------------------- /icinga/check_mqtt.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import sys 5 | import os 6 | import ssl 7 | import getopt 8 | 9 | import paho.mqtt.client as paho # pip install paho-mqtt 10 | import json 11 | 12 | def usage(): 13 | print "check-mqtt -h hostname/address -u userId -p port -w password -c cafile" 14 | 15 | def on_disconnect(mosq, userdata, rc): 16 | global returnValue 17 | print "MQTT disconnect %d" % rc 18 | if returnValue == -1: 19 | returnValue = 2 20 | 21 | def on_connect(mosq, userdata, rc): 22 | global returnValue 23 | print "MQTT connect %d" % rc 24 | if rc == 0: 25 | returnValue = 0 26 | else: 27 | returnValue = 2 28 | 29 | def main(argv): 30 | global returnValue 31 | clientID = "check-mqtt-%d" % os.getpid() 32 | host = 'localhost' 33 | userId = None 34 | password = None 35 | port = 1883 36 | cafile = None 37 | 38 | try: 39 | opts, args = getopt.getopt(argv, "h:p:u:w:c:", ["host", "port", "userId", "password", "cafile"]) 40 | except getopt.GetoptError as e: 41 | usage(); 42 | print "MQTT getopt 3" 43 | sys.exit(3) 44 | 45 | for opt, arg in opts: 46 | if opt in ('-h', '--host'): 47 | host = arg 48 | if opt in ('-p', '--port'): 49 | port = arg 50 | if opt in ('-u', '--userId'): 51 | userId = arg 52 | if opt in ('-w', '--password'): 53 | password = arg 54 | if opt in ('-c', '--cafile'): 55 | cafile = arg 56 | 57 | mqttc = paho.Client(clientID, clean_session=True, userdata=None) 58 | mqttc.on_connect = on_connect 59 | mqttc.on_disconnect = on_disconnect 60 | if userId != None: 61 | mqttc.username_pw_set(userId,password) 62 | if cafile != None: 63 | mqttc.tls_set(cafile) 64 | mqttc.tls_insecure_set(True) 65 | try: 66 | mqttc.connect(host, port, 60) 67 | except: 68 | print "MQTT connect exception 2"; 69 | returnValue = 2 70 | 71 | while returnValue == -1: 72 | mqttc.loop() 73 | 74 | mqttc.disconnect() 75 | exit(returnValue); 76 | 77 | returnValue = -1 78 | 79 | if __name__ == '__main__': 80 | main(sys.argv[1:]) 81 | -------------------------------------------------------------------------------- /icinga/config.mk.sample: -------------------------------------------------------------------------------- 1 | # ============================================================================= 2 | # User configuration section. 3 | # ============================================================================= 4 | 5 | INSTALL?=install 6 | 7 | PLUGINS=/usr/lib/nagios/plugins 8 | OBJECTS=/etc/icinga/objects 9 | 10 | USER=user 11 | PASSWORD=password 12 | PORTNO=1883 13 | BROKER=localhost 14 | -------------------------------------------------------------------------------- /icinga/gw-commands.src: -------------------------------------------------------------------------------- 1 | define command{ 2 | command_name check-gw-status-switched 3 | command_line %PLUGINS/check_gw.py -m status -h '$_HOSTBROKER$' -p '$_HOSTPORTNO$' -u '$_HOSTUSER$' -w '$_HOSTPASSWORD$' -t '$_HOSTTOPIC$' '$_HOSTTLS$' '$_HOSTCAFILE$' -s 4 | } 5 | 6 | define command{ 7 | command_name check-gw-status-permanent 8 | command_line %PLUGINS/check_gw.py -m status -h '$_HOSTBROKER$' -p '$_HOSTPORTNO$' -u '$_HOSTUSER$' -w '$_HOSTPASSWORD$' -t '$_HOSTTOPIC$' '$_HOSTTLS$' '$_HOSTCAFILE$' 9 | } 10 | 11 | define command{ 12 | command_name check-gw-vbatt 13 | command_line %PLUGINS/check_gw.py -m vbatt -h '$_HOSTBROKER$' -p '$_HOSTPORTNO$' -u '$_HOSTUSER$' -w '$_HOSTPASSWORD$' -t '$_HOSTTOPIC$' '$_HOSTTLS$' '$_HOSTCAFILE$' 14 | } 15 | 16 | define command{ 17 | command_name check-gw-vext-switched 18 | command_line %PLUGINS/check_gw.py -m vext -h '$_HOSTBROKER$' -p '$_HOSTPORTNO$' -u '$_HOSTUSER$' -w '$_HOSTPASSWORD$' -t '$_HOSTTOPIC$' '$_HOSTTLS$' '$_HOSTCAFILE$' -s 19 | } 20 | 21 | define command{ 22 | command_name check-gw-vext-permanent 23 | command_line %PLUGINS/check_gw.py -m vext -h '$_HOSTBROKER$' -p '$_HOSTPORTNO$' -u '$_HOSTUSER$' -w '$_HOSTPASSWORD$' -t '$_HOSTTOPIC$' '$_HOSTTLS$' '$_HOSTCAFILE$' 24 | } 25 | 26 | define command{ 27 | command_name check-gw-gpio7 28 | command_line %PLUGINS/check_gw.py -m gpio7 -h '$_HOSTBROKER$' -p '$_HOSTPORTNO$' -u '$_HOSTUSER$' -w '$_HOSTPASSWORD$' -t '$_HOSTTOPIC$' '$_HOSTTLS$' '$_HOSTCAFILE$' 29 | } 30 | 31 | define command{ 32 | command_name check-gw-age 33 | command_line %PLUGINS/check_gw.py -m age -h '$_HOSTBROKER$' -p '$_HOSTPORTNO$' -u '$_HOSTUSER$' -w '$_HOSTPASSWORD$' -t '$_HOSTTOPIC$' '$_HOSTTLS$' '$_HOSTCAFILE$' 34 | } 35 | 36 | -------------------------------------------------------------------------------- /icinga/gw-generic.src: -------------------------------------------------------------------------------- 1 | # Generic host definition template - This is NOT a real host, just a template! 2 | 3 | define host{ 4 | name gw-generic-switched ; The name of this host template 5 | notifications_enabled 1 ; Host notifications are enabled 6 | event_handler_enabled 1 ; Host event handler is enabled 7 | flap_detection_enabled 1 ; Flap detection is enabled 8 | failure_prediction_enabled 1 ; Failure prediction is enabled 9 | process_perf_data 1 ; Process performance data 10 | retain_status_information 1 ; Retain status information across program restarts 11 | retain_nonstatus_information 1 ; Retain non-status information across program restarts 12 | check_command check-gw-status-switched 13 | max_check_attempts 10 14 | notification_interval 0 15 | notification_period 24x7 16 | notification_options d,u,r 17 | contact_groups admins 18 | register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! 19 | _user %USER 20 | _password %PASSWORD 21 | _portno %PORTNO 22 | _broker %BROKER 23 | } 24 | 25 | define host{ 26 | name gw-generic-permanent ; The name of this host template 27 | notifications_enabled 1 ; Host notifications are enabled 28 | event_handler_enabled 1 ; Host event handler is enabled 29 | flap_detection_enabled 1 ; Flap detection is enabled 30 | failure_prediction_enabled 1 ; Failure prediction is enabled 31 | process_perf_data 1 ; Process performance data 32 | retain_status_information 1 ; Retain status information across program restarts 33 | retain_nonstatus_information 1 ; Retain non-status information across program restarts 34 | check_command check-gw-status-permanent 35 | max_check_attempts 10 36 | notification_interval 0 37 | notification_period 24x7 38 | notification_options d,u,r 39 | contact_groups admins 40 | register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! 41 | _user %USER 42 | _password %PASSWORD 43 | _portno %PORTNO 44 | _broker %BROKER 45 | } 46 | -------------------------------------------------------------------------------- /icinga/gw-hosts.cfg.sample: -------------------------------------------------------------------------------- 1 | define hostgroup { 2 | hostgroup_name owntracks-permanent 3 | alias All Test Greenwichs with permanent power 4 | members P1, P2 5 | } 6 | 7 | define hostgroup { 8 | hostgroup_name owntracks-switched 9 | alias All Test Greenwichs with switched power 10 | members P3, P4 11 | } 12 | 13 | define host { 14 | use gw-generic-switched 15 | host_name P3 16 | _topic owntracks/gw/P3 17 | parents broker1 18 | } 19 | 20 | define host { 21 | use gw-generic-switched 22 | host_name P4 23 | _topic owntracks/gw/P4 24 | parents broker2 25 | } 26 | 27 | define host { 28 | use gw-generic-permanent 29 | host_name P1 30 | _topic owntracks/gw/P1 31 | parents broker1 32 | } 33 | 34 | define host { 35 | use gw-generic-permanent 36 | host_name P2 37 | _topic owntracks/gw/P2 38 | parents broker2 39 | } 40 | 41 | -------------------------------------------------------------------------------- /icinga/gw-services.cfg: -------------------------------------------------------------------------------- 1 | define service { 2 | use generic-service 3 | name gw-age-service 4 | service_description GW age 5 | check_command check-gw-age 6 | register 1 7 | hostgroups owntracks-permanent, owntracks-switched 8 | } 9 | 10 | #define service { 11 | # use generic-service 12 | # name gw-status-service-permanent 13 | # service_description GW status 14 | # check_command check-gw-status-permanent 15 | # register 1 16 | # hostgroups owntracks-permanent 17 | #} 18 | 19 | #define service { 20 | # use generic-service 21 | # name gw-status-service-switched 22 | # service_description GW status 23 | # check_command check-gw-status-switched 24 | # register 1 25 | # hostgroups owntracks-switched 26 | #} 27 | 28 | #define service { 29 | # use generic-service 30 | # name gw-vbatt-service 31 | # service_description GW vbatt 32 | # check_command check-gw-vbatt 33 | # register 1 34 | # hostgroups owntracks-permanent, owntracks-switched 35 | #} 36 | 37 | #define service { 38 | # use generic-service 39 | # name gw-vext-service-switched 40 | # service_description GW vext 41 | # check_command check-gw-vext-switched 42 | # register 1 43 | # hostgroups owntracks-permanent, owntracks-switched 44 | #} 45 | 46 | #define service { 47 | # use generic-service 48 | # name gw-vext-service-permanent 49 | # service_description GW vext 50 | # check_command check-gw-vext-permanent 51 | # register 1 52 | # hostgroups owntracks-permanent, owntracks-switched 53 | #} 54 | 55 | #define service { 56 | # use generic-service 57 | # name gw-gpio7-service 58 | # service_description GW gpio7 59 | # check_command check-gw-gpio7 60 | # register 1 61 | # hostgroups owntracks-permanent, owntracks-switched 62 | #} 63 | 64 | -------------------------------------------------------------------------------- /icinga/mqtt-commands.src: -------------------------------------------------------------------------------- 1 | define command{ 2 | command_name check-mqtt 3 | command_line %PLUGINS/check_mqtt.py -h '$HOSTADDRESS$' -p '$_HOSTPORTNO$' '$_HOSTAUTH$' '$_HOSTUSER$' '$_HOSTPWD$' '$_HOSTPASSWORD$' '$_HOSTTLS$' '$_HOSTCAFILE$' 4 | } 5 | -------------------------------------------------------------------------------- /icinga/mqtt-hosts.cfg.sample: -------------------------------------------------------------------------------- 1 | define hostgroup { 2 | hostgroup_name owntracks-brokers 3 | alias All MQTT Brokers 4 | members broker0, broker1, broker2 5 | } 6 | 7 | define host { 8 | use generic-host 9 | host_name broker0 10 | address localhost 11 | _portno 1883 12 | } 13 | 14 | define host { 15 | use generic-host 16 | host_name broker1 17 | address localhost 18 | _auth -u 19 | _user user 20 | _pwd -w 21 | _password password 22 | _portno 1883 23 | } 24 | 25 | define host { 26 | use generic-host 27 | host_name broker2 28 | address test.mosquitto.org 29 | check_command check-host-alive_4 30 | _cafile cafile.pem 31 | _tls -c 32 | _auth -u 33 | _user user 34 | _pwd -w 35 | _password password 36 | _portno 8883 37 | parents broker1 38 | } 39 | -------------------------------------------------------------------------------- /icinga/mqtt-services.cfg: -------------------------------------------------------------------------------- 1 | define service{ 2 | use generic-service 3 | name mqtt-service 4 | service_description MQTT broker 5 | check_command check-mqtt 6 | register 1 7 | hostgroups owntracks-brokers 8 | } 9 | 10 | -------------------------------------------------------------------------------- /message-feeds/forecastio-feed.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | __author__ = 'Christoph Krey ' 5 | __copyright__ = 'Copyright 2015-2016 Christoph Krey, OwnTracks' 6 | __license__ = """Eclipse Public License - v 1.0 (http://www.eclipse.org/legal/epl-v10.html)""" 7 | 8 | import Geohash 9 | import forecastio 10 | import os 11 | import json 12 | import time 13 | import datetime 14 | import paho.mqtt.client as mqtt 15 | import random 16 | 17 | mqtt_user = os.getenv("MQTT_USER") 18 | mqtt_pass = os.getenv("MQTT_PASS") 19 | 20 | forecast_io_api_key = os.getenv("FORECAST_IO_API_KEY") 21 | if forecast_io_api_key is None: 22 | print "Requires FORECAST_IO_API_KEY in environment" 23 | sys.exit(2) 24 | 25 | client = mqtt.Client() 26 | if mqtt_user is not None: 27 | client.username_pw_set(mqtt_user, password=mqtt_pass) 28 | client.connect("localhost", 1883, 60) 29 | client.loop_start() 30 | 31 | last = 0 32 | 33 | while True: 34 | time.sleep(1) 35 | now = int(time.time()) 36 | 37 | # 1000 API calls per day are free -> every 86 seconds. So 100 seconds sleep 38 | if now > last + 100: 39 | last = now 40 | lat = random.randint(35,60) 41 | lon = random.randint(-11,30) 42 | print 'coords: %d,%d' % (lat,lon) 43 | try: 44 | forecast = forecastio.manual('https://api.forecast.io/forecast/%s/%d,%d?exclude=minutely,hourly,daily,flags' % (forecast_io_api_key, lat, lon)) 45 | except: 46 | forecast = None 47 | pass 48 | if forecast != None: 49 | #print forecast.json 50 | 51 | # geohash 3 has a lat/lon error of 0.7, so it should be ok for lat and lon as int 52 | geohash = Geohash.encode(lat, lon, precision=3) 53 | 54 | if forecast.json.has_key('alerts'): 55 | alerts = forecast.json['alerts'] 56 | for alert in alerts: 57 | print alert 58 | ttl = alert['expires'] - now 59 | payloaddict = dict(_type='msg',tst=now,ttl=ttl,prio=2,icon='fa-exclamation-triangle',desc=alert['description'],title=alert['title'], url=alert['uri']) 60 | client.publish('msg/forecast.io/%s' % geohash, payload=json.dumps(payloaddict), qos=2, retain=True) 61 | print 'pub: ' + 'msg/forecast.io/%s' % geohash 62 | else: 63 | if forecast.json.has_key('currently'): 64 | currently = forecast.json['currently'] 65 | weather = '%s' % (currently['summary']) 66 | payloaddict = dict(_type='msg',tst=currently['time'],ttl=24*3600,prio=1,icon='fa-exclamation-triangle',title='Local Weather',desc=weather, url='http://forecast.io') 67 | else: 68 | payloaddict = dict(_type='msg',tst=now,ttl=24*3600,prio=0,icon='fa-exclamation-triangle',desc='no alerts',title='forecast.io', url='http://forecast.io') 69 | client.publish('msg/forecast.io/%s' % geohash, payload=json.dumps(payloaddict), qos=2, retain=True) 70 | print 'pub: ' + 'msg/forecast.io/%s' % geohash 71 | 72 | 73 | -------------------------------------------------------------------------------- /message-feeds/meteoalarmeu-feed.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | __author__ = 'Christoph Krey ' 5 | __copyright__ = 'Copyright 2015-2016 Christoph Krey, OwnTracks' 6 | __license__ = """Eclipse Public License - v 1.0 (http://www.eclipse.org/legal/epl-v10.html)""" 7 | 8 | import Geohash 9 | import os 10 | import json 11 | import time 12 | import datetime 13 | import paho.mqtt.client as mqtt 14 | import random 15 | import feedparser 16 | 17 | mqtt_user = os.getenv("MQTT_USER") 18 | mqtt_pass = os.getenv("MQTT_PASS") 19 | 20 | feedurl = 'http://www.meteoalarm.eu/documents/rss/de.rss' 21 | 22 | client = mqtt.Client() 23 | if mqtt_user is not None: 24 | client.username_pw_set(mqtt_user, password=mqtt_pass) 25 | client.connect("localhost", 1883, 60) 26 | client.loop_start() 27 | 28 | lastrss = 0 29 | latestrss = 0 30 | 31 | while True: 32 | time.sleep(1) 33 | now = int(time.time()) 34 | 35 | if now > lastrss + 60: 36 | lastrss = now 37 | d = feedparser.parse(feedurl) 38 | #print d 39 | newlatestrss = latestrss 40 | for feed in d.entries: 41 | #print feed 42 | if feed.has_key('published_parsed'): 43 | feedtime = time.mktime(feed.published_parsed) 44 | if feedtime > latestrss: 45 | if feedtime > newlatestrss: 46 | newlatestrss = feedtime 47 | # 48 | # todo interpret text for "from" and "to" values 49 | # 50 | payloaddict = dict(_type='msg',tst=int(feedtime),ttl=24*3600,prio=0,icon='fa-rss',desc=feed.summary,title=feed.title,url=feed.link) 51 | # 52 | # todo regions are only given as text (e.g. "Brandenburg und Berlin"). Would need to interpret and calculate geohash 53 | # 54 | client.publish('msg/meteoalarm.eu/u33', payload=json.dumps(payloaddict), qos=2, retain=True) 55 | print 'pub:' + json.dumps(payloaddict) 56 | latestrss = newlatestrss 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /mosquitto-setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #(@)mosquitto-setup.sh - Create a basic Mosquitto configuration w/ TLS 3 | 4 | # Copyright (c) 2013 Jan-Piet Mens 5 | # All rights reserved. 6 | # 7 | # Redistribution and use in source and binary forms, with or without 8 | # modification, are permitted provided that the following conditions are met: 9 | # 10 | # 1. Redistributions of source code must retain the above copyright notice, 11 | # this list of conditions and the following disclaimer. 12 | # 2. Redistributions in binary form must reproduce the above copyright 13 | # notice, this list of conditions and the following disclaimer in the 14 | # documentation and/or other materials provided with the distribution. 15 | # 3. Neither the name of mosquitto nor the names of its 16 | # contributors may be used to endorse or promote products derived from 17 | # this software without specific prior written permission. 18 | # 19 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 | # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 | # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 | # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 | # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 | # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 | # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 | # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 | # POSSIBILITY OF SUCH DAMAGE. 30 | # 31 | # Modifications: Louis T. Getterman IV (@LTGIV) / GotGetLLC.com / opensour.cc 32 | 33 | echo "This program ($0) is deprecated; if you get it working, please submit patches." 34 | exit 2 35 | 36 | # Replace set -e and exit with non-zero status if we experience a failure 37 | trap 'exit' ERR 38 | 39 | # Array of paths to try and use 40 | PATHS=( "/etc/mosquitto/conf.d/" "/etc/mosquitto/" ) 41 | 42 | # Default location - overwritten with preceding path if one of them exists 43 | MOSQHOME=/tmp/mosquitto 44 | 45 | # Mosquitto configuration filename 46 | MOSQCONF=mosquitto.conf 47 | 48 | # Time stamp format for backing up configuration files 49 | tstamp=$(date +%Y%m%d-%H%M%S) 50 | 51 | # Environment variable that can control who owns the files (passed to generate-CA.sh) 52 | MOSQUITTOUSER=${MOSQUITTOUSER:=$USER} 53 | 54 | # Iterate through array of paths to traverse for default location to use 55 | for i in "${PATHS[@]}" 56 | do 57 | if [ -d $i ]; then 58 | export MOSQHOME=$i 59 | break 60 | fi 61 | done 62 | 63 | # Fall back to default /tmp/mosquitto and create this location if it doesn't exist 64 | [ -d $MOSQHOME ] || mkdir $MOSQHOME 65 | 66 | # User that owns mosquitto directory that we're targeting 67 | MOSQUSER=`ls -ld $MOSQHOME | awk '{print $3}'` 68 | 69 | # Check ownership of the path and let us know if there's a permissions problem 70 | if [ $USER != $MOSQUSER ]; then 71 | echo "FYI: File ownership for generated files in '${MOSQHOME}' is set to '${MOSQUITTOUSER}'," 72 | echo "but you are running as '${USER}' and '${MOSQHOME}' can only be modified by '${MOSQUSER}'." 73 | 74 | if [ $MOSQUSER == 'root' ]; then 75 | echo; 76 | echo "The most easy way to fix this error is re-running as 'sudo ${0}'" 77 | fi 78 | 79 | echo; 80 | read -p "Press [Enter] key to continue, or [Ctrl]-C to cancel." 81 | fi 82 | 83 | # Export environment variable to be used in subsequent (generate-CA.sh) 84 | export MOSQUITTOUSER 85 | 86 | # Concat of path and configuration file 87 | MOSQPATH=$MOSQHOME/$MOSQCONF 88 | 89 | # If file exists, move it to a timestamp-based name 90 | if [ -f $MOSQPATH ]; then 91 | echo -n "Saving previous configuration: " 92 | mv -v $MOSQPATH $MOSQHOME/$MOSQCONF-$tstamp 93 | fi 94 | 95 | # Export TARGET variable for use in generate-CA.sh 96 | export TARGET=$MOSQHOME 97 | eval "`dirname \"$0\"`/TLS/generate-CA.sh" 98 | 99 | sed -Ee 's/^[ ]+%%% //' < $MOSQPATH 100 | %%% # allow_anonymous false 101 | %%% autosave_interval 1800 102 | %%% 103 | %%% connection_messages true 104 | %%% log_dest stderr 105 | %%% log_dest topic 106 | %%% log_type error 107 | %%% log_type warning 108 | %%% log_type notice 109 | %%% log_type information 110 | %%% log_type all 111 | %%% log_type debug 112 | %%% log_timestamp true 113 | %%% 114 | %%% #message_size_limit 10240 115 | %%% 116 | %%% #password_file jp.pw 117 | %%% #acl_file jp.acl 118 | %%% 119 | %%% persistence true 120 | %%% persistence_file mosquitto.db 121 | %%% persistent_client_expiration 1m 122 | %%% 123 | %%% #pid_file xxxx 124 | %%% 125 | %%% retained_persistence true 126 | %%% 127 | %%% #listener 1883 128 | %%% listener 1883 127.0.0.1 129 | %%% 130 | %%% listener 8883 131 | %%% tls_version tlsv1 132 | %%% cafile $MOSQHOME/ca.crt 133 | %%% certfile $MOSQHOME/server.crt 134 | %%% keyfile $MOSQHOME/server.key 135 | %%% require_certificate false 136 | !ENDMOSQUITTOCONF 137 | 138 | chmod 640 $MOSQPATH 139 | echo "Please adjust certfile and keyfile path names in $MOSQPATH" 140 | --------------------------------------------------------------------------------