Google Street View in 2026
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:
h3– GitHubjson– built‑inlindel– Community extensionsparquet– built‑inspatial– built‑in
- 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;
| year | count |
|---|---|
| 2003 | 1 |
| 2006 | 1 |
| 2007 | 28 |
| 2008 | 251 |
| 2009 | 659 |
| 2010 | 344 |
| 2011 | 619 |
| 2012 | 792 |
| 2013 | 622 |
| 2014 | 474 |
| 2015 | 661 |
| 2016 | 529 |
| 2017 | 70 |
| 2018 | 142 |
| 2019 | 195 |
| 2020 | 50 |
| 2021 | 267 |
| 2022 | 507 |
| 2023 | 588 |
| 2024 | 290 |
| 2025 | 83 |
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.