Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算单独csv文件中坐标之间的最短距离_Python_Python 3.x_Coordinates_Distance - Fatal编程技术网

Python 计算单独csv文件中坐标之间的最短距离

Python 计算单独csv文件中坐标之间的最短距离,python,python-3.x,coordinates,distance,Python,Python 3.x,Coordinates,Distance,我有两个CSV文件名为文件A和文件B,带有坐标纬度和经度。我想通过在所有坐标之间循环,并将每个坐标分配给距离较短的坐标,从而使过程自动化。数据框具有相同的形状和长度,这意味着每个坐标必须指定给距离较短的唯一坐标。目前,我是手工做的,很乏味。这是我的密码 from math import asin, cos, pi, sqrt # coordinates in file A lat1 = float(input('Latitude A')) lon1= float(input('Longitud

我有两个CSV文件名为文件A和文件B,带有坐标纬度和经度。我想通过在所有坐标之间循环,并将每个坐标分配给距离较短的坐标,从而使过程自动化。数据框具有相同的形状和长度,这意味着每个坐标必须指定给距离较短的唯一坐标。目前,我是手工做的,很乏味。这是我的密码

from math import asin, cos, pi, sqrt

# coordinates in file A
lat1 = float(input('Latitude A'))
lon1= float(input('Longitude A'))

# coordinates in file B
lat2 = float(input('Latitude B'))
lon2= float(input('Longitude B'))


def distance(latA, lonA, latB, lonB):
    p = pi/180 # in radians
    a =  0.5 - cos((latB-latA)*p)/2 + cos(latA*p) * cos(latB*p) * (1-cos((lonB-lonA)*p))/2
    return 12742 * asin(sqrt(a)) #2*R*asin...
这是数据在两个CSV文件中的外观,如下图所示,但是,我想添加两列,一列用于计算距离(以米为单位),另一列用于对应的坐标(以最短距离为单位)


假设您希望为文件的给定行找到最近的一对坐标,听起来您希望将文件解析为列表列表

从这里开始,遍历其中一个列表,并通过检查第二个列表中的所有坐标找到最短距离

类似这样,假设您已经将这两个列表加载到一些变量

对于列表1中的坐标: 最近坐标=无 对于清单2中的第二个合作伙伴: 位移=距离坐标,第二坐标 如果最近的坐标=无或位移<最近的坐标[1]: 最近坐标=第二坐标,位移 用这些信息做点什么,也许有一个坐标对及其距离的列表? 假设距离函数是正确的,请尝试以下操作

导入csv 将“file2.csv”作为file2打开: f2csv=csv.readerfile2 f2pairs=[f2csv中的行对行] 将“file1.csv”作为file1打开: f1csv=csv.readerfile1 对于lat1,f1csv中的lon1: 正念者=无 对于lat,lon成对: 距离=距离LAT1,lon1,lat,lon 如果Mindsist为None或Distant,则确定最近的点 为了获得所需的输出,首先需要确定第二个文件中对应的最近点是什么。这可以通过在第一个文件上的所有点上迭代,并用在第二个文件上的坐标上迭代的另一个循环嵌套该点来实现

由于您希望将所有结果保存到一个文件中,因此我已将每个预期结果保存到其自己的数组中,对应于第一个文件上的每个点

注意:我使用numpy作为整个答案的np

shortest_distances = []
closest_points = []

for c1 in coordinates_1:
    # Compute the distance for each point
    distances = [distance(c1, c2) for c2 in coordinates_2]
    # Determine the shortest
    index = np.argmin(distances)
    closest_points.append(coordinates_2[index])
    shortest_distances.append(distances[index])
叠加结果 由于每个输出都将与其在第一个文件上的点相关联,因此您可以简单地将其水平堆叠以获得所需内容

result = np.hstack((coordinates_1, closest_points, np.reshape(shortest_distances, (3, 1))))

注意,我必须在最短_距离列表中调用np.reforme,这样它将有两个维度,然后np.hstack将工作

将结果打印到CSV 最后,我们可以调用np.savetxt将结果保存到csv文件中

np.savetxt("result.csv", result, delimiter=",")
完整代码 这是完整的代码

import numpy as np


def distance(point1, point2):
    R = 12742  # Earth radius, in KM
    p = np.pi / 180  # in radians
    lat1 = point1[0]
    lat2 = point2[0]

    lon1 = point1[1]
    lon2 = point2[1]

    a = 0.5 - np.cos((lat2 - lat1) * p) / 2 + np.cos(lat1 * p) * np.cos(lat2 * p) * (1 - np.cos((lon2 - lon1) * p)) / 2
    return R * np.arcsin(np.sqrt(a))


coordinates_1 = np.loadtxt('coordinates1.csv', delimiter=',')
coordinates_2 = np.loadtxt('coordinates2.csv', delimiter=',')

shortest_distances = []
closest_points = []

for c1 in coordinates_1:
    # Compute the distance for each point
    distances = [distance(c1, c2) for c2 in coordinates_2]
    # Determine the shortest
    index = np.argmin(distances)
    closest_points.append(coordinates_2[index])
    shortest_distances.append(distances[index])

