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);

結果圖:

在這裏插入圖片描述

祝大家生活愉快,變瘦變美變好看!給個關注行不行?我有個朋友想認識一下您。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章