[jq] GPS情報データベースから、現在地(指定地点)から半径100キロ以内のデータを取得する方法

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

こんにちわ。
 

下駄です。
 

「GPS」とかけまして、
 

「流行のウィルス」とときます。
 

そのココロは・・・
 

エイセイ(衛生と衛星)管理が重要です。
 

GPS検索は、リアル連携サービスの基本作法

なんちゃらGO!系のゲームアプリを始めとして、スマートフォンで誰もがGPSの恩恵を受けて、おもろいゲームや、便利なサービスを受けられる時代になりました。
 

いまさらGPSがなんじゃろ?という人は、今回の記事はお控えください。
 

全国の薬局の一覧データを厚労省のサイトから取得できることが分かったのですが、
 

その一覧データには、郵便番号と住所と電話番号しか情報が無かったため、GPS値を付ける処理をつなげて、かなり利用頻度の高いいい感じのリストデータを作ることに成功しました。
 

そして、それを自分のスマートフォンで見た時に、近くの薬局を検索するモードを付ける機能を作っているんですが、
 

利便性を考えて、jsonデータで保存しているデータを、jqコマンドで、一定距離以内のデータのみ取得して、ついでにそれを距離数でソートして、近い順リストを作ろうと考えました。
 

思いの外、簡単にできたので、そのソースコードを惜しまず掲載したいと思います。
※一覧リストデータは、お手持ちのGPSデータをお使いください。

データとソース

 

上記のように、latとlonというkeyに緯度(lat)経度(lon)情報をそれぞれ格納してあります。
※全国データが膨大なので、一部抜粋にしています。
 

これを、jqで以下のようにすることで、半径100キロメートル以内のデータのみを取得することができます。
 

 

解説

jqコマンドの中身を順を追って解説します。
 

まず、latとlonの値から、現在値の緯度経度をそれぞれ差分を求めます。
 

次に、それをそれぞれ2乗して、足します。
 

※2乗は、pow(.;2)です。
 

その値を平方根処理(sqrt)して100を掛けることで、距離が出力されます。
 

さらに、その計算後の値をselectで100(km)以下の条件をつけて、sort_byでdistanceにセットすると、完了です。
 

ちなみに、このデータは、厳密な100kmでの判定ではなく、GPS値の1°を大体100kmとして計算するようにしています。
 

注意点としては、100mぐらいの誤差が出てしまいますが、もっと厳密にしたい方は、内部の計算式を厳密パターンを作ってみてください。
 

全国で5万件オーバーぐらいの調剤薬局のリストですが、jqコマンドが意外と早い事にビックリすることでしょう。

Leave a Reply

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