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

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

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

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

解決済

2つのLatLonファイルを確認して最も距離が近い組合せを抽出したい

chouchou
chouchou

総合スコア3

Python 3.x

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

1回答

0評価

0クリップ

96閲覧

投稿2022/05/27 01:48

はじめまして。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に出力

をゴールとしています。

拙くて申し訳ありませんが、ご助言頂けると嬉しいです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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