谷歌地球引擎Google Earth Engine针对不同地表类型分别自动生成随机采样点的方法

news2024/12/29 13:49:13

  本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,按照给定的地表分类数据,对每一种不同的地物类型,分别加以全球范围内随机抽样点自动批量选取的方法。

  本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第22篇,更多GEE文章请参考专栏:GEE学习与应用(https://blog.csdn.net/zhebushibiaoshifu/category_11081040.html)。

  首先,来具体明确一下本文的需求。我们现在有一个MODIS地表分类数据产品MCD12Q1,其LC_Type3波段可以提供全球陆地范围内,每一年的地表植被分类数据,空间分辨率为500 m。如下图所示,就是其对于地表植被类型的分类;紫色框内的8种地表类型,就是8种不同的植被类型。

  我们希望实现的是,在全球陆地范围内,针对上述8种植被类型,对于每一种植被类型,分别筛选3000个左右的随机采样点;因为一共是8种植被类型,所以相当于我们最终希望得到的全部采样点个数大约为8 * 3000 = 24000。其中,每一种植被类型对应的3000个左右的采样点,都单独作为一个FeatureCollection,然后保存到Assets中。

  明确了需求,即可开始代码的撰写。本文用到的代码如下。

var modis_type = ee.Image("projects/ee-ucanuse6/assets/vegetation_type"),
    rectangle = 
    /* color: #98ff00 */
    /* shown: false */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[-164.97163926414936, 74.9796307938761],
          [-164.97163926414936, -57.6624255131542],
          [176.74711073585064, -57.6624255131542],
          [176.74711073585064, 74.9796307938761]]], null, false);

// Map.addLayer(rectangle);
var landcoverTypes = [1, 2, 3, 4, 5, 6, 7, 8];

var modis_type_vis = {
  min: 1.0,
  max: 17.0,
  palette: [
    '05450a', '086a10', '54a708', '78d203', '009900', 'c6b044', 'dcd159',
    'dade48', 'fbff13', 'b6ff05', '27ff87', 'c24f44', 'a5a5a5', 'ff6d4c',
    '69fff8', 'f9ffa4', '1c0dff'
  ],
};
Map.addLayer(modis_type, modis_type_vis, "MODIS_Type");

