salton1027
@salton1027

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【初心者】Python GPSデータについて

こちらの記事を参考にして進め、後半に書いてあった下記のプログラムを試して、

import serial
import micropyGPS
import threading
import time

gps = micropyGPS.MicropyGPS(9, 'dd') # MicroGPSオブジェクトを生成する。
                                     # 引数はタイムゾーンの時差と出力フォーマット

def rungps(): # GPSモジュールを読み、GPSオブジェクトを更新する
    s = serial.Serial('/dev/serial0', 9600, timeout=10)
    s.readline() # 最初の1行は中途半端なデーターが読めることがあるので、捨てる
    while True:
        sentence = s.readline().decode('utf-8') # GPSデーターを読み、文字列に変換する
        if sentence[0] != '$': # 先頭が'$'でなければ捨てる
            continue
        for x in sentence: # 読んだ文字列を解析してGPSオブジェクトにデーターを追加、更新する
            gps.update(x)

gpsthread = threading.Thread(target=rungps, args=()) # 上の関数を実行するスレッドを生成
gpsthread.daemon = True
gpsthread.start() # スレッドを起動

while True:
    if gps.clean_sentences > 20: # ちゃんとしたデーターがある程度たまったら出力する
        h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
        print('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2]))
        print('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
        print('海抜: %f' % gps.altitude)
        print(gps.satellites_used)
        print('衛星番号: (仰角, 方位角, SN比)')
        for k, v in gps.satellite_data.items():
            print('%d: %s' % (k, v))
        print('')
    time.sleep(3.0)

こちらのプログラムを試してみて上手く行ったため、こちらの結果をExcelなどでまとめたいと思ったので、CSVファイルにできないかと思い、ChatGPTを使い、下記のプログラムを組んだのですが、直したほうがよいところや、そもそもExcelにまとめるなら別の方法のほうがよいなら教えてください。よろしくお願いします。

import serial
import csv
import threading
import micropyGPS
import sys

# シリアルポートの設定
ser = serial.Serial('/dev/ttyS0', 9600)  # '/dev/ttyS0'は適切なシリアルポートに変更
ser.flushInput()

# CSVファイルのヘッダーを定義(緯度、経度、時間、衛星番号などのフィールド)
csv_header = ["Latitude", "Longitude", "Time", "Satellite Number"]

# GPSデータをリアルタイムで表示し、CSVファイルに保存する関数
def process_gps_data():
    gps = micropyGPS.MicropyGPS(9, 'dd')
    
    with open("gps_data.csv", mode='w', newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(csv_header)

        try:
            while True:
                sentence = ser.readline().decode('utf-8')
                if sentence[0] == '$':
                    for x in sentence:
                        gps.update(x)
                    if gps.clean_sentences > 20:
                        h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
                        latitude = gps.latitude[0]
                        longitude = gps.longitude[0]
                        time = '%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2])
                        
                        # 衛星番号のリストを取得
                        satellites = list(gps.satellite_data.keys())
                        
                        # CSVファイルにデータを書き込む
                        writer.writerow([latitude, longitude, time, ', '.join(satellites)])
                        print(f'time: {time}, lat: {latitude}, lon: {longitude}, Satellites: {", ".join(satellites)}')

        except KeyboardInterrupt:
            print("プログラムを終了します。")
        except Exception as e:
            print(f"エラーが発生しました: {str(e)}")
            sys.exit(1)
        finally:
            ser.close()
            csv_file.close()

# スレッドでGPSデータの取得と処理を同時に実行
gps_thread = threading.Thread(target=process_gps_data)
gps_thread.daemon = False  # デーモンモードを無効にする
gps_thread.start()

try:
    gps_thread.join()  # スレッドの終了を待つ
except KeyboardInterrupt:
    print("プログラムを終了します。")
except Exception as e:
    print(f"エラーが発生しました: {str(e)}")
    sys.exit(1)

0

1Answer

CSVファイルであれば、カンマで項目を区切っただけの、単なるテキストファイルです。

「Pythonでテキストファイルを出力する方法」をググれば、簡単に答えは見つかると思います。

すみませんが、自分は、上のChatGPTの出力結果を見る気にはなりません。

0Like

Your answer might help someone💌