DEV Community

dosanko_tousan
dosanko_tousan

Posted on

Hokkaido Should Be Japan's EV Special Zone Vol.5 — Charging Infrastructure Design: The Norway-Beating Hokkaido Model

About the author
dosanko_tousan. 50-year-old stay-at-home dad from Iwamizawa, Hokkaido. Independent AI alignment researcher (GLG Network · Zenodo DOI: 10.5281/zenodo.18691357).


Introduction: "Just Install Chargers" Is Not Enough

Vol.1–4 covered battery physics and operation engineering.

Vol.5 is about infrastructure design.

"Just install chargers" — correct but insufficient. Three questions must be answered for Hokkaido's charging infrastructure to function in winter:

  1. Where — Geographic design to eliminate charging dead zones
  2. How fast — Speed vs. user experience tradeoffs
  3. Does it work in winter? — Equipment specs and maintenance design

Norway achieved 97% EV penetration with 24,000 chargers. Hokkaido's area is about one-quarter of Norway's. Population is about one-tenth.

Question: What would it take for Hokkaido to achieve Norway-level charging density? Is the cost realistic?


1. Norway vs Hokkaido — The Gap in Numbers

from dataclasses import dataclass

@dataclass
class EVInfrastructure:
    name: str
    ev_count: int
    charger_count: int
    area_km2: float
    population: int
    ev_penetration_pct: float

norway = EVInfrastructure("Norway", 700_000, 24_000, 323_802, 5_400_000, 97.0)
hokkaido = EVInfrastructure("Hokkaido", 15_000, 800, 83_424, 5_200_000, 0.6)

def analyze(infra):
    return {
        "ev_per_charger": round(infra.ev_count / infra.charger_count, 1),
        "density_per_1000km2": round(infra.charger_count / infra.area_km2 * 1000, 1),
        "per_100k_pop": round(infra.charger_count / infra.population * 100_000, 1),
    }

print("=" * 60)
print("Norway vs Hokkaido: EV Charging Infrastructure Comparison")
print("Note: Figures are estimates/approximations")
print("=" * 60)

for infra in [norway, hokkaido]:
    a = analyze(infra)
    print(f"\n[{infra.name}]")
    print(f"  EV count            : {infra.ev_count:>10,}")
    print(f"  Charger count       : {infra.charger_count:>10,}")
    print(f"  EV penetration      : {infra.ev_penetration_pct:>10.1f}%")
    print(f"  EVs per charger     : {a['ev_per_charger']:>10.1f}")
    print(f"  Charger density     : {a['density_per_1000km2']:>10.1f} /1000km²")
    print(f"  Chargers per 100k   : {a['per_100k_pop']:>10.1f}")

print("\nCharger density gap: ~8× (Norway 74.1 vs Hokkaido 9.6 per 1000km²)")
print("But: uniform distribution is inefficient.")
print("→ Road-corridor charging gap elimination is the right approach.")
Enter fullscreen mode Exit fullscreen mode

2. Geographic Design — Eliminating Charging Dead Zones

2.1 The Physical Basis for the 50km Spacing Rule

From Vol.1's cold-climate range analysis, worst-case scenario at NAF -31°C:

Vehicle class Winter range (from NAF data) Practical range (SOC 80%→20%)
Best performer ~355 km ~213 km
Average ~306 km ~184 km
Worst (older EVs) ~270 km ~162 km
def charging_interval_physics(
    wltp_range_km: float = 500,
    cold_loss_pct: float = 0.50,   # NAF -31°C worst case
    soc_buffer_pct: float = 0.20,  # 20% reserve on arrival
    soc_start_pct: float = 0.80,   # 80% on departure
    safety_factor: float = 0.80,   # Getting lost, traffic, unexpected drain
) -> dict:
    """
    Safe charging interval calculation

    Designed for worst-case vehicle at worst temperature.
    Infrastructure must serve the most vulnerable user.
    """
    winter_range = wltp_range_km * (1 - cold_loss_pct)
    usable_soc = soc_start_pct - soc_buffer_pct
    practical_range = winter_range * usable_soc
    safe_interval = practical_range * safety_factor
    return {
        "winter_range_km": round(winter_range),
        "practical_range_km": round(practical_range),
        "safe_interval_km": round(safe_interval),
    }

