はじめまして。Python初心者です。表題の件をやりたくて質問します。
LatLonが書かれた2つのcsvがあり、距離を比較する関数を書いてみました。
ーーー
df1
lon lat
130.8 35.1
135.8 36.1
140.8 37.1
145.8 38.1
ーーー
df2
lon lat
131.5 35.1
132.5 35.1
133.5 35.1
134.5 35.1
ーーー
関数
import pandas as pd import numpy as np import csv import glob import math def cal_distance(lon1, lat1, lon2, lat2): # 極半径 pole_radius = 6356752.314245 # 赤道半径 equator_radius = 6378137.0 lat1_m = math.radians(lat1) lon1_m = math.radians(lon1) lat2_m = math.radians(lat2) lon2_m = math.radians(lon2) lat_difference = lat1_m - lat2_m lon_difference = lon1_m - lon2_m # 平均緯度 lat_average = (lat1_m + lat2_m) / 2 # 第一離心率^2 e2 = (math.pow(equator_radius, 2) - math.pow(pole_radius, 2)) / math.pow(equator_radius, 2) w = math.sqrt(1- e2 * math.pow(math.sin(lat_average), 2)) # 子午線曲率半径 m = equator_radius * (1 - e2) / math.pow(w, 3) # 卯酉線曲半径 n = equator_radius / w # 距離計測 distance = math.sqrt(math.pow(m * lat_difference, 2) + math.pow(n * lon_difference * math.cos(lat_average), 2)) return distance / 1000
ここで、次のカラムに
lon1 = df1.iloc[0, 0] lat1 = df1.iloc[0, 1] lon2 = df2.iloc[0, 0] lat2 = df2.iloc[1, 0]
とじかに設定してやると次のカラムで
cal_distance(lon1, lat1, lon2, lat2)
で解を一つ得られるのですが、df1の4行に対してdf2の行全部を当てて比較したいので
for文で回して計算してみようとすると、エラーが出てしまいます。
for i in len(df1): lon1 = df1.iloc[i, 0] lat1 = df1.iloc[i, 1] lon2 = df2.iloc[0, 0] lat2 = df2.iloc[1, 0] cal_distance(lon1, lat1, lon2, lat2)
→TypeError: 'int' object is not iterable
defの部分の書き方がおかしいのかもしれませんが、
1項目だけ設定したらエラーが出ないのに、forにするとエラーが出る理由がよくわかりません。
最終的には、df3を作って、
df1の1行目のLatLonとdf2の全LatLonを当てて、その最小値(min)をdf3に出力、
df1の2行目のLatLonとdf2の全LatLonを当てて、その最小値(min)をdf3に出力、
df1の3行目のLatLonとdf2の全LatLonを当てて、その最小値(min)をdf3に出力、
df1の4行目のLatLonとdf2の全LatLonを当てて、その最小値(min)をdf3に出力
をゴールとしています。
拙くて申し訳ありませんが、ご助言頂けると嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/27 02:52
2022/05/27 03:20 編集
2022/05/27 04:34