GEE 将本地 GeoJSON 文件上传到谷歌资产

news2024/9/23 23:17:36


在地理信息系统(GIS)领域,Google Earth Engine(GEE)是一个强大的平台,它允许用户处理和分析大规模地理空间数据。本文将介绍如何使用 Python 脚本批量上传本地 GeoJSON 文件到 GEE 资产存储,这对于需要将地理数据上传到 GEE 进行进一步分析的用户来说非常有用。

应用场景

  • 数据集成:将本地 GeoJSON 数据集成到 GEE 中,以便进行更复杂的地理空间分析。
  • 数据共享:与团队成员共享 GeoJSON 数据,以便协作分析和决策。
  • 自动化处理:自动化数据上传流程,减少手动操作,提高效率。

使用方法

  1. 安装必要的库:确保你的 Python 环境中安装了 earthengine-apijson 库。
  2. 设置代理:如果你在中国大陆使用 GEE,可能需要设置代理来访问 GEE 服务。
  3. 授权 GEE 账户:使用 ee.Authenticate()ee.Initialize() 函数进行授权和初始化。
  4. 运行脚本:执行脚本,脚本将自动处理指定文件夹中的所有 GeoJSON 文件,并上传到 GEE。

代码详解

导入库

# 导入必要的库
import ee
import os
import json
import time

这段代码导入了几个Python模块,用于后续的文件处理和与Google Earth Engine (GEE) 的交互。

  • ee: 用于与Google Earth Engine进行交互的专用库。
  • os: 用于处理操作系统功能,如文件路径操作。
  • json: 用于解析JSON格式的数据。
  • time: 提供各种和时间相关的功能。

设置代理和环境变量

# 设置代理和环境变量
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:xxxx' 
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:xxxx' 
os.environ['CRYPTOGRAPHY_OPENSSL_NO_LEGACY'] = '1'

# 方法参见`https://mp.weixin.qq.com/s?__biz=Mzk0MTU1MjU5Mw==&mid=2247484766&idx=1&sn=40db6ec347539999af2332ba1e4996fb&chksm=c2d1e3e0f5a66af6d564bf19a1d6a260e5addaf6b7c42981c0e9917db7feb62f9bcb83fdaa9d#rd` 

这段代码设置了两个环境变量,用于配置HTTP和HTTPS代理,以便程序可以通过指定的代理服务器进行网络请求。这对于访问某些需要通过特定网络路径访问的资源非常有用。CRYPTOGRAPHY_OPENSSL_NO_LEGACY 环境变量用于解决某些Python库与新版OpenSSL的兼容性问题。

授权和初始化 GEE

# 授权 GEE 账户并初始化 GEE API
ee.Authenticate()
ee.Initialize()

这段代码首先调用ee.Authenticate()函数进行用户认证,然后调用ee.Initialize()函数初始化GEE API。这是使用GEE进行任何操作前的必要步骤。

定义删除资产的函数

def delete_asset_if_exists(asset_path):
    """如果资产存在,则删除它。"""
    try:
        asset = ee.data.getAsset(asset_path)
        ee.data.deleteAsset(asset_path)
        print(f"Asset {asset_path} has been deleted.")
    except ee.EEException as e:
        if "not found" in str(e):
            print(f"Asset {asset_path} does not exist.")
        else:
            raise

这个函数尝试删除指定路径的GEE资产。如果资产存在,它将被删除并打印一条消息;如果资产不存在,将打印一条不存在的消息。如果发生其他类型的异常,则会抛出该异常。

获取特定扩展名的文件列表

def get_files_with_extension(directory, extension):
    """获取指定目录下所有具有特定扩展名的文件。"""
    directory = os.path.normpath(directory)
    all_files = os.listdir(directory)
    files_with_extension = [file for file in all_files if file.endswith(extension)]
    return files_with_extension

这个函数接收一个目录路径和文件扩展名作为参数,返回该目录下所有具有指定扩展名的文件列表。

主函数

def main():
    # 设置 JSON 文件路径
    json_folder_path = r'E:\Geojson'
    json_files = get_files_with_extension(directory=json_folder_path, extension='.geojson')

    # 遍历每个 GeoJSON 文件
    for json_file in json_files:
        json_name = json_file.split('.')[0]
        local_geojson_path = os.path.join(json_folder_path, json_file)

        # 打开并读取 GeoJSON 文件
        with open(local_geojson_path, 'r') as file:
            geojson_data = json.load(file)

        # 创建 Feature Collection
        feature_collection = ee.FeatureCollection([
            ee.Feature(
                ee.Geometry(geojson_feature['geometry']),
                {**geojson_feature['properties'], 'system:index': str(index)}
            )
            for index, geojson_feature in enumerate(geojson_data['features'])
        ])

        # 定义资产路径
        asset_path = fr'users/{json_name}'

        # 删除已存在的资产
        delete_asset_if_exists(asset_path)

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

        task.start()
        print(f"Upload task started for {json_file}.")

        # 监控上传状态
        while True:
            if not task.active():
                print("Task completed.")
                break
            else:
                print("Task status:", task.status())
                time.sleep(10)

