現在の緯度経度から最寄りのアメダス観測所番号を出力するコードをChatGPTに教えて貰った話
最近の天気アプリ、「このあとてんき」の開発の際に、緯度経度から最寄りのアメダス観測所の番号について知りたいと思いました。
天気情報はアメダス観測所番号で管理されている
ご存じかもしれませんが、気象庁で発表されている気象情報はアメダス観測所で観測されたものをベースとしています。
なので、キー項目としてはアメダス観測所番号で、それだと分かりにくいので人間が判断するには観測所番号と紐づいた観測所名(地名)となります。
でも、自分の最寄りの観測所がどこなのか、ぱっと言えますぅ?
そういう際は地図上を探して最寄りのアメダス観測所を見つける事になるかと思います。
私の要望としては、「緯度経度情報がスマホなどで判るのだから、その緯度経度情報を持って最寄りのアメダス観測所番号を探し出して、気象情報を教えて欲しい」となります。
折角なのでChatGPTに聞いてみた
Pythonコードで書き出し始めましたが、ファイルの入出力やら最短距離を求めるやら、面倒くさい…
あと、自分が考えていた方法よりも良い方法が見つかるかもしれない、と思い、ここはChatGPTに質問してコード作成を代行して貰いました。
import numpy as np
# データポイントの座標を表すリスト (800点のデータ)
data_points = [(x1, y1), (x2, y2), ...] # データ点の座標を実際のデータに置き換えてください
# 点aの座標
point_a = (a_x, a_y)
# 各データポイントと点aの距離を計算し、最小距離を見つける
min_distance = float('inf') # 初期値を無限大に設定
closest_point = None
for data_point in data_points:
x, y = data_point
distance = np.sqrt((x - a_x)**2 + (y - a_y)**2) # ユークリッド距離を計算
if distance < min_distance:
min_distance = distance
closest_point = data_point
print("最短距離:", min_distance)
print("最短距離の点:", closest_point)
ふむふむ、やはり最短距離はそれぞれの座標との差分を二乗して足したものの平方根したもの、を単純に比較していくみたいですね。
ここまで来ると欲が出てくるので、ファイル入力まで書いてもらいましょう。
import numpy as np
# テキストファイルからデータを読み取る
data_points = []
with open('data.txt', 'r', encoding='utf-8') as file:
for line in file:
parts = line.strip().split(',')
if len(parts) == 6:
point_number = int(parts[0])
location_name = parts[1]
location_number = int(parts[2])
latitude = float(parts[3])
longitude = float(parts[4])
altitude = int(parts[5])
data_points.append((point_number, location_name, location_number, latitude, longitude, altitude))
# 点aの座標
point_a = (a_x, a_y) # a_xとa_yを適切な値に設定してください
# 最短距離と最短距離を持つ点を初期化
min_distance = float('inf')
closest_point = None
# 各データポイントと点aの距離を計算し、最小距離を見つける
for data_point in data_points:
_, _, _, x, y, _ = data_point # 緯度と経度を取得
distance = np.sqrt((x - point_a[0])**2 + (y - point_a[1])**2) # ユークリッド距離を計算
if distance < min_distance:
min_distance = distance
closest_point = data_point
print("最短距離:", min_distance)
print("最短距離の点:", closest_point)
おお、これでイケそうです。
x, yの座標を手直しして、さっそくpoint_aのX, Y座標にそれぞれ経度、緯度を入れてみましょう。
(心情的にXは経度、という思い込みがある)
試しに喜茂別町の緯度経度、lat = 42.85564433、 lng = 141.09724045 を条件に入れてみます。
細かい条件も後出しで良いので追加するとソースコードの解像度が高まる
ん?どうみても実行結果がおかしい、北海道本島の地域に一番近いのが礼文島とは信じがたい。
改めてChatGPTに聞いてみました。
import numpy as np
# テキストファイルからデータを読み取る
data_points = []
with open('data.txt', 'r', encoding='utf-8') as file:
for line in file:
parts = line.strip().split(',')
if len(parts) == 6:
point_number = int(parts[0])
location_name = parts[1]
location_number = int(parts[2])
latitude = float(parts[3])
longitude = float(parts[4])
altitude = int(parts[5])
data_points.append((point_number, location_name, location_number, latitude, longitude, altitude))
# 点aの座標 (緯度と経度)
a_latitude = 35.123 # aの緯度を適切な値に設定
a_longitude = 138.456 # aの経度を適切な値に設定
# 最短距離と最短距離を持つ点を初期化
min_distance = float('inf')
closest_point = None
# 各データポイントと点aの距離を計算し、最小距離を見つける
for data_point in data_points:
point_number, _, _, point_latitude, point_longitude, _ = data_point # ポイント番号と緯度・経度を取得
distance = np.sqrt((point_latitude - a_latitude)**2 + (point_longitude - a_longitude)**2) # ユークリッド距離を計算
if distance < min_distance:
min_distance = distance
closest_point = (point_number, data_point)
print("最短距離:", min_distance)
print("最短距離の点のポイント番号:", closest_point[0])
print("最短距離の点:", closest_point[1])
このソースコードで喜茂別町の緯度経度で最寄りのアメダス観測所を探してみましょう。
偶然にも喜茂別町にアメダス観測所があったようで、満足する結果が出せました。
どうやら前のコードを修正した際に、X, Yのファイル読み込み時と緯度経度への代入を逆にしてしまったようです。これは自分のミスですね。
プロトタイプ作成の際のソースコード作成にChatGPTは有用
という訳で、今回はChatGPTにソースコード作成の代行をして貰いました。
コード作成のような用途だと、答えがはっきりしていて、コードの良し悪しの検証も出来る事から相性がとても良いようです。
実際には、このコードのみではWebサービスとして実行できる訳では無いので、もうちょっとやる事はあります。
ただ、今回のサービスのように、素早く何かを実装したい場合に「この部分はよくある定型的なものだな」と思った箇所はChatGPTに任せてみるというのも良い方法だと思いました。
と言う訳で、天気アプリ開発の情報をまとめるべくnoteのマガジンを作りました!
私が共同代表を務めているGREEN OFFSHOREでは農業向けのIoTサービスを展開しています。
そちらにも様々な情報を展開しているので、ぜひ上記リンクをクリックしてみて下さい。