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


在地理信息系统(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初识C++|继承

🍬 mooridy-CSDN博客 🧁C专栏(更新中!) 目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3继承类模板 2. 父类和子类对象赋值兼容转换 3. 继承中的…

国内外大模型汇总(包括科大星火、文心一言、通义千问、智普清言、华为大模型)

国内外大模型汇总 1. 科大讯飞星火认知大模型 主要特点: 多语言能力:以中文为核心,同时支持多语言处理,能够进行跨语种的语言理解和生成。 广泛的任务能力:具备内容生成、语言理解、知识问答、推理、数学计算、代码…

数学建模笔记—— 主成分分析(PCA)

数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…

小怡分享之栈和队列

前言: 🌈✨前面小怡给大家分享了顺序表和链表,今天小怡给大家分享一下栈和队列。 1.栈 1.1 概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#x…

WPF中依赖属性或附加属性的继承

引言 我们可以轻易的编写一个附加属性类,增加任意类型的附加属性并编写一定的逻辑来处理附加值的变化通知。假如控件是我们自定义的一个label、button 、textbox等,自定义控件当然是其他基础类型元素的组合,如shape、line、rectangle、geome…

针对SVM算法初步研究

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝心态决定高度,细节决定成败…

从OracleCloudWorld和财报看Oracle的转变

2024年9月9-12日Oracle Cloud World在美国拉斯维加斯盛大开幕 押注AI和云 Oracle 创始人Larry Ellison做了对Oracle战略和未来愿景的主旨演讲,在演讲中Larry将AI技术和云战略推到了前所未有的高度,从新的Oracle 23c改名到Oracle23ai,到Oracl…

活动|华院计算宣晓华受邀出席“AI引领新工业革命”大会,探讨全球科技的最新趋势

8月31日,“AI引领新工业革命”大会于上海图书馆圆满落幕。本次大会由TAA校联会和台协科创工委会联合主办,得到上海市台办、上海市台联、康师傅的大力支持。大会邀请了NVIDIA全球副总裁、亚太区企业营销负责人刘念宁,元禾厚望资本创始合伙人潘…

828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统

828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&a…

[Web安全 网络安全]-文件包含漏洞

文章目录: 一:前言 1.什么是文件包含漏洞 2.文件包含漏洞的成因 3.文件包含漏洞的分类 4.文件包含漏洞的防御策略 5.文件包含函数(触发点Sink) 6.环境 6.1 靶场 6.2 其他工具 二:文件包含LFI labs靶场实验…

docker-01 创建一个自己的镜像并运行容器

docker-01 创建一个自己的镜像并运行容器 前言 我们都知道使用Docker的镜像可以快速创建和部署应用,大大的节约了部署的时间。并且Docker 的镜像提供了除内核外完整的运行时环境,确保代码的环境一致性,从而不会在出现这段代码在我机器上没问…

YoloV10改进策略:上采样改进|动态上采样|轻量高效,即插即用(适用于分类、分割、检测等多种场景)

摘要 本文使用动态上采样改进YoloV10,动态上采样是今天最新的上采样改进方法,具有轻量高效的特点,经过验证,在多个场景上均有大幅度的涨点,而且改进方法简单,即插即用! 论文:《DySample:Learning to Upsample by Learning to Sample》 论文:https://arxiv.org/pdf/…

老旧电力系统安全隐患增加 该如何预防电气线路老化等因素引发的电气火灾呢?

为应对我国电气火灾事故频发的挑战,安科瑞电气股份有限公司开发了AcrelCloud-6000安全用电管理云平台。这一平台依托移动互联网和云计算技术,结合物联网传感器,将办公楼、学校、医院、工厂、体育场馆、宾馆及福利院等人员密集场所的电气安全数…

0x07 Nginx越界读取缓存漏洞 CVE-2017-7529 复现

参考: Nginx越界读取缓存漏洞 CVE-2017-7529 | PeiQi文库 (wgpsec.org)Nginx越界读取缓存漏洞(CVE-2017-7529)复现分析 - qweg_focus - 博客园 (cnblogs.com) 一、fofa 搜索 nginx && port"80" 我这里写了个脚本将ip保存…

启明云端乐鑫代理商,乐鑫ESP32无线芯片方案,物联网设备WiFi联动控制

随着智能和远程技术的飞速发展,物联网(IoT)逐渐出现在我们生活的每一个角落。乐鑫以其创新的无线通信技术,正成为智能家居、工业自动化和医疗设备等领域的推动者。 无线WiFi芯片模组不仅提供了强大的数据处理能力,还赋予了设备以直观的交互方…

Web 基础——Apache

Event Worker 的升级版、把服务器进程和连接进行分析,基于异步 I/O 模型。 请求过来后进程并不处理请求,而是直接交由其它机制来处理,通过 epoll 机制来通知请求是否完成; 在这个过程中,进程本身一直处于空闲状态&am…

Qt常用控件——QLCDNumber

文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件,类似于这样: 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5,in…

第十一周:机器学习

第十一周周报 摘要Abstract机器学习1. 注意力机制(下)1.1 multi-head self-attention(多头注意力机制)1.2 Positional Encoding(位置编码)1.3 truncated self attention(截断式注意力机制&#…

即插即用篇 | YOLOv8 引入高效的直方图Transformer模块 | 突破天气障碍:Histoformer引领高效图像修复新路径“

本改进已同步到YOLO-Magic框架! 摘要:摘要。基于Transformer的恶劣天气图像修复方法取得了显著进展。大多数方法通过沿通道维度或在空间上固定范围的块内使用自注意力,以减少计算负担。然而,这种折中方式在捕获长距离空间特征方面存在局限性。受到恶劣天气导致的退化因素主…

黑马点评18——多级缓存-OpenResty

文章目录 安装OpenRestyOpenResty快速入门OpenResty获取请求参数封装Http请求向Tomcat发送http请求根据商品id对tomcat集群负载均衡Redis缓存预热查询Redis缓存Nginx本地缓存 安装OpenResty 安装参考博客 OpenResty快速入门 nginx是没有业务能力的,我们是把请求转发…