座標が 0, 0 になってしまうのはなぜ? — Null Island に落ちるデータの原因と、CSV・GISでの見分け方

,

座標が 0, 0 になってしまうのはなぜ? — Null Island に落ちるデータの原因と、CSV・GISでの見分け方

座標が 0, 0 になってしまうのはなぜ? — Null Island に落ちるデータの原因と、CSV・GISでの見分け方

地図に落としたら、点の一部がアフリカ西方の大西洋に飛んでいた——原因はほぼ例外なく、緯度経度が 0, 0 になっているデータです。0, 0 は「座標が無い」ではなく「赤道と本初子午線の交点」という実在する正しい座標なので、多くのソフトはエラーを出さずにそこへ描画します。この記事では、0, 0 が生まれる典型的な原因を並べ、CSV とGISの両方での見つけ方・直し方をまとめます。

そこに島は無い——「Null Island」という呼び名

北緯0度・東経0度は、アフリカ大陸の西、ギニア湾の沖合にあたる大西洋上です。陸地はありません。それでも GIS の世界でここが有名なのは、壊れたデータが集まる場所だからです。

公開GISデータセットの Natural Earth が、ここに1辺1kmほどの架空の島を “Null Island” として収録したことで呼び名が広まりました。目的は観光ではなく品質管理で、地図上にこの島の周りに点が集まっていれば「変換や取り込みのどこかで座標が落ちた」とひと目で分かる、という仕掛けです。

余談として、この地点には実在する構造物が1つあります。米・仏・ブラジルが共同で運用する熱帯大西洋の係留ブイ網 PIRATA の観測ブイ(通称 Soul、識別番号 13010)が、赤道と本初子午線の交点にちょうど係留されています。「Null Island に唯一ある建造物」と呼ばれるのはこのブイです。

なぜエラーにならないのか

ここが 0, 0 の厄介なところです。

  • 緯度0度・経度0度は値域の内側(緯度は−90〜90、経度は−180〜180)。範囲チェックを通過します
  • 多くの言語・DBで、数値型の初期値・欠測の埋め草が 0 です。文字列 "" を数値に変換すると 0 になる処理系も多い
  • 日本の地図しか表示していない画面では、0, 0 の点は画面外に出るだけで、消えたようにしか見えません

つまり 0, 0 は「エラーとして落ちない欠測値」です。件数が合わないのに原因が見えない、というときはまずここを疑ってください。

0, 0 が生まれる典型パターン

# 原因 起きやすい場面 見分け方
1 空欄・NULL が 0 に変換された CSV取り込み、DBの NOT NULL DEFAULT 0 緯度も経度もちょうど 0
2 ジオコーディングが住所を解決できなかった 住所→緯度経度の一括変換 失敗した住所に偏る。表記ゆれ・旧住所が多い
3 数値に変換できない文字列が 0 になった 35°39'30" のような度分秒、全角数字、カンマ区切り 特定の入力形式の行だけが 0
4 列の対応がずれた 見出し行のずれ、列数の違うCSVの結合 緯度に別の値、経度が 0 など片方だけ 0
5 初期化されたまま書き出された アプリ側で座標を取得する前に保存 作成時刻が近い行にまとまって出る
6 測位できていない値をそのまま保存した GPSロガー、EXIF、車載機器 前後の行は正常で、0 の行だけ衛星数・精度が空
7 座標系の取り違えで原点に落ちた 平面直角座標の値を緯度経度として読んだ 完全な 0 ではなく 0 に近い小さな値(後述)

7番だけは「ちょうど 0」にならない

平面直角座標系の値を、そのまま緯度経度として読んでしまうケースでは、値は 0 になりません。たとえば X = -12345.678, Y = 5432.1 を「緯度 −12345.678度・経度 5432.1度」と読むと、多くのライブラリは範囲外として弾きます。逆に原点近くの小さな値(X・Y が数十m以内)だと、緯度経度としても値域に収まってしまい、やはり Null Island のすぐそばに描画されます。

「0 ちょうど」ではなく「0.0003 のような値が並んでいる」ときは、単位や座標系の取り違えを疑ってください。何の座標系なのか分からないデータの見分け方はこの座標、測地系はどれ? — ズレ量で見分けるでも扱っています。

CSV から見つける

まず、緯度・経度がともに 0(00.00.000000 のいずれも)である行を抜き出します。

# 2列目=緯度、3列目=経度のCSVから、両方が0の行を行番号付きで出す
awk -F, 'NR>1 && $2+0==0 && $3+0==0 {print NR": "$0}' points.csv

awk を使わず、テキスト検索だけで当たりを付けたい場合は正規表現で拾えます。

