CompareSG

Which MRT station has the most bicycle racks?

Pick your station to see its bicycle racks, how many are sheltered, and how it compares with the middle station. LTA's list of 12 Oct 2026 names 35,502 racks at 153 stations.

All 183 MRT and LRT stations. A station shows none when LTA lists no racks under its name.

How many bicycle racks does your station have?

Racks LTA lists under the station's name, such as TAMPINES MRT C3. Sheltered is LTA's yes or no for cover from the weather.

2,057bicycle racks at Tampines station
Sheltered
510
racks with cover from the weather
Not sheltered
1,547
racks in the open
MRT stationPlace 1 of 15325% sheltered

About 2 in 10 are sheltered. Tampines has 13 times the racks of the middle station (158). The average station has 232.

ShelteredNot sheltered

Tampines has 2,057 racks: 510 sheltered and 1,547 in the open (25% sheltered).

Which stations have the most racks?

Each row is a station, biggest first. A longer bar means more racks. The solid part is sheltered and the hatched part is not. Hover or tap a row for details, and click to pick it.

ShelteredNot shelteredYour station

Tampines has the most racks of the 153 stations that have any: 2,057.

How uneven is it?

The 100 dots are all 35,502 racks. The bars are the 153 stations with racks, biggest on the left. The middle station has as many stations above it as below it.

28 of every 100 racks are at the 10 biggest stations. The 76 smallest stations hold 16 of every 100.

Middle station: 158 racksAverage: 232 racksYour station

Half of the 153 stations have 158 racks or fewer, and Tampines, the biggest, has 2,057: 13 times the middle. Only 52 stations are above the average of 232. Tampines (in red) is above the middle line.

How many racks are sheltered?

Solid is sheltered and hatched is not. Each dot below is one rack in every ten.

All 153 stations
9%
of 35,502 racks are sheltered
Station by station
129 of 153
stations have no sheltered rack at all. 2 have every rack sheltered and 22 have some.
MRT stations138 stations · 34,956 racks9%sheltered
LRT stations15 stations · 546 racks0%sheltered

Biggest with no shelter

Stations with 100 or more racks and none sheltered

79 stations in all, 73 more in the table.

Biggest with most racks sheltered

Stations with 100 or more racks, 8 in 10 or more sheltered

3 stations in all.

At Tampines, 25% of the 2,057 racks are sheltered. Across all stations 9% are, and across MRT stations as a group 9%.

Where are the racks?

One circle per station, sized by its racks. Dashed rings are stations with none in the list. Hover or tap a circle for details, and click to pick it.

Station (bigger means more racks)No racks in the listYour station

Tampines is the red circle: 2,057 racks, 25% sheltered.

Fun finds

Which station has the most racks in the open?
Tampines: 1,547 not sheltered
Of Tampines' 2,057 racks, 510 have cover. Its open racks alone outnumber all the racks at Yishun (1,080), the second biggest station.
Big station, no cover at all?
Woodlands: 1,046 racks, none sheltered
79 stations with 100 or more racks have no sheltered rack. Only 24 of the 153 stations with racks have any, and 2 have every rack sheltered: Orchard and Orchard Boulevard.
Do LRT stations have racks?
Only 15 of 41 LRT stations are in the list
Those 15 hold 546 racks between them, about 36 each, and none is sheltered. The 138 MRT stations with racks hold 34,956, about 253 each.

The short version

LTA's list of 12 Oct 2026 names 35,502 bicycle racks at 153 stations, and 9% of them are sheltered. Tampines has the most (2,057 racks), 13 times the middle station (158), and the 10 biggest stations hold 28 of every 100 racks.

What we did. On 12 Oct 2026 we downloaded LTA's bicycle parking list for the area around every MRT and LRT station (19,362 rows). 657 of them are LTA's own racks or yellow-box spaces with a station in the name, such as TAMPINES MRT C3 or SENGKANG MRT YB_1. We added those up by station, with the racks marked sheltered. 153 of the 183 stations have racks, and 30 do not.

What we found. The middle station has 158 racks and the average is 232, because a few stations are far bigger: Tampines has 2,057. 9% of racks are sheltered. 129 stations have none sheltered, including Woodlands, Sembawang and Admiralty. 2 have every rack sheltered. LRT stations have fewer racks each (36, against 253 at MRT stations), and 0% of them are sheltered, against 9%.

