从 csv 文件中的位置列表中查找最近的位置 Python

Find closest location from a list of locations in csv file Python

我有一个如下所示的 csv 文件(位置名称、纬度、经度):

LocA, 40, 75
LocB, 100, -80
LocC, 45, 50
LocD, 20, -30
...

我有一个硬编码的起始位置(纬度、经度):

[20, -30]

使用欧几里德:

d = sqrt((x2 - x1)^2 + (y2 - y1)^2)

我需要一个距离我的起点最近的位置的列表(或数组)。我坚持循环浏览 csv 文件并从那里获取所有纬度和经度。我不知道是应该在循环内进行计算,还是在将所有内容保存在集合中后再进行计算。我在想用字典,把所有的东西都放在里面,循环之后,做计算。

# parse csv file using csv library
myCSV = csv.reader(open("temp.csv"))
dict = {}

# extract lats and longs in the csv file
for line in myCSV:

另一件事是预期的输出应该是这样的:

LocC, 45, 50
LocD, 20, -30
LocA, 40, 75
LocB, 100, -80
...

不是从最小到最大排序的数字列表。上面的例子只是为了指出输出应该是 name + lat + long,而不是数字(距离)列表。我没有在这里进行实际计算。如果正确计算,输出可能会有所不同。我也被困在这里,因为从最小到最大的列表后,我该如何对原始 csv 文件进行排序?

这是一种方法,使用 regular expression:

import math, re

def dist(a,b):
  return math.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)

p = [20,-30]

stringdata = re.findall('(.*), (.*), (.*)',open('testdata').read())
data = [(l,int(x),int(y)) for l,x,y in stringdata]
sorteddata = sorted(data, key=lambda d: dist(p,d[1:]))

最后一行说,"sort data, where each element d is sorted by the value of dist(p,d[1:])."这实现了您提到的按距离排序但保持完整数据可访问的内容。

1) 向字典中添加值

>>> import csv
>>> mycsv = csv.reader(open("ex4.csv"))
>>> dct = {}
>>> for lines in mycsv:
...     dct[lines[0]] = lines[1:]
>>> dct
{'LocB': [' 100', ' -80'], 'LocC': [' 45', ' 50'], 'LocD': [' 20', ' -30']}

2) 定义欧几里得函数和偏欧几里得函数(我刚刚意识到不需要部分欧几里得函数。我应该用默认 x1=20, y1=30 个参数定义欧几里得函数)

>>> import math
>>> from functools import partial
>>> def euclidean(x1, y1, x2, y2):
...     return math.sqrt((x1-x2)**2 + (y1-y2)**2)

>>> euc = partial(euclidean, 20, 30) #beginning coordinates

3) 计算距离

>>> for k in dct.keys():
...     d = euc(int(dct[k][0]), int(dct[k][0]))
...     dis.append((k, d))
... 
>>> dis = sorted(dis, key=lambda x: x[1])
>>> dis
[('LocD', 10.0), ('LocC', 29.154759474226502), ('LocB', 106.30145812734649)]

4) 排序。我刚刚打印了结果。也许您想打开一个新文件并将排序结果写入文件。

>>> for x, y in dis:
...     for k in dct.keys():
...         if x == k:
...             print x, " ".join(dct[k])
... 
LocD  20  -30
LocC  45  50
LocB  100  -80