スポンサーリンク

ISSが飛行中の地名を出力するスクリプトを作った(ほぼAIが)

久しぶりに時間ができたので、ポンス・ブルックス彗星の写真でも撮りに行こうと思ったんだが、どうも曇りになりそうなのでやめた。代わりにISSが飛行している現在の地上の地名を出力するPythonスクリプトを書いて気分を紛らわすことにした。

マシンパワーがありあまっている天文デジタル時計(Pi4, 8G)でコーディングすることにした。SSHでつないで、コンソールからスクリプトを実行。それで地名が取得できればよしとする。

緯度経度情報が取得できるAPIはきっとどこかにあるだろうし、緯度経度情報が分かれば地名を返してくれるAPIとかライブラリもきっとあるはずなので、組み合わせれば作れないことはなさそう。

まずは、ISSの軌道計算が必要。skyfield ライブラリを使えば、現在の緯度と経度を返してくれるらしい。ということで、skyfield ライブラリをインストールする。PIPコマンドでOK。

pip install skyfield
緯度・経度だけが分かっても、そこがどこだか分からないと辛いので、地名が知りたい。緯度経度情報をもとに地名を導出してくれるライブラリがあるらしい。geopyという。便利だね。geopy ライブラリをインストールする。こちらもPIPコマンドでOK。
pip install geopy

Chat GPTさんに教えてもらいながら書いてみた(コードは末尾にあるよ)。ISSの軌道は、2行軌道要素形式でTXTファイルに記述されている。プログレスMS-26補給船(PROGRESS-MS 26)の記述も見える。issloc.pyというファイル名で保存。実行してみる。

hoge@pi4:~/ISS $ python3 issloc.py 
Latitude: -20.77282031843961, Longitude: -65.70103163196585
Iricsina, Municipio Cotagaita, Provincia Nor Chichas, Potosí, Bolivia

OK!緯度経度と地名が表示されている。ボリビアだな。とりあえず動いてるよ。アプリで確かめてみたら、あってるみたい。

しかし、ボリビアだということは確かだけれど、知らない地名が出てきたら、それ以上にそれがどこだか検討がつかないということは分かった。結局、地名をGoogleマップで検索することになる…。

あ、そうだ。これをプロンプトにして、AIさんにお絵描きをお願いしてみる。「Iricsina, Municipio Cotagaita, Provincia Nor Chichas, Potosí, Boliviadでお絵かきしてください」。出た出た。確かに、ボリビアっぽい。実際にこんな景色があるわけじゃないとは思う。イメージだよね。イメージ。イメージが大切。

スクリプト自体は、うまく動いてはいるんだけれど、いくつか問題がある。まずは「読めない地名」の問題。現地語で値が返ってくるので、すぐに理解ができないんだ。たとえばこんな文字。キリル文字だね。

Қарқаралы ауданы, Қарағанды облысы, Қазақстан

頑張れば読める。ロシアかとおもいきや、カザフスタンだ。こちらはこんな風景が広がっているらしい。ググってみたところ、確かにカザフの文化にゲルは存在するみたい。

違う言語の文字が混じってることもある。こんなの。

库尔特乡, 富蕴县, 阿勒泰地区, 新疆维吾尔自治区 شىنجاڭ ئۇيغۇر ئاپتونوم رايونی, 中国

新疆ウイグル自治区だというのは漢字から読める。しかし、何このアラビア文字? 中国でもアラビア文字使うの? アラビア文字のウイグル語らしい。地名問題は仕方ないから、これはこれで放置する。

次は、「海の上には地名がない」問題。地名を得るスクリプトだから当然なんだけど、確かに海の上に地名はないよな。地名が返って来ない場合は、適当に「海の上なんじゃない?」というメッセージを返すことにした。砂漠の上なら大丈夫なのかな?

地名だけじゃなくて、上のようなAI絵を表示してくれるプログラムも面白そう。検討してみるかね。これは、気が向いたらのいつかの宿題。

今回作成したスクリプトは次のとおり。


from skyfield.api import load
from geopy.geocoders import Nominatim
from geopy.exc import GeopyError

def get_location(latitude, longitude):
        geolocator = Nominatim(user_agent="任意のエージェントの名前")
        try:
                location = geolocator.reverse((latitude, longitude), exactly_one=True)
                return location.address

        except GeopyError as e:
                print(f"An error occurred: {e}")

        except AttributeError as e:
                print("たぶん海の上だと思う")

# 人口衛星の軌道要素リストからISSのデータを取得
stations_url = 'http://celestrak.com/NORAD/elements/stations.txt'
satellites = load.tle_file(stations_url)
by_name = {sat.name: sat for sat in satellites}
iss = by_name['ISS (ZARYA)']

# タイムスケールオブジェクトをロード
ts = load.timescale()
t = ts.now()

# ISS の現在位置を取得
geocentric = iss.at(t)

# 緯度経度を取得
subpoint = geocentric.subpoint()
latitude = subpoint.latitude.degrees
longitude = subpoint.longitude.degrees

print(f'Latitude: {latitude}, Longitude: {longitude}')

address = get_location(latitude, longitude)
print(address)

この記事へのコメント

  1. はははっ、楽しそうだね。^^

    アラビア文字もそうだけど、近い国なのに手も足も出ないのがハングル文字。
    ある文字を出そうにも出し方が全くわからん。コピペがあるから何とかなるけどさ。
    キリル文字はどこまで正しいかわからんけど、なんとなく読むことができる。
    そういう意味でもローマ字は優秀だとつくづく思うよ。

    よく、やってみて初めて気が付くことってあるよね。
    「海の上には地名がない」が正にそれなんだけど。
    結果を見れば誰しも『そりゃ、そうなるよな。』となるんだけど、やる前になかなか気付けないことって多くあるもの。
    実施テストやリハーサルは大切だよね。

    • 一人遊びの達人みたいでしょう?(笑)

      ハングルは、不思議ですね。キーボードでの入力の仕方が同じく分かりません。中国語も分かりませんが、拼音で入力するらしいので、漢字ばかりでも入力は案外速いかもしれません。

      海の上でも、せめて北大西洋とかインド洋とか返してくれるといいのですが。穴でした。

  2. Python・・・こんなエグイライブラリがあるんですね!
    実際のスクリプトはAiが書いてるのかもしれませんが、
    使いこなしてるにゃあさんってスゴイ!!

    読めない文字も、また”異国風味”。エキゾチックでイィ。

    • いやあ、AIって本当にすごいですね。生産効率が上がるといわれていますが、疑いません。

      エキゾチックな文字といえば、こんなのが出てきました。

      ⵃⴰⵙⵉ ⵎⴻⵙⵄⵓⴷ

      北アフリカで話されている「ベルベル語」ティフィナグ文字なんだそうです。
      AIになんて書いてあるの? と聞いたら、「こんにちは」なんだとか。
      地名だっていうのは分かっているので、幻覚をごらんになったようで…
      AIを褒めすぎたようです(笑)

  3. おー、地名からそれっぽい絵を表示してくれるの面白いですね。なんかその国に行ったような気になれますね。アラビア文字のウイグル語でもちゃんと絵を出してくれるんですか?すごいな・・・

    • そうなのですよ。その国に行ったような気になれるのです。
      毎回、ターミナルを叩くのも風情がないので、独立した端末にしようかなと考えているところです。
      来週くらいにはパーツが届くのではないかと思うのですが…時間がないかも(悲)

タイトルとURLをコピーしました