1. 程式人生 > >反距離權重插值(IDW)的python實現

反距離權重插值(IDW)的python實現

定義:

       反距離加權法又稱N-P法,是非規則分佈點變成規則分佈點常用的網格化方法之一。該方法的基本思想是離所估算的網格點距離越近的離散點對該網格點的影響越大,越遠的離散點影響越小,甚至可以認為沒有影響。在估算某一網格點的值時,假設離網格點最近的N個點對其有影響,那麼這N個點對該網格點的影響與他們之間的距離成反比。

       首先,需要計算所有離散資料點與所求網格點的距離,在二維平面空間,離散點(xi,yi)到網格(A,B)的距離Di為:

       然後,需要找出離網格點(A,B)最近的N個離散點的距離,則網格點(A,B)上的估算值為:

其中,Zi為離散點i上的觀測值,Z(A,B)為網格點(A,B)上的估算值。

需求:

根據一些離散點(包含x,y,z座標),定義一個包含著些離散點的的M*N的網格,求網格上的沒一點的高程。

設網格點的x,y分別為lon,lat。離散取樣點的集合為:lst

程式碼實現:

def get_h(lon, lat, lst):
    p0 = [lon, lat]
    sum0 = 0
    sum1 = 0
    temp = []
    # 遍歷獲取該點距離所有采樣點的距離
    for point in lst:
        if lon == point[0] and lat == point[1]:
            return point[2]
        Di = distance(p0, point)
        # new出來一個物件,不然會改變原來lst的值
        ptn = copy.deepcopy(point)
        ptn.append(Di)
        temp.append(ptn)

    # 根據上面ptn.append()的值由小到大排序
    temp1 = sorted(temp, key=lambda point: point[3])
    # 遍歷排序的前15個點,根據公式求出sum0 and sum1
    for point in temp1[0:15]:
        sum0 += point[2] / point[3]
        sum1 += 1 / point[3]

    return sum0 / sum1


# 計算兩點間的距離
def distance(p, pi):
    dis = (p[0] - pi[0]) * (p[0] - pi[0]) + (p[1] - pi[1]) * (p[1] - pi[1])
    m_result = math.sqrt(dis)
    return m_result

三維效果圖