Matlab 矢量裁剪栅格应该注意的问题

还不点赞收藏?等你用到了,估计找不到资料了~

摘要

很多matlab矢量裁剪栅格的内容,看得一头雾水,本文也来简要说说如何使用矢量裁剪栅格。

思想(重要)

利用矢量裁剪栅格,我没有找到什么好用的函数,其核心思想目前我仍然是取值赋值,先找到矢量边界图形的boundary range,即经度和纬度最大最小值,然后利用栅格图像中的boundary range中的x_min和y_max,以及图像的空间分辨率 ° ,对矢量边界图形的经度和纬度最大最小值求其行列号。以上过程可以得到矢量边界图形对应栅格中的起始行列号和终止行列号,裁剪的图像的本质就是找到其下标范围,对栅格数据直接取值。

temp = Data;
tif_i = temp(line_start:line_end,sample_start:sample_end);

需要注意的是,如果栅格图像使用的是依据某一基准椭球体的大地坐标系,即投影坐标系,而不是地理坐标系,此时需要首先将二者的坐标系统一为栅格图像的投影坐标系,且投影基准椭球体应保持一致,然后求矢量图形x和y最大最小大地坐标系,然后基于栅格图像的x和y的最小最小坐标系,以及空间分辨率 m ,求出行列号,取图像值。

%起始行号和终止行号
%假设polygon一个角点位于第1行,应该取行号是多少
line_start = floor((tif_ymax-poly_i_ymax)/10)+1;
line_end = floor((tif_ymax-poly_i_ymin)/10)+1;
%起始列号和终止列号
sample_start = floor((poly_i_xmin-tif_xmin)/10)+1;
sample_end = floor((poly_i_xmax-tif_xmin)/10)+1;

矢量边界外的值设为无效值

这一步往往也很重要,有的人先把矢量转为了栅格,然后利用填充算法填充了边界内部,外部置为了无效值或者0,然后在栅格转矢量的过程中就会有各种问题,比如多一个像元少一个像元的问题,然后再处理这一个像元,而这个过程就比较复杂了。也有人使用了makerefmat和mask = vector2mtx()函数,将MASK中值>1的区域设置为nan,边界设置为0,制作掩膜。
详细见链接,没有用过,不知道好用不好用。下面是利用inpolygon方法。判断生成的经纬度meshgrid,在不在矢量范围之内,如果在,则这些经纬度置为1,外围置为0,然后得到的逻辑数组,再借给上面的子栅格使用,tif_i(~isin) = NaN;将0区域置为无效值。


x = linspace(poly_i_xmin,poly_i_xmax,temp_Ref.RasterSize(2));
y = linspace(poly_i_ymin,poly_i_ymax,temp_Ref.RasterSize(1));
[lon,lat] = meshgrid(x,y);
%----------------!!!!!!!!!!-------------------------------------------------------------
isin = inpolygon(lon,lat,shp(i).X,shp(i).Y);
%----------------!!!!!!!!!!-------------------------------------------------------------
tif_i(~isin) = NaN;

接着再把裁剪取到的数据和空间参考信息修改之后存入tif。
如图,黑色部分为无效值。
值得注意的是,如果是用大地坐标系生成的meshgrid,矢量也是大地坐标系的话,即投影坐标系的话,生成的isin图像是翻转的,因此需要增加一步翻转回来,然后再取其对应值,可能的原因是从本质上讲是因为地理坐标系和大地坐标系关于起始和终止位置坐标的表示方法不同。

isin_new = flipud(isin);

结果图:

在这里插入图片描述

祝大家生活愉快,变瘦变美变好看!给个关注行不行?我有个朋友想认识一下您。

猜你喜欢

转载自blog.csdn.net/qq_37970770/article/details/106081399