print("=" * 65)
print("Charging Interval Physics (NAF -31°C worst case)")
print("Design for the worst case — infrastructure serves all users")
print("=" * 65)

for wltp in [300, 400, 500, 600]:
    r = charging_interval_physics(wltp_range_km=wltp)
    print(f"\nWLTP {wltp}km:")
    print(f"  Winter range (-31°C, -50%): {r['winter_range_km']}km")
    print(f"  Practical (SOC 80%→20%):    {r['practical_range_km']}km")
    print(f"  Safe charging interval:     {r['safe_interval_km']}km")

print("\n→ 50km spacing rule covers all vehicles including older WLTP-300km EVs")
print("  (WLTP 500km current vehicles: safe interval ~96km, well above 50km)")
Enter fullscreen mode Exit fullscreen mode

"50km spacing rule" is a conservative design for legacy EVs (WLTP ~300km). Modern 500km+ vehicles could manage 100km intervals theoretically — but infrastructure is designed for the most vulnerable user.

2.2 Hokkaido's Secret Weapon: Michi-no-Eki (Roadside Stations)

Japan's "Michi-no-Eki" (道の駅) roadside rest stations function like highway service areas on regular roads. Hokkaido has 129 of them — the most of any prefecture in Japan.

Average spacing: 50–70km along major routes — almost perfectly aligned with the 50km charging interval rule.

def hokkaido_network_plan(
    michi_no_eki: int = 129,        # Hokkaido roadside stations (national record)
    main_road_km: float = 14_000,   # Major road network (estimated)
    target_spacing_km: float = 50,
    current_chargers: int = 800,
    rapid_charger_cost_jpy: int = 8_000_000,  # 50kW, installed
) -> dict:
    required_spots = main_road_km / target_spacing_km
    coverage_pct = min(michi_no_eki / required_spots * 100, 100)
    additional = max(required_spots - michi_no_eki, 0)

    cost_michi = michi_no_eki * rapid_charger_cost_jpy
    cost_additional = additional * rapid_charger_cost_jpy
    total_cost = cost_michi + cost_additional

    return {
        "required_spots": round(required_spots),
        "michi_no_eki_coverage_pct": round(coverage_pct, 1),
        "additional_spots_needed": round(additional),
        "total_cost_jpy": total_cost,
    }

plan = hokkaido_network_plan()

print("=" * 60)
print("Hokkaido Charging Network Plan — Michi-no-Eki as Backbone")
print("Approximate estimates. Detailed site surveys required.")
print("=" * 60)
print(f"\nRequired charging spots (50km spacing): {plan['required_spots']}")
print(f"Michi-no-Eki coverage:                  {plan['michi_no_eki_coverage_pct']}%")
print(f"Additional spots needed:                {plan['additional_spots_needed']}")
print(f"\nTotal cost estimate:  ¥{plan['total_cost_jpy']/1e8:.1f}B (¥{plan['total_cost_jpy']:,})")
print(f"Hokkaido annual budget (~¥1.4T):        {plan['total_cost_jpy']/1.4e12*100:.2f}%")
print(f"\n→ ~¥14B (0.1% of annual budget) largely eliminates charging dead zones")
Enter fullscreen mode Exit fullscreen mode

¥14 billion — 0.1% of Hokkaido's annual budget — to largely eliminate charging dead zones. Hokkaido's 129 michi-no-eki (a national record) are the natural backbone.


3. Winter-Ready Equipment Specifications

3.1 Problems Specific to Hokkaido Winters

Standard chargers don't work in Hokkaido winters:

① Snow burial
   → Connector, panel buried → unusable
   → Fix: Covered installation · snow-melt heaters · elevated mounting

