OpenWeatherMapという天気情報をAPIで提供しているものがあって
OpenWeatherMap
緯度経度情報から、天気情報を取得出来るということで
GPSモジュールを使って現在地の緯度経度から天気情報を取得してみた
コードはgithubに上げてます
weatherApiWithGPS
参考リンク
OpenWeatherMapを利用して天気情報を取得してみる
天気情報を取得する
無料天気予報APIのOpenWeatherMapを使ってみる
環境はMac OsX 10.9, Pythonは Anaconda 2.3.0(python version 3.4.3) を用いた
まずは上記参考リンクに沿って、OpenWeatherMapに登録してAPIを使うためのAPI keyを取得する
まずは簡単な例
取得したAPI_KEYが abcdefghijklmnopqrstuvwxyz だったとしたら
appidのところは
1
| appid = "abcdefghijklmnopqrstuvwxyz"
|
と記載する
weatherapi.py1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import urllib.request import json location = "Fukuoka-shi,jp" mode = "json" metric = "Metric" lat = "33.590355" lon = "130.401716" appid = "write your api key" url = "http://api.openweathermap.org/data/2.5/weather?lat={a}&lon={b}&units={c}&appid={d}".format(a=lat, b=lon, c=metric, d=appid) response = urllib.request.urlopen(url).readline() weather = json.loads(response.decode('utf-8')) print(weather['name']) print(weather['main']['temp'])
|
緯度経度はgoogle Geocodingを用いて福岡市の場所を取得した
location from city nameの行をgeocodeの代わりに使用すれば都市名からも天気情報を取得することができる
これで天気情報が取得できたら、次にGPSモジュールを使って緯度経度を取得し、天気情報を得てみる
GPSを使った位置情報の取得
GPSモジューつの使い方はPythonでシリアル通信を参照
結論から言うと、GPSモジュールを接続して
下記コードを実行すると取得できる
USBポート名とOpenWeatherMapのAPI_KEYは自分の環境のものを記入する
gpsWeather.py1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import urllib.request import json import serial import re import types import time ser = serial.Serial( port = "/dev/tty.usbserial*", baudrate = 9600, parity = serial.PARITY_NONE, bytesize = serial.EIGHTBITS, stopbits = serial.STOPBITS_ONE, timeout = None, xonxoff = 0, rtscts = 0, ) while True: gpsData = ser.readline().decode('utf-8') if re.search(r'RMC', gpsData): str = gpsData.split(",") if str[3] != "" and str[5] != "": lat_60decimal = float(str[3]) lng_60decimal = float(str[5]) lat = int(lat_60decimal/100)+(lat_60decimal/100 - int(lat_60decimal/100))*100/60 lng = int(lng_60decimal/100)+(lng_60decimal/100 - int(lng_60decimal/100))*100/60 mode = "json" metric = "metric" appid = {"add your API_KEY"} url = "http://api.openweathermap.org/data/2.5/weather?lat={a}&lon={b}&mode={c}&units={d}&appid={e}".format(a=lat, b=lng, c=mode, d=metric, e=appid) response = urllib.request.urlopen(url).readline() weather = json.loads(response.decode('utf-8')) print(weather['name']) print("weather is :", weather['weather'][0]['main']) print("temperature is :", weather['main']['temp']) print("") time.sleep(1.0) else: print("no data")
|
コードの説明
GPSモジュールはNMEAの形でいくつかの種類のデータを出力する
参考
http://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html
GPRMCは、基本的な情報を含んでいるデータで時刻情報や緯度経度を出力するので
今回はGPRMCを利用している
GPSモジュールからのデータを改変して使用できる緯度経度情報に計算する
コードの中で、得られたGPS情報を計算する部分がある
1 2 3 4
| lat_60decimal = float(str[3]) lng_60decimal = float(str[5]) lat = int(lat_60decimal/100)+(lat_60decimal/100 - int(lat_60decimal/100))*100/60 lng = int(lng_60decimal/100)+(lng_60decimal/100 - int(lng_60decimal/100))*100/60
|
GPSモジュールから得られるGPRMCの緯度経度は、度分表示(秒は含まれていないっぽい)
つまり、60進数表記
なので、google mapだとか、weather api にぶち込む時は
10進数表記にしてやらないといけないので計算する
例えば
$GPRMC,052004.000,A,3335.7339,N,13023.8791,E,1.16,80.86,201215,,,A*54
というGPRMCが得られたら、緯度経度は
緯度 33.357339 N (33度35.7339分, N(北緯))
経度 130.238791 E (130度23.8791分, E(東経))
で60進数表記なので
10進数に直すためには
度 + 分/60 をしてやらないといけない
参考
http://blog.fkoji.com/2005/09210026.html
http://qiita.com/tag1216/items/0b38ee5aedea0ef4a058
たとえば上のGPRMCのデータからだと
緯度(10進数) = 33 + 35.7339/60 ~= 33.59556166666667
経度(10進数) = 130 + 23.8791/60 ~= 130.3979733333333
となる
この緯度経度10進数表記をgoogle map や weather api につっこむとちゃんとしたデータが得られる。
これで現在地のデータを取得することができた
GPSモジュールとAPIを組み合わせてみたけどこういうのから何かできないかなと思う