【GEE学习第二期】GEE数据类型、语法

news2024/9/30 9:34:29

【GEE学习第二期】GEE数据类型、语法

  • GEE基本数据类型
  • 基本语法
    • 循环
    • 条件判断
    • 累加
  • 可视化影像与波段
  • 影像集
  • 数据导出
    • 数值与绘图
    • 保存影像
  • 参考

GEE基本数据类型

GEE 中使用的主要数据类型是栅格,涵盖从本地到全球范围的图像,可从数百个卫星和航空资源获得图像。
GEE整个代码是运行在云端的,所以GEE自定义了自己的数据类型,基本是ee.xxx形式,包括ee.String、ee.Number、ee.List、ee.Dictionary、ee.Date等。它们的定义及使用基本还是遵循常规方法,所以这里就简单演示一下。

演示代码如下。

// 新建一个服务器上的字符串
var serverString = ee.String('This is on the server.');
print('String on the server:', serverString);
 
// 新建一个服务器上的数字
var serverNumber = ee.Number(3.14159);
print('number=',serverNumber);
 
// 新建一个服务器上的列表
var serverList = ee.List([1,5,6,9,2]);
print('Sequence:',serverList);
// 注意,由于是服务器上的List,所以需要通过get()函数获得内容,而不是直接索引
print('item 2:',serverList.get(2));
 
// 新建一个服务器上的字典,包含三个键值对
var serverDict = ee.Dictionary({
  e:Math.E,
  pi:Math.PI,
  phi:(1+Math.sqrt(5))/2
});
// 和上面一样,需要通过get()函数获取数据
print('Golden ratio:',serverDict.get('phi'));
print('Keys:',serverDict.keys());
 
// 新建一个服务器上的日期
var serverDate = ee.Date('2020-10-13');
print('date:',serverDate);

控制台输出结果如下所示:
在这里插入图片描述

基本语法

这里的基本语法并不是指Java Script的基本语法,而是指上面提到的对于循环、条件判断以及累加操作的并行化写法。

循环

一个适合于GEE的并行的循环写法如下:

// This generates a list of numbers from 1 to 10.
var myList = ee.List.sequence(1, 10);
 
// The map() operation takes a function that works on each element independently
// and returns a value. You define a function that can be applied to the input.
var computeSquares = function(number) {
// We define the operation using the EE API.
  return ee.Number(number).pow(2);
};
 
// Apply your function to each item in the list by using the map() function.
var squares = myList.map(computeSquares);
print(squares);  // [1, 4, 9, 16, 25, 36, 49, 64, 81]

条件判断

下面代码演示了如何遍历一个List,寻找到其中的奇数。其实核心在于对每个元素对2取余,然后删除那些为0的元素,即可得到奇数。这个例子通过数学计算,避免了if/else的判断。是一种值得学习的思路。

// The following function determines if a number is even or odd.  The mod(2)
// function returns 0 if the number is even and 1 if it is odd (the remainder
// after dividing by 2).  The input is multipled by this remainder so even
// numbers get set to 0 and odd numbers are left unchanged.
var getOddNumbers = function(number) {
  number = ee.Number(number);   // Cast the input to a Number so we can use mod.
  var remainder = number.mod(2);
  return number.multiply(remainder);
};
 
// This generates a list of numbers from 1 to 10.
var myList = ee.List.sequence(1, 10);
 
// filtering
var newList = myList.map(getOddNumbers);
 
// Remove the 0 values.
var oddNumbers = newList.removeAll([0]);
print(oddNumbers);

另外,对于二维的影像而言,同样可以采用类似的操作来避免if/else判断,如下面的例子所示:

var collection = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA');
 
// Divide the collection into 2 subsets and apply a different algorithm on them.
var subset1 = collection.filter(ee.Filter.lt('SUN_ELEVATION', 40));
var subset2 = collection.filter(ee.Filter.gte('SUN_ELEVATION', 40));
 
var processed1 = subset1.map(function(image) {
  return image.multiply(2);
});
var processed2 = subset2;
 
// Merge the collections to get a single collection.
var final = processed1.merge(processed2);
print('Original collection size', collection.size());
print('Processed collection size', final.size());

说明:ee.Filter.lt()是表示过滤那些比给定值小的数据,ee.Filter.gte()表示过滤那些比给定值大的数据。

累加

下面代码展示了生成斐波那契数列。

var algorithm = function(current, previous) {
  previous = ee.List(previous);
  var n1 = ee.Number(previous.get(-1));
  var n2 = ee.Number(previous.get(-2));
  return previous.add(n1.add(n2));
};
 