② Freezing
   → Connector/cable freezes → can't insert
   → Fix: Insulated case · heated connector (built-in)

③ Cold-weather equipment failure
   → Power electronics degrade below -20°C · startup fails
   → Fix: Heated equipment enclosure · cold-climate certification

④ Blackout risk (winter storms, earthquakes)
   → EV users stranded without power
   → Fix: UPS · solar+battery backup · V2H capability
Enter fullscreen mode Exit fullscreen mode

3.2 Charger Spec Comparison

from dataclasses import dataclass, field
from typing import List

@dataclass
class ChargerSpec:
    name: str
    power_kw: float
    cold_rated: bool
    has_roof: bool
    has_heating: bool
    has_ups: bool
    cost_jpy: int
    locations: List[str]

specs = [
    ChargerSpec("Standard rapid (50kW)",
                50, False, False, False, False, 5_000_000,
                ["Urban · indoor parking"]),
    ChargerSpec("Cold-climate rapid (50kW)",
                50, True, True, True, False, 8_000_000,
                ["Michi-no-Eki · highways · suburban"]),
    ChargerSpec("Disaster-ready rapid (90kW)",
                90, True, True, True, True, 15_000_000,
                ["Evacuation centers · hospitals · major michi-no-eki"]),
    ChargerSpec("Ultra-rapid (150kW, highway)",
                150, True, True, True, False, 20_000_000,
                ["Highway service areas · major hubs"]),
]

print("=" * 65)
print("Hokkaido Charger Specification Comparison")
print("=" * 65)

for spec in specs:
    charge_time = 60 * 0.6 / spec.power_kw * 60
    features = [f for f, v in [
        ("Cold-certified", spec.cold_rated),
        ("Covered", spec.has_roof),
        ("Heated", spec.has_heating),
        ("UPS", spec.has_ups),
    ] if v]
    print(f"\n[{spec.name}]")
    print(f"  Output: {spec.power_kw}kW · Charge time (20%→80%): {charge_time:.0f}min")
    print(f"  Cost: ¥{spec.cost_jpy:,}")
    print(f"  Features: {', '.join(features) if features else 'Standard only'}")
    print(f"  Best for: {', '.join(spec.locations)}")

print("\n→ Minimum spec for michi-no-eki / highways: Cold-climate rapid (50kW)")
print("  Disaster-designated sites / evacuation centers: 90kW with UPS")
Enter fullscreen mode Exit fullscreen mode

4. ROI Analysis — Why Markets Fail Rural Areas

import numpy as np

def charger_roi(
    daily_sessions: float,
    avg_kwh: float = 25,
    price_jpy_kwh: float = 35,
    install_cost: int = 8_000_000,
    annual_maintenance: int = 300_000,  # includes snow removal, OPEX
    lifespan_years: int = 10,
) -> dict:
    """
    Charger ROI calculation (conceptual)

    Actual returns depend heavily on location, EV penetration, and competition.
    Maintenance includes snow removal — critical for Hokkaido.
    """
    annual_revenue = daily_sessions * avg_kwh * price_jpy_kwh * 365
    annual_cost = annual_maintenance + install_cost / lifespan_years
    annual_profit = annual_revenue - annual_cost
    profitability = annual_revenue / annual_cost
    breakeven = annual_cost / 365 / avg_kwh / price_jpy_kwh

    return {
        "annual_revenue": round(annual_revenue),
        "annual_profit": round(annual_profit),
        "profitability": round(profitability, 2),
        "breakeven_sessions": round(breakeven, 1),
    }

print("=" * 68)
print("Charger ROI by Location Type — Why Markets Fail Rural Areas")
print("Maintenance includes snow removal (Hokkaido essential)")
print("=" * 68)
print(f"{'Location':<30} {'Revenue':>12} {'Profit':>12} {'Profitability':>14}")
print("-" * 68)

