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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1499閲覧

Pyproj:一点から複数の点の距離を求めたい

Ykkykk

総合スコア140

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/09/12 03:55

編集2018/09/12 04:29

Pyprojを使用して、一点から複数の点の距離を求めたいと思っております。距離については、直線距離を求めるのではなく、ある一点から南北/東西方向にそれぞれどのくらいずれているのかという距離を求めています。

python

1import pandas as pd 2import pyproj 3 4df = pd.read_csv('file.csv') 5 6# lat1, lng1である一点の座標を決めておく 7lat1 = 緯度 8lng1 = 経度 9 10grs80 = pyproj.Geod(ellps='GRS80') 11 12for lat2 in list(df[1]): 13 azimuth, bkw_azimuth, distance = grs80.inv(lng1, lat1, lng1, lat2) 14for lng2 in list(df[2]): 15 azimuth, bkw_azimuth, distance = grs80.inv(lng1, lat1, lng2, lat1)

以上のようなコードをコンソール上で書きfor文で回すことで、距離自体は求められているのですが、これをクラスの中で使用し、以下のように変数にそれぞれself.とつけました。

Python

1self.df = pd.read_csv('file.csv') 2 3# lat1, lng1である一点の座標を決めておく 4self.lat1 = 緯度 5self.lng1 = 経度 6 7self.grs80 = pyproj.Geod(ellps='GRS80') 8 9for self.lat2 in list(self.df[1]): 10 self.proj_nums1 = self.grs80.inv(self.lng1, self.lat1, self.lng1, self.lat2) 11for self.lng2 in list(self.df[2]): 12 self.proj_nums2 = self.grs80.inv(self.lng1, self.lat1, self.lng2, self.lat1)

すると、

Python

1AttributeError: 'float' object has no attribute 'self'

というエラーが出てしまいます。このエラーは一つ目のfor文では出ず、二つ目のfor文で出てしまいます。一つ目のfor文をコメントアウトしてみても同じエラーが出ています。
緯度も経度もfloatなのだと思うのですが、なぜ二つ目のfor文でだけエラーが出てしまうのでしょうか?
ご教示いただけますと幸いです。よろしくお願いします。

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

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

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

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

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

fuzzball

2018/09/12 04:12

selfを付けたコードを書いて下さい。
guest

回答1

0

ベストアンサー

緯度・経度は、floatになるように小数点のある数字で与えていますでしょうか?

投稿2018/09/12 06:34

kakimochi

総合スコア110

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

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

Ykkykk

2018/09/12 07:47

ご回答いただきありがとうございます。 すべて小数点の座標になっております。
kakimochi

2018/09/12 08:41

> なぜ二つ目のfor文でだけエラーが出てしまうのでしょうか? 上記の回答にはなっていないのですが、 やりたいことは下記のような感じでしょうか?? ```python import pyproj import pandas as pd df = pd.read_csv("station.csv", header=None) # ヘッダーなしを読み込む # station.csv # 30.0, 130.0 # 34.705185, 135.498468 # 35.170897, 136.881537 lat1, lng1 = 34.705185, 135.498468 # 梅田駅 grs80 = pyproj.Geod(ellps='GRS80') data_list = [] for i, row in df.iterrows(): # print(i, row[0], row[1]) data = grs80.inv(lng1, lat1, row[1], row[0]) # print(data) data_list.append(data) print(data_list) ```
kakimochi

2018/09/12 08:54

Ykkykkさんが設計されているClassとはちがうかもしれませんが、 ざっとClass使って書いてみました。 ```python import pyproj import pandas as pd class GeoCalc: def __init__(self, filename): self.filename = filename def calc(self): df = pd.read_csv(self.filename, header=None) # ヘッダーなしを読み込む # df = pd.read_csv("station.csv", header=None) # ヘッダーなしを読み込む # station.csv # 30.0, 130.0 # 34.705185, 135.498468 # 35.170897, 136.881537 lat1, lng1 = 34.705185, 135.498468 # 梅田駅 grs80 = pyproj.Geod(ellps='GRS80') data_list = [] for i, row in df.iterrows(): # print(i, row[0], row[1]) data = grs80.inv(lng1, lat1, row[1], row[0]) # print(data) data_list.append(data) # print(data_list) self.data_list = data_list if __name__ == "__main__": geo = GeoCalc("station.csv") geo.calc() print(geo.data_list) ```
Ykkykk

2018/09/13 00:15

詳細なコードまでご提示いただきありがとうございます。 本当に初歩的な質問で申し訳ないのですが、self.がいる変数といらない変数の違いはなんなのでしょうか?self.の意味がまだあまりわかっておらず、すべての変数につけてしまっているので動かないのかとも思いました。
kakimochi

2018/09/13 05:49

ざっとくだけた説明をすると、 selfをつけた変数は、そのクラスに保存されます。 私が書いたコードでは、 self.filename は、保存しなくてもいいけど、まあ後でも使うかもしれないし、一応とっておくかー。 self.data_list は、結果として読み出したいので、geo.data_list で読み出せるようにしておくかー。 という設計ですね。
Ykkykk

2018/09/13 06:07

なるほど…。本来の質問外の質問でしたがお答えいただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問