CompareSG

Which estates have the most EV chargers?

Pick your estate and see how many residents share each public charger, from LTA's list of 8 Oct 2026.

28 estates where at least 20,000 people live, A to Z

How many residents share each charger?

Each grey dot is 10 residents. The bolt is one public charging point. Fewer dots means more chargers for the people who live there.

About 1 charger for every 150 residents
481 public chargers at 77 locations72,950 residents58% at HDB blocks and carparks26% fast (DC)

Jurong East

1 charger for every 150 residents

All 28 estates together

1 charger for every 400 residents

10 residents1 public charging point

Jurong East has about 1 public charger for every 150 residents. That is the most chargers per resident of the 28 estates. The 28 estates together average about 1 for every 400.

Which estates have the most chargers for their size?

Each bar is an estate. A longer bar means more chargers for every 1,000 residents. The number on the right is how many residents share one charger. Your estate is in red. Hover or tap a bar for details, and click to pick it.

Jurong East has the most chargers for its size (about 1 for every 150 residents), then Queenstown (200) and Bukit Merah (250); Bukit Timah has the fewest (about 1 for every 1,130), but home chargers are not in LTA's list.

Are the eight “EV-ready” towns ahead?

In 2021, LTA named eight towns to get chargers in all their HDB carparks by 2025. Are they better served than the other 20 estates on this page? First, each group as one big estate. Then, the eight one by one.

The 8 EV-ready towns

1 charger for every 410 residents

3,193 public chargers for 1,316,410 residents

The other 20 estates

1 charger for every 390 residents

7,187 public chargers for 2,814,830 residents

No, not ahead. Together the eight have 1 public charger for every 410 residents, and the other 20 estates have 1 for every 390. Counting only chargers at HDB blocks and carparks, it is 1 for every 560 against 1 for every 550.

The eight, one by one

A longer bar means more chargers for every 1,000 residents. The dashed line is the other 20 estates together, so a bar past the line is ahead of them. Hover or tap a bar for details, and click to pick it.

EV-ready townThe other 20 estates togetherYour pick

One by one: Queenstown is ahead, Jurong West, Tengah, Choa Chu Kang and Ang Mo Kio are about level, and Sembawang, Punggol and Bedok are behind. Within 5% of the other 20 estates counts as level.

Where are the chargers?

Each dot is a place with public chargers. Shading shows chargers per resident in the 28 estates; hatched areas have fewer than 20,000 residents and are not compared. Hover or tap an area, and click an estate to pick it.

Fewer chargers per residentMoreNot comparedCharging location

Jurong East is the darkest estate on the map. Orchard and Downtown Core are hatched: only 1,450 and 5,230 people live there, against 127 and 424 public chargers.

Where do the chargers sit, and how fast are they?

Picture 10 of an estate’s public chargers, one round bolt each. Coloured bolts answer “yes” to the question above them and grey bolts are the rest. Numbers are rounded to the nearest whole bolt.

Are they at an HDB block or carpark?

Coloured bolt: yes, the charger is at a location LTA names after an HDB block or an HDB multi-storey carpark. Grey bolt: anywhere else, such as a mall, petrol station or office, or a place with no name in LTA’s list.

Jurong Eastout of 481 public chargers
6 in 1058% at HDB blocks and carparks
All 28 estatesout of 10,380 public chargers
7 in 1072% at HDB blocks and carparks

Are they fast chargers?

Coloured bolt: yes, a fast DC charger. Grey bolt: a slower AC charger. LTA lists every charging point as one or the other.

Jurong Eastout of 481 public chargers
3 in 1026% are fast (DC)
All 28 estatesout of 10,380 public chargers
1 in 1012% are fast (DC)

Of Jurong East's 481 public chargers, 58% are at HDB blocks and carparks and 26% are fast (DC) chargers. Across the 28 estates, of 10,380 public chargers, 72% are at HDB blocks and carparks and 12% are fast (DC) chargers.

Fun finds

Fewest neighbours, most chargers?
Orchard: 1 charger for every 11 residents
127 public chargers and 1,450 residents. Not compared: fewer than 20,000 people live there.
Biggest estate, most chargers?
Tampines: 795 chargers
Tampines has the most residents (290,090) and the most chargers (795), yet 8 of the 28 estates have more chargers per resident.
Where are the fast chargers?
1 in 7 is a fast charger
1,597 of 11,595 public charging points are fast (DC). Bukit Timah has the highest share of the 28 estates (39%).

The short version

