データの読み方

座標の品質

配信している lat / lng は、元データに入っていた座標か、住所からジオコーディングした座標のどちらかです。 このページでは、その精度をどう見分けるか、そして施設の位置として信用できない座標をどう取り除いているかを説明します。

lat / lng が空になっている行があるのは、その多くが意図的な処理の結果です。

レコードは消さない

信用できないのは座標だけなので、落とすのも座標だけです。施設名・住所・業種・許可番号はそのまま配信します。

精度は列で分かる

geocoding_level を見れば、その座標が建物レベルか町丁目レベルかを判別できます。

地図には影響しない

ベクトルタイルは座標を持つ行だけを載せています。座標を落とした行は地図から自動的に消えます。

まず geocoding_level を見る

座標の精度は geocoding_level 列で判別できます。値が小さいほど位置は大まかです。

level意味おおよその誤差配信
空欄 元データに入っていた緯度経度をそのまま使用 公開元によるが、多くは建物レベル そのまま配信
8 街区・地番レベル 数十メートル そのまま配信
3 町丁目の代表点 数百メートル そのまま配信
2 市区町村の代表点 数キロメートル 座標を落とす
1 都道府県の代表点 数十キロメートル 座標を落とす

level の値は normalize-japanese-addresses が返す正規化レベルです。

10m 100m 1km 10km 100km 位置の誤差(対数目盛) level 8 街区・地番 〜数十m そのまま配信 level 3 町丁目 〜数百m そのまま配信 level 2 市区町村 数km 座標を落とす level 1 都道府県 数十km
level 2 と 1 は、prefecture 列・city 列で表せる情報しか持っていません。 地図に置くと庁舎の一点に施設が集中し、実在しない密集を作るため、座標を落としています。

取り除いている座標

次の3種類の座標を、配信前に取り除いています。いずれもレコードは残し、lat / lng / geocoding_level を空にします。

1

住所が場所を指していない

移動販売やキッチンカーの住所は「都内一円」「浜松市内一円」のように、営業できる範囲を書いてあるだけで場所を指していません。 こうした住所に公開元が座標を付けている場合、その座標は施設の位置ではありません。

元データ(東京都・891件) キッチンカーA  住所: 都内一円 キッチンカーB  住所: 都内一円 移動販売C    住所: 都内一円 …ほか888件    住所: 都内一円 どれも同じ座標が付いている 地図に置くと 891件が1点に重なる 渋谷区内の1点 処理後 配信するレコード name キッチンカーA address 都内一円 lat (空) lng (空) 施設の情報は残り、地図からは消える
「○○内一円」「○○保健所管内」のように、住所から位置を特定できないレコードが対象です。
2

座標が都道府県・市区町村の代表点しか指していない

住所が町名まで解けなかった場合、ジオコーディングは都道府県庁や市役所の位置を返します(geocoding_level が 1 または 2)。 これは施設の位置ではなく「その自治体のどこか」を意味するだけなので、座標を落としています。 必要な情報は prefecture 列・city 列に残っています。

3

座標が都道府県の外に落ちている

元データの緯度経度には、桁の取り違えや別の自治体の座標の紛れ込みが混ざっていることがあります。 レコードの都道府県と座標の位置が合わないものは、座標を落としています。

元データのレコード prefecture 北海道 address 北海道足寄郡足寄町… lat 34.664413 lng 135.781722 住所は北海道なのに、 座標は約1,000km 離れた場所を指す 行政界と照合 北海道の外 → 座標を落とす 北海道 住所が示す位置 大阪府 座標が指す位置
判定には行政区域データを使い、境界付近は約1kmの余裕を持たせています。 海沿いや埋立地の施設を誤って落とさないためです。

同一施設の座標をそろえている

同じ施設が複数の公開元に載っている場合や、業種違いの許可レコードとして複数行に分かれている場合、 同じ施設に少しずつ違う緯度経度が付くことがあります。

施設名を正規化して一致し、かつ 50m以内 にある座標は、1点にそろえています。 そろえた先には、そのまとまりの中でもっとも精度の高い座標を使います。 片方が公開元の実測座標、もう片方が住所からのジオコーディング結果という組み合わせが典型で、精度の低い側が引き上げられます。

処理前 — 同じ店に2つの座標 公開元A 実測座標 level 空欄 公開元B 住所から推定 level 3 約30m 統一 処理後 — 精度の高い側にそろえる 2件とも同じ座標 実測座標を採用 level 列は各行のまま 採用の優先順位: 元データの座標 → level 8(街区・地番) → level 3(町丁目)。同順位なら中央値
座標が動く距離は50m以下に収まります。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;
1レコード=1つの営業許可です。 同じ施設が業種違いで複数レコードになる場合があります。ユニークな施設数を数えたい場合は、 施設名と座標の組み合わせで重複を除いてください。