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);