GEE 批量上传 GeoJSON 文件到 Google Earth Engine 资产存储

批量上传 GeoJSON 文件到 Google Earth Engine (GEE) 资产存储 🚀

在遥感和地理信息系统(GIS)领域,处理和分析地理数据是日常工作的重要组成部分。Google Earth Engine(GEE)作为一个功能强大的云平台,提供了全球范围内的地理数据管理、分析和可视化能力。然而,当用户手头有大量的 GeoJSON 文件时,手动上传这些文件到 GEE 的资产存储库可能会变得繁琐且耗时。本文将介绍一种高效的批量上传方法,帮助您自动化这一过程,提升工作效率。


完整版本地址

  • 详细原文见:
    • https://mp.weixin.qq.com/s?__biz=Mzk0MTU1MjU5Mw==&mid=2247485071&idx=1&sn=12c9e83b4ed7be84f70ab8d22ed1d36e&chksm=c2d1e031f5a6692760a0463bd4a923f93ec5e203a4d146f19c81b764e3589b8bc82676fc1488#rd

使用方法 🛠️

1. 环境准备

  • 安装 earthengine-api:用于与 Google Earth Engine 进行交互。

    pip install earthengine-api
    
  • 配置 Google Earth Engine 账户:确保已经完成 ee.Authenticate() 的授权认证。

2. 代码使用步骤

  1. 准备 GeoJSON 文件:将本地的 GeoJSON 文件放置在一个指定的文件夹中。

  2. 修改代码路径

    • json_folder_path:设置为 GeoJSON 文件所在的目录。
    • asset_path:设置为 GEE 中目标存储的路径。
  3. 运行代码:系统将自动上传每一个 GeoJSON 文件至 GEE,并处理任务状态。

3. 运行环境

  • 编程语言:Python 3
  • 依赖库:Google Earth Engine (GEE) API

代码详情 🖥️

以下是用于批量上传 GeoJSON 文件到 GEE 资产存储的完整 Python 代码:

# -*- coding:utf-8 -*-
"""
此代码用于批量上传本地 GeoJSON 文件到 Google Earth Engine (GEE) 资产存储。
在上传前,自动删除同名资产,确保数据唯一性。

"""

import ee
import os
import json
import time

# 配置网络代理(如无代理,请注释以下两行)
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:XXXX'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:XXXX'

# 解决 OpenSSL 3.0 兼容性问题
os.environ['CRYPTOGRAPHY_OPENSSL_NO_LEGACY'] = '1'

# 授权并初始化 Earth Engine API
ee.Authenticate()
ee.Initialize(project='XXXX')


def delete_asset_if_exists(asset_path):
    """
    检查并删除指定的资产路径(如果存在)。

    参数:
    asset_path (str): 资产路径。
    """
    try:
        ee.data.getAsset(asset_path)
        ee.data.deleteAsset(asset_path)
    except ee.EEException as e:
        if "not found" not in str(e):
            raise


def get_files_with_extension(directory, extension):
    """
    获取指定文件夹中具有特定扩展名的所有文件。

    参数:
    directory (str): 文件夹路径。
    extension (str): 文件扩展名(包括点,例如 '.geojson')。

    返回:
    list: 符合条件的文件名列表。
    """
    directory = os.path.normpath(directory)
    all_files = os.listdir(directory)
    return [file for file in all_files if file.endswith(extension)]


def main():
    """
    主函数,用于批量上传 GeoJSON 文件到 GEE 资产存储。
    """
    json_folder_path = r"E:\_Geojson"
    json_files = get_files_with_extension(directory=json_folder_path, extension='.geojson')

    for json_file in json_files:
        json_name = os.path.splitext(json_file.split('_')[-1])[0]
        local_geojson_path = os.path.join(json_folder_path, json_file)

        # 读取 GeoJSON 文件
        with open(local_geojson_path, 'r', encoding='utf-8') as file:
            geojson_data = json.load(file)

        # 转换为 GEE 的 FeatureCollection
        feature_collection = ee.FeatureCollection([
            ee.Feature(
                ee.Geometry(feature['geometry']),
                {**feature['properties'], 'system:index': str(index)}
            )
            for index, feature in enumerate(geojson_data['features'])
        ])

        # 设置 GEE 资产路径
        asset_path = f'users/XXXX/{json_name}'

        # 删除同名资产(如果存在)
        delete_asset_if_exists(asset_path)

        # 创建并启动上传任务
        task = ee.batch.Export.table.toAsset(
            collection=feature_collection,
            description=f'Upload_geojson_to_asset_{json_name}',
            assetId=asset_path,
            fileFormat='GeoJSON'
        )
        task.start()
        print(f"已启动上传任务:{json_file}")

        # 监控任务状态
        while task.active():
            time.sleep(1)
        print("任务已完成。")


if __name__ == '__main__':
    main()

代码优势 ✨

  1. 自动化处理:批量上传多个 GeoJSON 文件,显著减少手动操作的时间和劳动强度。
  2. 错误处理:在上传前自动检查并删除同名资产,避免因重名导致的上传失败。
  3. 高灵活性:用户可根据需求轻松修改文件路径和 GEE 资产路径,适应不同应用场景。
  4. 任务状态监控:实时监控上传任务状态,确保每个任务顺利完成,防止遗漏。

