常见问题
我遇到了问题,请提供帮助!
请按照此指南发布问题,并提供尽可能多的信息(请参阅 Stack Overflow 指南:如何提出好问题)。这通常意味着:
发送指向代码编辑器中脚本的链接(点击“获取链接”按钮即可获取)
对于失败的批量任务,请报告失败任务的 ID。任务 ID 如下所示:
4C25GIJBMB52PXTEJTF4JLGL
。您可以在代码编辑器的“任务”标签页中找到它们。了解详情。
在哪里可以了解 Earth Engine 架构?
请参阅这篇论文:Gorelick 等人,2017。
有没有非 Google 制作的推荐 Earth Engine 教程?
有推荐的遥感教程吗?
观看 Ujaval Gandhi 教授的这门免费电子工程课程,其中包含一个介绍遥感的视频。
Earth Engine 编程
常见的编码错误有哪些?
请参阅调试指南。
为什么我不能使用简单的数学运算,例如 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 需要存储少量数据并验证凭据,因此最好尽可能长时间重复使用这些 ID。没有任何 API 配额与 getMapId
端点相关联,但任何涉及以与提取功能块提取速率接近的速率创建 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 会话。merge()
多个集合,或使用 ee.Filter.or()
。
如何在给定点周围创建边界框?
// Buffer the point by a desired 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
来查找资产,请确保过滤条件没有过于严格。
请特别注意以下几点:
ESA 未针对早期 Level 1 场景生成 Sentinel-2 SR(Level 2 数据)。
Landsat 在 2000 年之前没有全球覆盖范围。
现有数据集的值有误
请在开发者论坛上发帖。添加一个脚本,用于放大资源的原生分辨率,以便轻松查看哪些值有误。请说明您是在哪里看到的替代值。
在哪里可以咨询数据集相关问题?
如对 NASA 数据集有任何疑问,请访问此论坛。
如需了解有关在 Copernicus 数据集上运行的工具箱的问题,请参阅 S1、S2 和 S3 论坛。
EE 目录有多大?
截至 2023 年 10 月,该目录包含 1, 000 多个数据集。其在磁盘上的大小超过 90 个 petabyte(考虑到无损压缩)。
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(地表反射率)数据具有多个质量带,可用于遮盖云和其他不需要的图像伪影。这篇 GIS Stack Exchange 帖子提供了使用这些波段处理 Landsat 8 SR 图像并创建无云的中位数合成图像的示例。您可以使用相同的步骤构建无云合成图像,以便在开发者指南中的监督分类示例中使用。
是否需要对 Landsat 传感器的跨传感器地表反射率进行协调?
Roy 等;2016 对 Landsat 7-8 TOA 和地表反射率之间的反射率差异进行了分析。他们发布了 OLS 和 RMA 系数,以便读者将一个传感器数据的反射率值转换为另一个传感器的数据。该论文的最后一行指出:“虽然传感器差异很小,但可能会产生重大影响,具体取决于 Landsat 数据的应用。”不过,此分析基于收集前的数据。
在对集合 1 和集合 2 进行重新处理期间所做的改进可能会影响传感器之间的关系,但据我们所知,还没有针对集合 1 或集合 2 数据进行类似 Roy 等人 (2016) 的分析。尽管没有进行正式分析,但影响力较大的 Landsat 用户似乎普遍认为,不需要对集合 2 级别 2(地表反射率)数据进行校正。例如,在回答有关是否需要对集合 2 级别 2 进行协调的问题时,Landsat 科学团队的 Mike Wulder 指出,根据感兴趣的应用(包括土地覆盖图绘制和变化检测)的性质,集合 2 地表反射率产品非常适用且可靠,无需跨传感器调整。
如何遮盖 MSS 影像中的云和云阴影?
JavaScript 代码编辑器的第三方 msslib 模块包含 MSScvm 算法的实现,以及用于探索和准备 MSS 数据的其他实用函数。
数据管理
我上传的数据归谁所有?
根据 Earth Engine 服务条款,客户拥有他们上传到 Earth Engine 的数据。
我无法上传数据!
请在代码编辑器右上角的“任务”窗格中查看上传任务状态。您还可以查看专用任务页面。
如果没有任务,则表示您可能尝试过通过 Code Editor 上传文件,但由于网络问题,文件未能上传完毕,因此系统也未创建任务。请尝试使用其他浏览器或其他计算机。
如果有任务失败,请检查其显示的错误。如果没有收到具体错误消息,请先针对光栅文件运行 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
我的栅格数据提取已运行数天,但仍未完成。
使用 gdalinfo
检查您的文件是否设置了以下 GDAL 选项:INTERLEAVE=PIXEL
。对于具有此选项且包含多个波段的文件,提取操作可能永远无法完成,因为此类文件的布局会导致读取速度非常慢。
请尝试在上传前将此类文件转换为带状交错布局:
gdal_translate -co "INTERLEAVE=BAND" src.tif dst.tif
我上传的栅格图不与底图相符。
如果数据与底图略有偏移,则投影可能具有不正确的数据基准(关于地球形状的假设)。这种情况最常发生在无法在 GDAL 元数据中完全编码的正弦投影中。如果您知道目标预测值应为何(例如SR-ORG:6974
(对于使用 MODIS 正弦投影的文件),请在命令行上传期间设置 --crs
标志,或设置上传清单的 crs
字段。
如果数据严重失真和/或位于完全错误的位置,则投影或仿射转换可能有误。
我的栅格数据仅显示在东半球。
您上传的可能是横跨经度范围 [0, 360] 的全局栅格数据。不过,Earth Engine 要求栅格数据在 [-180, 180] 范围内。在提取之前,请交换栅格图的左半部分和右半部分。查看这些 GIS Stack Exchange 建议。
为什么我提取的分类图片看起来有斑点?
您可能使用了默认的 MEAN
金字塔式政策。对于分类图片,应使用 MODE
金字塔策略。对于质量检查/位掩码图片,应使用 SAMPLE
金字塔策略。
我收到以下错误消息:无法将数据值 -128.0 应用于类型为 Short<0, 255> 的频段 #0。
GDAL 无法将单字节波段视为包含有符号整数,因此会将此类波段读取为无符号整数。这会与负无数据值冲突。
如果您的值实际上是带符号整数,请使用清单上传,并将以下代码添加到包含文件的图块集部分: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。确保 GCS 文件可供您用于连接到 Earth Engine 的账号读取。如果浏览器多重登录会导致混淆,请在匿名/无痕式浏览器窗口中连接到 Earth Engine。
我想一次导出多个素材资源。
我们正在努力实现使用单个命令导出 ImageCollections
。目前,请单独导出每张图片。
我想使用单个命令移动或删除 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 文档编辑器格式”。
代码编辑器
我无法登录 Code Editor,因为系统提示我使用了错误的账号。
请退出账号,在“选择账号”页面中选择已注册使用 Earth Engine 的账号,然后在第二个“选择账号以继续前往 Earth Engine 代码编辑器”页面中重新选择该账号(确切用词可能有所不同)。
我想截取全球地图的屏幕截图,但不喜欢 Web Mercator 投影。
代码编辑器中使用的地图投影是Web 墨卡托投影(“EPSG:3857”)。它会放大远离赤道的位置的对象的大小,使高纬度地区看起来比赤道附近的地区大得多。您无法更改 Code Editor 地图画布的投影,但可以使用 ee.Image.changeProj
方法将图像“绘制”到 Web Mercator 画布中您选择的投影。如需查看将全局 DEM 以 Robinson 投影显示在 Code Editor 地图中的示例,请参阅该方法的 API 参考页面。请注意,此方法仅应用于可视化目的,因为代码编辑器的检查器和绘图工具仍在 Web Mercator 中运行。
我的脚本无法保存 (Script error: Unknown commit
)。
如果您在保存脚本时收到 Script error: Unknown commit
消息,则可能表示您要保存到的代码库已不同步。导致此状态的原因不尽相同,且难以确定。如需解决此问题,请尝试使用“脚本”标签页右上角的按钮刷新脚本列表。如果这样做无法解决问题,请尝试通过“脚本”标签页中的“新建”按钮创建一个新仓库,然后将脚本保存到该仓库中(您可能需要将脚本从不同步的仓库中移至新仓库)。