address_levels hierarchy inconsistent: 3-level countries have variable depth (LV 62%, SK 55% missing finest level)
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 70/100
- issue の種類
- ドキュメント
- 明瞭さ
- おおむね明確
- 活発さ
- 静か
- 技術スタック
- sql
調査の方向性
address_levels のドキュメントを確認し、提供された DuckDB SQL クエリをリリースデータに対して実行して問題を再現します。関連するガイダンスを更新し、深さが可変であることを説明し、最も細かい値から最も粗い値へ適用する COALESCE パターンを推奨し、postal_city を US のフォールバックとして記載します。完了の条件は、利用者が [3] を前提とせずに都市の値を特定できることです。
索引モデルが issue の本文から書いたものです。
説明
Summary
In the 2026-03-18.0 release, several countries listed with 3 address_levels have a variable number of populated levels. When consumers assume the finest level (index [3]) always contains the city/municipality, they lose significant coverage — up to 62% for Latvia and 55% for Slovakia.
This is similar to #367 (US addresses with NULL address_levels[2]), but affects the 3-level countries more severely.
Affected Countries
3-level countries with variable depth
| Country | Total addresses | level3 populated | level3 NULL (city must come from level2 or level1) | % lost if only checking level3 |
|---|---|---|---|---|
| LV (Latvia) | 548,712 | 208,256 | 340,456 | 62.0% |
| SK (Slovakia) | 1,697,528 | 757,325 | 940,203 | 55.4% |
| EE (Estonia) | 2,228,661 | 2,076,759 | 151,902 | 6.8% |
| IT (Italy) | 25,914,431 | 25,912,438 | 1,993 | <0.01% |
| TW (Taiwan) | 9,630,602 | 9,630,597 | 5 | <0.01% |
Latvia — 3 distinct hierarchy patterns
Pattern 1 (111K): Major cities — only level1 populated
level1=Rīga, level2=NULL, level3=NULL
→ City IS level1 (Rīga)
Pattern 2 (229K): Novads + town — level1 and level2 populated
level1=Jēkabpils nov., level2=Jēkabpils, level3=NULL
→ City IS level2 (Jēkabpils)
Pattern 3 (208K): Novads + pagasts + village — all 3 levels
level1=Olaines nov., level2=Olaines pag., level3=Jāņupe
→ City IS level3 (Jāņupe)
Slovakia — 2 patterns
Pattern 1 (940K): District — level3 NULL
level1=Bratislavský, level2=Bratislava-Ružinov, level3=NULL
→ City IS level2 (Bratislava-Ružinov)
Pattern 2 (757K): Municipality — all 3 levels
level1=Prešovský, level2=Spišská Nová Ves, level3=Spišská Nová Ves
→ City IS level3 (Spišská Nová Ves)
Estonia — 2 patterns
Pattern 1 (152K): Linn (town) — level3 NULL
level1=Ida-Viru maakond, level2=Narva linn, level3=NULL
→ City IS level2 (Narva linn)
Pattern 2 (2.1M): Village/district — all 3 levels
level1=Harju maakond, level2=Tallinna linn, level3=Kesklinn
→ City IS level3 (Kesklinn)
Also: US (related to #367)
The 2-level US data still has 37.6M addresses (30%) with address_levels[2] = NULL. Of those, 85% (32.1M) have postal_city as a fallback, but 5.5M US addresses have no city information at all — no level2 AND no postal_city. Top states affected: TX (1.7M), MS (852K), CA (575K), FL (455K).
Query to Reproduce
-- Shows all country × depth combinations
SELECT country,
len(address_levels) as levels_count,
CASE
WHEN address_levels[3].value IS NOT NULL THEN 'level3'
WHEN address_levels[2].value IS NOT NULL THEN 'level2'
WHEN address_levels[1].value IS NOT NULL THEN 'level1'
ELSE 'none'
END AS finest_populated_level,
count(*) as cnt
FROM read_parquet(
's3://overturemaps-us-west-2/release/2026-03-18.0/theme=addresses/type=address/*',
hive_partitioning=0
)
GROUP BY country, levels_count, finest_populated_level
ORDER BY country, levels_count, finest_populated_level
Suggestion
It would help consumers if the documentation clarified that:
address_levelsdepth is variable within a country — the array length doesn't guarantee all values are populated- The recommended city extraction pattern is a COALESCE cascade (finest → coarsest):
COALESCE(address_levels[3].value, address_levels[2].value, address_levels[1].value) - For US addresses without level2,
postal_cityis the intended fallback (and covers 85%)
This would prevent other consumers from hitting the same issue we did when building a geocoder on top of this data.
Environment
- Release:
2026-03-18.0 - Queried via DuckDB 1.5 + MotherDuck
- 39 countries, 469M addresses total
- 主要言語
- Python
- スター
- 1.2k
- フォーク
- 48
- 平均マージ
- 56分
- マージ済み PR(30日)
- 2
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
OvertureMaps/data のほかの issue
-
external
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
OvertureMaps/data#584 ·
-
Places (FI): ~90 duplicate, misplaced, non-pharmacy or closed features in the pharmacy categoryオープンexternal
難易度 4/5 3〜5日 初心者へのやさしさ 49/100
OvertureMaps/data#585 ·
-
external
難易度 4/5 3〜5日 初心者へのやさしさ 22/100
OvertureMaps/data#583 ·
-
data-sources external
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
OvertureMaps/data#581 ·
-
bug external
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
OvertureMaps/data#580 · コメント 1 件 ·
OvertureMaps/data の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
ansys/pyansys-common-mcp#213 ·
メンテナーはふだん 3 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
freedomofpress/dangerzone#1594 ·
メンテナーはふだん 3 日以内に返信
-
priority:P1 status:in-review type:bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
randomparity/kdive#3317 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
area:ci
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
mesonbuild/meson#16281 ·
メンテナーはふだん 1 日以内に返信