// Compute 10 iterations.
var numIteration = ee.List.repeat(1, 10);
var start = [0, 1];
var sequence = numIteration.iterate(algorithm, start);
print(sequence);  // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

可视化影像与波段

上面的部分介绍了GEE JS API的相关基本语法。这部分主要介绍一些比较具体的内容。如何利用GEE在地图上可视化影像。实现对影像数据的可视化非常简单,主要有三步:创建影像实例、设置地图中心点、添加图层。其中中间这一步不是必须的,核心就是创建一个影像实例,然后将这个实例添加到地图图层中。

下面代码演示了可视化STRM数据。

// Instantiate an image with the Image constructor.
var image = ee.Image('CGIAR/SRTM90_V4');
 
// Zoom to a location.
Map.setCenter(117.3798, 32.9049, 4); // Center on the Bengbu City.
 
// Display the image on the map.
Map.addLayer(image);

print('SRTM image',image);

Map.addLayer(image, {min: 0, max: 3000}, 'custom visualization');
Map.addLayer(image, {min: 0, max: 3000, palette: ['Moccasin', 'Orange', 'Coral']},'custom palette');

下面对代码进行简单解析。

  • 首先,对于影像实例,直接通过ee.Image()构造函数生成即可,传入的参数是要显示的数据的Image ID。关于这个ID,可以在GEE的数据库里寻找,找到后把那一串代码复制过来就好。
  • 第二行是调用Map类的成员函数setCenter()设置地图的中心点,参数分别是经度、纬度和缩放等级。缩放等级越大地图越放大。
  • 最后一行是将我们刚刚获取到的影像放到Map的图层中进行展示。

对于一个影像,我们可以通过print()函数来输出它的相关信息。
比如,我们在上面代码的最后增加一行print(‘SRTM image’,image);
控制台中会出现如下内容:
在这里插入图片描述
可以看到,显示了SRTM数据的一些基本信息,包括数据类型(signed int16)、影像大小(432000×144000)等等,非常丰富。
另外,我们可以在addLayer()的时候增加一些参数,使得可视化更符合我们的需求。

  • 比如说,可以设置显示范围,像这样修改上面代码的最后一行为Map.addLayer(image, {min: 0, max: 3000}, ‘custom visualization’);。这里我们将显示的搞高程范围限制在了0到3000m,图层的名称为custom visualization,可以看到如下效果:
    在这里插入图片描述
    而之前的效果是这样的。可以看到显示效果差异非常大。一个很重要的原因就在于,在原始的SRTM中是存在负值的(上面输出的SRTM信息),最小值为-32768。所以就会导致显示出来的效果很差了。

  • 除了可以控制数据显示的范围,同样也可以数据显示的颜色等级。比如将上面代码的最后一行换成下面这样:Map.addLayer(image, {min: 0, max: 3000, palette: [‘Moccasin’, ‘Orange’, ‘Coral’]},‘custom palette’);。
    可以通过标准颜色名称(标准颜色名称可以参考这里),或者十六进制字符串指定颜色。效果如下:
    在这里插入图片描述

影像集

影像集(Image Collection)可以理解为是多个影像(Image)组成的集合。这里以一个例子展示如何对影像进行过滤和筛选,最后显示在地图上。

代码如下:

//  获取Landsat8 TOA影像
var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA');
 
// 定义一个目标点
var point = ee.Geometry.Point(117.0721,33.2363);
 
// 调用filterBounds筛选位置
var spatialFiltered = l8.filterBounds(point);
print('spatialFiltered',spatialFiltered);
 
// 再调用filterDate筛选时间
var temporalFiltered = spatialFiltered.filterDate('2015-01-01','2015-12-31');
print('temporalFiltered',temporalFiltered);
 
// 到这一步之后,还可能有很多影像的,我们可以进一步按照云层覆盖进行排序
var sorted = temporalFiltered.sort('CLOUD_COVER');
// 选取含云量最少的那一景
var scene = sorted.first();
 
// 将影像放到当前地图的中心,缩放9级
Map.centerObject(scene,9);
 
// Landsat8的RGB波段分别是B4、B3、B2
// 最大值设为0.3,最小值默认为0
var visParams = {bands:['B4','B3','B2'],max:0.3};
 
// 展示影像,名称为true-color composite
Map.addLayer(scene,visParams,'true-color composite');

通过指定一目标点,我们对数据集在空间上进行了过滤,然后又在时间上进行了限制。最后,选出云量最少的一景作为展示。
同时注意Landsat8的数据RGB波段的顺序,最后进行展示。

数据导出

GEE虽然是云端处理,但显然是支持数据的导出和下载的,不然运行的结果没法使用。数据的导出主要分为两类,一类是运算的数值类型数据的导出以及绘图,一类是影像的导出。下面分别介绍。