landcoverTypes.forEach(function(type) {
  var type_mask = modis_type.eq(type);
  var type_image = modis_type.updateMask(type_mask);
  var type_point = type_image.sample({
    scale: 500,
    region: rectangle,
    numPixels: 140000,
    seed: 7,
    dropNulls: true,
    geometries: true
  });
  print(type_point);
  Map.addLayer(type_point, {}, "Point");
  
  Export.table.toAsset({
    collection: type_point,
    description: 'point_' + type,
    assetId: 'point_' + type,
  });
});

  其中,// Map.addLayer(rectangle);这句代码以上的内容,是获取我这里处理好的MODIS地表分类数据,以及我手动绘制的一个包含了全球主要陆地部分的Polygon。这一部分的代码,大家复制之后,可以转换成Imports的格式,如下图红色框内所示。

  代码接下来的部分的含义如下。

  首先,var landcoverTypes = [1, 2, 3, 4, 5, 6, 7, 8];定义了一个包含地物类型的数组landcoverTypes,这里的值18分别对应着我们所需的8种土地植被覆盖类别。

  随后,var modis_type_vis = { ... };这部分代码定义了MODIS地物类型数据的可视化参数,其中包含了最小值、最大值和调色板信息,用于根据类型值将地物类型数据映射到不同颜色,从而可以更好地可视化MODIS地表分类数据产品。随后,Map.addLayer(modis_type, modis_type_vis, "MODIS_Type");MODIS地表分类数据产品添加到地图中,并使用上述定义的可视化参数进行显示。

  接下来,landcoverTypes.forEach(function(type) { ... });表示对landcoverTypes数组中的每个值进行循环,也就是对8种地表类型数据分别加以循环。

  随后,var type_mask = modis_type.eq(type);表示根据当前循环的类型值,创建一个布尔类型的掩膜type_mask,用于筛选出与该类型相符的像素。其次,var type_image = modis_type.updateMask(type_mask);表示使用掩膜type_mask对地表类型数据进行屏蔽(掩膜),保留与当前类型相符的像素,并将其他像素设置为null

  其次,var type_point = type_image.sample({ ... });表示对掩膜后的地表类型数据进行抽样,生成样本点;在这里,我们使用给定的参数(比例尺、区域、像素数等)指定抽样的方式。

  最后,使用print(type_point);打印该地表类型的样本点信息,以查看抽样结果;通过Map.addLayer(type_point, {}, "Point");将样本点图层添加到地图中进行可视化。

  完成上述操作后,通过Export.table.toAsset({ ... });将样本点导出,将其存储为GEE中的Asset

  运行上述代码,首先我们看一下Console一栏的结果——也就是print(type_point);这句代码,打印出的8种地表类型对应的抽样点信息;如下图所示。

  在这里,首先可以看到,由于部分地表类型数据对应的抽样点个数比较多,所以对于该类型(如上图中第一种和第四种植被类型)抽样点,print(type_point);这句代码会报错,是打印不出来结果的。

  其次,就是有一点,我这里这个代码暂时不能直接限定每一种植被类型对应的抽样点个数——如上图所示,有的植被类型抽样点可以多到print(type_point);这句代码直接报错(也就是超过了5000个),而有的植被类型抽样点只有248个。这个问题,是var type_point = type_image.sample()这句代码中,.sample()函数不能很好地限制抽样点个数导致的。我的理解是,由于全球范围内,不同植被类型对应的面积不一样,也就是不同植被类型对应的MODIS地表分类数据产品的像元总数也就不一样;但是我们在执行.sample()函数时,其抽样比例是固定的(例如每3000个像素中,选出1个作为抽样点)——那么对于在全球面积占比大,也就是像元个数多的植被类型,其得到的抽样点个数自然就多;反之自然就少。针对这种情况,如果大家希望对于每一种植被类型,都获取比较一致的抽样点个数,那么就可以单独对这种(或者这几种)植被类型运行上述代码(即修改landcoverTypes中的类型数值),然后调整.sample()函数中的numPixels参数——这个参数越大,对应的抽样点个数就越多;反之,抽样点个数则越少。大家可以结合实际情况,自行调整这个参数,直到能够获取到合适数量的抽样点。

  接下来,我们看一下地图。如下图所示,可以看到8种植被类型对应的抽样点,以及MODIS地表分类数据产品,都已经显示出来了。由于抽样点个数比较多,所以看起来密密麻麻的;甚至有的地方都重叠在了一起,看起来仿佛是纯黑色的。

  最后,我们看一下Tasks一栏。如下图所示,可以看到8种植被类型导出的任务都已经生成了。

  我们逐一执行这些任务,即可将不同种植被类型对应的抽样点合集导出到Assets;如下图所示。

  其中,我们打开第一种植被类型对应的抽样点,也就是上图中的point_1,如下图所示。

  可以看到,这个植被类型对应的抽样点遍布全球,且总数有12292个,数量巨大——怪不得前面的print(type_point);这句代码,对这个植被类型的抽样点而言会报错。

  至此,大功告成。

欢迎关注:疯狂学习GIS

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

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

相关文章

05.Elasticsearch应用(五)

Elasticsearch应用(五) 1.目标 咱们这一章主要学习Mapping(映射) 2.介绍 Mapping是对索引库中文档的约束,类似于数据表结构,作用如下: 定义索引中的字段的名称定义字段的数据类型&#xff…

0124-2-算法题解析与总结(四)

