先说明一点,从正式学习GEE(google earth engine)到现在只过去了3个月,我自身就是一个初学者,很多时候从初学者和非常直白的角度去想问题,不会绕弯子,也不懂很复杂的东西。但是也算是入了一个门,已经学会了借助别人的力量去写自己的代码(简称复制粘贴),同时也能自己不抄别人的代码完成一些简单的操作。这篇文章就从一个初学者的角度去帮大家入个门,后续也会继续更新,毕竟学GEE是一个长期的事情。
首先,你需要一个教程。我的建议是,看一遍这个教程,然后有个印象就好,不需要跟着敲代码(因为我真的很懒,只想坐着看完一遍,而且还是开倍速那种)。视频是b站的遥感大数据平台 Google Earth Engine 教学视频_哔哩哔哩_bilibili,作者是王金柱。我只看过这一个,也是b站播放量最高的,它的简介有个群号,一定要进群!里面有课件!课件有代码!我就是靠着这些很基础的示例代码做我的论文的实验的。也看出,其实你不需要很强的GEE的知识,也可以应付常见的一些论文写作了。
我是刚看完视频就刚好遇到一个需要GEE解决的问题,就刚好当作练手的东西。这个任务是找到Landsat8和Sentinel2的相近时间相同位置的影像对,刚好GEE教程就有(你看!真的是很好的教程)!因为GEE教程里面的没有循环,我刚好要批处理,所以就小改了一下,加了一个批处理的循环。第二个任务是对研究区域的风速数据进行插值,自己也是就用那些非常基础的语法来写的。如果大家感兴趣,可以私信问我细节,代码就放在下面。但我能保证我就是用那个教程里面的代码拼拼凑凑起来的。
最后进阶一点了,我开始接触了一些“高端”东西,尝试函数调用什么的了。 但我可以保证,你用到最多的函数,大概就是去云和GEE的dataset里面已经写好的那些函数,基本上不需要自己写函数,目前我还是很抗拒自己写函数,能不写函数就不写哈哈哈。可能是我见识短浅,我看课题组老师写的GEE的代码,我觉得好复杂,不是我现在能写出来的东西。下一阶段我开始学GEE作图啦!大家可以期待一下!和大家一起学习~
下面是一些小福利,就是一个风速插值的代码,就是用克里金插值的方式,用前后两个时间的风速来插出中间某时刻的风速,在环境相关的研究应用特别广泛,一般都需要说明研究区域不同时间的风速情况。具体的细节就不讲了。这个代码就反映了我现在的写GEE代码能力,看起来很复杂的一定是我复制粘贴的。
var spill = ee.FeatureCollection("users/hxr/point")
var spill_list = spill.sort('Id',false).toList(632)
var roi = ee.Geometry.Polygon(
[[[105, 16],
[105, 25],
[122, 25],
[122, 16]]]);
var i=0
for (i = 0; i < 632; i++) {
var one_spill = ee.Feature(spill_list.get(i))
var year = one_spill.get('year')
var month = one_spill.get('month')
var day = one_spill.get('day')
var hour = one_spill.get('hour')
var minute = one_spill.get('minute')
var second = one_spill.get('second')
var Date1 = ee.Date.fromYMD(year, month, day).advance(hour,'hour').advance(minute,'minute').advance(second,'second');
// print(Date1);
var Date_minus3 = Date1.advance( -3, 'hour' );
var Date_add3 = Date1.advance( 3, 'hour' );
var former = CDR.filter(ee.Filter.date(Date_minus3, Date1)).select('wind_speed');
var later = CDR.filter(ee.Filter.date(Date1, Date_add3)).select('wind_speed');
var image1=former.first()
var image2=later.first()
// print(image1)
// print(image2)
// raster to vector: imagecollection to featurecollection
//前一个时间
// 利用 .sample() 和 .map() 实现栅格转点阵并且传递像元值
var points1 = image1.addBands(ee.Image.pixelLonLat()) // 为图像加入像元经纬度两个层
// 用 .sample() 将 ee.Image 转为 ee.FeatureCollection
.sample({
region: roi, // 以roi为采样区,不设置其它参数则采样全部像元
geometries: true // 使生成的点阵中的每个点都置于像元中心
})
// 用 .map() 对要素集中所有的要素逐个处理
.map(function(sample){
var lat = sample.get('latitude');
var lon = sample.get('longitude');
var value = sample.get('wind_speed');
// 硬定义返回的要素为矢量点,点的位置由经纬度创建,数据为上一行的value
return ee.Feature(ee.Geometry.Point([lon, lat]), {value: value});
});
// 后一个时间
var points2 = image2.addBands(ee.Image.pixelLonLat())
.sample({
region: roi,
geometries: true
})
.map(function(sample){
var lat = sample.get('latitude');
var lon = sample.get('longitude');
var value = sample.get('wind_speed');
return ee.Feature(ee.Geometry.Point([lon, lat]), {value: value});
});
// print(points1)
// interpolation in spatial
var area1 = points1.kriging({
range: 140000,
propertyName: 'value',
shape: "gaussian",
sill: 1.0,
nugget: 0.1,
reducer: "mean"
});
var area2 = points2.kriging({
range: 140000,
propertyName: 'value',
shape: "gaussian",
sill: 1.0,
nugget: 0.1,
reducer: "mean"
});
// Map.centerObject(one_spill,4);
// Map.addLayer(one_spill);
// Map.addLayer(area1);
// extract data
var speed1 = area1.sampleRegions({
collection:one_spill,
properties:ee.List(['id']),
scale:30
});
var speed2 = area2.sampleRegions({
collection:one_spill,
properties:ee.List(['id']),
scale:30
});
// print(speed1);
var speed_num1=speed1.first().get("value");
var speed_num2=speed2.first().get("value");
// print(speed_num1)
// print(speed_num2)
// calculate time different
var Date0 = ee.Date.fromYMD( year, month, day );
var Date3 = ee.Date.fromYMD( year, month, day ).advance(3, 'hour');
var Date6 = ee.Date.fromYMD( year, month, day ).advance(6, 'hour');
// print(Date3)
var Diff_qian=ee.Algorithms.If(ee.Number(hour).eq(2),
Date1.difference( Date0, 'second' ),
Date1.difference( Date3, 'second' ))
var Diff_hou=ee.Algorithms.If(ee.Number(hour).eq(2),
Date3.difference( Date1, 'second' ),
Date6.difference( Date1, 'second' ))
var total_diff=Date3.difference( Date0, 'second' );
// interpolation in time
var variables = {Diff_qian: Diff_qian, Diff_hou:Diff_hou,total_diff:total_diff,speed_num1:speed_num1,speed_num2:speed_num2};
// Arithmetic operators.
var speed=ee.Number.expression('(Diff_qian/total_diff)*speed_num1+(Diff_hou/total_diff)*speed_num2',variables);
print(speed)
// Export.image.toDrive({
// image: landsat,
// description: 'imageToDriveExample',
// scale: 30,
// region: geometry
// });
}
一起进步吧!下一次我会分享提取粤港澳城市建成区(也就是封面那个图片)!同时说一下其中遇到的无敌巨坑们。可以期待一下嘿嘿!