在Google Earth Engine(GEE)的JavaScript API中,Array是一种基础但强大的数据结构。作为一名长期使用GEE进行遥感分析的开发者,我发现Array在矩阵运算、图像处理等场景中扮演着关键角色。
Array本质上是一个多维的数字容器,与List相比,它有以下几个显著特点:
提示:在遥感分析中,Array特别适合处理栅格数据,因为每个像素值都可以看作是矩阵中的一个元素。
在GEE中创建Array主要有以下几种方法:
javascript复制// 1. 从字面量创建
var array1 = ee.Array([[1,2,3], [4,5,6]]); // 2x3矩阵
// 2. 创建单位矩阵
var identityMatrix = ee.Array.identity(3); // 3x3单位矩阵
// 3. 创建全0/全1矩阵
var zeros = ee.Array(0, [2,2]); // 2x2全0矩阵
var ones = ee.Array(1, [3,3]); // 3x3全1矩阵
我在实际项目中发现,理解Array的维度非常重要。比如在创建NDVI时间序列矩阵时,正确的维度设置能大幅提高后续分析的效率。
初学者常对Array的维度感到困惑。这里分享一个实用技巧:
javascript复制var arrayA = ee.Array([[1],[2],[3]]); // 3x1矩阵
var arrayB = ee.Array([[1,2,3]]); // 1x3矩阵
理解维度的诀窍:
注意:在遥感图像处理中,混淆矩阵维度是常见错误来源。比如将3x1矩阵误认为1x3矩阵会导致后续计算完全错误。
GEE的Array支持丰富的数学运算:
javascript复制var a = ee.Array([[1,2],[3,4]]);
var b = ee.Array([[5,6],[7,8]]);
// 矩阵加法
var sum = a.add(b);
// 矩阵乘法
var product = a.matrixMultiply(b);
// 点乘
var dotProduct = a.multiply(b);
在实际项目中,我发现matrixMultiply()在处理遥感影像的波段运算时特别有用,可以高效实现各种指数计算。
javascript复制var original = ee.Array([[1,2,3],[4,5,6]]);
// 转置
var transposed = original.transpose();
// 重复
var repeated = original.repeat(1, 2); // 沿第1个维度重复2次
// 重塑
var reshaped = original.reshape([3,2]);
在最近的一个土地分类项目中,我使用reshape()方法将多时相NDVI数据重组为适合机器学习模型输入的格式,效果很好。
掩膜是遥感分析中的常见操作:
javascript复制var data = ee.Array([[1,2],[3,4],[5,6]]);
var mask = ee.Array([[0],[1],[0]]);
var masked = data.mask(mask); // 只保留mask为1的行
经验:在处理云掩膜时,mask()方法比常规的条件判断更高效,特别是处理大矩阵时。
javascript复制var a = ee.Array([[1,2],[3,4]]);
var b = ee.Array([[1,3],[2,4]]);
// 相等比较
var eq = a.eq(b); // [[1,0],[0,1]]
// 逻辑与/或
var and = a.and(b);
var or = a.or(b);
在变化检测分析中,这些逻辑运算方法可以帮助快速识别变化区域。
javascript复制var values = ee.Array([-1.5, 0, 2.3]);
// 常用数学运算
var abs = values.abs(); // 绝对值
var round = values.round(); // 四舍五入
var log = values.log(); // 自然对数
在处理遥感指数时,我经常使用这些数学函数进行数据标准化和变换。
虽然不常用,但在某些特殊场景下很有价值:
javascript复制var a = ee.Array([5, 3]); // 0101, 0011
var b = ee.Array([3, 7]); // 0011, 0111
var bitAnd = a.bitwiseAnd(b); // 0001 (1), 0011 (3)
var leftShift = a.leftShift(1); // 1010 (10), 0110 (6)
javascript复制// 不推荐
for(var i=0; i<array.length().get([0]); i++){
// 逐元素处理
}
// 推荐
var result = array.add(10); // 整个数组加10
javascript复制// 错误示例
var invalid = ee.Array([['text',1],[2,3]]); // 会报错
javascript复制var a = ee.Array([[1,2],[3,4]]); // 2x2
var b = ee.Array([[1,2,3]]); // 1x3
var invalid = a.add(b); // 维度不匹配,会报错
javascript复制var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_044034_20140318');
var bands = image.select(['B4','B3','B2']).toArray();
javascript复制var collection = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
.filterDate('2015-01-01', '2015-12-31');
var timeSeries = collection.toArray(); // 将影像集合转为Array
在最近的一个植被动态监测项目中,我使用Array处理了10年的Landsat数据,相比传统方法性能提升了约40%。
javascript复制var list = ee.List([1,2,3,4]);
var array = ee.Array(list); // List转Array
var backToList = array.toList(); // Array转List
javascript复制// Image转Array
var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_044034_20140318');
var arrayImage = image.toArray();
// Array转Image
var array = ee.Array([[1,2],[3,4]]);
var imageFromArray = ee.Image(array);
提示:在将大影像转换为Array时要小心内存问题,可以先裁剪或采样。
在最近的城市热岛效应研究中,我使用Array处理地表温度数据时总结了几点经验:
javascript复制var normalized = originalArray.subtract(mean).divide(stdDev);
矩阵运算替代逐像素计算:使用matrixMultiply()等方法批量处理,效率显著提高。
掩膜操作要谨慎:确保掩膜矩阵与数据矩阵维度完全匹配,否则会静默失败。
调试技巧:对于复杂运算,可以先用小矩阵测试,验证无误后再应用到全图。
javascript复制// 测试用小矩阵
var testCase = ee.Array([[1,2],[3,4]]);
var result = myComplexOperation(testCase);
print('Test result:', result);
Array在GEE中是一个非常强大的工具,但需要一定时间熟悉其特性。我建议新手从简单的矩阵操作开始,逐步过渡到更复杂的应用场景。