On LTA's list of 8 Oct 2026, public EV chargers are not spread evenly across estates: Jurong East has about 1 for every 150 residents and Bukit Timah about 1 for every 1,130, and the eight towns LTA named “EV-ready” in 2021 have fewer chargers per resident than the other 20 estates (1 for every 410 residents against 1 for every 390).

What we did. We took LTA's list of public charging points (11,595 points at 2,783 locations), placed each location in one of URA's 55 planning areas, and divided each area's residents (SingStat, 2025) by its charging points. We compared the 28 areas with at least 20,000 residents. They hold 98% of residents and 90% of the charging points.

What we found. Jurong East has the most chargers for its size (about 1 for every 150 residents), ahead of Queenstown (200) and Bukit Merah (250). At the other end are Bukit Timah (about 1,130), Tanglin (990), Pasir Ris (660). Taken together, the eight “EV-ready” towns have 1 charger for every 410 residents and the other 20 estates 1 for every 390. One by one, Queenstown is ahead, Jurong West, Tengah, Choa Chu Kang and Ang Mo Kio are about level, and Sembawang, Punggol and Bedok are behind.

What to keep in mind. This counts public chargers per resident, not per electric car, and no estate's car count is published. Home chargers are not in the list, and 28% of the points in the 28 estates are at places other than HDB blocks and carparks, so estates with many of those read higher. It is one snapshot of a list that changes all the time. Use the picker to see your own estate, then check the numbers and the boring bit below.

By Ben (opens in a new tab). Updated . Data: LTA DataMall, EV Charging Points Batch; SingStat, General Household Survey 2025; URA planning areas, data.gov.sg.

Questions people ask

Which estate in Singapore has the most EV chargers per resident?

Of the 28 estates with at least 20,000 residents, Jurong East: 481 public charging points for 72,950 residents, about 1 for every 150. Queenstown (about 1 for every 200) and Bukit Merah (250) follow.

Which estate has the fewest EV chargers per resident?

Bukit Timah, at about 1 public charger for every 1,130 residents, then Tanglin (990) and Pasir Ris (660). The list holds public chargers only, so home chargers are not counted, and it says nothing about how many electric cars are in each estate.

How many public EV charging points are there in Singapore?

11,595 charging points at 2,783 locations in LTA's list of 8 Oct 2026. 9,998 are slower AC points and 1,597 are fast DC points (14%). The biggest single location has 78 points.

Are the eight “EV-ready” towns ahead of the rest?

No, not on this measure. Together the eight have 1 public charger for every 410 residents, against 1 for every 390 in the other 20 estates. One by one, Queenstown is ahead, Jurong West, Tengah, Choa Chu Kang and Ang Mo Kio are about level, and Sembawang, Punggol and Bedok are behind. LTA named them in 2021 as the towns to have chargers in all HDB carparks by 2025. This page counts chargers per resident, not carpark coverage, so it does not say whether that target was met.

Does the list include chargers at condos and landed homes?

It does not appear to. LTA's guide says the file returns all charging points, but it holds 11,595, while the Ministry of Transport put the number deployed at about 30,500 in March 2026. So we treat it as the public network, and private and home chargers are not counted.

Why are Orchard and Downtown Core not compared?

Too few people live there. Orchard has 1,450 residents and 127 public chargers; Downtown Core has 5,230 residents and 424. A per-resident number would say little, so we compare only the 28 of 55 planning areas with at least 20,000 residents.

How is “residents per charger” worked out?

Residents of the planning area (SingStat, 2025) divided by the public charging points inside it. A charging point is one connector, not one location. Residents are citizens and permanent residents, so work-pass holders and visitors are not in the count.

Is an estate the same as an HDB town?

Not exactly. We use URA's planning areas, which share names with most HDB towns but have their own boundaries, so a town's number here can differ from a count by HDB's own boundary.

Will these numbers change?

Yes. LTA's list is refreshed every 5 minutes and the rollout is still going. This page is one snapshot, from 8 Oct 2026.

The numbers behind it

