使用Arcgis + Matlab 獲取徑流節點

????網上找了很少有關于提取徑流節點的文章,我因為論文要用到花了好幾個小時找方法,最后還是在Arcgis里面找到了突破口。Arcgis自帶的水文分析工具箱中就有基本的水文分析工具,想要獲取徑流節點只要需要知道河流的每一段的起始和終止位置就行。首先是提取河網 DEM --> 填洼 --> 流向 --> 流量 --> 設定流量閾值(重分類方法),然后用 河流鏈接工具 就能給每一段河流一個唯一的序號。

每一段河流都有序號了,接下來就好辦了,很明顯有兩個思路(1)找到每一個連接多條河網的節點,用窗口分析就能做到。(2)結合流向圖,對于每一段河流其最兩段的點有可能就是徑流節點,再根據端點中是否與其他河流相連就能判斷是否為徑流節點。

我用 Matlab 實現了第一種方法,寫的有點啰嗦,代碼貼上去中文字符顯示異常,懶得改了思路很簡單,就是用 3*3的窗口根據窗口內的柵格有幾個在河流上的找到意思節點,再比較相鄰的疑似節點,只留下一個最大值。

```

%? ?áè?2¢?òμ???á÷?úμ?


path = 'C:\Users\xjh\Desktop\?°?òí????á11\ó?ò?ìáè???á÷?úμ?.tif';


c = imread( path );


c(c==2147483647) = 0 ;


river = zeros(1000, 2);? % oóá÷μ?


num = 0;

fori=1:size(c, 1)

? ? forj=1:size(c, 2)

? ? ? ? ifc(i,j) ~= 0

? ? ? ? ? ? num = num+1;

? ? ? ? ? ? river(num, :) = [ i j ];

? ? ? ? end

? ? end

end

jie_ri = zeros(1, 2);%?òμ?oóá÷?úμ?

jie_num = 1;

fori=1:size(river, 1)

? ? i;

? ? % ?°?ò?a???¤??μ?ê?2?ê?oóá÷?úμ?

? ? % £¨1£?·μ???a???úμ??ü?§μ?????μ?£??ü?§′??ú???üμ??úμ??íê?oóá÷?úμ?


? ? ifriver(i, 1) ~=1 && river(i, 1)~=size(c, 1) && river(i, 2) ~=1 && river(i, 2)~=size(c, 2)?

? ? ? ? % μ?μ??¤??μ??ü?§μ? 8 ???¤??

? ? ? ? rx = river(i, 1); ry = river(i, 2);


? ? ? ? temp = c( rx-1:rx+1 , ry-1:ry+1);


? ? ? ? % oóá÷?úμ??áéùóD3??áú?óμ?

? ? ? ? ifsize( find(temp==0) , 1 ) < 6


? ? ? ? ? ? ifsize(unique(temp), 1) == 4


? ? ? ? ? ? ? ? jie_ri(jie_num, :) = [rx, ry];

? ? ? ? ? ? ? ? jie_num = jie_num+1;


? ? ? ? ? ? end


? ? ? ? end


? ? end


end


% è¥μ?μ??D£??òμ?μ?μ?áú?óμ?£?òaê??μ±è??′ó?íé?μ???£?·???é?μ?×??o


fori=1:size(jie_ri, 1)


? ? forj=1:size(jie_ri, 1)


? ? ? ? one = jie_ri(i, :) ; two = jie_ri(j, :);


? ? ? ? x1 = one(1) ; y1 = one(2); x2 = two(1); y2 = two(2);



? ? ? ? if? ? (abs(x1 - x2) == 1 && abs(y1 - y2) == 1) ||? (abs(x1 - x2) == 0 && abs(y1 - y2) == 1) ||? (abs(x1 - x2) == 1 && abs(y1 - y2) == 0)?


? ? ? ? ? ? ifc(x1, y1) > c(x2, y2)

? ? ? ? ? ? ? ? jie_ri(j, :) = [0 0] ;

? ? ? ? ? ? elseif? c(x1, y1) < c(x2, y2)

? ? ? ? ? ? ? ? jie_ri(i, :) = [0 0] ;

? ? ? ? ? ? end


? ? ? ? end



? ? end


end


% è¥μ??úμ??D±?±ê??μ?μ?

b = zeros(size(c, 1), size(c, 2)) ;

fori =1:size(jie_ri, 1)

? ? if~? jie_ri(i, :) == [ 0 0? ]


? ? ? ? b(jie_ri(i, 1), jie_ri(i, 2)) = 1;


? ? end


end


% ±£′??a?éó?μ?tif

b = uint8(b);


use_this_coordinate_system(? b , path ,? 'result\re9.tif') ;

```

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容