What to keep in mind. We count only racks LTA names after a station. Racks that belong to HDB and others, or sit under a bus interchange or street name, are not counted, so a station can have more racks nearby than shown. The list has no date of its own. We count racks, not how many are used, and the list says nothing about why some stations have more. Use the picker to see your own station, then check the numbers and the boring bit below.

By Ben (opens in a new tab). Updated . Data: LTA DataMall bicycle parking (downloaded 12 Oct 2026); LTA MRT and LRT station exits on data.gov.sg.

Questions people ask

How many bicycle racks are there at MRT stations in Singapore?

LTA's list, downloaded on 12 Oct 2026, names 35,502 bicycle racks after 153 stations: 138 MRT stations (34,956 racks) and 15 LRT stations (546). 30 of the 183 stations have none under their name.

Which MRT station has the most bicycle racks?

Tampines, with 2,057. Then Yishun (1,080), Woodlands (1,046), Sembawang (893) and Admiralty (891). The 10 biggest stations hold 28 of every 100 racks.

How many bicycle racks are sheltered?

3,258 of 35,502, or 9%. The other 32,244 are in the open. 2 stations have every rack sheltered, 22 have some, and 129 have none.

Which MRT stations have no sheltered bicycle parking?

129 of the 153 stations with racks have no sheltered rack in the list. Of those with 100 or more racks, the biggest are Woodlands, Sembawang, Admiralty and Lakeside. Woodlands has 1,046 racks and none is sheltered.

Which MRT station has the most sheltered racks?

Yishun, with 662 sheltered racks (of 1,080). Then Tampines (510) and Marine Parade (364).

Do LRT stations have bicycle racks?

Only 15 of the 41 LRT stations have racks listed under their name, 546 in all, and none of them is sheltered. The 138 MRT stations with racks hold 34,956. LRT racks may belong to someone else, such as HDB, and so fall outside this count.

Why does my station show no bicycle racks?

We count the racks LTA names after a station, such as TAMPINES MRT C3. Racks that belong to others (HDB, town councils, parks and so on) are not counted, and racks listed under a bus interchange or a street name are left out. 30 stations show none.

What is the middle station?

List the 153 stations that have racks from fewest to most. The middle one is number 77, with 158 racks. Half of the stations have fewer, half have more. We use it because a few big stations pull the average up to 232.

Does this say whether the racks are full?

No. It counts racks, not how many are used, and says nothing about how busy a station is. The list has no date of its own; we downloaded it on 12 Oct 2026.

How were the racks matched to stations?

LTA's list has 19,362 rows near the stations, each with an owner type, a name, a location, a rack count and a sheltered yes or no. 657 rows are LTA's own racks or yellow-box spaces with a station in the name, such as TAMPINES MRT C3 or SENGKANG MRT YB_1. We added those up by station. All of them are within 271 m of that station's nearest exit.

Why not count every rack in the list?

Within 800 m of the stations the list holds 210,812 racks, but 18,653 of its 19,362 rows belong to HDB, parks, schools and others, or are yellow-box spaces with no station in the name, and many are beside blocks and bus stops, not stations. Counting them would credit those racks to MRT stations.

The numbers behind it

