こんにちは。 今日は緯度経度の値を正規化する際の課題と、それを解決するために開発したオープンソースのプロジェクトの Node.js ライブラリ @geolonia/normalize-any-latlng について紹介します。
インターネット上に氾濫する緯度経度の文字列には様々なフォーマットがあり、代表的なものとしては度分秒法表示と10進法表示の2種類が挙げられると思います。
度分秒法の数字は、 度 + 分 / 60 + 秒 / 3600
で10進法表示に変換できますがそれぞれの単位の記号もいくつかの種類があり混沌としています。
- 度 ° ゜ deg.
- 分 ' ‘ ’ ` ′ min.
- 秒 " " “ ” ゛ ″ sec.
また、緯度経度と経度緯度のどの順番に書くのか、それらの区切り文字はどうするか、あるいは東西南北を表す語句 (N、E、W、S、北緯、南緯、東経、西経) は何にするのか、そしてその国際化の問題など、取りうるフォーマットは無数にあります。
- 29°31′55″N 35°00′20″E
- 북위37°34′00″ 동경126°58′41″
- 남위34°36′12″ 서경58°22′54″
- 北緯32度53分9.35秒 東経130度11分9.34秒
- 45°24′N 75°40′W
そんな緯度経度文字列を決まったオブジェクトの形となるよう正規化し、機械的処理を容易にしようとするのがこの @geolonia/normalize-any-latlng
プロジェクトです。
@geolonia/normalize-any-latlng は Node.js が使える環境でインストール可能です。
$ npm install @geolonia/normalize-any-latlng
現在のところ緯度経度を表す任意の文字列を受け取り、解析が成功した場合 { lat: number, lng: number }
というオブジェクトを返却するシンプルな同期的関数 normalize
のみで構成されています。内部では文字列処理と正規表現の力技で結果を生成してます。
// TypeScript の例
import { normalize } from '@geolonia/normalize-any-latlng'
const { lat, lng } = normalize('北緯32度53分9.35秒 東経130度11分9.34秒')
console.log(lat, lng) // 32.885930555555554 130.18592777777778
そのほか、[-180°, 180°]
を超える経度の値はその範囲に収めるように数字を調整したり、北緯/南緯・東経/西経がどの順番で記載されているか数字の大小でわかる場合は判定したりするなど、色々細かい処理を行っています。
東西南北を表す文字は漢字・アルファベット・ハングルに対応しています。これは内部的には拡張可能としていて、世界的にどのような表記が使われているのか探しているところです。
ちなみに、Wikipedia を巡回して各文字・各言語の緯度経度の表記を集めていて、次はキリル文字に対応しようとしたところ、東西南北の表記が思った以上に多様であることが分かりました。キリル文字は、それを使う言語ごとに文字セットが異なるらしい..?
55°45′21″ с. ш. 37°37′04″ в. д.
, モスクワ, https://ru.wikipedia.org/wiki/Москва34°35′59″ ю. ш. 58°22′55″ з. д.
, ブエノスアイレス, https://ru.wikipedia.org/wiki/Буэнос-Айрес12° 28′ 00″ Ј; 130° 50′ 00″ И
, ダーウィン, https://sr.wikipedia.org/wiki/Дарвин_(Северна_територија)4° 35′ 56″ С; 74° 04′ 51″ З
, ボゴタ, https://sr.wikipedia.org/wiki/Богота18.938611° ю. ш. 47.521389° и. д.
, アンタナナリボ, https://bg.wikipedia.org/wiki/Антананариву35.689444° с. ш. 139.691667° и. д.
, 東京, https://bg.wikipedia.org/wiki/Токио逆に、アラビア文字・ヘブライ文字・ギリシャ文字のページを調べた限りでは英語アルファベット (N, E, W, S) が使われていて、それぞれの文字のアルファベットではありませんでした。何か文化的背景があるのか、興味深いです。
29°31′00″N 35°00′00″E
, アカバ, https://ar.wikipedia.org/wiki/العقبة32°48′14″N 35°00′31″E
, ハイファ, https://he.wikipedia.org/wiki/חיפה37°59′3″N 23°43′41″E
アテネ, https://el.wikipedia.org/wiki/Αθήνα@geolonia/normalize-any-latlng
は https://maps.geolonia.com で試していただくことができます。
左上にある検索テキストボックスに緯度経度の文字列を入力すると、判定してジャンプするように設定しています。
北緯32度53分9.35秒 東経130度11分9.34秒
を入力した様子プロジェクトはまだ始まったばかりで、このライブラリが便利なのかどうかすらもまだ不明ですが、興味があればぜひ試してみてください。 おもしろい使い方や知見、それから対応できていない緯度経度のフォーマットも多くあると思いますので、その場合は issue にお寄せいただければ嬉しいです。 また、プルリクエストもいつでも歓迎します。
それでは!