grep -nE '(^|,)0(\.0+)?,0(\.0+)?(,|$)' points.csv

巨大なCSV(数GB以上)で同じことをするなら、uvp ならこう書きます。

uvp points.csv '(^|,)0(\.0+)?,0(\.0+)?(,|$)' -E

0, 0どの入力元に偏っているかを知りたいときは、件数を数えるところまで1コマンドでまとめられます。

uvp points.csv '(^|,)0(\.0+)?,0(\.0+)?(,|$)' -E -uniq '^([^,]+),'

(先頭列をキーにして、0, 0 になった行が事業所コードや取込元ごとに何件あるかを並べる形です。)

「片方だけ 0」も忘れずに

上のパターン4は、緯度か経度の一方だけが 0 になります。これは両方 0 の検索では引っかからないので、別に探す必要があります。日本国内のデータであれば、経度が 0 のものは確実に異常です。

# 日本国内のはずなのに、緯度が20未満 or 経度が120未満の行
awk -F, 'NR>1 && ($2+0 < 20 || $3+0 < 120) {print NR": "$0}' points.csv

日本の領域はおおよそ北緯20〜46度・東経122〜154度に収まります(南鳥島まで含めた範囲)。この矩形から外れた行を「要確認」として機械的に弾くだけで、0, 0 も緯度経度の入れ替わりも同時に捕まえられます。緯度と経度が入れ替わる事故そのものは緯度と経度、どっちが先?で詳しく扱っています。

GIS から見つける

QGIS など属性テーブルを持つソフトなら、式フィルタで一発です。

"lat" = 0 AND "lon" = 0

地図表示側で気づく方法もあります。全レイヤに「全体表示」をかけると、日本のデータなのに表示範囲がアフリカまで広がっていれば、その時点で 0, 0 の混入が確定します。日本国内のデータで全体表示が横に大きく伸びたら、まず属性テーブルを疑ってください。

直し方——0 を消すのではなく、欠測として区別する

見つけた後の扱いで大事なのは、「0 を消す」のではなく「欠測だと分かる形にする」ことです。

  1. 0, 0 は空欄(NULL)に戻す。 0 のまま残すと、次の工程でまた地図に描かれます
  2. 元の値が何だったのかを残す。 住所が解決できなかったのか、そもそも座標が無いのかで、後の対応が変わります
  3. 再取得するなら原因ごとに分ける。 ジオコーディング失敗なら住所表記の正規化、機器由来なら再測。混ぜて一括再処理しても直りません
  4. 0 が入らない形で取り込み直す。 CSV取り込み時に「空欄を0で埋める」設定が入っていないかを確認します

CSVを入力して座標変換し、CSVとして書き出す流れの図

GeoConverter Pro で緯度経度を変換するときも、0, 0 はそのまま正しい入力として扱われます(実際、赤道・本初子午線上の点は変換できてしまいます)。変換にかける前の段階で、上記の矩形チェックで弾いておくのが確実です。CSVをまとめて変換する手順はCSVの一括変換ガイドにまとめています。

まとめ

  • 0, 0 は「座標が無い」ではなく赤道と本初子午線の交点。値域の内側なのでエラーにならない
  • 呼び名の Null Island は Natural Earth が品質管理用に置いた架空の島に由来する。実在する構造物は観測ブイが1基のみ
  • 原因は7通りあるが、空欄が0に化けたのとジオコーディング失敗がほとんど
  • 「ちょうど 0」だけでなく「0 に近い小さな値」「片方だけ 0」も同じ事故。日本の矩形(北緯20〜46度・東経122〜154度)から外れた行を弾くのが最も取りこぼしが少ない
  • 直すときは 0 を消さず、欠測と分かる形(空欄)に戻して原因ごとに再取得する

出典

  • Null Island — Wikipedia: https://en.wikipedia.org/wiki/Null_Island
  • Natural Earth(公有のGISデータセット。Null Island を収録): https://www.naturalearthdata.com/
  • PIRATA(Prediction and Research Moored Array in the Tropical Atlantic)— NOAA PMEL: https://www.pmel.noaa.gov/gtmba/pmel-theme/atlantic-ocean-pirata
  • 世界測地系 — 国土地理院: https://www.gsi.go.jp/sokuchikijun/datum-main.html
  • uvp コマンドの構文 — UwView Pro: https://uvp.y42u.net/blog/uvp-cli-release-vs-ripgrep/

次に確認する


開発者より: アプリ・Kindle本・オープンソースの一覧は GitHub: amru195704 にまとめています。


お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。誤記・不正確な情報がございましたら、コメント欄よりご指摘いただければ、確認のうえ修正いたします。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

トップへ戻る