主函数执行以下步骤:

  1. 设置GeoJSON文件的存储路径。
  2. 使用get_files_with_extension函数获取所有GeoJSON文件。
  3. 遍历每个文件,读取其内容,并创建GEE的FeatureCollection
  4. 定义每个文件对应的GEE资产路径。
  5. 如果资产已存在,则删除它。
  6. 创建一个上传任务,将FeatureCollection上传到GEE资产存储。
  7. 启动上传任务,并使用循环监控任务状态,直到任务完成。

这个脚本为批量上传GeoJSON文件到GEE提供了一个完整的解决方案,包括处理文件、创建特征集合、上传和监控任务状态。

完整案例

下列代码提供了一个完整的案例,展示了如何批量上传 GeoJSON 文件到 GEE 资产存储。

# -*- coding:utf-8 -*-
"""
此代码的主要用途是批量上传本地 GeoJSON 文件到 Google Earth Engine (GEE) 资产存储。
将多个本地 GeoJSON 文件上传到 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 账户及初始化 Earth Engine API
ee.Authenticate()
ee.Initialize(project='ee-xxxx')


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

    参数:
    asset_path (str): 资产路径。
    """
    try:
        asset = ee.data.getAsset(asset_path)
        ee.data.deleteAsset(asset_path)
        print(f"Asset {asset_path} has been deleted.")
    except ee.EEException as e:
        if "not found" in str(e):
            print(f"Asset {asset_path} does not exist.")
        else:
            raise


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

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

    返回:
    list: 包含指定扩展名文件名的列表。
    """
    # 确保路径字符串是正确的格式
    directory = os.path.normpath(directory)

    # 获取文件夹中的所有文件
    all_files = os.listdir(directory)

    # 筛选出指定扩展名的文件
    files_with_extension = [file for file in all_files if file.endswith(extension)]

    # 返回结果
    return files_with_extension


def main():
    """
    主函数,用于批量上传 GeoJSON 文件到 Google Earth Engine (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 = json_file.split('.')[0]

        local_geojson_path = os.path.join(json_folder_path, json_file)

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

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

        # 指定上传到 GEE 资产的路径
        asset_path = fr'ISID_{json_name}'

        # 检查并删除资产,如果存在的话
        delete_asset_if_exists(asset_path)

        # 创建上传任务
        task = ee.batch.Export.table.toAsset(
            collection=feature_collection,
            description=fr'Upload_geojson_to_asset_{json_name}',
            assetId=asset_path,
            fileFormat='GeoJSON'
        )

        # 开始上传任务
        task.start()
        print(f"Upload task started for {json_file}.")

        # 等待任务完成
        while True:
            if not task.active():
                print("Task completed.")
                break
            else:
                print("Task status:", task.status())
                time.sleep(10)


if __name__ == '__main__':
    main()

注意事项

术语/函数解释
ee.Authenticate()用户需要手动打开浏览器完成登录认证的过程。
ee.Initialize()初始化 Earth Engine API,通常需要传入一个项目名。
ee.FeatureCollection创建一个特征集合,用于存储地理特征数据。
ee.batch.Export提供了导出数据的方法,如将数据导出到 Google Drive 或 Asset Manager。
os.environ设置环境变量,这里用来配置代理服务器地址。
os.listdir()列出指定目录下的所有文件和子目录。
json.load()将文件中的 JSON 数据解析成 Python 对象。
ee.Geometry表示地理几何对象,如点、线或多边形等。
ee.Feature代表地理空间中的一个要素,包含几何信息和属性信息。
task.active()检查任务是否还在活跃状态。

通过这个脚本,你可以自动化地将本地 GeoJSON 文件上传到 GEE,为地理空间数据分析和可视化提供便利。

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

详细全文-点击查看

file

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

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

相关文章

Qt (16)【Qt 事件 —— Qt 事件简介 | 如何重写相关的 Event 函数】

阅读导航 引言一、事件介绍二、如何重写相关的 Event 函数1. 事件的处理简介2. 示例重写鼠标相关的 Event 函数(1)新建Qt项目,设计UI文件(2)新添加MyLabel类(3)重写enterEvent()方法和leaveEven…

分享一个爬虫数据挖掘 农村产权交易数据可视化平台 数据分析大数据 Java、python双版(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

形式向好、成本较低、可拓展性较高的名厨亮灶开源了。

简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,减少企业级应用约 95%的开发成本,在强大视频算法加…

建筑业首个通过算法备案的大模型发布

建筑业首个通过算法备案的大模型发布 9月10日上午,上海建工四建集团与中国建筑出版传媒有限公司携手推出了Construction-GPT PRO版,这是一款专为建筑行业设计的施工知识大模型。该模型能够理解和生成长达8000字符的内容,其回答速度达到毫秒级…

LLM大模型学习:NLP三大特征抽取器(CNN/RNN/TF)

NLP三大特征抽取器(CNN/RNN/TF) 结论:RNN已经基本完成它的历史使命,将来会逐步退出历史舞台;CNN如果改造得当,将来还是有希望有自己在NLP领域的一席之地;而Transformer明显会很快成为NLP里担当…

Linux 信息安全:构建坚固的防御体系

摘要: 本文围绕 Linux 信息安全展开。阐述了 Linux 在信息技术中的重要地位,强调信息安全的重要性以及 Linux 信息安全面临复杂网络环境、演变攻击手段与内部威胁等挑战。详细介绍了 Linux 系统的安全架构与机制,包括用户与权限管理、文件系统…

Hexo框架学习——从安装到配置

第一章 Hexo入门 Hexo 是一个快速、简洁且高效的博客框架。 1.1 Hexo的下载与安装 1.1.1 Hexo下载 在下载Hexo之前,我们需要确保电脑上已经安装好以下软件: Node.js (Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本) Git…

你真的懂吗系列——串口通信

你真的懂吗 文章目录 你真的懂吗前言二、什么是串口通信二、STM32的串口三、什么是数据通信 前言 串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。尽管比字节(byte)的串行通信慢,但…

机器学习算法-决策树算法

文章目录 什么是决策树?决策树的基本概念决策树的构建过程决策树的优缺点优点:缺点: 决策树的优化决策树的应用决策树的实现工具 特征选择准则1. 信息增益(Information Gain)计算公式:熵(Entrop…

ubuntu20.4安装Qt5.15.2

ubantu20.4镜像下载地址: https://releases.ubuntu.com/focal/ubuntu-20.04.6-desktop-amd64.iso Qt5.15.2下载地址: https://download.qt.io/official_releases/online_installers/ 安装步骤 1、进入地址后选择对应安装包,我这是ubuntu…

Redis进阶(二)--Redis高级特性和应用

文章目录 第二章、Redis高级特性和应用一、Redis的慢查询1、慢查询配置2、慢查询操作命令3、慢查询建议 二、Pipeline三、事务1、Redis的事务原理2、Redis的watch命令3、Pipeline和事务的区别 四、Lua1、Lua入门(1)安装Lua(2)Lua基…

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天

SETUP:工具和插件 工具:elevenlabs或者讯飞,用于Speech Synthesis(语音合成,text to speech)。 https://elevenlabs.io/app/speech-synthesis/text-to-speechhttps://elevenlabs.io/app/speech-synthesis…

海外云手机——跨国业务的高效工具

海外云手机是一种基于云计算的虚拟手机服务,依托海外服务器实现跨国网络访问。这项服务不仅具备传统智能手机的所有功能,还突破了地域限制,为跨国业务提供更加便捷、高效、安全的解决方案。 随着全球化的加速和互联网的快速普及,跨…

C语言深入理解指针五(18)

文章目录 前言一、回调函数是什么?二、qsort使用举例使用qsort函数排序整型数据使用qsort函数排序结构数据 三、qsort的模拟实现总结 前言 本篇将会很有意思! 一、回调函数是什么? 回调函数就是一个通过函数指针调用的函数。   如果你把函数…

代码随想录27期|Python|Day52|​动态规划|​647. 回文子串|516. 最长回文子序列

本文是动态规划的回文字符串部分。 647. 回文子串 本题需要搞清楚dp的定义、遍历顺序和递推公式。 1、dp数组的定义 由图片可知,不同于之前的dp数组直接定义为当前遍历到的位置处题目所要求得值,而是应该定义为i为开始,j为结束的子串是否是…

探索音视频SDK的双重核心:客户端与服务端的协同作用

在当今的数字化时代,音视频技术已成为连接人与人、人与世界的重要桥梁。从社交娱乐到在线教育,从远程医疗到视频会议,音视频技术的应用无处不在,极大地丰富了我们的生活方式和工作模式。本文将深入探讨音视频SDK的两大核心类别——…

横版闯关手游【全明星时空阿拉德】Linux手工服务端+运营后台+双app端

横版闯关手游【时空阿拉德】(【全明星阿拉德】)阿拉德系列2022整理Linux手工服务端余额充值后台安卓苹果双端。 运营后台看目录结构是thinkphp开发的。 代码免费下载:百度网盘

DNAT和SNAT实践

NAT分SNAT和DNAT两种。从名字上区分: SNAT将源IP地址替换为出口网络的IP地址,以便内网地址可以访问外网服务。一般受限于公网IP有限,一个内网集合想访问外网服务,则用统一的出口做代理。出口配置公网IP,帮助从此发出的…

Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形

常用的绘图方法 1.设置当前画笔的颜色,可多次调用 public abstract void setColor(Color c) 参数:c -颜色 2. 画一条直线 public abstract void drawLine(int x1, int y1, int x2, int y2) 参数:x1 - 第一个点的 x坐标。 y1 - 第一点的 y坐…

Git使用—把当前仓库的一个分支push到另一个仓库的指定分支、基于当前仓库创建另一个仓库的分支并推送到对应仓库(mit6828)

目录 背景提示 将当前仓库的一个分支push到另一个仓库的指定分支 直接基于仓库rep1中的某个分支创建新的分支并将其推送到目标仓库rep2 补充 参考链接 背景提示 最近打算做一下mit6.828的项目,这个仓库使用问题困扰了自己一段时间,由于6828官方提供…