Bicycle racks by station in LTA's list of 12 Oct 2026 (most racks first)
StationTypeRacksShelteredNot shelteredShare shelteredPlace
TampinesMRT2,0575101,54725%1
YishunMRT1,08066241861%2
WoodlandsMRT1,04601,0460%3
SembawangMRT89308930%4
AdmiraltyMRT89108910%5
LakesideMRT86608660%6
AljuniedMRT840727689%7
SengkangMRT81308130%8
Boon LayMRT68520847730%9
Tampines EastMRT63013449621%10
KhatibMRT62706270%11
Paya LebarMRT56415441027%12
Choa Chu KangMRT55905590%13
CanberraMRT52605260%14
PunggolMRT51419432038%15
Bedok NorthMRT50205020%16
Yew TeeMRT47004700%17
Pasir RisMRT46004600%18
MacphersonMRT44404440%19
Bukit GombakMRT44204420%20
Marine ParadeMRT4363647283%21
MayflowerMRT43404340%22
Ang Mo KioMRT42004200%23
SimeiMRT416104062%24
Outram ParkMRT39203920%25
EunosMRT37403740%26
Bedok ReservoirMRT36603660%27
CaldecottMRT36103610%28
KranjiMRT3576029717%29
NewtonMRT334303049%30
LentorMRT33003300%31
SpringleafMRT32903290%32
Tan Kah KeeMRT324183066%33
Jurong EastMRT32003200%34
Woodlands SouthMRT31403140%35
KallangMRT30703070%36
ExpoMRT303242798%37
KembanganMRT29402940%38
Gardens by the BayMRT28802880%39
Kaki BukitMRT28702870%40
BishanMRT28002800%41
Tanjong KatongMRT28002800%41
Bukit PanjangMRT2787620227%43
Upper ChangiMRT27402740%44
Tanah MerahMRT26602660%45
BendemeerMRT25902590%46
BuangkokMRT25602560%47
Tampines WestMRT25402540%48
HougangMRT25302530%49
StadiumMRT24902490%50
Marina BayMRT24402440%51
Tai SengMRT24002400%52
Joo KoonMRT2303219814%53
Bright HillMRT22602260%54
BayshoreMRT2142041095%55
Chinese GardenMRT21302130%56
Geylang BahruMRT21302130%56
Woodlands NorthMRT21202120%58
MattarMRT21102110%59
Marine TerraceMRT210202896%60
Jalan BesarMRT20702070%61
Botanic GardensMRT20002000%62
Marina South PierMRT20002000%62
HillviewMRT19601960%64
Potong PasirMRT1962017610%64
BedokMRT19201920%66
CashewMRT19201920%66
King Albert ParkMRT19201920%66
Little IndiaMRT18201820%69
BencoolenMRT18001800%70
Bukit BatokMRT17601760%71
MaxwellMRT17201720%72
Katong ParkMRT17101710%73
MountbattenMRT16401640%74
Telok AyerMRT16401640%74
BugisMRT16001600%76
StevensMRT158609838%77
UbiMRT15101510%78
SiglapMRT14801480%79
Boon KengMRT1422811420%80
KovanMRT13801380%81
One-northMRT13801380%81
Tanjong PagarMRT13801380%81
Lorong ChuanMRT13401340%84
Shenton WayMRT13401340%84
Beauty WorldMRT13301330%86
MarsilingMRT13201320%87
HavelockMRT13001300%88
Tuas LinkMRT13001300%88
Fort CanningMRT12601260%90
DowntownMRT12401240%91
Farrer ParkMRT12001200%92
LavenderMRT12001200%92
Yio Chu KangMRT12001200%92
SerangoonMRT11301130%95
Upper ThomsonMRT11201120%96
Sixth AvenueMRT10701070%97
PioneerMRT10201020%98
NapierMRT10001000%99
DakotaMRT960960%100
BartleyMRT940940%101
Great WorldMRT94266828%101
MarymountMRT930930%103
BraddellMRT920920%104
Tuas West RoadMRT910910%105
Pasir PanjangMRT900900%106
OrchardMRT88880100%107
Farrer RoadMRT860860%108
Holland VillageMRT860860%108
Labrador ParkMRT850850%110
Buona VistaMRT800800%111
Haw Par VillaMRT800800%111
Kent RidgeMRT800800%111
Telok BlangahMRT800800%111
Phoenix LRTLRT780780%115
Tanjong RhuMRT73403355%116
ChinatownMRT700700%117
WoodleighMRT700700%117
Kadaloor LRTLRT600600%119
Nicoll HighwayMRT600600%119
Senja LRTLRT580580%121
RochorMRT560560%122
QueenstownMRT530530%123
Dhoby GhautMRT520520%124
Raffles PlaceMRT520520%124
Fajar LRTLRT510510%126
Gul CircleMRT500500%127
South View LRTLRT500500%127
Teck Whye LRTLRT500500%127
Fernvale LRTLRT480480%130
DoverMRT460460%131
CommonwealthMRT440440%132
Orchard BoulevardMRT42420100%133
HarbourfrontMRT400400%134
SomersetMRT400400%134
Segar LRTLRT380380%136
Keat Hong LRTLRT360360%137
Tuas CrescentMRT360360%137
ClementiMRT340340%139
RedhillMRT320320%140
Bras BasahMRT280280%141
Clarke QuayMRT280280%141
Toa PayohMRT270270%143
EsplanadeMRT220220%144
Jelapang LRTLRT210210%145
City HallMRT130130%146
Nibong LRTLRT130130%146
Oasis LRTLRT130130%146
Pending LRTLRT120120%149
Tiong BahruMRT120120%149
Coral Edge LRTLRT100100%151
PromenadeMRT100100%151
Punggol Point LRTLRT8080%153
MRT and LRT stations compared
TypeStations with racksRacksShelteredNot shelteredShare shelteredStations with none
MRT13834,9563,25831,6989%4
LRT1554605460%26
Stations with no racks under their name in the list
StationType
Bakau LRTLRT
Bangkit LRTLRT
BayfrontMRT
Bukit Panjang LRTLRT
Changi AirportMRT
Cheng Lim LRTLRT
Choa Chu Kang LRTLRT
Compassvale LRTLRT
Cove LRTLRT
Damai LRTLRT
Farmway LRTLRT
Kangkar LRTLRT
Kupang LRTLRT
Layar LRTLRT
Marina SouthMRT
Meridian LRTLRT
NovenaMRT
Petir LRTLRT
Punggol LRTLRT
Ranggung LRTLRT
Renjong LRTLRT
Riviera LRTLRT
Rumbia LRTLRT
Sam Kee LRTLRT
Samudera LRTLRT
Soo Teck LRTLRT
Sumang LRTLRT
Teck Lee LRTLRT
Thanggam LRTLRT
Tongkang LRTLRT