数值与绘图

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA');
 
// Map a function over the Landsat 8 TOA collection to add an NDVI band.
var withNDVI = l8.map(function(image) {
  // Get a cloud score in [0, 100].
  var cloud = ee.Algorithms.Landsat.simpleCloudScore(image).select('cloud');
 
  // Create a mask of cloudy pixels from an arbitrary threshold.
  var mask = cloud.lte(20);
 
  // Compute NDVI.
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
 
  // Return the masked image with an NDVI band.
  return image.addBands(ndvi).updateMask(mask);
});
 
// Define ROI.
var roi = ee.Geometry.Polygon([[117.211,32.847],
[117.464,32.847],
[117.464,32.995],
[117.211,32.995],
[117.211,32.847]]);
 
// Create a chart.
var chart = ui.Chart.image.series({
  imageCollection: withNDVI.select('NDVI'),
  region: roi,
  reducer: ee.Reducer.first(),
  scale: 30
}).setOptions({title: 'NDVI over time'});
 
// Display the chart in the console.
print(chart);
Map.centerObject(roi,11);
Map.addLayer(roi);

控制台输出效果如下:

如果想输出原始数据,点击右上角的”Download CSV”即可,如果想保存折线图,点击”Download SVG/PNG”即可,十分方便。

保存影像

上面保存的都是处理后的数值与绘图,那么遥感影像呢?也非常简单,主要是利用GEE的Export包实现。对于影像导出,GEE支持三种模式:

  • 导出到Google Drive
  • 导出到Google Cloud Storage
  • 导出到项目的Asset。

如果是想下载的话,一般可以使用第一种,导出到Google Drive以后,再进行下载。这里我们以刚刚在第六部分计算的单景NDVI影像为例,演示导出至Google Drive。示例代码如下。

// 指定某个目标点
var point = ee.Geometry.Point([117.0721,33.2363]);
 
// 导入Landsat-8 TOA影像数据集
var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA');
 
// 获取2015年云量最少的影像
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);
 
// 计算Normalized Difference Vegetation Index (NDVI)
// Landsat8 第5波段是近红外(NIR),第4波段是红波段(Red)
var nir = image.select('B5');
var red = image.select('B4');
// 套用NDVI计算公式(NIR-Red)/(NIR+Red)
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');
 
// 设置影像到地图中心
Map.centerObject(image,9);
// 设置最大最小值和显示颜色
var ndviParams = {min:-1,max:1,palette:['blue','white','green']};
// 向地图中添加图层
Map.addLayer(ndvi,ndviParams,'NDVI image');
 
// 上面的代码都一样
// 这里,调用Export的toDrive函数导出
Export.image.toDrive({
  image: ndvi,
  description: 'NDVI',
  scale: 30
});

运行代码以后,除了会得到之前的结果外,在右上角的“Tasks”里也会看到有新的任务,点击“Run”,弹出如下对话框。填入相关信息,即可开始导出,导出完成后就会在你的Google Drive里看到对应的文件了,下载即可。如下图所示。

参考

1、CSDN博客-GEE初学者笔记之快速上手篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?

近年来,信创的概念引入和高效实践落地让更多的行业企业自发性地进行国产化替代,目前信创国产化替代还多发生在操作系统和应用层面,软件工具等目前还在下一阶段规划,但很多企业未雨绸缪,已经在做调研和尝试。 FTP作为世…

数据结构:并查集

数据结构:并查集 并查集原理实现框架初始化合并查询获取成员路径压缩其它 总代码 并查集 在生活中,经常会出现分组问题。比如一个班级分为多个小组,打篮球分为两方等等。在同一个组中的所有成员,就构成一个集合。对这种一个群体分…

基于SSM的会员管理系统【附源码】

基于SSM的会员管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概述 4.2 数据库设计原则 4.3 数据表 第五章 系统实现 5.1用户功能模块 5.2管理员功能模块 5.3前台首页功能模块 4 系统…

可视化是工业互联网的核心技术之一,都有哪些应用场景?

一、工业互联网是什么,发展的来胧去脉 工业互联网是指利用互联网技术和物联网技术,将工业生产中的各种设备、机器、传感器等进行互联互通,实现信息的实时采集、传输和分析,从而实现生产过程的智能化、自动化和高效化。 工业互联网…

微信网页 上传图片压缩

微信网页上传图片时的压缩问题可以通过多种方法解决。以下是一些有效的方案和相关API的使用说明。 主要解决方案 1. 使用Canvas进行自定义压缩: 对于需要适配多种设备和格式的情况,可以利用Canvas API进行图片重绘和压缩。通过获取图片信息、设置Canvas尺寸、绘制图片并…

