2.2 JavaScript编程基础知识
为了构建用于深入分析的脚本,您需要使用JavaScript。下面将介绍JavaScript语法和基本数据结构。
2.2.1 Variables
在编程语言中,变量用于存储数据值。在JavaScript中,变量是使用var关键字定义的,后跟变量的名称。下面的代码将文本“San Francisco”赋值给名为city的变量。注意代码中的文本字符串应该用引号括起来(注意:单引号和双引号均可,但前后必须统一),并且它们必须在每个字符串的开头和结尾匹配。在您的程序中,建议保持一致性——在整个给定脚本中要么使用单引号要么使用双引号(本书中的代码通常使用单引号)。您的脚本每个语句通常应该以分号“;”。如果您想输出变量city,您将在控制台中输出出变量中存储的值(San Francisco)。
var city = 'San Francisco';
print(city);
var population = 873965;
print(population);
当您赋予文本值时,变量将自动被赋予字符串类型。您也可以将数字赋值给变量并创建类型为数字的变量。以下代码创建一个名为population的新变量,并将一个数字赋为其值。
2.2.2 Lists
能够在单个变量中存储多个数值是非常有帮助的。JavaScript提供了一种称为list的数据结构,可以存储多个值。我们可以使用方括号[ ]创建一个新列表,并通过逗号分隔添加多个数值。
var cities = ['San Francisco', 'Los Angeles', 'New York','Atlanta'];
print(cities);
如果您查看控制台中的输出,您将看到“List”旁边有一个展开箭头(▷)。点击箭头将展开列表并显示其内容。您会注意到列表中的四个项目旁边都有一个数字。这是每个项目的索引。它允许您使用数字值引用列表中的每个项目,该值指示其在列表中的位置(请注意:GEE中所有的索引都是从0开始的)。
2.2.3 Objects
列表允许您将多个数值存储在单个容器变量中。虽然很有用,但并不适合存储结构化数据。能够通过名称而不是位置来引用每个项目是很有帮助的。JavaScript中的对象(Objects)允许您存储键值对(key-value pairs),其中每个值都可以通过其键来引用。您可以使用花括号{}创建一个字典。下面的代码创建了一个名为cityData的对象,其中包含有关旧金山的一些信息。请注意此处JavaScript语法的一些重要事项。首先,我们可以使用多行定义对象。只有在输入分号(;)时,命令才被视为完整。还请注意变量名称cityData的选择。变量包含两个单词。第一个单词是小写的,第二个单词的首字母大写。将多个单词连接成单个变量名的这种命名方案称为“驼峰命名法”。尽管不强制要求使用此方案命名变量,但遵循这种规范被认为是一个良好的习惯。GEE API中的函数和参数均遵循此约定,因此如果您也遵循此规范,您的代码将更易读。
var cityData = {
'city': 'San Francisco',
'coordinates': [-122.4194, 37.7749],
'population': 873965
};
print(cityData);
该对象将在控制台中打印出来。您可以看到,每个项目都具有标签而不是数值索引。这被称为键,可用于检索项目的值。
2.2.4 Functions
在使用GEE时,您需定义自己的函数。函数接受用户输入,使用它们执行一些计算,并发送输出。函数允许您将一组操作组合在一起,并在不必每次重新编写它们的情况下使用不同参数重复执行相同操作。使用function来定义函数。下面的代码定义了一个名为greet的函数,该函数接受一个名为name的输入,并返回一个带有Hello前缀的问候语。请注意,我们可以使用不同的输入调用函数,并且它会生成不同的输出,但代码相同。
var greet = function(name) {
return 'Hello ' + name;
};
print(greet('World'));
print(greet('Readers'));
2.2.5 Comments
在编写代码时,为了解释代码或给自己留个注释,添加一些文字是很有用的。在JavaScript中,您可以在任何行前加上两个斜杠//来使其成为注释。注释中的文本将被解释器忽略,不会被执行。
代码编辑器还提供了一个快捷键——在Windows上是Ctrl + /,在Mac上是Cmd + /,可以一次性注释或取消注释多行。您可以选择多行并按下组合键,使它们都变成注释。再次按下组合键以撤消此操作。在调试代码时,这对于阻止脚本的某些部分被执行是很有帮助的。
2.3 GEE API基础知识
GEE API包含丰富的对象和方法,可以执行从简单数学运算到图像处理等高级算法的所有操作。在Code Editor中,您可以切换到Docs选项卡,查看按对象类型分组的API函数。API函数都以ee(代表Earth Engine)前缀开头。
假设您想要将由变量a和b表示的两个数字相加。新建一个脚本,并输入以下内容:
var a = 1;
var b = 2;
var result = ee.Number(a).add(b);
print(result);
在第2.1节中,您学会了如何将数字存储在变量中,但没有进行任何计算。这是因为在使用Earth Engine时,您不使用JavaScript运算符进行加法。例如,您不会写“var c = a + b”来相加这两个数字。相反,Earth Engine API提供了函数来执行此操作,并且当您可以使用API函数时,使用它们非常重要。起初可能感觉有些别扭,但如我们将在下面描述的那样使用函数将帮助您避免超时并创建高效的代码。
在Docs选项卡中查看,您会找到一组可以调用的ee.Number的方法。展开它以查看可用于处理数字的各种函数。您将看到ee.Number函数,它可以从一个值创建一个Earth Engine数字对象。在函数列表中,有一个用于相加两个数字的add函数。这就是您用来相加a和b的函数。
要将a和b相加,我们首先从变量a创建一个ee.Number对象,使用ee.Number(a)。然后,我们可以使用add(b)调用将b的值添加到其中。以下代码显示了语法并打印结果,结果当然是值3:
到目前为止,您可能已经意识到,在学习Earth Engine编程时,您不需要深入学习JavaScript或Python—相反,它们是访问Earth Engine API的方式。无论是从JavaScript还是Python调用,该API都是相同的。
这里是另一个例子来进一步说明这一点。假设您正在处理一个任务,需要创建一个从1980年到2020年以五年间隔的年份列表。如果面临这个任务,第一步是切换到Docs选项卡,打开ee.List模块。浏览函数并查看是否有任何可以帮助的函数。您会注意到一个名为ee.List.sequence的函数。单击它将显示函数的文档。
函数ee.List.sequence能够从给定的起始值到结束值生成一系列数字。它还有一个可选参数step,用于表示每个数字之间的增量。我们可以通过使用以下值调用这个预定义函数来创建一个表示从1980年到2020年,间隔为5的年份列表:start = 1980,end = 2020,step = 5。在控制台中打印的输出将显示变量yearList确实包含具有正确间隔的年份列表。
var yearList = ee.List.sequence(1980, 2020, 5);
print(yearList);