よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【termux】スマホの現在地を取得しGoogleマップで表示する

今回は、AndroidスマートフォンとターミナルアプリのTermux、TermuxにインストールしたPythonを使って、GPSによる現在地の取得とGoogleMapでの確認をやってみたいと思います。

環境


Androidスマホ
termux
Python3.7

目次




概要


スマホにはGPSセンサーが搭載されておりますが、ターミナルアプリのTermuxを使うと現在地のGPS座標が取得できます。
TermuxでGPS座標を取得し、取得できた緯度と経度からGoogleマップで現在地の確認をするところまでをやります。

AndroidGPSは精度を出す為に、GPS信号やAndroid端末とインターネットプロバイダーの距離をいろいろ計算して誤差を少なくする方式になっているようで、現在地を取得する際にはにモバイル通信やWi-Fiのネット接続が必要です。
余談ですが電子工作でよく使われるアルデュイーノ基板を使用する際にGPSセンサーモジュールという基板を後付けすると現在地GPS座標が取得できるようになるらしいですが、ネット接続無しで使いまして、屋外での精度は数m、高性能だと数cmの誤差だとか。
自分のスマホは何度か試した限りで数メートルの誤差でした。



実装


ではでは実装していきます。

まずはためしにtermuxコマンドでGPS座標を取得してみる


termuxを立ち上げ、 termux-locationとコマンドを打ちます。
これだけで簡単に現在地のGPS座標が取得できます。

スマホの現在地とネット接続をオンにし、さらにスマホの設定でtermuxの現在地権限をオンにしておきます。



上記のコマンドを実行し、上手く取得できるとjson形式で次の値が表示されます。表示に10~20秒ほど掛かる!

  • latitude:緯度
  • longitude:経度
  • altitude:高度
  • accuracy:位置精度
  • vertical accuracy:垂直位置精度
  • bearing:方角
  • speed:何のスピード?
  • elapsedMs:クエリ開始からの経過時間?
  • provider:gpsプロバイダ


建物の内部だとGPS座標が取得できない可能性大です。



subprocessでGPS座標を取得


上のコマンドで無事に座標が取得出来たことを確認したら、次にこれをPythonのsubprocessモジュールで使って行えるようにします。

import subprocess

cmd = "termux-location"

result = subprocess.check_output(cmd.split()).decode("utf8")
print(result)

decode("utf8")としているのは、subprocessの出力がバイト型でされるため変換しています。



json形式で取得されるので、latitude(緯度)longitude(経度)だけを取り出す。

だがその前に型を確認。

print(type(result))
<class 'str'>

おっと、文字列になってる。辞書型に直してvalueを取得する。

import json

result_dict = json.loads(result)
latitude = result_dict["latitude"]
longitude = result_dict["longitude"]

print("緯度",latitude)
print("経度",longitude)

Googleマップで確認する


現在地のGPS座標が取得できたら確認のためGoogleで検索してみます。



が、上で取得した緯度と経度は「float型のためstr型に直せ」とエラーが出たので直す。

latitude = str(latitude)
longitude = str(longitude)

str型に直した。

次のコードの実行でGoogleマップが起動し、緯度と経度の場所が示されます。

url = "https://www.google.com/maps/search/" + latitude  + "+" + longitude 

open_map_cmd = "termux-open " + url

subprocess.run(open_map_cmd.split())

Googleマップが起動し現在地が示されたでしょうか?



コードまとめ


最後にコードをまとめて今回の終わりにします。

import subprocess
import json

# TermuxでGPS座標の取得コマンド
cmd = "termux-location"

# コマンドをsubprocessで実行
result = subprocess.check_output(cmd.split()).decode("utf8")

# 辞書型に変換
result_dict = json.loads(result)

# 緯度と経度をstr型で取得
latitude = str(result_dict["latitude"])    # 緯度
longitude = str(result_dict["longitude"])  # 経度

# Googleマップで緯度と経度から現在地検索用URL
url = "https://www.google.com/maps/search/" + latitude  + "+" + longitude 

# ブラウザ起動コマンド
open_map_cmd = "termux-open " + url

# subprocessでコマンド実行
subprocess.run(open_map_cmd.split())

ファイル名「何とか.py」と名前をつけたら、termuxからpython 何とか.pyとコマンドを実行すればGoogleマップが起動し現在地を表示するはず…



応用編として
【termux】スマホでGPSスピードメーターをつくる - よちよちpython

以上です。