矢量数据属性参与栅格Tiff计算的数据处理过程-ArcMap+Matlab

从网上下载了一些中国植被分布、中国区划的矢量文件,想把这些数据作为统计依据结合之前由遥感影像计算得到的TIFF文件进行一些计算,原本ArcMap里是有分区统计的功能模块(见之前的博客),但是因为想进行一些复杂的计算,需要在Matlab里完成,在网上没有找到合适的方法(也可能是我搜索的关键词有问题),就自己摸索了一下,在这里简单记录,以便后续查阅。

材料

1、中国地理区划shp
2、中国植被1:100万分布图shp
3、由遥感影像计算的TIFF文件

ArcMap处理部分

1、进行投影转换(将shp转换成和TIFF相同的WGS84投影)。
Data-management tools-Projections and Transformations-Feature-Project
在这里插入图片描述
第一栏是待转换的shp,第三栏是输出路径,第四栏是选择转出的投影
在这里插入图片描述
点击Layers载入和tiff layer相同的投影格式,实现投影转换。

2、将Polygon 转换为 Raster
Conversion Tools-To Raster-Polygon to Raster
在这里插入图片描述
这里需要输入的就是待转换的shp、选择shp的属性(TIFF只能带一个属性值)、输出文件位置、最后一项Cell size是用来确定TIFF空间分辨率的,一个像素的大小。
(其实这里也可以输入和匹配的tiff一致的像元大小,但是我的shp和TIFF差的太多了,总是提示转出失败,所以其实后面的操作都是在“曲线救国” ,也就是说如果你的shp可以直接转成和TIFF一样像元大小的话,是可以跳过3和4直接到5的)
3、栅格计算器计算
这是一个“曲线救国”的步骤,可能会带来一些细微的误差,但是确实是不得已而为之。
Spatial Analyst Tools-Map Algebra-Raster calculator
采用 Con( Isnull(tiff图像)<1, shp转tif的图像,tiff图像)的计算方式
获取tiff图像有效范围内的shp对应属性值,在这一步可以获得和原始tiff像元大小相近的、且具有相应shp属性的tiff。(主要目的是缩小像元大小差距便于重采样,因为如果差的大了,Arcgis会提示重采样失败)

4、重采样Resample
Data Management Tools-Raster-Raster Processing-Resample
在这里插入图片描述
包括输入rasteer(经过栅格计算得到的tiff)、输出文件路径、
输出raster像元大小,在下拉菜单选择想要配准的tiff,重采样方式,如果你的属性是一些定值比如1/2/3/4/5这种分类结果代号,就选Nearest最近邻,因为这样不会生成一些带小数的值,如果不是的话,也可以选择其他插值方法
5、Clip(保证范围一致)
我们通过以上步骤得到的TIFF数据,难免会和原始的待配准TIFF有行列号不一致的问题,通过裁剪,可以实现行列号的统一。
Data Management Tools-Raster-Raster Processing-Clip
在这里插入图片描述
输入待裁剪的TIFF,输出范围选择一个shp(可以是获取研究区范围的shp),选择输出文件路径,勾选Maintain Clipping Extent保留裁剪边界。
这里需要把原始TIFF和shp转的TIFF都Clip一下,保证行列号能对上。

Matlab部分

因为每个人的处理方式不同,所以我这里只简单列出导入TIFF的代码
导入数据

file1="F:\xxx\xxx1原始数据.tif";

file2="F:\xxx\veg\shp_code_project_resample_clip2.tif";
%12类
file3="F:\xxx\Climate_quhua\shpqh_proj_code1_rc1_resample_clip.tif";
%9类
%读取TIFF数据
[A,R1] = geotiffread(file1);
[B,R2] = geotiffread(file2);
[C,R3] = geotiffread(file3);


属性作为索引获取相应数据(双层for循环)

idx = (B==i) & (C==k);%获得B属性值为i,C属性值为k的所有数据索引位置
        if(sum(idx,'all')>0)
            count=count+1;
            [row,col]=find(idx==1);%获取行列号
            ind=sub2ind(size(A),row,col);%转成线性索引
            s=A(ind+(0:size(A,3)-1)*size(A,1)*size(A,2));%获取数据

如果不知道代码怎么写,可以问问Chatgpt :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值