文章目录
- 前言
- 步骤
- 1.ENVI:打开Image Registration Workflow
- 2.Image Registration Workflow
- (1)选择GF2为Base Image File,某季节Sentinel2为Warp,然后Next
- (2)修改该参数为100
- (3)人为选择5个左右控制点,然后Next
- (4)删除离谱点
- (5)在ENVI输出配准好的Sentinel影像为.tiff
- 最后
前言
由于GF-2影像的地理偏移,我们需要在地理上配准下载的Sentinel-2(4季节)和GF-2。
步骤
需要准备:1.ENVI;2.区域A的GF-2影像;3.区域A对应的四季节的哨兵影像。
哨兵影像要根据GF-2的矢量框,在Gee下载,矢量框的获取较为简单:
①定义地理坐标系为WGS1984;②重分类;③栅格转面
Gee下载四季影像
1.ENVI:打开Image Registration Workflow
2.Image Registration Workflow
(1)选择GF2为Base Image File,某季节Sentinel2为Warp,然后Next
(2)修改该参数为100
(3)人为选择5个左右控制点,然后Next
点“Start Editing"后便可以开始选择控制点
在GF-2上,瞅准某个位置,然后鼠标左键按下(出现十字),然后鼠标右键点击,弹出下图窗口,点击”Accept as Individual Points",然后会自动跳转到Sentinel-2影像,找到对应位置的点,同操作,便完成了控制点1的人工选择。
你也可以随时"Stop Editing",然后通过来回点击"Switch to Wrap"来查看两幅影像,去寻找你认为合适的控制点(我通常会选择十字路口、房屋或桥的交界处)。唯一需要注意的是,你决定要去选控制点时(“Start Editing”),第一个Accept是要在GF-2影像上点击的(有时候"Switch to Wrap"后,你没有切回Base Image,即使显示的是Wrap Image,你Accept的这个点,实际是在Base Image上的,这会导致你选择的控制点完全匹配不上)。
(4)删除离谱点
这时它自动选好了控制点,点击"Show Table"。
删除ERROR高的点,推荐一个个删,然后让RMS Error<1(同时控制点要在10个以上)
最后,修改此参数为Wrap Image,否则会导致Sentinel-2的分辨率重采样为1米。
点击Next,影像导出为tiff,ASCII文件有时能在人工选择控制点时提供帮助,提高效率,但有时没有用。
在这里能导入ASCII文件,有时候能让你不需要再人工选择控制点了(因为四张哨兵的地理信息是匹配的)
(5)在ENVI输出配准好的Sentinel影像为.tiff
Sentinel{}/Warpsenti{}_C.tiff
例如:目标区域1:
Sentinel1/Warpsenti1_C.tiff
Sentinel1/Warpsenti1_X.tiff
Sentinel1/Warpsenti1_Q.tiff
Sentinel1/Warpsenti1_D.tiff
最后
如果以GF-2为Base Image,那么每个区域要做4次配准,n个区域就是4n次配准;
如果以Sentinel-2为Base Image,那么每个区域只需要做1次配准,但最终的耕地结果可能和比赛方的“参考答案”存在地理偏差,不知道会不会因此影响比赛分数。
如果不影响,那么就能大大节省时间!
Gee代码:
//—————————————————————————————需要修改的参数1:ro 矢量框路径————————————————————————
var ro = ee.FeatureCollection("users/Liuyifei/MAP_data/Studyarea/huantai");
ro = ro.first().geometry()
function maskS2clouds(image) {
var qa = image.select('QA60');
// Bits 10 and 11 are clouds and cirrus, respectively.
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
return image.updateMask(mask).divide(10000);
}
var Mlt = function(image) {
return image.multiply(10000);
};
//——————————————————————需要修改的参数2:folderr 第几个目标区域,只改数字————————————————————————
var folderr='Mapsenti'+'1';
//——————————————————————其它不需要动了————————————————————————
var start1='2020-12-01';
var end1='2021-03-01';
var dirname1=folderr+'_D';
var start2='2020-03-01';
var end2='2020-06-01';
var dirname2=folderr+'_C';
var start3='2021-06-01';
var end3='2021-09-01';
var dirname3=folderr+'_X';
var start4='2020-09-01';
var end4='2020-12-01';
var dirname4=folderr+'_Q';
// Map the function over one year of data.
// Load Sentinel-2 TOA reflectance data.
//export data1
var exportdataset1 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(ro)
.filterDate(start1,end1)
// Pre-filter to get less cloudy granules.
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
// .sort('CLOUDY_PIXEL_PERCENTAGE',false)
.map(maskS2clouds)
.select(['B2','B3', 'B4', 'B8']);
var exp1=exportdataset1.map(Mlt)
var mosaic1 = exp1.median().clip(ro);
Map.addLayer(mosaic1, {bands: ['B4', 'B3', 'B2'],min:0.0,max:0.3,gamma:0.5}, 'Crop Landcover');
Export.image.toDrive({
image:mosaic1,
description:dirname1,
scale:10,
folder :folderr,
// crs: "EPSG:32649",
maxPixels: 1e13,
region:ro,
fileFormat: 'GeoTIFF',
formatOptions: {
cloudOptimized: true
}
});
var num=exportdataset1.size()
print('Winter',num)
//export data2
var exportdataset2 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(ro)
.filterDate(start2,end2)
// Pre-filter to get less cloudy granules.
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(maskS2clouds)
.select(['B2','B3', 'B4', 'B8']);
var exp2=exportdataset2.map(Mlt);
var mosaic2 = exp2.median().clip(ro);
Export.image.toDrive({
image:mosaic2,
description:dirname2,
scale:10,
folder :folderr,
// crs: "EPSG:32649",
maxPixels: 1e13,
region:ro,
fileFormat: 'GeoTIFF',
formatOptions: {
cloudOptimized: true
}
});
var num=exportdataset2.size()
print('Spring',num)
//export data3
var exportdataset3 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(ro)
.filterDate(start3,end3)
// Pre-filter to get less cloudy granules.
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(maskS2clouds)
.select(['B2','B3', 'B4', 'B8']);
var exp3=exportdataset3.map(Mlt);
var mosaic3 = exp3.median().clip(ro);
Export.image.toDrive({
image:mosaic3,
description:dirname3,
scale:10,
folder :folderr,
// crs: "EPSG:32649",
maxPixels: 1e13,
region:ro,
fileFormat: 'GeoTIFF',
formatOptions: {
cloudOptimized: true
}
});
var num=exportdataset3.size()
print('Summer',num)
//export data4
var exportdataset4 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(ro)
.filterDate(start4,end4)
// Pre-filter to get less cloudy granules.
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(maskS2clouds)
.select(['B2','B3', 'B4', 'B8']);
var exp4=exportdataset4.map(Mlt);
var mosaic4 = exp4.median().clip(ro);
Export.image.toDrive({
image:mosaic4,
description:dirname4,
scale:10,
folder :folderr,
// crs: "EPSG:32649",
maxPixels: 1e13,
region:ro,
fileFormat: 'GeoTIFF',
formatOptions: {
cloudOptimized: true
}
});
var num=exportdataset4.size()
print('Autumn',num)'''