地理空间插值是用于使用已知值估计地理区域中未知点的值的过程。
逆距离加权,或简称 IDW,是用于地理空间数据插值的最流行的方法之一。本文将讲述如何在 Python中进行 IDW 插值。
IDW 插值方法假设更接近的值比更远的值更相关。IDW 通过使用已知值与要估计值的点的距离加权来估计未知点的值。
import numpy as np
def idw_custom(dist,val,power):
numerator=np.sum(val/(dist**power))
weights=np.sum(1/(dist**power))
return numerator/weights
dist=np.array([1.38,3.04,7.36,7.59,9.67])
val=np.array([17.7,15.7,34.3,6.3,23.3])
print(idw_custom(dist,val,1))
分子包含已知值的总和除以距离,分母包含距离倒数的总和。幂可以用来控制已知值的影响。
使用内置库执行 IDW 插值
在上面的示例中,我们使用了预先计算的距离,但在大多数实际用例中,我们必须自己计算距离。我们可以使用haversine距离来计算它,但是当我们有很多点时,这可能很麻烦。这是我们可以使用预先存在的库来计算距离并执行插值的地方。
在我们的示例中,我们将从班加罗尔市的空气质量数据中插入 PM2.5 值。
grid_space = 0.01
grid_lon = np.arrange(np.amin(lons), np.amax(lons), grid_space)
grid_lat = np.arrange(np.amin(lats), np.amax(lats), grid_space)
让我们首先生成一个需要估计值的点网格。我们设置了大约 1 公里的网格空间。
“lons”包含经度列表,“lats”包含纬度列表。我们使用经度和纬度的最小值和最大值生成了网格。
all_lats = np.meshgrid(grid_lon, grid_lat)[1].ravel()
all_lons = np.meshgrid(grid_lon, grid_lat)[0].ravel()
itrp=pd.DataFrame()
itrp['lat']=all_lats
itrp['lng']=all_lons
在上面的代码中,我们创建了一个数据框,其中包含我们需要估计值的纬度和经度对。我们也可以使用'for循环'来做同样的事情,如下面的代码所示。
lat=[]
lng=[]
for i in range(len(grid_lat)):
for j in range(len(grid_lon)):
lat.append(grid_lat[i])
lng.append(grid_lon[j])
itrp=pd.DataFrame()
itrp['lat']=lat
itrp['lng']=lng
我们可以使用 Sklearn 的 KNN 实现来模拟 IDW。下面给出了执行此操作的代码。
“样本”数据帧包含单个时间戳的车站空气质量数据。我们将经纬度作为解释变量,将 PM2.5 作为需要插值的变量。我们应该使用“kd_tree”作为算法,并将“n_neighbors”设置为站数,在本例中为 8。我们还应该将“权重”设置为执行 IDW 的距离。
将使用 predict 方法来估计存储在 itrp 数据帧中的网格点的值。
我们现在将加载一些 shapefile 来帮助我们可视化插值结果。