Public EV charging points per resident, the 28 estates with at least 20,000 residents, LTA list of 8 Oct 2026 (most chargers per resident first)
EstateResidentsPublic chargersLocationsResidents per chargerChargers per 1,000 residentsAt HDB blocks and carparksFast (DC)EV-ready town
Jurong East72,950481771526.6277 (58%)125 (26%)
Queenstown101,4804971242044.9220 (44%)101 (20%)Yes
Bukit Merah146,2005811372524.0431 (74%)49 (8%)
Kallang101,720402912534.0282 (70%)48 (12%)
Geylang117,6404341182713.7240 (55%)86 (20%)
Novena53,160181482943.497 (54%)27 (15%)
Clementi104,240300583472.9203 (68%)41 (14%)
Toa Payoh142,2204021083542.8334 (83%)37 (9%)
Tampines290,0907951833652.7528 (66%)106 (13%)
Jurong West253,8406771373752.7546 (81%)48 (7%)Yes
Tengah22,9605883962.558 (100%)16 (28%)Yes
Choa Chu Kang187,550466974022.5396 (85%)13 (3%)Yes
Ang Mo Kio158,7203911074062.5280 (72%)25 (6%)Yes
Bukit Batok165,830403834112.4281 (70%)26 (6%)
Bukit Panjang136,360328624162.4312 (95%)13 (4%)
Sembawang113,350265654282.3168 (63%)61 (23%)Yes
Bishan87,530204574292.3138 (68%)40 (20%)
Woodlands254,4405661544502.2434 (77%)54 (10%)
Yishun228,7304861124712.1357 (73%)25 (5%)
Serangoon116,630244594782.1166 (68%)31 (13%)
Hougang227,2204701234832.1389 (83%)45 (10%)
Marine Parade47,48097264892.053 (55%)16 (16%)
Sengkang267,6004941265421.8433 (88%)32 (6%)
Punggol204,150376995431.8319 (85%)28 (7%)Yes
Bedok274,3604631385931.7365 (79%)50 (11%)Yes
Pasir Ris144,260218686621.5166 (76%)43 (20%)
Tanglin24,63025109851.03 (12%)6 (24%)
Bukit Timah85,90076221,1300.932 (42%)30 (39%)
All 28 estates4,131,24010,3802,4973982.57,508 (72%)1,222 (12%)
The eight “EV-ready” towns against the other 20 estates
GroupResidentsPublic chargersResidents per chargerChargers at HDB blocks and carparksResidents per HDB charger
The eight “EV-ready” towns1,316,4103,1934102,352560
The other 20 estates2,814,8307,1873905,156550
Not compared: planning areas with fewer than 20,000 residents and the most public chargers
AreaResidentsPublic chargersLocations
Downtown Core5,23042489
Orchard1,45012735
Singapore River4,63012518
Outram16,9408920
Rochor12,7908622
Changi1,9606015
Southern Islands2,680417
Sungei Kadut7303810
Museum8203610
Tuas803311
Western Water Catchment5803210
Central Water Catchment0305

The boring bit

Where the data comes from

LTA DataMall's EV Charging Points Batch file, downloaded 8 Oct 2026 (the file's own time stamp is 2026-10-08, 20:35): 11,595 charging points at 2,783 locations, with the operator, plug type and charging speed for each. Planning areas are URA's Master Plan 2019 boundaries, because SingStat's 2025 table uses them. Residents come from SingStat's General Household Survey 2025 (table C020123, rounded to the nearest 10). The list of eight “EV-ready” towns is from LTA's March 2021 news release on deploying charging points, and the 30,500 total is from the Ministry of Transport's reply in Parliament on 5 May 2026.

What is not claimed

  • This is chargers per resident, not per electric car. Car counts by estate are not published, so we cannot say whether any estate has too few chargers.
  • Home and private chargers are not in the list. A low number does not mean residents there cannot charge.
  • Planning areas are not exactly HDB towns, and we make no claim about whether LTA's 2025 target for the eight towns was met.
  • “At HDB blocks and carparks” is worked out from location names starting with “BLK” or naming a multi-storey carpark. 467 points are at locations with no name, so they count in every total but not in that share.
  • “Fast” means LTA lists the charging point as DC; the others are listed as AC. We do not compare speeds beyond that.
  • Residents are citizens and permanent residents. People who work or visit but do not live in an estate are not counted, which is why central areas read high.
  • No operator is ranked, and no prices are shown. This page does not say any estate or operator is better or worse.
  • One snapshot. The list is refreshed every 5 minutes and the rollout is still going, so the numbers will move.

Coverage

All 11,595 points were placed in a planning area (1 location just off the coast went to the nearest area). 28 of 55 areas are compared; they hold 98% of residents and 90% of the charging points.

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

