当前位置:   article > 正文

Python中的反距离加权插值_python距离权重插值法

python距离权重插值法

地理空间插值是用于使用已知值估计地理区域中未知点的值的过程。

逆距离加权,或简称 IDW,是用于地理空间数据插值的最流行的方法之一。本文将讲述如何在 Python中进行 IDW 插值。

IDW 插值方法假设更接近的值比更远的值更相关。IDW 通过使用已知值与要估计值的点的距离加权来估计未知点的值。

  1. import numpy as np
  2. def idw_custom(dist,val,power):
  3.     numerator=np.sum(val/(dist**power))
  4.     weights=np.sum(1/(dist**power))
  5.     return numerator/weights
  6. dist=np.array([1.38,3.04,7.36,7.59,9.67])
  7. val=np.array([17.7,15.7,34.3,6.3,23.3])
  8. print(idw_custom(dist,val,1))

分子包含已知值的总和除以距离,分母包含距离倒数的总和。幂可以用来控制已知值的影响。

使用内置库执行 IDW 插值

在上面的示例中,我们使用了预先计算的距离,但在大多数实际用例中,我们必须自己计算距离。我们可以使用haversine距离来计算它,但是当我们有很多点时,这可能很麻烦。这是我们可以使用预先存在的库来计算距离并执行插值的地方。

在我们的示例中,我们将从班加罗尔市的空气质量数据中插入 PM2.5 值。

  1. grid_space = 0.01
  2. grid_lon = np.arrange(np.amin(lons), np.amax(lons), grid_space)
  3. grid_lat = np.arrange(np.amin(lats), np.amax(lats), grid_space)

让我们首先生成一个需要估计值的点网格。我们设置了大约 1 公里的网格空间。

“lons”包含经度列表,“lats”包含纬度列表。我们使用经度和纬度的最小值和最大值生成了网格。

  1. all_lats = np.meshgrid(grid_lon, grid_lat)[1].ravel()
  2. all_lons = np.meshgrid(grid_lon, grid_lat)[0].ravel()
  3. itrp=pd.DataFrame()
  4. itrp['lat']=all_lats
  5. itrp['lng']=all_lons

在上面的代码中,我们创建了一个数据框,其中包含我们需要估计值的纬度和经度对。我们也可以使用'for循环'来做同样的事情,如下面的代码所示。

  1. lat=[]
  2. lng=[]
  3. for i in range(len(grid_lat)):
  4. for j in range(len(grid_lon)):
  5. lat.append(grid_lat[i])
  6. lng.append(grid_lon[j])
  7. itrp=pd.DataFrame()
  8. itrp['lat']=lat
  9. itrp['lng']=lng

我们可以使用 Sklearn 的 KNN 实现来模拟 IDW。下面给出了执行此操作的代码。

“样本”数据帧包含单个时间戳的车站空气质量数据。我们将经纬度作为解释变量,将 PM2.5 作为需要插值的变量。我们应该使用“kd_tree”作为算法,并将“n_neighbors”设置为站数,在本例中为 8。我们还应该将“权重”设置为执行 IDW 的距离。

将使用 predict 方法来估计存储在 itrp 数据帧中的网格点的值。

我们现在将加载一些 shapefile 来帮助我们可视化插值结果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/306013
推荐阅读
相关标签
  

闽ICP备14008679号