• Google Earth Engine-04(GEE中的JavaScript和原始JavaScript的异同和联系)


    在Google Earth Engine中,虽然提供基于JavaScript和Python的API供用户使用,但与原始的语句还有许多不同之处,下面以JavaScript为例,介绍GEE中JavaScript与原始JavaScript的异同及联系。

    目录

    1.两者JS的异同

    1.1 执行代码位置不同

    1.2 数据类型不同

    1.3 循环方式不一样

    1.4 方法返回值不同 

    1.5 条件判断不一样

    2.两者JS的联系

    2.1 Earth Engine对象由JavaScript对象定义获得

    2.2 Earth Engine 调用getInfo()将ee对象转换为普通js对象


    1.两者JS的异同

    1.1 执行代码位置不同

    Earth Engine的代码在服务器端执行相关逻辑,然后返回结果到客户端。JavaScript的代码则是在客户端执行相关逻辑。

    示例: 

    1. var a=10;
    2. var b=ee.Number(10);
    3. print('JavaScript',a);
    4. print('server JS',b)

     执行结果:

    在运行结果中,虽然返回值都为JSON类型数据,但a为JS的数值类型,在浏览器端进行解析;而b为Earth Engine的数字对象,需要将其发送至服务器进行解析,浏览器再接受其返回的运行结果。

    1.2 数据类型不同

    在GEE中,同一种数据,类型不同,例如上述案例中,同样为数字10,使用原始js生成的数据类型为数值类型,而使用ee.Number()生成的数字为Number()类型对象。由于数据类型不同,所以同一数据类型两者包含的方法也不一样。例如在列表数据中,原始JS可使用.length获取其长度,而GEE中,要使用length()方法计算长度。

    1. var a=[10,20,30,40];
    2. var b=ee.List([10,20,30,40]);
    3. print('JavaScript',a,a.length);//JS类型
    4. print('server JS',b,b.length())//GEE类型

    运行结果:

    1.3 循环方式不一样

    在JS中,循环使用for做循环,而在GEE中使用map做循环。在使用for循环时,循环操作可以获取 相关索引,而map对集合内每一个元素做循环操作,并没有相关索引。

    1. var a=[10,20,30,40];
    2. var b=ee.List([10,20,30,40]);
    3. for (var i=0;ilength;i++){
    4. print('for循环',a[i]);
    5. }
    6. var c=b.map(function(num){
    7. num = ee.Number(num);
    8. return num;
    9. })
    10. print(c)

    输出结果:

    1.4 方法返回值不同 

    在GEE中,大部分API都有返回值,因为GEE不会对数据本身做修改,而是直接生成新的数据返回给本地使用。

    1. //javascript
    2. var aList=[1,2,3];
    3. aList.push(5);
    4. print('aList',aList);
    5. //gee
    6. var bList=ee.List([1,2,3]);
    7. bList=bList.add(5);
    8. print('bList',bList)

    上述代码中,aList为JS创建的列表,在进行数据添加操作时,数据将在原始列表中进行操作;而ee.List列表中,在进行数据操作时,返回的是操作后的新列表,结果如下图所示: 

     1.5 条件判断不一样

    在JS中,可以直接使用if语句进行条件判断,但在GEE中,无法使用if语句直接对对象做条件判断,因为在GEE中,条件判断返回的布尔值是对象而不是数据本身值,所以if条件的判断永远是真。在GEE中,有自己定义的条件判断方式,使用方法是:

    ee.Algorithms.If( condition, trueCase, falseCase);
    

    示例代码:

    1. var nums_gee = ee.List([1,2,3,4]);
    2. nums_gee = nums_gee.map(function(num){
    3. num = ee.Number(num);
    4. var newNum = ee.Algorithms.If(num.gt(2),num.add(10),num.add(1));
    5. return newNum;
    6. })
    7. print(nums_gee);

    上述代码中,使用ee.Algorithms.If()方法进行条件判断,循环nums_gee列表中的数据,当num>2时,对 num实行加10操作;否则进行加1操作,输出结果如下:

    2.两者JS的联系

    2.1 Earth Engine对象由JavaScript对象定义获得

    Earth Engine的对象是由JS的数据对象直接定义而来的,如字符串类型数据,要想得到Earth Engine的字符串类型,只需将普通的JS字符串通过ee.String()方法进行转换即可。

    1. //js
    2. var jstr = 'hello world!';
    3. print(jstr);
    4. //ee
    5. var estr = ee.String(jstr);
    6. print(estr);

    上述代码中,使用ee.String()方法将js的字符串jstr转换为ee类型的str,输出结果如下:

    2.2 Earth Engine 调用getInfo()将ee对象转换为普通js对象

     在GEE中,可以使用.getInfo()方法,将ee对象类型数据转换为普通的js对象。但实际使用中,不建议大量使用,因为调用getInfo()方法,会将EarthEngine数据以普通的JS数据返回给客户端,JS数据相比于Earth Engine数据非常大,会造成客户端“假死”现象。

    1. //js
    2. var str="hello world!";
    3. print(typeof str);
    4. //ee
    5. var str2=ee.String("abc");
    6. print(typeof str2);
    7. //translate
    8. print(typeof str2.getInfo())

    上述代码中,将生成js类型的字符串和ee类型的字符串,并使用getInfo()方法将ee类型字符串转换为js类型数据,结果如下所示:

  • 相关阅读:
    深入理解Java ThreadLocal及其内存泄漏防范
    rm: cannot remove `.user.ini‘: Operation not permitted异常该如何解决?
    基于51单片机的教室智能照明灯控制系统光控人数检测
    【Mysql】where 条件子句之逻辑运算符
    python基于微信小程序的个人摄影作品展示报名系统 uniapp 小程序
    Element UI主题换肤功能(基于vue-element-admin框架)
    Vue 搭配 Spring MVC 创建一个 web 项目
    深度学习基础:超分辨率网络整理之EDVR网络
    C++单元测试GoogleTest和GoogleMock十分钟快速上手(gtest&gmock)
    【VS Code 使用tensorboard功能技巧】
  • 原文地址:https://blog.csdn.net/damadashen/article/details/127401070