locations = [
    ("Highway SA (15 sessions/day)",    15),
    ("Major michi-no-eki (8/day)",       8),
    ("Suburban michi-no-eki (4/day)",    4),
    ("Mountain michi-no-eki (2/day)",    2),
    ("Remote area (0.5/day)",          0.5),
]

for label, sessions in locations:
    r = charger_roi(sessions)
    print(f"{label:<30} {r['annual_revenue']:>10,}¥ {r['annual_profit']:>10,}¥ {r['profitability']:>12.2f}")

print("=" * 68)
print("\n→ Mountain and remote locations: unprofitable (market failure)")
print("  This is WHY Arrow ④ (charging gap subsidy) is needed.")
print("  Markets won't place chargers there — policy must fill the gap.")
Enter fullscreen mode Exit fullscreen mode

5. What to Learn from Norway — Structure, Not Copy-Paste

5.1 Why Norway Really Succeeded

flowchart TD
    A[Norway EV Policy Core] --> B[Purchase incentives\ntax exemptions]
    A --> C[Charging infra\nfront-loaded investment]
    A --> D[Charging non-taxed]
    A --> E[Petroleum fund\nfinancing EV transition]
    C --> F[Chicken-and-egg solved:\ngovernment placed chargers first]
    E --> G[Oil revenue reinvested\ninto post-oil transition — irony]
    style F fill:#1a472a,color:#fff
    style G fill:#1a472a,color:#fff
Enter fullscreen mode Exit fullscreen mode

Most important lesson: Norway designed for simultaneous growth of chargers and vehicles. Japan's current approach ("add chargers after vehicles arrive") reverses this — and explains why EV adoption lags.

5.2 Hokkaido's Advantages Over Norway

Element Norway Hokkaido applicability
Tax exemption on EV purchase ✅ Implemented ❌ National tax — hard for prefecture alone
Charger front-loading ✅ Government-placed first ✅ Possible with prefectural budget
Michi-no-eki network ❌ Doesn't exist 129 sites — national record, ready backbone
Cold-climate coefficient subsidy ❌ No equivalent ✅ Hokkaido-specific policy opportunity
Oil boiler + EV disaster synergy ❌ Less relevant ✅ Unique Hokkaido advantage

Hokkaido's unique position: The michi-no-eki network provides a ready backbone that Norway never had. Paired with oil-boiler disaster resilience — a Hokkaido-specific advantage — the model can exceed Norway in cost-effectiveness.


Vol.5 Summary

Fact 1: Charger density gap is ~8× vs Norway. But uniform distribution is wrong — road-corridor gap elimination is the right target.

Fact 2: Hokkaido's 129 michi-no-eki (national record) align naturally with the 50km charging interval rule. They're the natural backbone.

Fact 3: Michi-no-eki equipping + 151 additional sites covers virtually all charging dead zones. Estimated cost: ~¥14B = 0.1% of Hokkaido's annual budget.

Fact 4: Mountain/remote areas are unprofitable (negative ROI). This market failure is exactly why Arrow ④ (charging gap subsidy) is needed.

Fact 5: Cold-climate certified equipment (covered, heated, cold-rated) is the minimum spec — standard equipment fails in Hokkaido winters.


Series Structure

Vol. Topic Keywords
Vol.1 Cold-climate battery physics Arrhenius · NAF · Five Arrows
Vol.2 Sodium-ion batteries Naxtra · Solvation energy
Vol.3 Solid-state batteries The solid paradox · Interface resistance
Vol.4 Operation engineering Heat pump COP · Preconditioning · V2H
Vol.5 (this) Charging infrastructure Norway comparison · Michi-no-Eki · ROI
Vol.6 Policy proposal (final) Five Arrows · Cost · KPIs · Roadmap

MIT License — All code and concepts free to use, modify, distribute.

Zenodo DOI: 10.5281/zenodo.18691357 · dosanko_tousan + Claude (claude-sonnet-4-6)


"Just install chargers" is where the plan starts, not ends. The physics, geography, and economics tell you where, what spec, and why markets won't do it alone.

Top comments (0)