先看看代码运行结果(红色部分表示河流中心线,黑色表示河流两岸!):
注:
1. 由于河流两岸的坐标不是等距采样,所以无法保证100%准确,只要按着要求处理河岸坐标数据Shape文件,能保证95%以上能和真正的中心线重合;
2. 一条河流计算一次,支流另行计算;
3.计算中心线同样适合公路,且效果更好。
本程序主要有两个难点:
1. 提取中心线
2. 两侧目标点对应匹配
解决方法:
1. 利用三角网格方法计算中心线(提示:三角形侧边中点连线平行于底边,因此只需要计算侧边中点);
2. 可以通过重采样的方式来实现;
部分matlab代码:
%==================================说明====================================
% 根据河流两岸的一些列点坐标(2D),计算中心线,计算河流蜿蜒度;
% 作用:根据河流两岸的一些列点坐标(2D),计算中心线,计算河流蜿蜒度;
% 作者:胡礼珍
% 单位:厦门大学联合遥感接收站
% 邮件:hulizhen@xmu.edu.cn
% Q Q:249***701
clear;close all;clc;
[FileName,PathName,index] = uigetfile({'*.shp'},'shp文件读取','MultiSelect','off');
if index == 0errordlg('Shape输入错误,请重新输入','输入错误');return; %终止运行程序
end
% 由于数据的原因,不建议批量处理
S = shaperead([PathName,FileName]); % 读取Shape文件
if length(S) ==2 % 若线段个数等于2%% Result_Data= River_Shoreline(S)./1000; % 计算首尾位移和路程line1 = [S(1).X',S(1).Y';]; % 第一条岸线line2 = [S(2).X',S(2).Y';]; % 第二条岸线% line1和line2必须首尾一直line2 = line2(end:-1:1,:); % line 翻转,根据实际而定% Centerline = Center_Line(line1,line2); % 计算中心线[Centerline,line1,line2] = Center_Line(line1,line2); % 计算中心线%% 计算路程和路径% 第一行表示位移长度,剩下的每行表示一条线段的长度Result_Data = sqrt(sum((Centerline-[Centerline(end,:);Centerline(1:end-1,:)]).^2,2));Result_Data = [Result_Data(1,:),sum(Result_Data(2:end,:))]./1000; % [位移,路程]Meanderness = Result_Data(1,2)/Result_Data(1,1); % 蜿蜒度
else % 若线段个数不等于2errordlg('Shape输入错误,请重新处理Shape文件','输入错误');return; % 终止运行程序
end%% 显示
figure('Name','位置')
plot(line1(:,1),line1(:,2),'k')
hold on
plot(line2(:,1),line2(:,2),'k')
plot(Centerline(:,1),Centerline(:,2),'r')
hold off
注:核心部分代码就不公布了,自行下载。
完整代码地址:matlab-计算河流蜿蜒度和提取中心线-其它文档类资源-CSDN下载
完整代码中有Word讲解,完整的程序,以及测试的代码!
也可以根据我的提示,自己编写代码,这样更能提高写代码能力。
路漫漫其修远兮,吾将上下而求索!