How we did it
Point-in-polygon matchingRate per residentGroupingThreshold ruleCross-check
  1. Read the charging list: LTA's file lists 2,783 locations. Each location has chargers, each charger has plug types, and each plug type has one connector ID per charging point. We counted connector IDs, 11,595 in all, with no repeats.
  2. Placed each location in a planning area by checking which URA boundary contains its coordinates.
  3. Added up charging points per area, plus those at HDB-style names and those that are fast DC.
  4. Took residents from SingStat's table for each planning area and kept the 28 areas with at least 20,000.
  5. Divided residents by charging points, for each estate and for the eight “EV-ready” towns together against the other estates together.
  6. Counted twice. The prep script places locations with shapely and the page counts again with plain Python; the build stops if any area's charging points, locations, HDB-style points, fast points or residents differ.
Show the Python code
"""prep_ev.py: every number on the EV chargers page starts here.

Inputs (all in data/raw/):
  ev.json          LTA DataMall, EV Charging Points Batch file
  pa.geojson       URA Master Plan 2019 Planning Area Boundary (No Sea), data.gov.sg
  pop.json         SingStat table C020123, General Household Survey 2025 (residents by planning area)

    python prep/prep_ev.py --no-download    use the three files already in data/raw/
    python prep/prep_ev.py                  download them first. LTA needs an AccountKey: set LTA_ACCOUNT_KEY, or set LTA_FILE_URL to the
                                            presigned "Link" that the EVCBatch call returns (it works for only a few minutes).

Writes data/ev_numbers.json. page.py counts everything again with plain Python (no shapely) and stops on any difference."""
import json, os, re, sys, urllib.request
from pathlib import Path
from shapely.geometry import shape, Point, box
from shapely.strtree import STRtree

HERE = Path(__file__).resolve().parent.parent
RAW = HERE / "data" / "raw"

MIN_RESIDENTS = 20000      # an area is ranked only if at least this many residents live there
EV_READY_EIGHT = ["Ang Mo Kio", "Bedok", "Choa Chu Kang", "Jurong West", "Punggol", "Queenstown", "Sembawang", "Tengah"]   # LTA news release, March 2021
HDB_NAME = re.compile(r"^BLK |MULTI STOREY CAR PARK")                                                                       # names that point to an HDB block or carpark
LON0, LON1, LAT0, LAT1 = 103.60, 104.09, 1.205, 1.475                                                                       # the map frame
W = 800.0


def fetch(url, dest, headers=None):
    req = urllib.request.Request(url, headers=headers or {"User-Agent": "Mozilla/5.0"})
    with urllib.request.urlopen(req, timeout=120) as r:
        dest.write_bytes(r.read())


def download():
    RAW.mkdir(parents=True, exist_ok=True)
    link = os.environ.get("LTA_FILE_URL")
    if not link:
        key = os.environ["LTA_ACCOUNT_KEY"]
        req = urllib.request.Request("https://datamall2.mytransport.sg/ltaodataservice/EVCBatch", headers={"AccountKey": key, "accept": "application/json"})
        link = json.load(urllib.request.urlopen(req, timeout=60))["value"][0]["Link"]
    fetch(link, RAW / "ev.json")
    u = json.load(urllib.request.urlopen("https://api-open.data.gov.sg/v1/public/api/datasets/d_4765db0e87b9c86336792efe8a1f7a66/poll-download", timeout=60))["data"]["url"]
    fetch(u, RAW / "pa.geojson")
    fetch("https://tablebuilder.singstat.gov.sg/api/table/tabledata/C020123?limit=5000", RAW / "pop.json")