result = np.hstack((coordinates_1, closest_points, np.reshape(shortest_distances, (3, 1))))

# save to a csv file
np.savetxt("result.csv", result, delimiter=",")

下面是我在重新解释这个问题后所做的

解析文件并将坐标放入列表中 然后找到所有最短的唯一对,将它们放入列表中 将最短的对返回到文件1的顺序 输出坐标1、坐标2以及到输出文件coords_out.csv的距离 CSV_分隔符=',' filename_1='file2.csv' filename_2='file1.csv' 类坐标: 定义初始自我、纬度、经度、文件、行: self.lat=纬度 self.lon=经度 self.file=文件 self.line=line 定义自身: 返回f'{self.lat},{self.lon}' def提取线: lat,lon=line.splitCSV_分隔符 返回浮球 def距离LAT1、lon1、lat2、lon2: p=π/180英寸弧度 a=0.5-coslat2-lat1*p/2+coslat1*p*coslat2*p*1-coslon2-lon1*p/2 返回12742*asinsqrta 2*R*asin。。。 coords_1=[] coords_2=[] 将openfilename_1作为文件1,将openfilename_2作为文件2: 跳过标题行 file1.readline file2.readline 同时迭代两个文件 对于enumeratezipfile1、file2中的i、line1、line2: printf'{line1}' 提取值并将其添加到列表中 lat1,lon1=extractline1 lat2,lon2=extractline2 coords_1.appendcoordinarelat1,lon1,'file1',i coords_2.AppendCoordinate2,lon2,'file2',i 现在我们找到坐标之间的最短距离 coords_1_order=coords_1[:]复制订单以备以后使用 最短距离=[] 对于范围为MinLenCoords_1、lencoords_2的x: 最小值=无 对于i,枚举坐标1中的坐标1: 对于j,坐标系2中的坐标系2: d=距离坐标1.lat,坐标1.lon, 坐标2.lat,坐标2.lon 如果最小值d==无或d<最小值d[0]: 最小坐标d=d,坐标1,坐标2,i,j 将找到的最小距离添加到列表中,并确保在下一个循环中不再使用这些坐标 最短距离 coords_1.Popud[3] coords_2.popsm allest_d[4] 然后我们按照文件1的顺序对距离进行排序 已排序的返回=[] 对于按协调顺序排列的c: 对于最短距离内的d_信息: 如果c==d_info[1]: 已排序的返回。已附加的信息 检查分拣是否正常 assert lensorted\u back==lenshortest\u距离,排序严重错误,数组长度不匹配 打开'coords_out.csv','w'作为输出: 写标题 out.writef'lat1,lon1,lat2,lon2,distance\n' 对于排序后的距离信息: d、 c1,c2,i,j=距离信息 输出坐标1、坐标2和到输出文件的距离 out.writef'{c1},{c2},{d}\n'
我添加了一个小的坐标类,该类还可以跟踪文件和坐标所在行的信息。

能否显示CSV文件中的一行?标题行是什么样子的?因此两个文件都是这种格式的?试着编辑你的答案,以更准确地展示你想要发生的事情。你能澄清一下你想要实现什么吗?是否要将文件1中的每个坐标与其在文件2处的最近点配对?因此,将文件1中的每一行与文件2中的每一行进行比较,并以最短距离输出该对?文件1中的两行是否允许同时配对到文件2中的同一行?您的问题没有提到为文件1中的每个项目从文件2中选择唯一配对的要求,这一点后来在评论中提到过,我们也不知道如何仅根据一条评论实现这一点,因此我没有尝试在这里解决。再次强调,如果您仍然需要帮助,请特别针对该问题提出一个新问题,可能链接到这里,但也可以参考提供帮助的指南。我猜这里的np指的是NumPy,一个流行但非标准的第三方库。是的。。。我在完整的代码中有这个别名,但是很好,为了避免混淆,我将在开始时包含它。我认为您正在使它变得比必须的更复杂。在任何情况下,断言都会得到额外的分数@同样,复杂是一个相对的术语,但我同意我的解决方案有点复杂。我想找到一种不使用额外库的方法,主要是因为我自己没有太多使用不同库的经验。看看你的答案,我真希望我知道如何查找这些方法!hstack??我害怕依赖于我不懂的代码,所以我总是尽量保持原始状态。我认为我寻找最短距离的方法也很乏味,但它是有效的。分而治之会更好…公平点@Queuebee。我同意你的观点,不依赖第三方库通常是一个好方法。然而,您也面临着总是要自己重新发明轮子的风险,而且很可能您的实现不会像库中的实现那样高效。也就是说,你的观点是,这正是为什么我倾向于避免使用具有奇特数据结构的库,这些库的目标是为你在这里阅读的所有内容提供帮助。在任何情况下,numpy都是一个非常容易熟悉的库,它与matlab的操作方式非常相似。我一定会开始更多地探索numpy!而且可能很快就会被迫学习熊猫:'