目录
01 说明
源码链接:https://code.earthengine.google.com/4f02959684e1ad8bd70df97175540b89
这里仅说明如何查找GAUL数据集的各个行政区划的属性信息,特别是行政区划的名称.
var fvLayer = ui.Map.FeatureViewLayer('FAO/GAUL/2015/level1_FeatureView');
var visParams = {
color: '00909F',
fillColor: 'b5ffb4',
opacity: 1,
width: 1,
pointSize: 1
};
fvLayer.setVisParams(visParams);
fvLayer.setName('First Level Administrative Units');
Map.setCenter(7.82, 49.1, 4);
Map.add(fvLayer);
运行上述代码,通过显示在图层上的各个行政区划,将鼠标状态切换到Inspector,点击指定区域获取该位置的行政区划要素的属性信息。操作如下:
02 完整代码
/*
该程序用于获取指定时间范围的MOD09GA数据集的月尺度NDVI产品
*/
// 定义日期范围
var start_date = '2000-02-01'; // 必须以一号结尾
var end_date = '2020-12-31';
var roi_name = 'Sichuan Sheng';
// 定义云和水体掩膜函数
function maskCloudAndWater(image) {
var QA = image.select('QC_500m');
// 创建一个空的mask,初始值为1(即所有像素都不被掩膜覆盖)
var mask = ee.Image.constant(1);
// 遍历每个波段的数据质量标识
for (var i = 0; i < 2; i++) { // 因为我选取了两个波段进行ndvi的计算
// 计算当前波段的数据质量标识的起始位(是从2开始)
var startBit = 2 + i * 4;
// 提取当前波段的数据质量标识
var bandQuality = QA.rightShift(startBit).bitwiseAnd(15);
// 如果数据质量标识为15,说明该像素可能被云或深海覆盖,需要被掩膜覆盖
mask = mask.min(bandQuality.neq(15)); // min取两者间小的那个值,逐像元
}
// 应用掩膜
return image.updateMask(mask);
}
// 定义获取日期列表的函数
function month_list(start_date, end_date) {
// 将字符串转换为ee.Date对象
var startDate = ee.Date(start_date);
var endDate = ee.Date(end_date);
// 计算总共有多少个月
var diff = endDate.difference(startDate, 'month').round();
// 创建每个月的开始和结束日期的列表
var dates = ee.List.sequence(0, diff.subtract(1)).map(function (n) {
var start = startDate.advance(n, 'month');
var end = start.advance(1, 'month').advance(-1, 'day');
return [start.format('YYYY-MM-dd'), end.format('YYYY-MM-dd')];
});
return dates
}
// 定义地理空间范围(四川省)
// var roi = ee.FeatureCollection('projects/ee-chaoqiezione/assets/china_admin_province')
// roi = roi.filter(ee.Filter.eq('省', roi_name));
var roi = ee.FeatureCollection("FAO/GAUL/2015/level1")
.filter(ee.Filter.eq('ADM1_NAME', roi_name));
Map.addLayer(roi.style({fillColor: "00000000"}), {width: 2}, roi_name)
Map.centerObject(roi, 6)
// 生成日期列表
var dates = month_list(start_date, end_date);
dates.evaluate(function(dates) {
dates.map(function(date){
var start = ee.Date(date[0]);
var stop = ee.Date(date[1]);
// 加载MODIS数据根据日期和地理范围进行筛选
var modis_ndvi = ee.ImageCollection("MODIS/061/MOD09GA")
.filterDate(start, stop)
.filterBounds(roi)
.select(['sur_refl_b02', 'sur_refl_b01', 'QC_500m'])
.map(function (img) {
img = maskCloudAndWater(img); // 水体和云掩膜
// img = img.multiply(0.0001) 本应进行单位换算, 但是仅仅计算ndvi时会约掉,为了减小计算量这里不进行
return img.normalizedDifference(['sur_refl_b02', 'sur_refl_b01']).rename('ndvi') // 计算ndvi
})
.mean().clip(roi).unmask(-9999)
modis_ndvi = modis_ndvi.set({name: ee.String(start.format('YYYY-MM-dd'))});
Export.image.toDrive({
image: modis_ndvi.select("ndvi"),
region: roi.geometry(),
scale:500,
description: "ndvi_" + date[0] + '_' + date[1],
folder: 'MOD09GA_NDVI',
});
})
})
// 仅用于查看GAUL行政区划的属性信息
// var fvLayer = ui.Map.FeatureViewLayer('FAO/GAUL/2015/level1_FeatureView');
// var visParams = {
// color: '00909F',
// fillColor: 'b5ffb4',
// opacity: 1,
// width: 1,
// pointSize: 1
// };
// fvLayer.setVisParams(visParams);
// fvLayer.setName('First Level Administrative Units');
// Map.setCenter(7.82, 49.1, 4);
// Map.add(fvLayer);
2023.07.06修改:
关于GEE数据集单位换算的一些说明
为什么要进行单位换算?可能是由于GEE在存储时避免浮点数(相对于整数所占空间更大)存储,因此对所有像元值进行了缩放(scale),当然可能为了避免缩放后还有负数(因为unsigned在相同字节下可以存储更多)影响存储,可能还进行了偏移(offset)使其为正数。因此,我们需要再将其逆向
转化回原来的真实像元值。(上述仅平时处理常规数据集的经验之谈(scale_factor, offset多在HDF、NC文件中出现),对于GEE可能原因不止于此)
公式为:
Physical Value = Digital Number * Scale Factor + Offset
因此一般而言,Scale Factor为浮点数例如0.0001,Offset为负数。
如何查看当前数据集的Scale Factor和Offset?
时间有限,很多代码的相关讨论并没有进行。如有问题,私聊或者评论.