The boring bit

Where the data comes from

Racks: LTA DataMall's bicycle parking service, asked on 12 Oct 2026 for every rack within 800 m of each of the 183 station points. After removing repeats that gave 19,362 rows. Each row has an owner type (LTA, HDB, a town council, a park and so on), a name, a location, a rack count and a sheltered yes or no. The rows carry no date, so we call the list as downloaded on 12 Oct 2026. Stations: LTA's MRT Station Exit file on data.gov.sg, with every exit of every station. Seven exit records carry only a station code (CC9, DT18, DT4, NE18, CC30, CC31 and CC32) instead of a station name, so we left them out.

An older LTA file on data.gov.sg (stamped July 2019) also counts bicycle racks. It has no owner or name for its racks, so it cannot be compared with this list, and we did not use it.

What is not claimed

  • We count only racks that LTA owns and names after a station. A rack beside a station that belongs to HDB or another owner is not counted for that station.
  • Racks listed under a bus interchange, a street or a bus stop are left out, even when they are close to a station.
  • A station and its neighbour with the same site name, such as an MRT and an LRT station, are counted apart: the MRT or LRT in the rack's name decides.
  • Sheltered is LTA's own yes or no for each row. We do not know what kind of cover it is, or how it was decided.
  • The count is of racks as the list gives them (its rack count field), not bicycles, and not how many racks are in use.
  • The middle station and the average are for the 153 stations with racks. They leave out the 30 stations with none.
  • We do not say why some stations have more racks or more cover than others.

Coverage

657 rows are used, for 35,502 racks. 18,653 of the 19,362 rows belong to other owners (HDB, parks, schools and so on), or are yellow-box spaces at bus stops, blocks and streets with no station in the name, and are left out. 52 LTA rows are left out because no station is in the name. Of those, 4 rows (569 racks) name an MRT station that is not in the exit file or is spelt differently: Prince Edward Road MRT 1 (184), Punggol Coast MRT Level 2 (151), Punggol Coast MRT Level 1 (214) and Pending MRT A (20). Every row used is within 271 m of an exit of its station, and 93 of every 100 rows are within 100 m.

Report an error. Corrections are logged publicly with a date.

How we did it
Nearest-exit matchingSums by stationMiddle and average
  1. Read the rack list and kept each row's owner type, name, location, rack count and sheltered yes or no.
  2. Read the station exit file and grouped the exits by station name.
  3. Kept LTA's own racks and yellow-box spaces whose name has a station in it (for example "TAMPINES MRT C3", "SENGKANG MRT YB_1" or "KADALOOR LRT A") and gave each to that station.
  4. Added up racks and sheltered racks for each of the 183 stations.
  5. Found the middle and the average across the 153 stations with racks.
Show the Python code
"""Bicycle racks at MRT and LRT stations: take the racks LTA names after a station and add them up for each station.
Run: python3 -I prep/prep_racks.py <data folder> <out json>
Reads <data folder>/BicycleParking_raw.json (LTA DataMall bicycle parking, downloaded 12 Oct 2026) and LTAMRTStationExitGEOJSON.geojson."""
import json, re, math, sys, collections
from pathlib import Path
RAW = Path(sys.argv[1]); OUT = Path(sys.argv[2])
STATION_TYPES = ('MRT_RACKS', 'LTA_RACKS', 'LTA_YELLOWBOX')   # the types LTA uses for its own racks; the others belong to HDB, parks, schools and so on
YELLOW = 'Yellow Box'   # LTA's yellow-box spaces (most are at bus stops or HDB blocks): kept only when the name has a station in it

