土地利用数据|气象数据|社会经济数据|npp数据|ndvi数据-地理遥感生态网

GEE学习笔记 四十五:使用GEE常见错误及解决方案(一)

GEE学习笔记 四十五:使用GEE常见错误及解决方案(一)
GEE学习笔记 四十五:使用GEE常见错误及解决方案(一)

详细信息

这一篇先说一些新手最常见的问题,下一篇文章介绍本地和远端运行相关的更多错误,这个是在开发中经常会遇到的大坑。


  • 缺少关键字

错误:

a = 1; 
print(a); 

分析:这个错误在新手中特别常见,很多人写的代码一旦比较长后,经常忘记写“var”这个关键字。

正确的写法如下。

var a = 1; 
print(a); 

 

  • 中文标点符号和英文标点符号混用

错误:

//错误:中文的双引号
var a = ee.Date("2018-01-01“); 
print(a); 
//错误:中文的单引号
var b = ee.List(['a', 'b‘]) 

 

分析:对于很多新手来讲,一般出现这种错误之后会一脸懵逼,感觉一切都没有错误,编辑器就是认为有错误。这里给一个建议:写代码的时候我们一定要将输入法切换位英文输入发,否则在输入标点符号(比如最常见的双引号、单引号、小括号、中括号等)就会出现中文和英文混用的问题。

正确的写法:

var a = ee.Date("2018-01-01"); 
print(a); 
var b = ee.List(['a', 'b']) 

 

  • 未定义变量

错误:

var a = 0; 
print(b); 

分析:这种错误很容易发现,我们在没有定义过“b”的前提下就直接使用了这个变量。

还有一种错误就非常隐蔽了,如下:

var a = 0; 
print(b); 
var b = 1; 

运行结果如下图:

 

分析:这次程序没有报错,但是也没有输出我们想要的结果,我们期望的结果是“1”。这里其实是和编程语言有关了,程序在底层编码执行时候发现b在后面定义了,所以这里就不报错,但是在执行print的时候b又是没有值的,所以输出为“undefined”。

正确的写法应该是先定义,然后在调用:

var a = 0; 
var b = 1; 
print(b); 
  • 波段名称未定义或者属性名称不存在

错误:

var image = ee.Image("USGS/SRTMGL1_003"); 
//图片波段中只有:elevation,这里输出b1必然报错 
print(image.select("b1")); 

另外一种情况,不算是错误,只是调用了不存在的属性

var image = ee.Image("USGS/SRTMGL1_003"); 
print(image); 
//year属性不存在,title存在,程序运行不会报错只会将结果输出为null 
print(image.get("year")); 
print(image.get("title")); 

 

分析:我们在使用影像时候首先第一步就是要确认影像包含哪些波段,然后就是包含哪些属性,这样在计算中可以避免很多不必要的错误。

 

  • 重复定义变量或者覆盖定义
var a = 1; 
var b = 10; 
//输出1 
print(a); 
//值被更新 
a = b + 1; 
//输出11 
print(a); 
//a被重新定义 
var a = 2; 
//输出2 
print(a); 

 

分析:在逻辑上这段代码是没有错误的,但是在一个非常大的工程中,如果我们没有对变量进行比较好的命名,那么就非常有可能出现这种变量名称被重复定义的情况,然后结果就是属于不可预知的了。

 

  • GEE的方法和javaScript的属性彼此不分
var a = [1, 2, 3]; 
print("a length is: " + a.length); 

//错误,ee.List中length是个方法
var b = ee.List([1,2,3]); 
print("b length is: ", b.length); 


//正确 
var c = ee.List([1,2,3]); 
print("c length is: ", c.length()); 

 

  • 调用未定义的方法

第一种错误调用不存在的方法:

//错误,ee.List中没有sum 
var a = ee.List([1,2,3,4]); 
print(a.sum()); 

分析:ee.List()中没有sum这个方法,所以会报错。

正确的方式如下:

//正确 
var a = ee.List([1,2,3,4]); 
print(a.reduce(ee.Reducer.sum())); 

 

第二种错误返回值不是想要的数据类型,需要强制转换然后调用相关方法

//错误 
var a = ee.List([1,2,3,4]); 
var b = a.reduce(ee.Reducer.sum()); 
//b这里是ee.Object类型,所以没有add方法 
var c = b.add(10); 
print(c); 

正确的写法是添加ee.Number()强制转换

//正确 
var a = ee.List([1,2,3,4]); 
var b = a.reduce(ee.Reducer.sum()); 
var c = ee.Number(b).add(10); 
print(c); 

 

  • 数据类型转化错误

错误:

var a = ee.String("1"); 
var b = ee.Number(2); 
var c = ee.Number(a).add(b); 
print(c); 

分析:这段代码如果第一眼看觉得是没有问题,但是运行后就会报错。报错的原因是参数不能被解析为json,仔细分析可以知道是ee.Number(a)错误了。在GEE中字符串不能直接转换为数字,需要调用方法ee.Number.parse()

正确:

var a = ee.String("1"); 
var b = ee.Number(2); 
var c = ee.Number.parse(a).add(b); 
print(c);