GEE入门之路(从【初学者】角度,大白话)——附海面风速插值代码

        先说明一点,从正式学习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
// });
}

         一起进步吧!下一次我会分享提取粤港澳城市建成区(也就是封面那个图片)!同时说一下其中遇到的无敌巨坑们。可以期待一下嘿嘿!

        

        

    

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值