5.5 如何去除有序数组的重复元素 本文对应的力扣题目: 26.删除排序数组中的重复项 83.删除排序链表中的重复元素 26.删除排序数组中的重复项: int removeDuplicates(int[] nums) {int n nums.length;if (n 0) return 0;int slow 0, fast 1;while…

Spring基于AbstractRoutingDataSource实现MySQL多数据源

目录 多数据源实现 yml配置文件 配置类 业务代码 案例演示 多数据源实现 yml配置文件 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezoneUTC&useUnicodetrue&characte…

第二百八十六回

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了如何拦截路由相关的内容,本章回中将介绍页面转场动画.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍了路由拦截相关的内容,本章回中将使用路由拦截实现转场…

《动手学深度学习(PyTorch版)》笔记3

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,本书源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode测试通过。 Chapter3 Linear …

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中,中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位,所在部门为长城新盛信托有限责任公司。目前完成了一面,在这里记录一下一面经…

Puppeteer结合Jest对网页进行测试

之前我们使用Puppeteer进行网页爬虫(以及自动化操作),这篇文章主要验证一下Puppeteer测试的可实现性。 项目设置 让我们从设置一个基本的React应用程序开始。 我们将安装其他依赖项,如Puppeteer和Faker。 为了这篇文章的目的,我创建了一个…

ASP.NET Core WebAPI从HTTPS调整为HTTP启动

使用VS2022创建WebAPI项目时,默认勾选“配置HTTPS(H)”,这样启动WebAPI时以https方式启动。   如果要从HTTPS调整为HTTP启动,需要修改项目中以下几处,首先是Program.cs中删除app.UseHttpsRedirection()语句,删除后…

gitlab runner 安装、注册、配置、使用

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

GitLab升级版本(任意用户密码重置漏洞CVE-2023-7028)

目录 前言漏洞分析影响范围查看自己的GitLab版本升级路程 升级过程13.1.1113.8.8 - 14.0.1214.3.614.9.5 - 16.1.6 前言 最近GitLab发了个紧急漏洞需要修复,ok接到命令立刻着手开始修复,在修复之前先大概了解一下这个漏洞是什么东西 漏洞分析 1、组件…

免费的 UI 设计资源网站 Top 8

今日与大家分享8个优秀的免费 UI 设计资源网站。这些网站的资源包括免费设计材料站、设计工具、字体和其他网站,尤其是一些材料站。它们是免费下载的,材料的风格目前很流行,适合不同的项目。非常适合平面设计WEB/UI设计师收藏,接下…

.git 文件夹结构解析

.git 文件夹结构解析 在这篇文章就让我们来看看这个 Git 仓库里的文件分别都是用来干什么的,以及在执行了相关的 Git 命令后这些文件会如何响应。 hooks(钩):存放一些shell脚本info:存放仓库的一些信息logs&#xff…

1分钟部署幻兽帕鲁联机服务,PalWorld服务器搭建教程(阿里云)

1分钟部署幻兽帕鲁联机服务,PalWorld服务器搭建教程 最近这游戏挺火,很多人想跟朋友联机,如果有专用服务器,就不需要房主一直开着电脑,稳定性也好得多。 概述 幻兽帕鲁是Pocketpair开发的一款开放世界生存制作游戏&…

Linux系统Shell脚本编程之条件语句

一、条件测试 Shell 环境根据命令执行后的返回状态值 " $? " 来判断是否执行成功,当返回值为0时表示成功,否则表示失败或异常(非0值)。使用专门的测试工具 test 命令,可以对特定条件进行测试,并…

金融OCR领域实习日志(一)

一、OCR基础 任务要求: 工作原理 OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相)检查纸上打印的字符,经过检测暗、亮的模式肯定其形状,而后用…

先进车辆驾驶舱系统的强大网络安全协议

近年来,车辆驾驶舱系统发展迅速,融入了导航、娱乐和车辆性能监控系统等先进技术。随着驾驶舱变得更加互联和依赖软件,它们也变得更容易受到网络安全威胁。实施强大的网络安全协议对于保护驾驶员和乘客以及保持车辆运行的完整性至关重要。 本…

支付宝推出新年“五福节”活动,新增四大AI玩法;大型语言模型综合指南

🦉 AI新闻 🚀 支付宝推出新年“五福节”活动,新增四大AI玩法 摘要:支付宝宣布今年的“集五福”活动升级为“五福节”,新增了四大AI玩法:飙戏小剧场、时空照相馆、会说话红包和大家来找福。用户可以通过拼…

uniapp canvas做的刮刮乐解决蒙层能自定义图片

最近给湖南中烟做元春活动&#xff0c;一个月要开发4个小活动&#xff0c;这个是其中一个难度一般&#xff0c;最难的是一个类似鲤鱼跃龙门的小游戏&#xff0c;哎&#xff0c;真实为难我这个“拍黄片”的。下面是主要代码。 <canvas :style"{width:widthpx,height:hei…

c语言-枚举和联合体

文章目录 前言一、枚举类型1.1 枚举类型的定义1.2 枚举类型的使用1.3 枚举的优点 二、联合体类型2.1 联合体类型的定义2.2 联合体类型的特点2.3 联合体大小的计算 总结 前言 本篇文章介绍c语言中的枚举类型和联合体类型 一、枚举类型 1.1 枚举类型的定义 枚举类型和结构体类…

【C++干货铺】C++中的四种类型转换

个人主页点击直达&#xff1a;小白不是程序员 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C语言中的类型转换 为什么C需要四种类型转化 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast RTTI C语言中的类型转换 在C语言中&…