GEE(Google Earth Engine)中出现的数据类型报错问题

作为一个初学者,在运行Google Earth Engine中的代码时,经常会出现报错的情况,其中有一部分是由于数据类型导致的错误,出现这些错误的主要原因是对客户端服务器之间的区别了解太少,这里列出了遇到的一些问题和解决方法,若以后遇到相似问题,也能够以此为参考。

一、Map.addLayer()中参数的数据类型出错 

 该问题是在向自定义的函数中传参报错时发现的,这里简化了问题的例子,以Landsat 8 TOA数据集中的一张影像为例,image为一张裁剪的影像,通过Map.addLayer()函数显示影像,这里定义了两个变量,bandNames和description,前者为RGB对应的波段,后者为图层描述。

// 正确示范
var bandNames = ['B4','B3','B2'];
var description = 'true color';
Map.addLayer(image,
             {min:0,max:0.3,bands:bandNames},
             description);

以上代码可以正常运行并且显示裁剪的影像,但是将bandNames转换为列表类型,description转换成字符串类型,则会报错。

// 错误示范
var bandNames = ee.List(['B4','B3','B2']);
var description = ee.String('true color');
Map.addLayer(image,
             {min:0,max:0.3,bands:bandNames},
             description);

 

这里提示数据类型出错,由此可见,Map.addLayer()中虽然这两个参数的形式看起来像列表和字符串,但是实际数据类型却不是,对此chatGPT3.5给出的解释是,Map.addLayer()函数是应用在客户端上的,但是ee.String()和ee.List()是应用在服务器中。

二、ee.Algorithms.If()的返回数据类型出错

该问题是在对 ee.Algorithms.If()函数的返回值进行镶嵌运算报错时发现的,这里也简化了问题的例子。landsatCollection是一个影像数据集,共有4张影像,现在调用ee.Algorithms.If(),该函数可以根据条件选择返回值,这里条件设为true,这样会永远返回第一个返回值landsatCollection,也就是返回这个影像数据集本身,然后对其进行镶嵌。

// 错误示范
var filterCollection = ee.Algorithms.If(
  true,
  landsatCollection,
  null);
print(landsatCollection);
print(filterCollection.mosaic());

这里打印ee.Algorithms.If()的返回值,显示为影像数据集类型,但是对其进行mosaic()操作会显示出错,实际测试发现,许多用于影像数据集的操作都会出错,说明虽然返回值设置为变量本身,但其实数据已经发生了变化。而如果将返回值再调用ee.ImageCollection()转为影像数据集后,就可以进行正常操作。

// 正确示范
var filterCollection = ee.ImageCollection(
  ee.Algorithms.If(
    true,
    landsatCollection,
    null));
print(landsatCollection);
print(filterCollection.mosaic());

 这里可以看到,ee.Algorithms.If()的返回值又可以进行镶嵌操作,并且打印了结果,对此,chatGPT3.5给出的解释是,ee.Algorthms.If()的返回值是一个通用的对象,需要手动转换数据类型,才不会导致后续的操作报错。

三、数字作为布尔类型

这个问题中,程序并没有报错,但是在应用中容易出现混淆的问题。

Google Earth Engine的官方写道,在布尔运算中,0、null、false都会被解读为false,而非空的数据会被解读为true,但是,如果0为数字类型时,则会被解读为true。 

// 案例1
var condition = 0;
var result = condition ? true
                       : false;
print(result);
// 案例2
var condition = ee.Number(0);
var result = condition ? true
                       : false;
print(result);

 

可以看到,在案例1中,条件直接输入0,结果为false, 在案例2中,将0转化为数字类型,结果为true,这一现象在算法设计的过程中也需要注意,另外,需要注意,[]、ee.List([])、{}、ee.Dictionary({})在布尔运算中都会被解读为true

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值