Python中的反距离加权插值

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

逆距离加权,或简称 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 来帮助我们可视化插值结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wouderw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值