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


定義:

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

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

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

其中, 為離散點 上的觀測值, 為網格點(A, B)上的估算值, 為參與計算的樣本個數, 為插值點與第 個站點間的距離, 是距離的冪,一般取2。

需求:

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

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

代碼實現:

 1 # lon和lat分別是要插值的點的x,y
 2 # lst是已有數據的數組,結構為:[[x1,y1,z1],[x2,y2,z2],...]
 3 # 返回值是插值點的高程
 4 def interpolation(lon, lat, lst):
 5     p0 = [lon, lat]
 6     sum0 = 0
 7     sum1 = 0
 8     temp = []
 9     # 遍歷獲取該點距離所有采樣點的距離
10     for point in lst:
11         if lon == point[0] and lat == point[1]:
12             return point[2]
13         Di = distance(p0, point)
14         # new出來一個對象,不然會改變原來lst的值
15         ptn = copy.deepcopy(point)
16         ptn.append(Di)
17         temp.append(ptn)
18  
19     # 根據上面ptn.append()的值由小到大排序
20     temp1 = sorted(temp, key=lambda point: point[3])
21     # 遍歷排序的前15個點,根據公式求出sum0 and sum1
22     for point in temp1[0:15]:
23         sum0 += point[2] / math.pow(point[3], P)
24         sum1 += 1 / math.pow(point[3], P)
25     return sum0 / sum1
26  
27  
28 # 計算兩點間的距離
29 def distance(p, pi):
30     dis = (p[0] - pi[0]) * (p[0] - pi[0]) + (p[1] - pi[1]) * (p[1] - pi[1])
31     m_result = math.sqrt(dis)
32     return m_result

其中P=2。

 


————————————————
版權聲明:本文為CSDN博主「我住隔壁我姓王a」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/BigBoySunshine/article/details/81867502


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM