【Matlab】读取".shp"文件

写在最前

本文主要介绍了 Matlab 中函数 shaperead 的用法以及如何用shp文件制作真值图。
该函数可以用于读取 “.shp” 文件。

代码

% 标准开头

clc
clear 
close all

% 读取文件 “*.shp”

shpPath='*.shp';
shp=shaperead(shpPath);
dataSet=shp;

% 获取shp文件的大小,即shp文件中有多少个{‘Polygon’}

polygon_num=size(shp,1);

% 初始化一个数组,存放shp文件中的类的名字

class=cell(50,1);

% 初始化变量,k用来计算类的个数,同时也是类的标号,
% 即第一次出现的类名标号为“1”,依次类推
% count用来计算类名是“其他”的类的个数

k=1;
count=0;

% 利用for循环在{‘Polygon’}中逐个判断,返回:
% dataSet . ID:类名的标号
% class:所有的类名(不重复)

for i=1:polygon_num
    % 第i个区域的类名,如'茵陈蒿'
    type=dataSet(i).x0xC00xE00xD00xCD;
    
    for j=1:k   
        % 相同返回“1”,否则返回“0”
        tmp=strcmpi(class(j),type);
        
        % 如果相同,即在之前得到的class中有这个类,
        % 将dataSet(i).Id设为j,即该类在class中的序号,
        % 跳出循环“for j=1:k”
        if tmp ~= 0
            dataSet(i).Id = j;  
            break;
        end
        
        % 如果不同,即在class中填入新的类名,
        % 同时将该类在class中的序号写到dataSet(i).Id中
        if j==k && tmp==0
            class(k,1)=cellstr(type);
            dataSet(i).Id = k;
            k=k+1;
            continue;
        end
    end
    
    % 如果得到类名为“其他”,count计数则加1
    if strcmpi(type,'其它')==1
        count=count+1;
    end
end

% 如果在所有的区域中没有“其他”这个类,
% 那么就将类别为空“”的区域设为“其他”
% (一般不会有这样的事情发生)

if count==0 
    for i=1:polygon_num
        type=dataSet(i).x0xC00xE00xD00xCD;
        if strcmpi(type,'')==1
            dataSet(i).x0xC00xE00xD00xCD='其它';
        end
    end
end

% 根据四至范围制作真值图
% 四至范围
% (.19202583,.74128107) --------------------------(.19352531,.74128107)
%
%
%
%
%
% (.19202583,.74005221) --------------------------(.19352531,.74005221)

height=*;
width=*;

startRow=*.74128107;
endRow=*.74005221;
per_height=(endRow-startRow)/(height-1);

startCol=*.19202583;
endCol=*.19352531;
per_width=(endCol-startCol)/(width-1);

zuobiaoLat=zeros(height,1);
zuobiaoLon=zeros(width,1);
for i=1:height
    row=startRow+(i-1)*per_height;
    zuobiaoLat(i)=row;
end
for i=1:width
    col=startCol+(i-1)*per_width;
    zuobiaoLon(i)=col;
end   

ClassGraph=zeros(height,width);

for i=1:height 
    row=zuobiaoLat(i);
    ClassGraph(i,:)=Line( row,zuobiaoLon,dataSet  );
end

save('*.mat','ClassGraph');

Line.m 如下:

function [ Result_Line ] = Line( Lat,Lon,data  )
%POTINPOLYGON 此处显示有关此函数的摘要
%   此处显示详细说明
%   每行经纬度的判断
row = Lat;
width=size(Lon,1);
rows=repmat(row,1,width);
cols=Lon';
Result_Line=zeros(1,width);
dotinpoly=1;
k=1;
while dotinpoly == 1
        polygonSize=size(data(k).X,2);
        rangeX=data(k).X;
        rangeY=data(k).Y;
    
        rangeX(1,polygonSize)=rangeX(1,1);
        rangeY(1,polygonSize)=rangeY(1,1);
    
        is_in = inpolygon(cols,rows,rangeX,rangeY);
        index=find(is_in ~=0);
        num=length(index);
        if num > 0      
            Result_Line(index)=data(k).Id;
        end
        
        k=k+1; 
        if k>size(data,1)
            dotinpoly = 2 ;     
        end
    end

end

祝您浏览愉快!

你可以按照以下步骤使用 MATLAB 对 HDF5 文件进行裁剪: 1. 读取.shp文件:使用 `shaperead` 函数读取 .shp 文件,获取裁剪范围的边界坐标。 2. 打开HDF5文件:使用 `h5info` 函数打开 HDF5 文件,获取文件中的数据集信息。 3. 获取数据集的坐标范围:使用 `h5readatt` 函数或 `h5read` 函数获取数据集的经纬度范围。 4. 计算裁剪范围:根据步骤1和步骤3获取的坐标范围,计算出裁剪范围的经纬度范围。 5. 裁剪HDF5文件:使用 `h5read` 函数读取数据集的数据,然后根据计算出的裁剪范围,使用 MATLAB 的索引功能对数据进行裁剪。 下面是一个简单的示例代码,其中 `filename` 是 HDF5 文件路径,`shpfile` 是 .shp 文件路径,`datasetname` 是 HDF5 文件中的数据集名称: ``` % 读取.shp文件 S = shaperead(shpfile); x = [S.X]; % 获取边界坐标的经度 y = [S.Y]; % 获取边界坐标的纬度 % 打开HDF5文件 info = h5info(filename); dataset = info.Groups(1).Datasets(1); data = h5read(filename, dataset.Name); % 获取数据集的坐标范围 lat_range = h5readatt(filename, dataset.Name, 'lat_range'); lon_range = h5readatt(filename, dataset.Name, 'lon_range'); % 计算裁剪范围 lat_min = min(y); lat_max = max(y); lon_min = min(x); lon_max = max(x); % 裁剪HDF5文件 lat_idx = find(lat_range >= lat_min & lat_range <= lat_max); lon_idx = find(lon_range >= lon_min & lon_range <= lon_max); cropped_data = data(lat_idx, lon_idx); ``` 注意,这只是一个简单的示例,实际操作中可能需要进行更多的数据处理和错误处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值