常见问题
我遇到了问题,需要帮助!
按照本指南发布问题,并尽可能提供详细信息(请参阅 Stack Overflow 关于如何提出优质问题的指南)。这通常意味着:
发送代码编辑器中脚本的链接(点击“获取链接”按钮即可获取)
对于失败的批处理任务,报告失败任务的 ID。任务 ID 类似于:
4C25GIJBMB52PXTEJTF4JLGL。您可以在代码编辑器的“任务”标签页中找到它们。 了解详情。
在哪里可以了解 Earth Engine 架构?
请参阅这篇论文:Gorelick 等人,2017 年。
有没有不是由 Google 创建的推荐 Earth Engine 教程?
是否有任何推荐的遥感教程?
不妨观看 Ujaval Gandhi 提供的这门免费的 EE 课程,其中包含一个介绍遥感技术的视频。
Earth Engine 编程
有哪些常见的编码错误?
请参阅调试指南。
为什么我会收到“... is not a function”错误?
如果 Earth Engine 找不到所调用的方法,就会发生此错误。请检查以下常见原因:
拼写或大小写敏感度:方法区分大小写。根据 API 参考文档验证拼写。
Error: img.normalizedDiff(...) -> Correct: img.normalizedDifference(...)
缺少类型转换:从 .get() 等函数返回的值是泛型 ee.ComputedObject 实例,必须显式转换。请参阅未知对象类型转换。
Error: dict.get('val').add(5) -> Correct: ee.Number(dict.get('val')).add(5)
混合使用客户端方法和服务器方法:确保您没有在 Earth Engine 对象上使用标准 JavaScript 或 Python 方法(例如 .push() 或 .append())。请参阅避免混用客户端函数和服务器函数。
Error: list.push(4) or list.append(4) -> Correct: list.add(4)
不可用的方法:如果对象类型正确,并且该方法存在于文档中或之前可以正常使用,但现在无法正常使用,请报告 bug。
为什么我无法使用 ee.Image("image") * 2 等基本数学函数?
在 EE 中,您不应混用服务器端和客户端对象或操作。对 EE 对象的所有操作都在服务器端执行。任何客户端计算都无法实现您预期的效果。如需了解详情,请参阅此页面。
如何使用 for 循环或 if/else 语句?
Earth Engine 编程使用函数式语言完成,因此循环和条件运算应使用 map 或 filter 等同等概念来表达。如需了解详情,请参阅此页面。
如何在图片或视频中显示文字标签?
没有内置的文本标签支持,但您可以:
- 使用第三方 JS 软件包。 查看示例
- 使用第三方 Python 软件包 geemap。
- 使用 QGIS 通过 EE QGIS 插件引入 EE 影像
我可以使用一些标准调色板吗?
使用第三方 JS 软件包 ee-palettes。
如何创建使用 Earth Engine 的自定义网站?
对于基本应用,请使用 Earth Engine 应用。在更复杂的情况下,您可以构建由 EE 提供支持的 App Engine 应用。
地图 ID 的运作方式
地图 ID(在整个 API 中称为 mapid)是允许客户端提取地图图块的密钥。每个 ID 都是通过向 getMapId 端点提供图片表达式而创建的哈希值。生成的 ID 是指向图片表达式和用户凭据的键,这些键将在后续阶段用于生成图块。
请求地图图块时,需要指定图块的位置 (x、y、zoom) 以及 mapid(图片和凭据的密钥)。同一 ID 可重复用于加载多个地图图块。mapid 密钥的重复使用次数没有限制,但会在几个小时后过期。我们不会公布有关这些 ID 持续时间的具体时间范围,但您编写的任何代码都应能应对 ID 过期的情况。
创建这些 ID 需要存储少量数据并验证凭据,因此最好尽可能长时间地重复使用它们。没有与 getMapId 端点专门关联的 API 配额,但任何以接近提取图块的速度创建 mapid 对象的工作流可能都存在问题。由于这些是临时资源,因此 Earth Engine 没有用于移除、列出或管理这些 ID 的 API 端点。
为什么 ee.Algorithms.If() 会同时输出 true 和 false 两种情况?
function a() { print("true"); }
function b() { print("false"); }
// Prints 'true' and 'false'.
ee.Algorithms.If(true, a(), b());
If() 算法的工作方式与 Earth Engine 上的所有其他算法一样,即必须先评估其所有实参,然后算法本身才能运行。该算法会同时获取 trueCase 和 falseCase 结果,然后根据 condition 实参选择并返回一个结果,但必须先执行这两个路径,才能将这些值传递给算法。
我收到“Request payload size exceeds the limit”错误
您尝试向 Earth Engine 发送非常大的请求。如果代码使用大量客户端“for”循环或通过许多几何对象构建 FeatureCollection,通常会发生这种情况。在后一种情况下,您无需在脚本中创建此类几何图形,而是生成包含这些几何图形的 CSV 文件,然后将其上传到表格资源。
ee.Image.clip() 和 ee.Filter.bounds() 有什么区别?
请参阅此 GIS Stack Exchange 帖子。
ee.Image.clip() 函数会遮盖不与指定 ee.Geometry 或 ee.Feature 相交的像素,使这些像素在可视化效果中呈现透明状态,并在计算中被排除。您可以将其理解为从图片中剪掉像素。
ee.Filter.bounds() 函数会根据图片与 ee.Geometry 或 ee.Feature 的交集,从 ee.ImageCollection 中过滤出 ee.Image 对象。它用于将分析范围限制为仅与给定区域相交的图片,这有助于优化表达式。
如何将图片像素转换为功能集,每个像素对应一个功能?
使用 ee.Image.sample() 函数。请参阅该函数的 API 参考页面上的使用示例。
ee.ImageCollection.merge() 和 ee.ImageCollection.combine() 有什么不同?
ee.ImageCollection.merge() 函数会将两个集合中的所有图像合并为一个集合,无论它们各自的图像是否具有重合的波段、元数据、CRS 或比例。它是两个集合的并集。combine() 方法会将两个集合中匹配图片的波段合并为一个集合。匹配的图片具有相同的 ID(system:index 属性)。它是基于图片 ID 的两个集合的内联接,其中来自匹配图片的波段会合并在一起。对于匹配的图片,次要图片的波段会附加到主要图片(覆盖是可选的)。如果没有匹配的图片,则返回空集合。
如何按多个日期区间过滤图片集?
请参阅此 GIS Stack Exchange 帖子。
您可以同时选择多个集合,也可以使用 ee.Filter.or()。merge()
如何围绕给定点创建边界框?
// Buffer the point by a chosen radius and then get the bounding box.
var LNG = -117.298;
var LAT = 45.162;
var point = ee.Geometry.Point([LNG, LAT]);
var buffer = point.buffer(30000); // half of box width as buffer input
var box = buffer.bounds(); // draw a bounding box around the buffered point
Map.centerObject(box);
Map.addLayer(point);
Map.addLayer(box);
// Map the buffer and bounds procedure over a point feature collection.
var pointCol = ee.FeatureCollection([
ee.Feature(ee.Geometry.Point([LNG + 1, LAT])),
ee.Feature(ee.Geometry.Point([LNG - 1, LAT]))
]);
var boxCol = pointCol.map(function(feature) {
var box = feature.buffer(30000).bounds();
return feature.setGeometry(box.geometry());
});
Map.addLayer(boxCol);
Data Catalog
您可以添加数据集 X 吗?
按照数据集请求指南提交数据集请求 bug。
您还可以将数据上传到 Earth Engine 主文件夹中。请参阅导入栅格数据和导入表格数据。
现有数据集有新版本
按照数据集请求指南提交数据集 bug,并指明您要请求更新数据集。
现有数据集未更新或缺少资源
在报告问题之前,请尽可能验证所选素材资源是否确实存在于数据集提供方的网站上。如需了解详情,请参阅有关图片缺失的指南。
如果您要通过过滤 ImageCollection 来查找资源,请确保过滤条件不会过于严格。
请特别注意以下几点:
对于早期的 1 级场景,ESA 未生成 Sentinel-2 SR(2 级数据)。
在 2000 年之前,Landsat 并未覆盖全球。
现有数据集包含错误的值
在开发者论坛上发帖。 包含一个脚本,该脚本可放大素材资源的原始分辨率,以便清楚地看到哪些值是错误的。说明您在何处观察到替代价值。
我还可以通过哪些渠道咨询数据集相关问题?
如需咨询有关 NASA 数据集的问题,请访问 NASA Earth Data 论坛。
如果您对在 Copernicus 数据集上运行的工具箱有疑问,请访问 S1、S2 和 S3 论坛。
EE 目录有多大?
截至 2023 年 10 月,该目录包含 1, 000 多个数据集。其占用的存储空间超过 90 PB(在考虑无损压缩的情况下)。
EE 中的数据多久更新一次?
通常,所有持续更新的数据集至少每天更新一次(不过,并非所有此类数据集每天都有新数据)。部分数据集每天会更新多次。不过,没有政策可确保目录中包含最新的资产。
如何以编程方式查看 EE 目录的内容?
数据集列表以 STAC 格式导出到 Google Cloud Storage 存储分区 gs://earthengine-stac。入口文件为 catalog.json。
我能否使用 Google 地图数据或图像进行分析?
Google 不会授权或出售用于分析的基础地图数据。
如何查找素材资源的提取日期?
'system:version' 资源属性是提取时间戳,格式为自 Unix 纪元以来的微秒数。以下示例将 Landsat 影像的提取时间戳转换为人类可读的格式。
var image = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_044034_20210508');
print('Ingest date', ee.Date(image.getNumber('system:version').divide(1000)));
Earth Engine 目录是否包含 JSON-LD 元数据?
可以,JSON-LD 元数据嵌入在目录 HTML 网页中。例如,Sentinel-2 页面包含以下代码块:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1,
"name": "Earth Engine Data Catalog",
"item": "https://developers.google.com/earth-engine/datasets"
},{
"@type": "ListItem",
"position": 2,
"name": "Harmonized Sentinel-2 MSI: MultiSpectral Instrument, Level-1C",
"item": "https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_HARMONIZED"
}]
}
</script>
Landsat
simpleComposite 算法是如何实现的?
服务器端实现相当于此 JavaScript 代码。
如何使用 Landsat 地表反射率数据创建无云合成影像?
Landsat 2 级(地表反射率)数据有多个质量波段,可用于遮盖云和其他不需要的图像伪影。如需查看使用这些波段处理 Landsat 8 SR 影像并创建中值无云合成影像的示例,请参阅这篇 GIS Stack Exchange 帖子。在开发者指南中,监督分类示例中使用的无云复合影像也是通过相同程序构建的。
是否需要进行跨传感器 Landsat 地表反射率协调?
Roy 等,2016 年对 Landsat 7-8 大气表观反射率与地表反射率之间的反射率差异进行了分析。他们公布了 OLS 和 RMA 系数,以便读者将一个传感器数据的反射率值转换为另一个传感器数据的反射率值。该论文的最后一行写道:“虽然传感器差异很小,但根据 Landsat 数据的应用,它们可能会产生重大影响。”不过,此分析基于的是收集前的数据。
在 Collection 1 和 Collection 2 重新处理期间进行的改进可能会影响传感器之间的关系,但据我们所知,尚未针对 Collection 1 或 Collection 2 数据进行过类似于 Roy 等人 (2016) 的分析。尽管没有正式的分析,但有影响力的 Landsat 用户似乎普遍认为,Collection 2 级 2(地表反射率)数据无需校正。例如,在回复有关需要 Collection 2、Level 2 协调的问题时,Landsat 科学团队的 Mike Wulder 指出,根据感兴趣的应用(包括土地覆盖图绘制和变化检测)的性质,Collection 2 地表反射率产品非常适合且可靠,无需进行跨传感器调整。
如何遮盖 MSS 影像中的云和云阴影?
JavaScript 代码编辑器的第三方 msslib 模块包含 MSScvm 算法的实现,以及用于探索和准备 MSS 数据的其他实用函数。
数据管理
我上传的数据归谁所有?
根据 Earth Engine 服务条款,客户拥有其上传到 Earth Engine 的数据。
我无法上传数据!
在代码编辑器右上角的“任务”窗格中查看上传任务状态。您还可以查看专用任务页面。
如果没有任务,您可能尝试通过代码编辑器上传文件,但由于网络问题,文件从未完成上传,因此从未创建任务。尝试使用其他浏览器或其他电脑。
如果存在失败的任务,请检查其显示的错误。如果没有具体的错误消息,请先运行 gdalinfo(针对栅格文件)或 ogr2ogr(针对矢量文件),验证文件是否损坏。
这些命令会尝试从源文件中读取所有数据,并在文件损坏时显示错误。
gdalinfo 调用示例:
gdalinfo -mm -stats -checksum file.tif
将 in.shp 转换为 out.csv 的 ogr2ogr 调用示例:
ogr2ogr -lco GEOMETRY=AS_WKT -f CSV out.csv in.shp
如果文件看起来有效,请在开发者邮寄名单中以文本形式(而非屏幕截图)发布失败的任务 ID。任务 ID 的格式为:4C25GIJBMB52PXTEJTF4JLGL。尽可能将源文件设为可公开读取。如果是私密文件,请仅与 earthengine@google.com 分享,以便 Earth Engine 团队检查该文件。如果无法共享源文件,请至少提供 gdalinfo -mm -stats -checksum 的输出。
如果 Earth Engine 不支持某种投影,您需要先使用 gdalwarp 等工具重新投影数据,然后再上传。
如何上传 NetCDF 或其他不受支持的栅格格式的文件?
只能将 GeoTIFF 上传到 Earth Engine。其他与 GDAL 兼容的格式可以使用 gdal_translate 转换为 GeoTIFF。示例:
gdal_translate -co COMPRESS=DEFLATE file.nc file.tif
请注意,某些 NetCDF 或 HDF 文件包含多个可使用 gdalinfo 发现的子数据集。在这种情况下,gdal_translate 命令将如下所示(请注意双引号之间的路径):
gdal_translate HDF4_EOS:EOS_GRID:"/tmp/MCD12Q1.A2001001.h00v08.005.2011055224312.hdf":MOD12Q1:Land_Cover_Type_1 file.tif
NetCDF 文件有时不包含 GDAL 可识别的投影。在这种情况下,您需要在 gdal_translate 命令行中设置投影和空间范围。示例:
gdal_translate -a_srs EPSG:4326 -a_ullr -180 90 180 -90 file.nc file.tid
我可以对上传的 GeoTIFF 使用哪些压缩算法?
对于上传,GeoTIFF 可以使用 DEFLATE、JPEG、JPEG-XL/JXL、LERC、LERC_DEFLATE、LERC_ZSTD、LZMA、LZW、WEBP 或 ZSTD 进行压缩。对于实时 COG 读取,您可以使用 DEFLATE、JPEG、LZW 或 ZSTD。ZSTD 是一个不错的总体选择,因为它可以快速解压缩,同时仍能很好地压缩大多数图片。
如需在使用 gdal_translate 时应用 ZSTD 压缩,请添加以下选项。如果数据包含浮点值,请将 PREDICTOR 更改为 3。
gdal_translate in.tif out.tif \
-co COPY_SRC_OVERVIEWS=YES \
-co TILED=YES \
-co BLOCKXSIZE=512 \
-co BLOCKYSIZE=512 \
-co COMPRESS=ZSTD \
-co PREDICTOR=2 \
-co ZSTD_LEVEL=22 \
-co INTERLEAVE=BAND \
-co NUM_THREADS=ALL_CPUS
我的栅格提取已运行数天,但尚未完成。
使用 gdalinfo,检查您的文件是否设置了以下 GDAL 选项:INTERLEAVE=PIXEL。对于采用此选项且包含多个波段的文件,由于此类文件的布局导致读取速度非常慢,因此提取可能永远无法完成。
尝试在上传之前将此类文件转换为频段交错布局:
gdal_translate -co "INTERLEAVE=BAND" src.tif dst.tif
我上传的光栅与基本地图不匹配。
如果数据与基础地图略有偏移,则可能是投影的基准(关于地球形状的假设)不正确。这种情况最常发生在无法在 GDAL 元数据中完全编码的正弦投影中。如果您知道目标投影应是什么(例如,对于使用 MODIS 正弦投影的文件,应为 SR-ORG:6974),请在命令行上传期间设置 --crs 标志,或设置上传清单的 crs 字段。
如果数据看起来严重失真或完全位于错误的位置,则投影或仿射转换可能存在错误。
我的栅格仅显示在东半球。
您可能上传了跨越经度范围 [0, 360] 的全球栅格。 不过,Earth Engine 要求栅格的范围为 [-180, 180]。在提取之前交换栅格的左右两半。 请参阅这些 GIS Stack Exchange 建议。
为什么我提取的分类图片看起来有斑点?
您可能使用了默认的 MEAN
pyramiding 政策。对于分类图片,应使用 MODE 金字塔化政策;对于 QA/位掩码图片,应使用 SAMPLE 金字塔化政策。
我收到以下错误:No data value -128.0 cannot be applied to band #0 of type Short<0, 255>。
GDAL 无法将单字节波段视为包含有符号整数,因此它会将此类波段读取为无符号整数。这会与负值无数据值冲突。
如果您的值实际上是有符号整数,请使用清单上传,并将以下内容添加到包含您文件的 tileset 部分:data_type: "INT8"
如果您的值是无符号整数,则您的文件具有错误的 nodata 值。您可以在上传时使用正确的数据值(或从不出现的值,如果有)替换该值。您还可以使用 gdal_translate -a_nodata 更改 nodata 值,或使用 gdal_edit.py -unsetnodata 将其移除。
如何上传 GeoJSON 或其他不受支持的矢量格式的文件?
使用 ogr2ogr 将 OGR 兼容格式转换为 CSV 或 SHP。示例:
or2ogr -f "ESRI Shapefile" file.shp file.kml
请注意,在 CSV 上传中,几何图形列可以包含 GeoJSON。
我想使用 Python 上传数据,或者一次上传多个文件。
使用命令行上传。 此类上传需要先将源文件放入 GCS (Google Cloud Storage) 存储分区中。如果您保持在免费层级限额范围内,GCS 用量不会产生任何费用 - 请参阅价格页面。
我想上传一个分成多个图块的大型栅格拼接图。
如果所有文件的投影和像素大小都相同,只需将它们一起上传到同一素材资源中,系统会自动将它们拼接在一起。
如果文件具有不同的投影或像素大小,则无法将它们镶嵌到单个栅格资源中。而是将每个图块作为单独的素材资源上传到同一 ImageCollection 中,这些素材资源可以使用 ImageCollection.mosaic() 进行拼接
我尝试上传拼接图,但收到有关图块不匹配的错误。
Earth Engine 光栅镶嵌的图块必须具有相同的投影和像素大小。此外,图块必须在像素边界上完全对齐。
我尝试从 GCS 存储分区上传文件,但 Earth Engine 找不到该文件。
您可能使用了不同的 Google 账号来上传 GCS 数据和连接到 Earth Engine。确保您用于连接到 Earth Engine 的账号可以读取 GCS 文件。如果浏览器多重登录让您感到困惑,请在无痕式浏览器窗口中连接到 Earth Engine。
我想一次性导出多个素材资源。
您必须单独导出每张图片。
我想使用单个命令移动或删除 Folder 或 ImageCollection。
您必须先移动或删除每个素材资源,然后移动或删除父文件夹或合集。如果子素材资源很多,请编写 shell 或 Python 循环来遍历它们。
我想直接从 EE 外部访问 Earth Engine 数据。
QGIS 具有 Earth Engine 插件。
GDAL 具有 Earth Engine 驱动程序。
其他系统可以使用 EE REST API。
我想更新 Earth Engine 资产的一部分,而无需完全重新提取。
无法更新上传到 EE 中的栅格或矢量数据。 只能更新资产元数据属性。
我即将失去对我的账号的访问权限。如何处理我的资产?
如果原账号的政策允许数据传输,请将您的资产与其他账号共享,然后将这些资产复制到新账号中,以便新账号拥有这些资产。如果要移动大量资源,请使用命令行复制实用程序。
如果某个账号被删除,则无法再访问该账号拥有的资产。
我导出的图片位置有误。
对于某些投影(例如正弦或圆锥投影),GeoTIFF 文件有时无法存储所有必要的投影参数。这会导致导出的文件在桌面 GIS 工具中查看时或重新提取到 EE 中时显示在错误的位置。
如需解决此问题,请指定一个已知可与 GeoTIFF 文件良好搭配使用的导出 crs 参数,例如,使用包含感兴趣区域的 UTM 地带的 EPSG 代码。
我应该使用哪个 Cloud Storage 存储分区位置来存储 COG 资源?
答案取决于您要优化的目标。如果您要优化低延迟计算访问,那么存储 COG 资源的最佳 GCS 存储分区位置是 US-CENTRAL*。如需了解其他注意事项,请参阅存储分区位置页面。
导出的要素集合资产不会保留我设置的属性。
没有 Export.table.* 函数会在输出中保留表级属性。
对于许多输出格式(例如 CSV、GeoJSON),不支持此类元数据。Export.table.toAsset 函数可以支持表级属性,但目前不支持。
以 CSV 格式导出到云端硬盘的表格会转换为 XLSX 格式。
根据您的 Google 云端硬盘设置,从 Earth Engine 导出的 CSV 表格可能会转换为 XLSX 文件,从而产生意外影响,例如数据类型转换。请按照以下步骤修改后续导出的行为。
- 在网页版 Google 云端硬盘中,点击右上角的“设置”齿轮图标。
- 点击“设置”。
- 滚动到并清除“将上传的文件转换为 Google 文档编辑器格式”。
代码编辑器
我无法登录代码编辑器,因为系统提示我使用错误的账号。
退出,在“选择账号”页面中选择已注册使用 Earth Engine 的账号,然后在第二个“选择账号以继续使用 Earth Engine 代码编辑器”页面中重新选择同一账号(确切措辞可能有所不同)。
我想截取一张全球地图的屏幕截图,但不喜欢 Web 墨卡托投影。
代码编辑器中使用的地图投影是 Web Mercator(“EPSG:3857”)。它会夸大远离赤道物体的尺寸,导致高纬度地区看起来比实际大得多,而赤道附近的地区则不会受到影响。您无法更改代码编辑器地图画布的投影,但可以使用 ee.Image.changeProj 方法在所选投影的图像中“绘制”到 Web 墨卡托画布上。
如需查看在 Robinson 投影中向代码编辑器地图显示全球 DEM 的示例,请参阅该方法的 API 参考文档。请注意,此技术仅应用于可视化目的,因为代码编辑器的检查器和绘图工具仍以 Web 墨卡托投影运行。
我的脚本无法保存 (Script error: Unknown commit)。
如果您在保存脚本时收到 Script error: Unknown commit 消息,则很可能表示您要保存到的代码库处于不同步状态。此状态的原因各不相同,难以确定。如需解决此问题,请尝试使用“脚本”标签页右上角的按钮刷新脚本列表。如果此方法无效,请尝试在“脚本”标签页中点击“新建”按钮,然后在此处保存脚本(您可能需要将脚本从不同步的代码库移到新代码库中)。