【问题标题】:Join two dataframes on closest distance between coordinates python在坐标python之间的最近距离上加入两个数据框
【发布时间】:2017-10-11 23:58:23
【问题描述】:

我有两个数据集,我需要在两个坐标条件之间的距离上连接在一起。我使用Haversines formula 创建了一个函数来计算distance_km,但在需要多长时间时遇到了性能限制。

数据集 1:

 building_id |  lat  |  lng
-------------|-------|--------
      1      | 32.11 | -71.22
      2      | 32.44 | -72.25
      3      | 31.75 | -71.36```

数据集 2:

building_id |  lat  |  lng
------------|-------|--------
      4     | 31.65 | -73.52
      5     | 32.78 | -70.21
      6     | 36.15 | -72.49

每个数据集都有超过 10,000 个建筑物,我想将数据集 2 与数据集 1 匹配,但前提是距离以公里为单位的距离小于 0.0075。

我目前正在遍历数据集 1 的每一行,并从数据集 2 中查找所有 lat lng 组合以确定最小距离

dataset_2_latlng_dict = dict(zip(dataset_2.lng,dataset_2.lat))

for index, row in dataset_1.iterrows():
    lat = row['lat']
    lng = row['lng']
    all_dist = []
    final_list = []
    for key, value in dataset_2_latlng_dict.iteritems():
        distance = utils.distance_km(key,value,lng,lat)
        all_dist.extend([distance])
        final_list = sorted(all_dist, key=float)
    dataset_1['min_distance'] = final_list[0]

【问题讨论】:

  • 您有更大的数据集可用于测试吗?
  • 您可以尝试 1) 计算与第一个数据集中每个建筑物的最大距离的坐标,然后 2) 根据这些坐标过滤第二个数据集。那么您甚至可能不需要将所有行相互配对。

标签: python for-loop geospatial geo haversine


【解决方案1】:

你没有提供任何数据,所以我将这个答案保留为描述性的。

如您所料,没有理由计算到其他每座建筑物的距离。 7.5 米规格意味着纬度和经度将非常接近直接匹配任何彼此靠近的建筑物。

纬线之间的距离从赤道的 110.6 公里到两极的 111.7 公里不等。如果我们添加一些误差范围和舍入以使分析更容易,那么我们可以使用每度 100 公里的估计值。这意味着 0.0075 公里的最大距离变为最大纬度 0.000075 度。因此,任何符合 0.0075 公里距离标准的建筑物也必然符合 0.000075 纬度标准。如果您将计算限制在纬度 0.000075 度以内的建筑物,您只需要对更小的建筑物子集进行计算。

因此,您可以简单地按纬度对位置列表进行排序,然后遍历列表,仅比较纬度在另一个列表中建筑物的 0.000075 度(7.5 米)范围内的建筑物的距离。

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2022-06-16
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多