1简介
在本模块中,我们将讨论以下概念:
- 如何将您自己的数据集引入 GEE。
- 如何将来自遥感数据的值与您自己的数据相关联。
- 如何从 GEE 导出特征。
2背景
了解动物对环境的反应对于了解如何管理这些物种至关重要。虽然动物被迫做出选择以满足其基本需求,但它们的选择很可能也受到当地天气条件等动态因素的影响。除了直接观察之外,很难将动物行为与天气条件联系起来。在这个单元中,我们将从美洲狮收集的 GPS 项圈数据与通过 GEE 访问的 Daymet 气候数据集的每日温度估计值集成。
这将要求我们将自己的数据引入 GEE,将天气值连接到点位置,并将这些增值数据从 GEE 中带回以进行进一步分析。在加利福尼亚州洛杉矶的顶级旅游目的地之一附近拍摄的山狮的相机陷阱照片。照片:地球岛杂志
2.1 GPS定位数据
Mahoney 等人 2016 年的一项研究使用 GPS 项圈来跟踪犹他州中部的两只美洲狮和 16 只土狼的运动。这些数据用于了解这两个物种个体的一些行为模式。任何人都可以在Movebank网站上访问这些研究人员在研究期间收集的数据。该网站托管来自世界各地的动物运动数据集。虽然某些 Movebank 数据集仅列出作者的联系信息,但其他数据集允许您在其 web 地图上显示信息,还有一些允许您下载数据。Movebank.com 上的交互图示例,可让您搜索有关动物运动的数据。
2.2 Daymet 天气数据
Daymet 数据以 1 公里 x 1 公里的空间分辨率提供每天的数据,是美洲狮与景观相互作用的时间和空间尺度的重要资源。总共有七个测量值。这使我们能够检查天气的多个方面,以评估它如何影响行为。Daymet 数据集提供了每日天气参数的网格估计。每天有 7 个地表天气参数可用,空间分辨率为 1 公里 x 1 公里,空间范围为北美。ORNL DAAC 可以通过各种工具和格式访问 Daymet 数据集,从而提供丰富的每日地表气象资源。资料来源: Daymet/NASA
与 GEE 中的 Daymet 图像关联的元数据。
如果您有兴趣了解有关全球可用气候数据的更多信息,请查看 单元6。
3将您自己的数据带入 Earth Engine
在本练习中,我们将讨论如何将您自己的数据移动到 GEE、从数据集中提取值以及从 GEE 中导出这些值。将数据带入 GEE 的过程一直在迅速变化,与大多数事情一样,最好直接转到文档以查看最新更新。该信息可以在这里找到。
3.1清理数据
动物运动数据作为 csv 文件下载。要将它们带入 GEE,我们需要将它们转换为 shapefile。虽然有很多方法可以将 csv 文件转换为 shapefile,但我们将使用 R。下面的代码包含进行此转换所需的所有内容。可以在此处找到有关如何在 R 中将 csv 文件转换为 shapefile 的详细信息。
代码的一些复杂性来自重命名列以删除“.”。为了符合 GEE 对命名约定的要求,这是必要的。虽然此特定细节不在文档中,但它在帮助论坛上的帖子中有所描述。
您不需要运行此代码,它供您将来参考
# Load necessary libraries
library(sp)
library(rgdal)
library(dplyr)
# read in CSV of data
baseDir <- "The folder your csv is held in"
data <- read.csv(paste0( baseDir, "/Site fidelity in cougars and coyotes, Utah_Idaho USA (data from Mahoney et al. 2016).csv"))
# convert to spatial points data frame
# remove all NA values from lat and long columns
names(data)
noNAs <- data[complete.cases(data[ , 4:5]),]
# filter to select animal of interest
glimpse(noNAs)
cougarF53 <- noNAs %>%
filter(individual.local.identifier == "F53") %>%
dplyr::select("event.id", "timestamp", "location.long","location.lat")
# Unique GEE issue
# GEE does not accept column names with dots So we will rename our columsn
colnames(cougarF53) <- c("id", "timestamp", "lon", "lat")
# check the time line of data collection so we can match those dates in GEE
timeframe <- sort(cougarF53$timestamp)
print(paste0("The first time stamp is ", timeframe[1], " the last collection is ", timeframe[length(timeframe)] ))
# Create a spatial feature with the sp package
# only keep unique id as data
cougarF53Spatial <- sp::SpatialPointsDataFrame(coords = cougarF53[,3:4], data = cougarF53[,1])
# set coordinate reference system to WGS84, using the proj4str
crs(cougarF53Spatial) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs "
# Export as shapefile
# write a shapefile
writeOGR(cougarF53Spatial, baseDir, "/cougarF53Locations", driver="ESRI Shapefile")
我们写出了 shapefile,每行只有一个列,一个唯一的 id。我们这样做是因为我们计划在 GEE 之外进行大部分分析,因此无需加载所有额外数据。唯一 ID 将允许我们将来自 GEE 的增值数据与原始数据集连接起来。
3.2引入资产
-
坐标参考系统:首先,重要的是要注意 GEE 使用的投影是WGS 1984 EPSG: 4326。因此,您想要带入 GEE 的所有数据都需要相同的坐标参考系统。请记住 WGS1984 是一个地理坐标系。您不希望数据上有投影坐标系。
-
上传 shapefile:在上面的 R 代码中,我们将数据的 csv 文件转换为 shapefile,并定义坐标参考系统 (CRS) 以匹配 GEE 的预期 (WGS 1984)。当您将功能加载到 Google 地球引擎中时,您将添加与您的 GEE 帐户相关联的个人资产。
您将能够在任务窗格中监控上传进度。
上传后,您可以通过代码编辑器左侧的资产窗格编辑资产。这允许您设置共享参数。对于此示例,任何人都可以读取资产。这意味着运行代码的任何人都将能够使用数据集,即使他们不拥有它或没有下载它。
共享个人资产的示例。
上传 shapefile 的过程可能需要一段时间,因此我们提供了一个脚本链接,而不是让您完成该过程,该脚本已经加载了本课程所需的数据。带有预加载数据集的代码。请将此脚本用作本课剩余部分的起点。
运行完此内容后,我们建议您加载自己的 shapefile。这可以是您的数据,或者如果您想要快速简便的数据,请尝试使用Natural Earth Data中的 shapefile 。这是一个用于各种地图比例的地理数据的绝佳站点。上面的链接将带您进入的 1:110m 物理向量非常通用,因此加载速度比数据更丰富的层快得多。
每项资产都具有与您在 Google 云端硬盘上可能拥有的其他功能类似的共享偏好。
import
允许您将新获取的资产添加到脚本中。这与将 imageCollection 导入脚本非常相似。
share
允许您定义谁可以查看和编辑资产。
delete
使用它来清理空间,但请记住,一去不复返了。
加载资产后,通过双击资产面板中的资产名称或将鼠标悬停在名称上时按下出现在功能右侧的小箭头图标,将其导入脚本。将功能重命名为具有描述性的名称。然后在地图上将其可视化,以确保该功能看起来符合您的预期。
在预加载的脚本中,您可以看到我们已经完成了这些步骤。我们还添加了一个打印语句来访问数据结构。
-
-
// Imported the data and not add it to the map and print.
-
Map.
addLayer(cougarF53, {},
"cougar presence data");
-
print(cougarF53,
"cougar data");
您可以使用检查器工具查看与新资产关联的属性数据。
将这些点可视化后,制作一个包含我们感兴趣区域的几何特征。我们将使用几何特征来过滤我们的气候数据。
您可以通过选择方形几何特征并绘制一个包含这些点的框来完成此操作。
在这些点周围绘制几何特征以过滤气候数据。
3.2.1上传栅格
引入栅格的过程与我们刚刚使用 shapefile 进行的过程相同。图像集合(栅格集)是更复杂的数据类型,还有一些其他要求,您可以在此处阅读。
3.3定义天气变量
在本课中,我们使用 Google Earth Engine 作为将遥感数据(即我们的栅格)与我们的点位置相关联的方法。虽然这个过程在概念上是直截了当的,但它确实需要一些工作才能完成。加载我们的点后,下一步是导入 Daymet 天气变量。
3.3.1调用气候资料日
我们使用的是 NASA 派生的数据集 Daymet V3,因为它具有 1 公里的空间分辨率,并且它可以测量美洲狮所经历的环境条件。我们将通过调用数据集的唯一 ID 并将其过滤到我们的边界框几何图形来导入它。
// Call in image and filter.
var Daymet = ee.ImageCollection("NASA/ORNL/DAYMET_V3")
.filterDate("2014-01-01", "2017-08-01")
.filterBounds(geometry)
.select('tmin')
.map(function(image){return image.clip(geometry)});
print(Daymet,"Daymet");
Map.addLayer(Daymet, {}, "Daymet");
打印语句中 Daymet 数据结构的视图。
从打印语句中,我们可以看到这是一个包含 267 张图像的图像集合(尽管您的图像总数可能会随着数据集的变化而变化)。每幅图像都有七个与特定天气测量相关的波段。现在两个数据集都已加载,我们将把美洲狮的发生数据与天气数据相关联。
3.4提取值
加载我们的点和图像后,我们可以调用一个函数,根据美洲狮的已知位置从底层栅格中提取值。我们将使用该ee.Image.sampleRegions
函数来执行此操作。在 Docs 选项卡下搜索ee.Image.sampleRegions()
函数以熟悉它所需的参数。
ee.Image.sampleRegions()
是一个图像的函数,所以如果我们试图在 Daymet 上调用它,ImageCollection
我们会得到一个错误。为了解决这个问题,我们将把 Daymet 图像集合转换为多波段图像。每天的七次测量中的每一次都将成为我们多波段图像中的一个特定波段。这个过程最终将对我们有所帮助,因为每个波段都是由收集日期和显示的变量定义的。我们可以使用这些信息来确定哪些数据与美洲狮在特定日期的位置有关。
重要提示:在图像集合中有许多图像,我们将创建具有大量波段的单个图像。因为 GEE 非常擅长数据操作,所以它可以处理这种类型的请求。
// Convert to a multiband image and clip.
var DaymetImage = Daymet
.toBands()
.filterBounds(geometry);
print(DaymetImage, "DaymetImage");
显示从图像集合转换为多波段图像的结果的打印语句。
现在我们有了一个多波段图像,我们可以使用该sampleRegions
函数。您需要考虑此函数的三个参数。
Collection
采样数据将与之关联的矢量数据集。
Properties
定义将保留矢量数据集的哪些列。在这种情况下,我们希望保留“id”列,因为我们将使用它来将此数据集连接回 GEE 之外的原始数据。
Scale
:这是指数据集的空间尺度(像元大小)。比例应始终与栅格数据的分辨率相匹配。如果您不确定栅格的分辨率是多少,请使用搜索栏搜索数据集,该信息将出现在文档中。
// Call the sample regions function.
var samples = DaymetImage.sampleRegions({
collection: cougarF53,
properties: ['id'],
scale: 1000 });
print(samples,'samples');
从打印语句中,我们可以看到我们的点位置现在具有与之关联的天气测量值。同样,您的结果可能看起来略有不同。
3.5 导出
3.5.1将点导出为 Shapefile
我们有一系列与美洲狮 57 已知位置相关的每日天气数据。虽然我们可以在 GEE 中更多地使用这些数据,但很容易将它们导入 R 或 Excel。有几个选项可以定义导出数据的最终位置。一般来说,将数据保存到 Google Drive 帐户是一个安全的选择。我们将使用字典(用大括号表示)来定义export.table.toDrive()
函数的参数。
shapefile 字段限制:一个 shapefile 只能包含 255 个字段;这些数据有 1869 个。因此,我们将数据导出为 csv 文件。
// Export value added data to your Google Drive.
Export.table.toDrive({
collection: samples,
description:'cougarDaymetToDriveExample',
fileFormat: 'csv'
});
当您导出某些内容时,您的任务窗格将亮起。您需要通过选择运行按钮单独运行任务。
export
运行具有函数的脚本后的任务栏示例。
当您选择运行按钮时,将出现以下弹出窗口。这允许您编辑导出的详细信息。
从 GEE 导出特征时出现的用户定义参数示例。
3.5.2导出栅格
在处理所有这些空间数据时,您可能已经意识到,在美洲狮上收集数据的时间段内显示中值的栅格可能是非常有用的信息。有关使用栅格的更多信息,请参阅5
为此,我们将对median()
Daymet 图像集合应用一个 reducer 函数,为每个单元格中的每个参数生成一个中值。就像表格数据一样,我们将把这个多波段图像导出到 Google Drive。一旦我们使用该函数将图像集合转换为图像median()
,我们就可以将其剪辑到geometry
特征对象中。此要素将导出为多波段栅格。
// Apply a median reducer to the dataset.
var Daymet1 = Daymet
.median()
.clip(geometry);
print(Daymet1);
// Export the image to drive.
Export.image.toDrive({
image: Daymet1,
description: 'MedianValueForStudyArea',
scale: 1000,
region: geometry,
maxPixels: 1e9
});
有很多选项。最重要的选项之一是max.pixels
设置。一般来说,GEE 不允许您导出超过 10^9 像素的栅格。使用该max.pixels
参数,您可以将其提高到每张图像大约 10^12 像素。如果您为大于 10^12 像素的区域导出数据,您将需要创造性地了解如何从 GEE 中获取信息。有时这涉及将图像分割成更小的部分,或者在 GEE 之外重新评估如此大的图像的有用性。
4结论
虽然 Google 地球引擎可用于行星尺度分析,但它也是一种有效的资源,可用于使用您自己的数据快速访问和分析大量信息。本模块中介绍的方法是为您自己的数据集增加价值的好方法。在此示例中,我们使用了天气数据,但这绝不是唯一的选择!您可以将您的数据连接到 Google 地球引擎中的许多其他数据集。由您决定什么是重要的以及为什么重要。
4.1 完整代码
// Imported the data and not add it to the map and print.
Map.addLayer(cougarF53, {}, "cougar presence data");
print(cougarF53, "cougar data");
// Call in image and filter.
var Daymet = ee.ImageCollection("NASA/ORNL/DAYMET_V3")
.filterDate("2014-01-01", "2017-08-01")
.filterBounds(geometry)
.select('tmin')
.map(function(image){return image.clip(geometry)});
print(Daymet,"Daymet");
Map.addLayer(Daymet, {}, "Daymet");
// Convert to a multiband image and clip.
var DaymetImage = Daymet
.toBands()
.clip(geometry);
print(DaymetImage, "DaymetImage");
// Call the sample regions function.
var samples = DaymetImage.sampleRegions({
collection: cougarF53,
properties: ['id'],
scale: 1000 });
print(samples,'samples');
// Export value added data to your Google Drive.
Export.table.toDrive({
collection: samples,
description:'cougarDaymetToDriveExample',
fileFormat: 'csv'
});
// Apply a median reducer to the dataset.
var Daymet1 = Daymet
.median()
.clip(geometry);
print(Daymet1);
// Export the image to drive.
Export.image.toDrive({
image: Daymet1,
description: 'MedianValueForStudyArea',
scale: 1000,
region: geometry,
maxPixels: 1e9
});