初めてのqiita投稿
はじめまして!
日々プログラミングを勉強している大学生です!
日々のプログラミング学習で学んだことをアウトプットするためにqiitaに投稿をしようと思いました。
まだまだプログラミングやコンピュータについての知識が乏しいので誤った記載、改善すべき点についてご教授頂けると幸いです!
今回作った物について
今回はユーザーから県庁所在地を入力してもらい、その地域の気温を地図上に表示するというアプリを作りました。
作成の目的は今まで学んだライブラリを組み合わせてのアプリ開発をしようと思い、作ったので実用性はないと思います。
使ったライブラリ
folium(地図作成)webbrowser(作成した地図を表示するため)
geocoder(逆ジオコーディング)
tkinter(入力を受け付けるウィジェット作成)
requests(APIから気温を所得)
sys(エラーが生じたときに実行を停止するため)
location_names=['大阪市', '神戸市', '京都市', '札幌市', '青森市', '盛岡市', '仙台市', '秋田市', '山形市', '福島市', '水戸市', '宇都宮市', '前橋市', 'さいたま市', '千葉市', '横浜市', '新潟市', '富山市', '金沢市', '福井市', '甲府市', '長野市', '岐阜市', '静岡市', '名古屋市', '津市', '大津市', '奈良市', '和歌山市', '鳥取市', '松江市', '岡山市', '広島市', '山口市', '徳島市', '高松市', '松山市', '高知市', '福岡市', '佐賀市', '長崎市', '熊本市', '熊本市', '大分市', '宮崎市', '鹿児島市', '那覇市']
area_code={
'札幌市':'016000','青森市':'020000','盛岡市':'030000','仙台市':'040000','秋田市':'050000',
'山形市':'060000','福島市':'070000','水戸市':'080000','宇都宮市':'090000','前橋市':'100000','さいたま市':'110000',
'千葉市':'120000','横浜市':'140000','新潟市':'150000','富山市':'160000','金沢市':'170000','福井市':'180000',
'山梨市':'190000','長野市':'200000','岐阜市':'210000','静岡市':'220000','名古屋市':'230000','津市':'240000',
'大津市':'250000','京都市':'260000','大阪市':'270000','神戸市':'280000','奈良市':'290000','和歌山市':'300000',
'鳥取市':'310000','松江市':'320000','岡山市':'330000','広島市':'340000','山口市':'350000','徳島市':'360000',
'高松市':'370000','松山市':'380000','高知市':'390000','福岡市':'400000','佐賀市':'410000','長崎市':'420000',
'熊本市':'430000','大分市':'440000','宮崎市':'450000','鹿児島市':'460100','那覇市':'471000',
}
def rain_percent():
#ダイアログでウィンドウを消すように促す
messagebox.showinfo('次の処理へ', 'ウィンドウを消してください')
global city
city=textbox.get()
try:
city_code=area_code[city]
url='https://weather.tsukumijima.net/api/forecast/city/'+city_code
r=requests.get(url)
json_data=r.json()
temperature=json_data['forecasts'][1]['temperature']['max']['celsius']
except requests.exceptions.RequestException as e:
print('エラー', e)
sys.exit()
except KeyError as e2:
#try文でのapiからデータがとれない場合、別のapiから天気を取る
city_code=area_code[city]
url='https://www.jma.go.jp/bosai/forecast/data/forecast/'
url=url+city_code+'.json'
r=requests.get(url)
json_data=r.json()
temperature=json_data[0]['timeSeries'][2]['areas'][0]['temps'][0]
except NameError as e3:
print('エラー', e3)
sys.exit()
finally:
global weather
weather=temperature
root=tk.Tk()
root.title('行きたい場所の天気')
root.geometry('300x100')
textbox=tk.Entry(width=10)
textbox.place(x=120, y=40)
button=tk.Button(text='送信', width=15, height=1, activebackground='gainsboro', command=rain_percent)
button.place(x=100, y=70)
root.mainloop()
1.まず実行を開始するとtkinterの入力を受け付けるテキストボックスが出てくる
2.天気を所得するapiから気温情報を取得、try,except文でapiのurlが二つあるのは入力する地名によって、try文中のapiから気温情報が取得できなかったためです。
例:入力が大阪市の時→一つ目のapiから情報が送られる
神戸市→一つ目のapiから情報が送られなかったので別の天気apiから情報を受け取る
print('スタート!')
locations=[]
for i, location_name in enumerate(location_names, 1):
ret=geocoder.osm(location_name, timeout=5)
locations.append(ret.latlng)
print(i, end=' ')
print()
print('あと少し')
表示されたウィンドウを消すと処理が進むようにしました。
上で定義したlocation_namesというリストから地名をひとつづつ取り出し,
逆ジオコーディングを行い、空リストlocationsに緯度、経度を追加していく
実行に時間がかかったので進捗状況をターミナルに表示
気温を一カ所表示するだけでは寂しかったので緯度、経度を表示するようにしました。
folium_map = folium.Map(location=geocoder.osm(city).latlng, zoom_start=15)
#popupに気温を表示
for i, location in enumerate(locations, 1):
if geocoder.osm(city).latlng==location:
folium.Marker(location=location,popup=weather, icon=folium.Icon(color='green')).add_to(folium_map)
else:
folium.Marker(location=location, popup=location,icon=folium.Icon(color='red')).add_to(folium_map)
print(i, end=' ')
print()
print('終了!')
# 地図保存
folium_map.save('mapx.html')
#地図を保存し、そのパスを指定し表示する。
webbrowser.open('保存したhtmlのパス')
テキストボックスに入力された地名の気温をfoliumのpopupに表示するようにさせる。
別の県庁所在地には緯度、経度を表示。
そして作成した地図を保存し、表示する。
最後に
今回作成したコードはきれいな物ではないかもしれませんがアドバイスやこんな物作ったら面白そうなものがあれば是非コメントよろしくお願いします。