def compute():
    ev = json.load(open(RAW / "ev.json"))
    feats = sorted(json.load(open(RAW / "pa.geojson"))["features"], key=lambda f: f["properties"]["PLN_AREA_N"])
    areas = [(f["properties"]["PLN_AREA_N"].title(), shape(f["geometry"])) for f in feats]
    tree = STRtree([g for _, g in areas])

    def area_of(lon, lat):
        pt = Point(lon, lat)
        for i in tree.query(pt):
            if areas[i][1].contains(pt):
                return areas[i][0], False
        return areas[int(tree.nearest(pt))][0], True      # a point just off the coast: nearest area

    rows = json.load(open(RAW / "pop.json"))["Data"]["row"]
    residents = {}
    for r in rows:
        if r["rowText"].endswith(" - Total"):
            v = [c for c in r["columns"][0]["columns"] if c["key"] == "Total"][0]["value"]
            residents[r["rowText"][:-8].strip().title()] = int(v) if v.isdigit() else 0

    stats = {n: dict(n=n, pts=0, locs=0, hdb=0, dc=0, res=residents.get(n, 0)) for n, _ in areas}
    sites, nearest, unnamed, max_site = [], 0, 0, 0
    for loc in ev["evLocationsData"]:
        a, near = area_of(loc["longtitude"], loc["latitude"])     # (sic) LTA spells the field longtitude
        nearest += near
        pts = dc = 0
        for ch in loc["chargingPoints"]:
            for pt in ch["plugTypes"]:
                k = len(pt["evIds"])                              # one evCpId = one charging point (connector)
                pts += k
                dc += k if pt["current"] == "DC" else 0
        s = stats[a]
        s["pts"] += pts; s["locs"] += 1; s["dc"] += dc
        named_hdb = bool(HDB_NAME.search(loc["name"].upper()))
        s["hdb"] += pts if named_hdb else 0
        unnamed += pts if not loc["name"].strip() else 0
        max_site = max(max_site, pts)
        sites.append((loc["longtitude"], loc["latitude"], pts))

    # ---- map geometry: planning areas simplified, and the locations ----
    kx = W / (LON1 - LON0)
    H = (LAT1 - LAT0) * kx
    proj = lambda lon, lat: ((lon - LON0) * kx, (LAT1 - lat) * kx)
    clip = box(LON0, LAT0, LON1, LAT1)
    out_areas = []
    for n, geom in areas:
        g = geom.intersection(clip).simplify(0.0005, preserve_topology=True)
        polys = [g] if g.geom_type == "Polygon" else list(getattr(g, "geoms", []))
        d = []
        for p in polys:
            if p.geom_type != "Polygon" or p.is_empty:
                continue
            for ring in [p.exterior] + list(p.interiors):
                d.append("M" + "L".join(f"{x:.1f},{y:.1f}" for x, y in (proj(a, b) for a, b in ring.coords)) + "Z")
        if not d:
            continue
        c = g.representative_point(); cx, cy = proj(c.x, c.y)
        s = stats[n]
        out_areas.append(dict(n=n, d="".join(d), cx=round(cx, 1), cy=round(cy, 1), res=s["res"], pts=s["pts"], locs=s["locs"], hdb=s["hdb"], dc=s["dc"]))
    # areas with no drawn outline would break the page's totals
    assert {a["n"] for a in out_areas} == set(stats), "an area has no outline in the map frame"
    locs = []
    for lon, lat, p in sites:
        if LON0 <= lon <= LON1 and LAT0 <= lat <= LAT1:
            x, y = proj(lon, lat); locs.append([round(x, 1), round(y, 1), p])
    return dict(
        updated=ev["LastUpdatedTime"], n_locs=len(sites), n_points=sum(s["pts"] for s in stats.values()), dc_total=sum(s["dc"] for s in stats.values()),
        nearest=nearest, unnamed_pts=unnamed, max_site=max_site, min_residents=MIN_RESIDENTS, ev_ready_eight=EV_READY_EIGHT,
        map=dict(w=W, h=round(H, 1), lon=[LON0, LON1], lat=[LAT0, LAT1]), off_map=len(sites) - len(locs),
        areas=out_areas, locs=locs)


if __name__ == "__main__":
    if "--no-download" not in sys.argv:
        download()
    d = compute()
    (HERE / "data" / "ev_numbers.json").write_text(json.dumps(d, ensure_ascii=False, separators=(",", ":")), encoding="utf-8")
    print("wrote data/ev_numbers.json:", d["n_points"], "points,", d["n_locs"], "locations, list time stamp", d["updated"])

What could make it wrong: a location placed in the wrong neighbouring area, a name that does not say what a place is, or a list that is not the whole public network. As a check, counting only chargers at HDB blocks and carparks, the eight “EV-ready” towns have 1 for every 560 residents against 1 for every 550 in the other 20 estates, so the answer does not change, Jurong East is still the best, and Bukit Timah and Tanglin are the last two.

No machine learning was needed. The questions were “how many” and “where”, which counting and dividing answer directly.

Sources: LTA DataMall, EV Charging Points Batch (dynamic datasets (opens in a new tab)); SingStat, Resident Population by Planning Area/Subzone of Residence, Age Group and Sex, 2025 (opens in a new tab); URA Master Plan 2019 Planning Area Boundary (No Sea), data.gov.sg (opens in a new tab); Ministry of Transport, written reply, 5 May 2026 (opens in a new tab); LTA news release, March 2021, “Accelerating nationwide deployment of electric vehicle charging points”. Downloaded 8 Oct 2026. Contains information from LTA DataMall, made available under the Singapore Open Data Licence (LTA API terms (opens in a new tab)). URA and SingStat data from data.gov.sg and SingStat are also made available under the Singapore Open Data Licence.