用于从地理点列表中查找最近位置对的 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章

2个纬度/经度点(坐标)列表之间的地理/地理空间距离

通过距离和方位从已知位置查找点坐标的地理算法

查找最近的地理栅格元素

基于地理位置的列表排序

根据当前地理位置 ios app javascript 从 lat / long 列表中返回值

Elasticsearch系列(14)Query之地理空间查询