注意事项 ⚠️

  1. 网络代理设置:若未使用代理服务器,请注释或移除以下代码行:
    os.environ['HTTP_PROXY'] = 'http://127.0.0.1:XXXX'
    os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:XXXX'
    
  2. GEE 配额限制:GEE 对上传频率和存储空间有一定限制,上传大量文件时需注意配额,避免触发限制。
  3. 文件格式要求:本代码仅支持 .geojson 格式,其他格式(如 .shp)需先进行格式转换。
  4. 资产命名:确保资产路径唯一,避免因重名导致的数据覆盖或丢失。
  5. OpenSSL 兼容性:根据本地环境需求,可能需调整 CRYPTOGRAPHY_OPENSSL_NO_LEGACY 设置。

相关函数讲解 📚

函数名称功能描述参数说明
delete_asset_if_exists(asset_path)检查并删除指定的 GEE 资产路径(如果存在)。asset_path:GEE 资产的路径,例如 'users/nicexian0011/_DGS_GSV_Grids/{json_name}'
get_files_with_extension(directory, extension)从指定文件夹中提取所有特定扩展名的文件。directory:文件夹路径。extension:文件扩展名(包括点,如 .geojson)。
ee.batch.Export.table.toAsset()将本地的 FeatureCollection 数据上传至 GEE 资产存储。collection:需要上传的数据(FeatureCollection)。description:任务描述。assetId:目标资产路径。fileFormat:文件格式(如 GeoJSON)。

结论 🎯

通过本文提供的批量上传脚本,用户可以高效地将大量本地 GeoJSON 文件自动上传至 Google Earth Engine (GEE) 资产存储中。该方法不仅简化了操作流程,还通过自动化处理和错误检查,确保数据的唯一性和一致性。在实际应用中,请注意 GEE 的配额限制,并确保网络代理和认证配置正确,以实现最佳效果。


术语解释表 📖

术语解释
GeoJSON一种基于 JSON 格式的开放标准,用于表示地理特征及其属性。
Google Earth Engine (GEE)一个基于云的地理空间分析平台,支持大规模的地理数据存储、处理和可视化。
FeatureCollectionGEE 中用于存储一组地理特征(Feature)的数据结构。
Asset在 GEE 中,资产是用户上传和管理的地理数据资源。
earthengine-apiGoogle 提供的 Python 库,用于与 GEE 进行交互。
ee.Authenticate()Earth Engine API 的认证函数,用于验证用户身份。
ee.Initialize()初始化 Earth Engine API,准备进行数据操作。
ee.batch.Export.table.toAsset()将数据导出为 GEE 资产的函数。

如果这对您有所帮助,希望点赞支持一下作者! 😊

详细全文-点击查看

file

### 如何在 Google Earth Engine (GEE) 中上传 GeoJSON 文件 要在 GEE 中成功上传并加载 GeoJSON 文件,可以按照以下方法操作: #### 准备工作 确保已安装最新版本的 **Google Earth Engine API** 并完成身份验证过程[^2]。如果尚未设置环境,请运行以下命令来初始化 Python 环境中的 GEE 客户端库。 ```bash pip install earthengine-api ``` 接着,在终端执行 `earthengine authenticate` 来授权访问权限。 --- #### 方法一:通过 Code Editor 手动导入文件 1. 登录到 [Earth Engine Code Editor](https://code.earthengine.google.com/)。 2. 将本地存储GeoJSON 文件拖放到左侧导航栏中的“Assets”部分。 3. 创建一个新的资产时,选择 “GeoJSON” 类型作为输入数据格式[^3]。 4. 设置目标路径以及名称后点击确认按钮即可完成上传流程。 此方式适合于较小规模的数据集处理需求场景下使用。 --- #### 方法二:利用 Python 脚本自动化上传 对于批量作业或者需要脚本支持的任务来说,推荐采用编程接口实现自动化的功能开发模式。下面给出一段简单的示例代码用于演示如何借助 python SDK 实现这一目的: ```python import ee from google.cloud import storage # 初始化 EE 应用程序实例连接服务 ee.Initialize() def upload_geojson_to_gee(bucket_name, source_file_name, destination_blob_name): """Uploads a local GeoJSON file to Google Cloud Storage and imports it into GEE.""" client = storage.Client() bucket = client.bucket(bucket_name) blob = bucket.blob(destination_blob_name) blob.upload_from_filename(source_file_name) task_config = { 'fileFormat': 'GeoJSON', 'maxVertices': None, 'bigtableOptions': {}, 'description': 'Imported_GeoJSON' } table_task = ee.data.newTask({ 'type': 'TABLE_UPLOAD', 'sourceUri': f'gs://{bucket.name}/{destination_blob_name}', 'parentName': 'users/yourusername', # 替换为您的个人目录地址 'taskConfig': task_config }) return table_task.start() if __name__ == "__main__": BUCKET_NAME = '<YOUR_BUCKET_NAME>' # 更改为实际使用的云端储存桶名 SOURCE_FILE_PATH = './data/sample.geojson' # 地理空间矢量文档位置 DESTINATION_BLOB_NAME = 'sample.geojson' result = upload_geojson_to_gee(BUCKET_NAME, SOURCE_FILE_PATH, DESTINATION_BLOB_NAME) print(f'Task submitted with ID {result}') ``` 上述函数定义了一个通用的过程框架用来将指定路径下的地理特征集合转换成可供后续分析调用的形式存入云平台内部数据库系统之中待进一步查询检索应用[^4]。 注意替换模板变量 `<YOUR_BUCKET_NAME>` 和 `'./data/sample.geojson'` 的具体值为你自己的配置参数信息。 --- #### 常见错误排查指南 - 如果遇到认证失败的情况,请重新尝试运行 `earthengine authenticate` 或者检查网络连通状态是否正常。 - 当提示内存不足等问题发生时,则可能是因为所选区域范围过大引起的资源消耗过高现象;此时建议缩小研究边界限定条件再试一次看看效果怎样。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值