Google Street View in 2026

Published: (February 26, 2026 at 12:38 PM EST)
4 min read

Source: Hacker News

Introduction

Last year, I came across a dataset documenting Google’s global Street View coverage. Each point in this dataset includes the year and month of that point’s last capture.

In this post, I’ll convert the dataset into Parquet and examine its geospatial patterns.

Environment

  • CPU: 5.7 GHz AMD Ryzen 9 9950X (16 cores, 32 threads)
  • Cache: 1.2 MB L1, 16 MB L2, 64 MB L3
  • RAM: 96 GB DDR5 @ 4,800 MT/s
  • Storage: Crucial T700 4 TB NVMe M.2 SSD (read up to 12,400 MB/s) with heatsink
  • Power: 1,200 W fully modular Corsair PSU
  • Motherboard: ASRock X870E Nova 90
  • OS: Ubuntu 24 LTS via Microsoft’s Ubuntu for Windows on Windows 11 Pro (GPU driver considerations)
  • GPU: Nvidia GTX 1080 (better Windows driver support)

Tools

  • DuckDB v1.4.3 with extensions:
  • QGIS v3.44 for map rendering (using the HCMGIS plugin for Esri basemaps)

Installing DuckDB and Extensions

cd ~
wget -c https://github.com/duckdb/duckdb/releases/download/v1.4.3/duckdb_cli-linux-amd64.zip
unzip -j duckdb_cli-linux-amd64.zip
chmod +x duckdb
./duckdb
INSTALL h3 FROM community;
INSTALL lindel FROM community;
INSTALL json;
INSTALL parquet;
INSTALL spatial;

Add the extensions to every DuckDB session:

vi ~/.duckdbrc
.timer on
.width 180
LOAD h3;
LOAD lindel;
LOAD json;
LOAD parquet;
LOAD spatial;

Downloading the Data

mkdir -p ~/emily_biz
cd ~/emily_biz
wget -r -A json https://geo.emily.bz/coverage-dates

The download yields 131 JSON files (≈ 647 MB uncompressed), last refreshed on December 4th.

Example Record

jq -S .customCoordinates[0] geo.emily.bz/coverage-dates/aland.json
{
  "extra": {
    "tags": [
      "2009-08"
    ]
  },
  "lat": 60.023421733271704,
  "lng": 20.58331925203021
}

Importing into DuckDB

./duckdb street_view.duckdb
CREATE OR REPLACE TABLE street_view (
    geometry   GEOMETRY,
    updated_at DATE
);
for FILENAME in geo.emily.bz/coverage-dates/*.json; do
  echo $FILENAME
  echo "
      INSERT INTO street_view
          WITH a AS (
              SELECT UNNEST(customCoordinates) a
              FROM   READ_JSON('$FILENAME'))
          SELECT geometry:   ST_POINT(a.lng, a.lat),
                 updated_at: (a.extra.tags[-1] || '-01')::DATE
          FROM   a
          WHERE  a.extra.tags[-1] LIKE '2%'" \
      | ./duckdb street_view.duckdb
done

Exporting to Parquet

./duckdb street_view.duckdb
COPY (
    FROM street_view
    ORDER BY HILBERT_ENCODE(
        [ST_Y(ST_CENTROID(geometry)),
         ST_X(ST_CENTROID(geometry))]::DOUBLE[2])
) TO 'street_view.parquet' (
    FORMAT 'PARQUET',
    CODEC  'ZSTD',
    COMPRESSION_LEVEL 22,
    ROW_GROUP_SIZE 15000
);

The resulting Parquet file is 85 MB and contains 7,163,407 rows.

Note: Data for Bosnia & Herzegovina, Cyprus, Namibia, Paraguay, and Vietnam are missing in this release.

Summary Statistics

./duckdb
SELECT
    year:  YEAR(updated_at),
    count: CEIL((COUNT(*) / 1000))::INT
FROM 'street_view.parquet'
GROUP BY 1
ORDER BY 1;
yearcount
20031
20061
200728
2008251
2009659
2010344
2011619
2012792
2013622
2014474
2015661
2016529
201770
2018142
2019195
202050
2021267
2022507
2023588
2024290
202583

Visualizations

Europe

Darker colours indicate points updated closer to 2007; brighter colours indicate updates closer to December of last year.

India & Southeast Asia

Coverage map for the Indian subcontinent and surrounding Southeast Asian countries.

Australia & New Zealand

Coverage map for Australia and New Zealand.

North America

Coverage map for the United States, Canada, and Mexico.

Latin America & the Caribbean

Coverage map for Central and South America, plus the Caribbean region.

0 views
Back to Blog

Related posts

Read more »

When does MCP make sense vs CLI?

I’m going to make a bold claim: MCP is already dying. We may not fully realize it yet, but the signs are there. OpenClaw doesn’t support it. Pi doesn’t support...