質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

7019閲覧

一つ前のデータと今取得したデータが異なれば処理を行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/06 10:31

編集2019/01/08 04:44

これはプログラムの対象部分であり、これを動作させると以降、While True:内部を無限ループするものです。

題目のとおりですが、"gps.latitude[0], gps.longitude[0]"に格納されている小数点のデータが一個前のデータと同じであれば特に何も処理せず再度、ループの先頭に返し無限ループを始める、、ことを実装したいです。
上記の「特に何もせず」の部分ですが無記入だとエラー(頭にインデントを入れろ)が出てしまうので、"print("same")"としました。

どうかよろしくお願いいたします。

Python

1def rungps(): 2 #timeoutを秒で設定(10秒の間に受信したデータを返す) 3 s = serial.Serial('/dev/serial0', 9600, timeout=10) 4 #ここでGPSデータ取得するが初回はうまく取得できていない 5 s.readline() 6 #読むの1回目 7 c = 1 8 while True: 9 #GPSデータを'utf-8'に変換 10 sentence = s.readline().decode('utf-8') 11 if sentence[0] != '$': 12 continue 13 #GPSオブジェクトにデータを追加,更新する 14 for x in sentence: 15 gps.update(x) 16 17 if gps.clean_sentences > 20: 18 print('%2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0])) 19 df = pd.DataFrame([[gps.latitude[0], gps.longitude[0]]]) 20 #読むの1回目なら 21 if c == 1: 22 lat = gps.latitude[0] 23 lon = gps.longitude[0] 24 25 df.to_csv('r_latlon.csv', mode='a', header=False, index=False) 26 27 time.sleep(1.0) 28 29 #読むの2回目以降は 30 elif lat == gps.latitude[0] or lon == gps.longitude[0]: 31 print("same") 32

補足変更追記

①GPSが”35.0000, 139.0000”の形で35.000はgps.latitude[0]へ、139.0000はgps.longitude[0]へ格納されます。
GPSが繰り返し取得されるので、上記①が繰り返し動作しgps.latitude[0],gps.longitude[0]はその都度更新されます。
そこで一つ前のデータと今取得したデータが異なる場合にのみ動作させたく、プログラムを動作した直後一度目のgps.latitude[0],gps.longitude[0]データをlat及びlonに格納し2回目以降はlatとgps.latitude[0]を,lonとgps.longitude[0]を比較しようと思いました。
しかしこの通りに動作しなかったため、どのように変更すれば良いのかをお聞きした次第でございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinobu_osaka

2019/01/06 10:47

ちょっと何が聞きたいのかわかりません。 コードも途中までですし…。 とりあえず「一つ前のデータと次のデータが同じなら処理を行わない」ではなく、 「一つ前のデータと今取得したデータが異なれば処理を行う」と記述するのが普通ではないでしょうか。
guest

回答2

0

ベストアンサー

前回取得データと今回取得データを比較し、
前回取得データと今回取得データが異なれば処理を実行し、
前回取得データへ今回取得したデータを入れる。

上記の処理をループするだけで実現可能かと思います、
「同じであるか?」を確認するのではなく、「違うか?」を確認して処理をすれば、
「同じである場合何もしない」という記述そのものが必要なくなります。

また、ループの前に「前回取得データ」を入れる必要もありません。
(初回実行時は前回取得データ(0)と比較され"異なる"と判断されるため)

下記をループ

python

1if lat != gps.latitude[0] or lon != gps.longitude[0]: 2 ~新しい位置データの処理~ 3 lat = gps.latitude[0] 4 lon = gps.longitude[0]

あと、元コードの lat == gps.latitude[0] or lon == gps.longitude[0]: は、
or ではなく and が正しのでは?

投稿2019/01/08 10:22

編集2019/01/08 10:25
shinobu_osaka

総合スコア456

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/09 06:53

```Python # カーナビ(オンライン) # "r_latlon.csv" に保存 # "r_map.html" で出力 # 1秒の遅れで11m進む(時速40km) import csv, folium, io, micropyGPS, serial, time import pandas as pd import webbrowser from selenium import webdriver #(タイムゾーンの時差(日本は9時間), '出力フォーマット(ddは10進=35.6789)') gps = micropyGPS.MicropyGPS(9, 'dd') driver = webdriver.Chrome("/usr/lib/chromium-browser/chromedriver") browser = None #--------------------------------------------------------------------------------- def rungps(): #timeoutを秒で設定(10秒の間に受信したデータを返す) s = serial.Serial('/dev/serial0', 9600, timeout=10) #ここでGPSデータ取得するが初回はうまく取得できていない s.readline() while True: sentence = s.readline().decode('utf-8') if sentence[0] != '$': continue for x in sentence: gps.update(x) if gps.clean_sentences > 20: print('%2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0])) df = pd.DataFrame([[gps.latitude[0], gps.longitude[0]]]) df.to_csv('0109.csv', mode='a', header=False, index=False) plot_to_map() time.sleep(1.0) #--------------------------------------------------------------------------------- def plot_to_map(): df = pd.read_csv('0109.csv', names=('lat', 'lon')) map = folium.Map(location=[df.lat[0], df.lon[0]], zoom_start=18) for i, r in df.iterrows(): folium.Marker(location=[r['lat'], r['lon']], icon=folium.Icon(color='black', icon='circle')).add_to(map) map.save("0109.html") global browser if browser is None: # 初回は開く browser = webdriver.Chrome(r'/usr/lib/chromium-browser/chromedriver') browser.get('file:///home/pi/Desktop/0109.html') else: # 2回目以降は再読込 browser.refresh() time.sleep(1.0) #--------------------------------------------------------------------------------- rungps() if browser is not None: browser.quit() time.sleep(1.0) ``` ご回答ありがとうございます。 ですがどこにその文を追記、そしてどの文を削除すればよいのでしょうか? 上に基のプログラム全文を貼ります。
shinobu_osaka

2019/01/09 07:18

ええと、このコードはご自分で書かれたのではないのでしょうか? 処理してるのはココでしょうかね? if gps.clean_sentences > 20: print('%2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0])) df = pd.DataFrame([[gps.latitude[0], gps.longitude[0]]]) df.to_csv('0109.csv', mode='a', header=False, index=False) plot_to_map() time.sleep(1.0) ここのif文内を私が書いた前と違うなら処理すればいいのではないでしょうか? きちんとコードを読み込んではいませんが、 10秒毎に位置をCSVに保存してる感じでしょうか、 これ、移動してなければ保存しないですと、時間がわからなくなりますので、 タイムスタンプも書き出すようにしないとですね~。
guest

0

空のブロックを表したい場合はpass文を用います。また、ループ内の残り処理を飛ばして次のループに行きたい場合はcontinueの方が適しているかもしれません。

投稿2019/01/06 10:52

編集2019/01/06 10:53
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問