Earth Engine与javascript的异同点
Earth Engine的语法主要来源于Javascript,但又有很多自身的特点。
两者主要有以下的区别:
1)执行代码位置不一样
Earth Engine的代码在服务器上执行相关逻辑,然后返回相关结果到客户端,Javascript则在客户端执行相关的逻辑。
2)数据类型不一样
同一种数据类型不同,如数字1,在javasript中为普通的数值类型,在Earth Engine中为ee.Number对象类型。
3)流程控制语句不一样
JavaScript中可以直接使用for循环,而在Earth Engine中使用map做循环操作。JavaScript中可以使用if做逻辑判断,但是在Earth Engine中无法使用if条件直接对对象做条件判断,这是因为在Earth Engine中返回的布尔值是对象,而不是数据本身。
4)方法返回值不一样
Earth Engine不会对数据本身做修改,二十直接生成新的数据返回给本地使用。
两者主要有以下的联系:
1)Earth Engine对象由Javascript对象定义获得
如想要得到Earth Engine的字符串类型,只需要将普通的JavaScript的字符串通过ee.String()转换即可。
2)Earth Engine调用getInfo()将对象变为普通的Javascript对象
注意,开发过程中建议不要使用getInfo,Javascript数据格式相比Earth Engine原生数据格式量非常大,很容易会造成客户端的通信息不畅。
Javascript版语法简述
1.1数值ee.Number
//Earth Engine中申明数值直接使用ee.Number()转换普通的数字即可
var ee_num1 = ee.Number(100.1);
var ee_num2 = ee.Number(10);
print("ee number is", ee_num1);
//绝对值
print("ee abs is", ee.Number(-100).abs());
//浮点类型转换
print("float to int", ee_num1.toInt());
//四则运算 add subtract multiply divide mod
print("add values", ee_num1.add(ee_num2));
print("divide values", ee_num2.divide(ee_num1));
print("mod values", ee_num2.mod(ee_num1));
//对数
print("log value", ee_num2.log());
1.2.左移、右移运算符
//A << 计算规则,把a的所有位向左移动指定的位数b,即扩大原来的2的n次方倍: result = a * 2^b
var a = 1 << 2;
print("a move left 2 is:", a);
//B >> 计算规则,把a的所有位向右移动指定的位数b,即suo'xiao右边原来的2的n次方倍: result = a / 2^b
var b = 8 >> 2;
print("b move right 2 is:", b);
1.3.按位运算
按位运算是将十进制数字转换位二进制的数字,再按照按位运算规则计算的运算方法,主要包括“与”、“或”、“异或”和“取反”
var a = ee.Number(2);
var b = ee.Number(3);
//bitwiseAnd
print("a bitwiseAnd b", a.bitwiseAnd(b));
//bitwiseOr
print("a bitwiseOr b", a.bitwiseOr(b));
1.4字符串ee.String
在Earth Engine中申明字符串只需要使用ee.string()定义普通的字符串对象即可
var base_str = "this is string.";
var ee_str1 = ee.String(base_str);
print("ee.string is", ee_str1);
//字符串长度
print("ee.string length", ee_str1.length());
//拼接字符串
var ee_str2 = ee.String("second string");
var ee_str3 = ee_str1.cat(" ").cat(ee_str2);
print("concatenates more strings", ee_str3);
//替换字符串
var ee_str4 = ee.String("my name is AA, so i am is a boy.");
var ee_str5 = ee_str4.replace("AA", "BB");
print("replace string", ee_str5);
//字符串变大小写
var ee_str6 = ee.String("China");
print("to upper string", ee_str6.toUpperCase());
print("to lower string", ee_str6.toLowerCase());
var ee_str7 = ee.String("This is landsat8 image.");
//字符串切片
print("get substring", ee_str7.slice(1,6));
//分割字符串
print("split string to list", ee_str7.split(" "));
1.5字典ee.Dictionary
Earth Engine中需要加入ee.Dictionary修饰字典。
var ee_dict1 = ee.Dictionary({
name:"AA",
age:10,
desc:"this is a boy"
});
//获取字典的大小、key列表、值列表
print("size is", ee_dict1.size());
print("key is", ee_dict1.keys());
print("values is", ee_dict1.values());
//根据键值取值
print("age is", ee_dict1.get("age"));
print("name is", ee_dict1.get("name"));
var keys = ["name", "year", "sex"];
var values = ["BB", 1990, "girl"];
//根据列表生成新的字典
var ee_dict2 = ee.Dictionary.fromLists(keys, values);
print("ee_dict2 is", ee_dict2);
//合并两个字典
var ee_dict3 = ee_dict1.combine(ee_dict2);
print("ee_dict3 is ", ee_dict3);
var ee_dict4 = ee_dict1.combine(ee_dict2, false);
print("ee_dict4 is", ee_dict4);
//判断是否包含key
var flag = ee_dict4.contains("name");
print("flag is", flag);
//删除
var ee_dict5 = ee.Dictionary({
a:1,
b:2,
c:3
});
ee_dict5 = ee_dict5.remove(["a", "c"]);
print("ee_dict5 is", ee_dict5);
//添加忽略,防止键值不存在造成删除错误
print(ee_dict5.remove(["a", "c"], true));
//添加,使用set后字典会变成Earth Engine的object对象类型,所以需要强制转换一下
var ee_dict6 = ee.Dictionary({
a:1,
b:2,
c:3
});
ee_dict6 = ee_dict6.set("d", 4);
ee_dict6 = ee.Dictionary(ee_dict6);
print("ee_dict6 is", ee_dict6);
1.6日期ee.Date
//1.通过字符串定义日期变量
var ee_date1 = ee.Date("2017-01-01");
print("ee_date1 is", ee_date1);
//http://joda-time.sourceforge.net/apidocs/org/jodatime/format/DateTimeFormat.html
//yyyy是指年,DDD指的是每年中的第几天
var ee_date3 = ee.Date.parse("yyyyDDD", "2017010");
print("ee_date3 is", ee_date3);
//2.获取后一天,单位可以是'year','month','week', 'day', 'hour', 'minute', or 'second'
var ee_date4 = ee.Date("2017-1-10");
var next_date = ee_date4.advance(1, "day");
print("next date is", next_date);
var pre_date = ee_date4.advance(-1, "day");
print("pre date is", pre_date);
//3.日期间隔,单位可以是'year','month','week', 'day', 'hour', 'minute', or 'second'
var ee_date5 = ee.Date("2017-1-1");
var ee_date6 = ee.Date("2017-1-10");
print("days number", ee_date6.difference(ee_date5, "day"));
//4.获取指定格式的日期返回值,比如当前是一年中的第几天
var doy1 = ee_date6.format("DDD");
print("day of year1", doy1);
//当前日期对于这一年的开始是第几天、月、星期等
var doy2 = ee_date6.getRelative("day", 'year');
print("day of year2", doy2);
//获取日期的年月日等信息
var ee_date7 = ee.Date.parse("yyyy-MM-dd HH:mm:ss", "2017-1-10 12:19:01");
print("year", ee_date7.get("year"));
print("month", ee_date7.get("month"));
print("week", ee_date7.get("week"));
print("day", ee_date7.get("day"));
print("hour", ee_date7.get("hour"));
print("minute", ee_date7.get("minute"));
print("second", ee_date7.get("second"));
print("millis", ee_date7.millis());
1.7ee.List 列表
var ee_list1 = ee.List([1,2,3,4,5]);
print("ee List create first method", ee_list1);
//2.列表初始化除了可以直接使用Js数组,还可以使用内部方法
var ee_list2 = ee.List.sequence(1,5);
print("ee List create second method", ee_list2);
print("ee_list2[1]", ee_list2.get(1));
print("length", ee_list2.length());
print("size", ee_list2.size());
//创建一个长度4,所有值都是10的列表
print("repeat list", ee.List.repeat(10, 4));
//添加元素
var ee_list3 = ee.List([1,2,3]);
ee_list3 = ee_list3.add(4);
print("ee_list3 is", ee_list3);
print("insert index", ee_list3.insert(0,9));
//合并列表
var ee_list4 = ee.List([1,2,3]);
var ee_list5 = ee.List([5,6,7]);
print("cat list", ee_list4.cat(ee_list5));
//删除
var ee_list6 = ee.List([1,2,3,4]);
print("remove element", ee_list6.remove(4));
print("remove element", ee_list6.removeAll(ee.List([1,2])));
//替换
print("replace element", ee_list6.replace(4,5));
//提取部分List
print("slice list", ee_list6.slice(1,3));
//判断包含
print("contain element", ee_list6.contains(3));
//排序和翻转
print("reverse list", ee_list6.reverse());
print("sort list", ee_list6.sort());
//tostring
var ee_list7 = ee.List(["a", "b", "c"]);
print("join string", ee_list7.join("-"));
//去重
var ee_list8 = ee.List(["a", "b", "c", "a"]);
print("remove dup string", ee_list8.distinct());
//reduce
var ee_list9 = ee.List([1,2,3,4]);
print("List sum", ee_list9.reduce(ee.Reducer.sum()));
//遍历
var ee_list10 = ee_list9.map(function(data) {
return ee.Number(data).multiply(2);
});
print("ee_list10 is", ee_list10)
1.8数组ee.Array
//
var ee_arr1 = ee.Array([[1,2],[2,2]]);
print("ee_arr1 is", ee_arr1);
var ee_arr2 = ee.Array(ee.List([[1,1], [3,3]]));
//加减乘除
print("add result ", ee_arr1.add(ee_arr2));
print("subtract result", ee_arr1.subtract(ee_arr2));
print("divide result", ee_arr1.divide(ee_arr2));
print("multiply result", ee_arr1.multiply(ee_arr2));
//axis 0 1
//从行遍历的每一列计算结果,结果为[[4,4]]
print("axis 0", ee_arr2.reduce(ee.Reducer.sum(), [0]));
//从列遍历的每一行计算结果,结果为[[2],[6]]
print("axis 1", ee_arr2.reduce(ee.Reducer.sum(), [1]));