用于从地理点列表中查找最近位置对的 Python 脚本
Posted
技术标签:
【中文标题】用于从地理点列表中查找最近位置对的 Python 脚本【英文标题】:Python script to find closest location pairs from a list of geographic points 【发布时间】:2018-09-19 17:47:46 【问题描述】:我有一个位置列表及其名称和坐标点。
我正在尝试为每个位置查找最近的位置对并打印当前位置名称、到最近位置的距离以及最近的位置名称。
位置名称存储在第 0 列中 纬度存储在第 5 列中 经度存储在第 8 列中我已尝试解决此问题,但经过几次迭代后出现此错误。
---------------------------------------------------------------------------
24 for j in range(len(data[i])):
25 if(i != j):
---> 26 distance = get_distance(float(data[i][5]),float(data[i][8]),float(data[j][5]),float(data[j][8]))
27 temp = str(data[i][0])
28 if (min > distance):
ValueError: could not convert string to float:
我在这个错误之前得到了结果,但我怀疑结果是错误的。不知道是什么问题,任何帮助将不胜感激。
编辑:我现在的问题是算法坏了。它返回的最近位置始终是相同的目标位置。它返回的距离从 80 英里到数千英里不等,我知道情况并非如此。所有地点都相距数百英里。
import math
import csv
with open("Locations.csv") as f:
def get_distance(lat_1, lng_1, lat_2, lng_2):
d_lat = lat_2 - lat_1
d_lng = lng_2 - lng_1
temp = (
math.sin(d_lat / 2) ** 2
+ math.cos(lat_1)
* math.cos(lat_2)
* math.sin(d_lng / 2) ** 2
)
return 3963.1676 * (2 * math.atan2(math.sqrt(temp), math.sqrt(1
- temp)))
min = float(9000)
temp = ''
closest = ''
reader = csv.reader(f)
next(reader) # skip header
for i in range(len(data)):
for j in range(len(data[i])):
if(i != j):
distance = get_distance(float(data[i][5]),float(data[i][8]),float(data[j][5]), float(data[j][8]))
temp = str(data[i][0])
if (min > distance):
min = distance
closest = temp
print(str(data[i][0]) +" " + str(min) + " " + closest)
min = 90000
closest = ''
【问题讨论】:
如果您的点是经度和纬度,this 对您有帮助吗? “数据”变量在哪里定义? 您是否检查了您的 csv 文件以确保其中没有字符? @amacf 我错过了数据定义,data = [r for r in reader],应该在 nextline(reader) 之后...不知何故这没有什么区别 @NickEu 我有,csv 是干净的 【参考方案1】:我假设您正在尝试读取 文件对象,而不是 内容。看看docs就可以找到用法了。
这是同一文档中的一个简单示例:
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
查看代码没有读取任何内容,并且您的阅读器超出了您的 CSV 文件范围。 请注意,您使用的是“with open”,它定义了其范围并随后关闭文件。
【讨论】:
这基本上就是我所做的。修复了格式以使其更清晰 在您编辑代码之前看到了这个,读者超出了范围。以上是关于用于从地理点列表中查找最近位置对的 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章