配信している lat / lng は、元データに入っていた座標か、住所からジオコーディングした座標のどちらかです。
このページでは、その精度をどう見分けるか、そして施設の位置として信用できない座標をどう取り除いているかを説明します。
lat / lng が空になっている行があるのは、その多くが意図的な処理の結果です。
信用できないのは座標だけなので、落とすのも座標だけです。施設名・住所・業種・許可番号はそのまま配信します。
geocoding_level を見れば、その座標が建物レベルか町丁目レベルかを判別できます。
ベクトルタイルは座標を持つ行だけを載せています。座標を落とした行は地図から自動的に消えます。
geocoding_level を見る
座標の精度は geocoding_level 列で判別できます。値が小さいほど位置は大まかです。
| level | 意味 | おおよその誤差 | 配信 |
|---|---|---|---|
| 空欄 | 元データに入っていた緯度経度をそのまま使用 | 公開元によるが、多くは建物レベル | そのまま配信 |
| 8 | 街区・地番レベル | 数十メートル | そのまま配信 |
| 3 | 町丁目の代表点 | 数百メートル | そのまま配信 |
| 2 | 市区町村の代表点 | 数キロメートル | 座標を落とす |
| 1 | 都道府県の代表点 | 数十キロメートル | 座標を落とす |
level の値は normalize-japanese-addresses が返す正規化レベルです。
prefecture 列・city 列で表せる情報しか持っていません。
地図に置くと庁舎の一点に施設が集中し、実在しない密集を作るため、座標を落としています。
次の3種類の座標を、配信前に取り除いています。いずれもレコードは残し、lat / lng / geocoding_level を空にします。
移動販売やキッチンカーの住所は「都内一円」「浜松市内一円」のように、営業できる範囲を書いてあるだけで場所を指していません。 こうした住所に公開元が座標を付けている場合、その座標は施設の位置ではありません。
住所が町名まで解けなかった場合、ジオコーディングは都道府県庁や市役所の位置を返します(geocoding_level が 1 または 2)。
これは施設の位置ではなく「その自治体のどこか」を意味するだけなので、座標を落としています。
必要な情報は prefecture 列・city 列に残っています。
元データの緯度経度には、桁の取り違えや別の自治体の座標の紛れ込みが混ざっていることがあります。 レコードの都道府県と座標の位置が合わないものは、座標を落としています。
同じ施設が複数の公開元に載っている場合や、業種違いの許可レコードとして複数行に分かれている場合、 同じ施設に少しずつ違う緯度経度が付くことがあります。
施設名を正規化して一致し、かつ 50m以内 にある座標は、1点にそろえています。 そろえた先には、そのまとまりの中でもっとも精度の高い座標を使います。 片方が公開元の実測座標、もう片方が住所からのジオコーディング結果という組み合わせが典型で、精度の低い側が引き上げられます。
geocoding_level はそろえた後も書き換えません。
その行の住所から解けた精度は変わらないため、この列は精度の下限を表します。
座標を持たない行が一定数あることを前提に組んでください。地図表示では除外し、集計では市区町村単位に寄せるのが安全です。
ベクトルタイルを使う場合は何もする必要はありません。座標を持つ行だけが入っています。
CSV から自分で描画する場合は、lat / lng が空の行を除外してください。
建物単位の精度が必要な用途では geocoding_level も見て、町丁目の代表点(3)を外すかどうかを判断してください。
-- DuckDB: 建物レベルの座標だけを取り出す SELECT name, address, lat, lng, geocoding_level FROM read_csv_auto('https://food.japan-facilities.com/api/facilities-all.csv') WHERE lat IS NOT NULL -- 空欄(元データの座標)と 8(街区・地番)だけを残す AND (geocoding_level IS NULL OR geocoding_level = 8);
座標の有無で絞ると件数が減ります。市区町村ごとの施設数のような集計では、座標ではなく
prefecture 列・city 列を使ってください。これらは座標を落とした行にも入っています。
-- 市区町村ごとの件数(座標の有無に影響されない)
SELECT prefecture, city, COUNT(*) AS n
FROM read_csv_auto('https://food.japan-facilities.com/api/facilities-all.csv')
GROUP BY prefecture, city
ORDER BY n DESC;