网上找了很少有关于提取径流节点的文章,我因为论文要用到花了好几个小时找方法,最后还是在Arcgis里面找到了突破口。Arcgis自带的水文分析工具箱中就有基本的水文分析工具,想要获取径流节点只要需要知道河流的每一段的起始和终止位置就行。首先是提取河网 DEM --> 填洼 --> 流向 --> 流量 --> 设定流量阈值(重分类方法),然后用 河流链接工具 就能给每一段河流一个唯一的序号。
每一段河流都有序号了,接下来就好办了,很明显有两个思路(1)找到每一个连接多条河网的节点,用窗口分析就能做到。(2)结合流向图,对于每一段河流其最两段的点有可能就是径流节点,再根据端点中是否与其他河流相连就能判断是否为径流节点。
我用 Matlab 实现了第一种方法,写的有点啰嗦,代码贴上去中文字符显示异常,懒得改了思路很简单,就是用 3*3的窗口根据窗口内的栅格有几个在河流上的找到意思节点,再比较相邻的疑似节点,只留下一个最大值。
```
% ¶ÁÈ¡²¢ÕÒµ½¾¶Á÷½Úµã
path = 'C:\Users\xjh\Desktop\Ñ°ÕÒÍØÆ˽ṹ\ÓÃÒÔÌáÈ¡¾¶Á÷½Úµã.tif';
c = imread( path );
c(c==2147483647) = 0 ;
river = zeros(1000, 2); % ºÓÁ÷µã
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);%ÕÒµ½ºÓÁ÷½Úµã
jie_num = 1;
fori=1:size(river, 1)
i;
% Ñ°ÕÒÕâ¸öÕ¤¸ñµãÊDz»ÊǺÓÁ÷½Úµã
% £¨1£©·µ»ØÕâ¸ö½ÚµãÖÜΧµÄ¼¸¸öµã£¬ÖÜΧ´æÔÚÆäËüµÄ½Úµã¾ÍÊǺÓÁ÷½Úµã
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);
% ºÓÁ÷½ÚµãÖÁÉÙÓÐ3¸öÁÚ½Óµã
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
% È¥µôµãÖУ¬ÕÒµ½µãµÄÁڽӵ㣬ҪÊÇÖµ±ÈËû´ó¾ÍɾµôËû£¬·ñÕßɾµô×Ô¼º
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
% È¥µô½ÚµãÖб»±ê¼ÇµÄµã
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
% ±£´æΪ¿ÉÓõÄtif
b = uint8(b);
use_this_coordinate_system( b , path , 'result\re9.tif') ;
```