def read_stations():
    ex = collections.defaultdict(list)
    for f in json.load(open(RAW / 'LTAMRTStationExitGEOJSON.geojson'))['features']:
        n = f['properties']['STATION_NA']
        if 'STATION' in n:                      # 7 exits carry only a station code; they are left out
            ex[n].append(tuple(f['geometry']['coordinates'][:2]))
    return ex

def metres(a, b):
    return math.hypot((a[0] - b[0]) * 111320 * math.cos(math.radians(1.35)), (a[1] - b[1]) * 110570)

def nice(n):
    kind = 'LRT' if ' LRT ' in n else 'MRT'
    base = re.sub(r' (MRT|LRT) STATION$', '', n)
    words = [w.capitalize() if w not in ('OF',) else w.lower() for w in base.split(' ')]
    return ' '.join(words), kind, base

def station_of(description, lookup):
    """'TAMPINES MRT C3' -> Tampines MRT; 'KADALOOR LRT A' -> Kadaloor LRT; 'HAVELOCK_MRT_1' -> Havelock; None if no station is named."""
    d = re.sub(r'\s+', ' ', description.upper().replace('_', ' ')).strip()
    m = re.match(r'^(?:OPP |OPPOSITE )?(.+?) (MRT|LRT|STATION)\b', d)
    if not m: return None
    base, word = m.group(1), m.group(2)
    return lookup.get((base, 'LRT' if word == 'LRT' else 'MRT'))

if __name__ == '__main__':
    feed = json.load(open(RAW / 'BicycleParking_raw.json'))
    ex = read_stations()
    lookup, info = {}, {}
    for k in ex:
        name, kind, base = nice(k)
        lookup[(base, kind)] = k
        info[k] = (name, kind)
    agg = {k: dict(n=0, sh=0, pts=0) for k in ex}
    used, left_out, far, missing = 0, collections.Counter(), [], []
    for r in feed:
        if r['RackType'] not in STATION_TYPES and r['RackType'] != YELLOW:
            left_out['other owners'] += 1; continue
        k = station_of(r['Description'], lookup)
        if not k and r['RackType'] == YELLOW:
            left_out['other owners'] += 1; continue
        if not k:
            left_out['no station named'] += 1
            if re.search(r'\b(MRT|LRT)\b', r['Description'].upper().replace('_', ' ')): missing.append((r['Description'], int(r['RackCount'])))
            continue
        a = agg[k]; n = int(r['RackCount'])
        a['n'] += n; a['pts'] += 1; used += 1
        if r['ShelterIndicator'] == 'Y': a['sh'] += n
        far.append(min(metres((r['Longitude'], r['Latitude']), p) for p in ex[k]))
    rows = []
    for k, a in agg.items():
        name, kind = info[k]
        rows.append(dict(key=k, name=name, kind=kind, n=a['n'], sh=a['sh'], pts=a['pts'],
                         lon=sum(p[0] for p in ex[k]) / len(ex[k]), lat=sum(p[1] for p in ex[k]) / len(ex[k]), exits=len(ex[k])))
    tot = sum(r['n'] for r in rows)
    json.dump(dict(rows=rows, total=tot, feed=len(feed), feed_racks=sum(int(r['RackCount']) for r in feed), records=used,
                   other=left_out['other owners'], unnamed=left_out['no station named'],
                   unnamed_racks=sum(int(r['RackCount']) for r in feed if r['RackType'] in STATION_TYPES and not station_of(r['Description'], lookup)),
                   missing=missing, within=dict((m, sum(1 for d in far if d <= m)) for m in (100, 200, 300, 500)), farthest=round(max(far))),
              open(OUT, 'w'))
    print('stations', len(rows), 'with racks', sum(1 for r in rows if r['n']), 'station rows', used, 'racks', tot, 'left out', dict(left_out), 'farthest m', round(max(far)))

What could make it wrong: a rack name that points to the wrong station, a rack added or moved after 12 Oct 2026, or a sheltered mark that is out of date. As a check, the racks added up by station equal the 35,502 in the 657 rows used, and a second count written separately gives the same.

No machine learning was needed. The question was "how many racks, and how many sheltered", which adding up answers directly.

Sources: LTA DataMall, Bicycle Parking (opens in a new tab) and LTA MRT Station Exit (opens in a new tab), both downloaded 12 Oct 2026. Contains information from LTA DataMall and data.gov.sg, made available under the Singapore Open Data Licence (LTA API terms).