見出し画像

現在の緯度経度から最寄りのアメダス観測所番号を出力するコードをChatGPTに教えて貰った話

最近の天気アプリ、「このあとてんき」の開発の際に、緯度経度から最寄りのアメダス観測所の番号について知りたいと思いました。


天気情報はアメダス観測所番号で管理されている


ご存じかもしれませんが、気象庁で発表されている気象情報はアメダス観測所で観測されたものをベースとしています。
なので、キー項目としてはアメダス観測所番号で、それだと分かりにくいので人間が判断するには観測所番号と紐づいた観測所名(地名)となります。

でも、自分の最寄りの観測所がどこなのか、ぱっと言えますぅ?

そういう際は地図上を探して最寄りのアメダス観測所を見つける事になるかと思います。

tenki.jpから「アメダス地点を地図から探す」画面

私の要望としては、「緯度経度情報がスマホなどで判るのだから、その緯度経度情報を持って最寄りのアメダス観測所番号を探し出して、気象情報を教えて欲しい」となります。

折角なのでChatGPTに聞いてみた

Pythonコードで書き出し始めましたが、ファイルの入出力やら最短距離を求めるやら、面倒くさい…
あと、自分が考えていた方法よりも良い方法が見つかるかもしれない、と思い、ここはChatGPTに質問してコード作成を代行して貰いました。

貴方はプログラマーです。 それぞれx,yの座標を持つ800点のデータ群を持っています。 ここに任意の点aをプロットした場合、aから一番最短の距離を先ほどのデータ群から選び出すPythonコードを書いてみてください。



最も効率的な方法は、すべてのデータポイントと点aの距離を計算し、最小距離を見つけることです。以下はPythonでそれを行うためのコードです。このコードは800点のデータ群に対しても動作します。

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)

このコードはNumPyを使用してユークリッド距離を計算し、最小距離とその最小距離を持つ点を見つけます。data_pointsリストに実際のデータポイントの座標を追加し、point_aに点aの座標を追加してください。その後、コードを実行すると、最短距離と最短距離を持つ点が表示されます。

ChatGPT

ふむふむ、やはり最短距離はそれぞれの座標との差分を二乗して足したものの平方根したもの、を単純に比較していくみたいですね。
ここまで来ると欲が出てくるので、ファイル入力まで書いてもらいましょう。

追加で、データポイントはtxtファイルになります。 800点は以下のようなカンマ区切りのフォーマットで入っています。
12266,朝日,12,44.118,142.595,225 前から順にポイント番号、地名、地点番号、緯度、経度の順に入っています。
これを踏まえて先ほどのコードを書き直してください。

指定されたテキストファイルからデータを読み取り、それを使用して最も近い点を見つけるPythonコードを以下に示します。

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の座標
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)

このコードは、指定されたテキストファイル('data.txt')からデータを読み取り、その後、点aと各データポイントとの距離を計算して最小距離と最小距離の点を見つけます。テキストファイルのフォーマットに従ってデータを正しく読み取るために、各行をカンマで分割し、必要な情報を取得しています。点aの座標は、point_aに適切な値を設定してください。

ChatGPT

おお、これでイケそうです。
x, yの座標を手直しして、さっそくpoint_aのX, Y座標にそれぞれ経度、緯度を入れてみましょう。
(心情的にXは経度、という思い込みがある)
試しに喜茂別町の緯度経度、lat = 42.85564433、 lng = 141.09724045 を条件に入れてみます。

最短距離: 137.17617467082385
最短距離の点のポイント番号: 11046
最短距離の点: (11046, '礼文', 11, 45.305, 141.045, 65)

実行結果1

細かい条件も後出しで良いので追加するとソースコードの解像度が高まる

ん?どうみても実行結果がおかしい、北海道本島の地域に一番近いのが礼文島とは信じがたい。
改めてChatGPTに聞いてみました。


先ほどの情報に加えます。
点aと点群の座標はそれぞれ緯度と経度になります。
対応したコードに書き直してください。
最終的にはポイント番号も出力してください。

指定された要件に合わせて、緯度と経度を使用して点aとデータポイントの距離を計算するPythonコードを以下に示します。

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])

このコードは、緯度と経度を使用して点aとデータポイントの距離を計算し、最も近いデータポイントを見つけます。点aの緯度と経度は、a_latitudea_longitudeに適切な値を設定してください。

ChatGPT

このソースコードで喜茂別町の緯度経度で最寄りのアメダス観測所を探してみましょう。

最短距離: 0.16185494739841888
最短距離の点のポイント番号: 16286
最短距離の点: (16286, '喜茂別', 16, 42.793, 140.948, 264)

実行結果2

偶然にも喜茂別町にアメダス観測所があったようで、満足する結果が出せました。
どうやら前のコードを修正した際に、X, Yのファイル読み込み時と緯度経度への代入を逆にしてしまったようです。これは自分のミスですね。

プロトタイプ作成の際のソースコード作成にChatGPTは有用

という訳で、今回はChatGPTにソースコード作成の代行をして貰いました。
コード作成のような用途だと、答えがはっきりしていて、コードの良し悪しの検証も出来る事から相性がとても良いようです。

実際には、このコードのみではWebサービスとして実行できる訳では無いので、もうちょっとやる事はあります。
ただ、今回のサービスのように、素早く何かを実装したい場合に「この部分はよくある定型的なものだな」と思った箇所はChatGPTに任せてみるというのも良い方法だと思いました。

と言う訳で、天気アプリ開発の情報をまとめるべくnoteのマガジンを作りました!

私が共同代表を務めているGREEN OFFSHOREでは農業向けのIoTサービスを展開しています。
そちらにも様々な情報を展開しているので、ぜひ上記リンクをクリックしてみて下さい。



この記事が参加している募集

つくってみた

この記事が気に入ったらサポートをしてみませんか?