地图资源下载工具(geodatatool)下载 亚洲 8 米 DEM数据

本数据集提供的 DEM 镶嵌图是由 DigitalGlobe 卫星的超高分辨率 (VHR) 沿轨和跨轨立体图像生成的。为了生成 DEM 镶嵌图块,超过 4000 个 DEM 条带与加权平均 镶嵌程序合并,以减少错误并消除接缝。镶嵌图块为 100 公里 x 100 公里,8 米处为 …

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理: Cannot add merged region …

tr命令:替换文本中的字符

一、命令简介 ​tr​ 命令用于转换或删除文件中的字符。它可以从标准输入中读取数据,对数据进行字符替换、删除或压缩,并将结果输出到标准输出。 ‍ 二、命令参数 格式 tr [选项] [集合1] [集合2]选项和参数 ​ ​-c​​: 指定 集合 1 的补集。​ …

Vulhub zico 2靶机详解

项目地址 https://download.vulnhub.com/zico/zico2.ova实验过程 将下载好的靶机导入到VMware中,设置网络模式为NAT模式,然后开启靶机虚拟机 使用nmap进行主机发现,获取靶机IP地址 nmap 192.168.47.1-254根据对比可知Zico 2的一个ip地址为…

以太网交换安全:MAC地址表安全

一、MAC地址表安全 MAC地址表安全是网络安全中的一个重要方面,它涉及到网络设备的MAC地址表的管理和保护。以下是对MAC地址表安全的详细介绍: (1)基本概念 定义:MAC地址表是网络设备(如交换机&#xff0…

群晖安装Audiobookshelf(有声书)

一、Audiobookshelf是什么? Audiobookshelf是一款自托管的有声读物和播客服务器,用于管理和播放您的有声读物。为用户提供便捷、个性化的音频书籍管理与播放体验 支持网页端、安卓端、IOS端三端同步,支持对有声书进行不同分类。 二、安装教程 通过群晖…

【C语言进阶】一次解决字符串输入问题——为什么输入这么容易奔溃?

文章一览 写在前面一、scanf、getchar与gets函数的爱恨情仇1.1 scanf函数1.1.1 %c输入单个字符2. %s 输入字符串1.1.3 %d输入数字 1.2 getchar函数1.3 gets函数 二、不同输入情况下的使用三、回顾C语言的输入函数总结 写在前面 在之前的文章中,笔者详细介绍了scanf函…

基于Springboot+Vue的课程教学平台的设计与实现系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

Arm Linux 交叉编译openssl 1.1.1

一、openssl 源码下载 OpenSSL的官方网站或源代码仓库下载最新或指定版本的OpenSSL源代码。 官网地址: https://openssl-library.org/source/index.html 旧版本下载: https://openssl-library.org/source/old/index.html 这里以 1.1.1 为例 国内git…

网线最短不能短于1米?

大家都知道网线最长不能长于100米,但你有没有听说过“网线最短不能短于1米”这个说法呢?也有的朋友说不能低于0.6米。 有的网友说“‌‌网线最短1米的说法是真的。‌ 短于1米的网线电阻几乎为零,设备可能无法识别,因此在实际应用中…

Android 安卓内存安全漏洞数量大幅下降的原因

谷歌决定使用内存安全的编程语言 Rust 向 Android 代码库中写入新代码,尽管旧代码(用 C/C 编写)没有被重写,但内存安全漏洞却大幅减少。 Android 代码库中每年发现的内存安全漏洞数量(来源:谷歌&#xff09…

【前端开发入门】html快速入门

目录 引言html基础模板内容html文档流html 标签块级元素行内元素功能性元素标签嵌套 html编码习惯总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容,并不代表这部分内容不重要,只是对于初学…

一站式大语言模型API调用:快速上手教程

智匠MindCraft是一个强大的AI工具及开发平台,支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型,帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网,注册并登录账号。 进入开发者平台&…

86、Python之鸭子类型:即便行为大于类型,还是要聊一下类型转换

引言 我们的最近几篇文章一直在聊的是鸭子类型,以及支撑鸭子类型相关的魔术方法的内容。其实,鸭子类型的本质在于“行为大于类型”。但是,并不是说类型不重要,只是在特定领域中,行为本身高于类型形式,或者…

爬虫及数据可视化——运用Hadoop和MongoDB数据进行分析

作品详情  运用Hadoop和MongoDB对得分能力数据进行分析;  运用python进行机器学习的模型调理,利用Pytorch框架对爬取的评论进行情感分析预测;  利用python和MySQL对网站的数据进行爬取、数据清洗及可视化。