自动将卫星图像转换为经过云优化的 GeoTiffs,以便在 Amazon S3 中托管

长期以来,卫星图像的庞大尺寸给寻求动态渲染这些图像的客户软件带来了沉重负担。通常,客户必须将影像从中央存储库复制到本地计算机。下载大图像可能需要几分钟。下载图像时,处理速度也很慢。 云优化 GeoTiffs (COG) 的推出提高 了使用这些图像的云存储的效率。

在这篇文章中,我们演示了如何使用无服务器技术来处理和存储卫星图像。具体而言,这些图像被转换为高效的 COG 并存储在 Amazon Simple Storage Service (S3) 中 ,这是一种提供业界领先的可扩展性、数据可用性、安全性和性能的对象存储服务。通过使用 COG,用户可以立即访问大型图像,而不必再在本地复制数据。因此,用户可以更快地开始分析图像和输出产品。用户还可以流式传输他们需要的部分图像,而不是使用整张图像,从而加快处理速度并提高生产力。

云端优化的 GeoTIFF (COG)

COG 是普通的 GeoTIFF,但其内部组织可以实现更高效的云端工作流程。用户只能流式传输所需的 COG 部分,从而加快数据传输和处理速度。此外,COG 可减少数据重复。用户无需在本地复制和缓存数据即可访问 COG 数据。以下各节中描述的无服务器架构允许组织自动将其数据转换为 COG。

解决方案概述

为此,我们介绍了以下步骤:

  • 如何在预装了 Python 库 rio-cogeo 的情况下构建容器化 的 亚马逊云科技 Lambda 函数,用于将图像转换为 COG。亚马逊云科技 Lambda 将能够翻译大小小于 10GB 的图像。
  • 创建云基础架构,用于自动处理新图像、对其进行转换和存储输出。当 S3 存储桶收到上传的卫星图像时,S3 存储桶会触发翻译 Lambda 函数。
  • 如何将客户端应用程序连接到 Amazon S3 中这些新创建的 COG 文件的示例。

先决条件

在继续执行以下步骤之前,需要满足以下先决条件:

  1. 创建 Amazon S3 存储桶的 IAM 权限
  2. 亚马逊云科技 Lambda 具有读取和写入 S3 存储桶的权限
  3. 创建 ECR 存储库并将 Docker 映像推送到该存储库的 IAM 权限
  4. 安装了 Docker
  5. 亚马逊云科技 命令行界面 已安装
  6. QGIS 软件已安装

草率排练

在较高的级别上,您将执行以下步骤:

  1. 创建 Amazon S3 输入/输出存储桶。
  2. 创建 亚马逊云科技 Lambda 容器镜像并推送到 ECR。
  3. 使用 ECR 映像部署 亚马逊云科技 Lambda 函数并设置 S3 触发器。
  4. 将 COG 与 QGIS 软件配合使用。

1。创建亚马逊 S3 存储桶

大多数 GeoTiff 已经不是 COG 了。为了方便地将这些图像转换为 COG,这篇文章部署了两个 S3 存储桶和一个 Lambda 函数。最终,用户可以将其图像上传到输入 S3 存储桶,该存储桶会触发 Lambda 函数将图像转换为 COG 并将结果上传到输出 S3 存储桶。

首先使用 亚马逊云科技 管理控制台 创建输入 S3 存储桶 。为存储桶提供名称并使用默认设置进行创建。这篇文章将输入 S3 存储桶称为 “geotiff-to-cog” 存储桶。此外,创建一个与输入存储桶同名但末尾附加文本 “-output” 的存储桶。这篇文章的输出存储桶被称为 “geotiff-to-cog-output” 存储桶。

2。创建 Lambda 容器镜像

接下来,我们将介绍如何构建负责将输入图像转换为 COG 的 Lambda 函数。按如下方式创建 handler.py、Dockerfile 和 requirements.txt,然后存储在 /lambda 等目录中。

# handler.py 
import json
import boto3
import os
import rio_cogeo
from rio_cogeo.cogeo import cog_translate
from rio_cogeo.profiles import cog_profiles

def noncog_to_cog_tiff(input_img, output_img):
    if rio_cogeo.cog_info(input_img).COG:
        print('The input img is already a COG!')
    else:
        print('The input img is not a COG, starting conversion of input img to COG!')
        cog_translate(input_img, output_img, cog_profiles.get("lzw"))
        if rio_cogeo.cog_info(output_img).COG:
            print(f'finished converting input img to COG! The output img is saved to {output_img}')

def handler(event, context):
    print('start')
    os.mkdir('/tmp/output')
    
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    obj_name = key.split('/')[-1]
    full_path = f's3://{bucket_name}/{key}'
    
    s3 = boto3.resource('s3')
    s3.Bucket(bucket_name).download_file(key, f'/tmp/{obj_name}')
    print(obj_name)
    
    noncog_to_cog_tiff(f'/tmp/{obj_name}', f'/tmp/output/{obj_name}')
    
    s3 = boto3.client('s3')
    s3.upload_file(f'/tmp/output/{obj_name}', bucket_name+'-output', 'cog_'+key)
    
    return {
        'statusCode': 200,
        'body': json.dumps(f'conversion_to_cog_finished')
    }
# Dockerfile 
FROM public.ecr.aws/lambda/python:3.9
COPY requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
COPY handler.py ${LAMBDA_TASK_ROOT}
CMD ["handler.handler"]
# requirements.txt
awslambdaric
boto3
rio-cogeo

在终端中,导航到该目录并执行 docker build-t lambda-cog-blog: latest。 构建 docker 镜像后,你可以使用 docker ru n-p 9000:8080 lambda-cog-bl o g: latest 命令在本地对其进行测试。

接下来,docker 镜像被推送到 亚马逊弹性容器注册表 (Amazon ECR )。 Amazon ECR 是一个完全托管的容器注册表,提供高性能托管,因此您可以在任何地方可靠地部署应用程序映像和构件。首先标记 docker 镜像并登录 Amazon ECR 存储库。然后,docker 镜像被推送到亚马逊 ECR 存储库。完成亚马逊 ECR 传输的命令如下:

  • docker tag blog-test: latest .dkr。ecr.us-east-1.amazonaws.com /lambda-cog-blog: latest 
    
  • aws ecr get-login-password--region us-east-1 | docker 登录--用户名 亚马逊云科技--password-stdin .dkr。ecr.us-east-1.amazonaws.com 
    
  • aws ecr create-repository-name lambda-cog-blog--image-scanning-cannPush=True--image-tag-mutability 可变性 
    
  • docker push .dkr。ecr.us-east-1.amazonaws.com /lambda-cog-blog: latest 
    

3。从亚马逊 ECR 映像部署 Lambda

最后,可以使用存储在 Amazon ECR 中的映像来部署 Lambda 函数。在控制台中打开 Lambda。选择 创建函数 ,然后选择 容器镜像 类别。选择 浏览图片 ,然后选择已推送到亚马逊 ECR 的 Lambda 图像。为 Lambda 函数命名,然后选择 创建函数。

how-to create aws lambda function

创建函数后,必须设置 Amazon S3 触发器。首先选择 添加触发器 并使用 Amazon S3 作为来源。选择您的存储桶作为事件源,然后选择底 部的 添加。此外,打开配置选项卡,在 “权限” 下为 Amazon S3 的函数角色授予读写 权限 。根据输入图像可能的大小,您还可以在 “常规配置” 下增加 Lambda 函数的内存(10 GB 限制)、磁盘(10 GB 限制)和超时(15 分钟限制)。

how to create amazon S3 trigger

这样就完成了必要的架构。用户可以将图像输入到输入 S3 存储桶,此处称为 “geotiff-to-cog” 存储桶。这将触发 Lambda 函数,该函数下载图像并将其转换为 COG。Lambda 函数将 COG 输出输入到输出 S3 存储桶,此处称为 “geotiff to-cog-output”。 如果用户希望使用非COG的TIF图像数据集来测试使用上述架构将图像转换为COG的情况,则此处提供了 一个名为RarePlanes的数据集。

4。使用 QGIS 软件访问 COG

“geotiff-to-cog-output” S3 存储桶中的图像已准备就绪,可以使用地理空间分析软件进行高效访问。这篇文章演示了如何 使用之前创建的存储桶的公共版本通过 QGIS 访问 COG 图像。

在存储桶中,复制您想要在 QGIS 中分析的任何 COG 图像的 Amazon S3 网址。

how to grab amazon S3 url

打开 QGIS => 图层 => 数据源映射器 。在 数据源映射器中 ,选择 添加栅格图层 选项卡。在 源类型下 ,选择 协议:HTTP (S)、云等, 然后将 Amazon S3 URL 粘贴到 协议下的 URI 输入框中 。选择 “ 添加” 并关闭 “ 数据源映射器 ”。来自亚马逊 S3 的 COG 图像已在 5-10 秒内加载到 QGIS 中,可供用户分析。如果您更喜欢使用非公有 S3 存储桶,则 QGIS 可以选择输入 亚马逊云科技 证书,以允许 QGIS 访问非公共存储桶内的图像。

how to open cog on qgis

远程使用 COG 需要权衡取舍。使用 COG 时,扫描图像所需的渲染时间略长于已完全下载并在 QGIS 中在本地打开的图像。但是,与必须下载整个非 COG 图像然后将其加载到 QGIS 中相比,COG 能够仅使用 URL 在用户的地理空间软件中快速显示具有明显的速度优势。

正在清理

以下说明用于删除本文中创建的资源:

删除输入/输出 S3 存储桶

  1. 登录 亚马逊云科技 管理控制台并打开 Amazon S3 控制台。
  2. 存储桶 列表中,选择您创建的输入存储分区名称旁边的选项,然后 在页面顶部选择 删除。如果存储桶不为空,则在删除存储桶之前,您必须选择 清空 并在输入字段中提交 “ 永久删除 ”。
  3. 删除存储桶 页面上,通过在文本字段中输入存储桶名称来确认您要删除存储桶,然后选择 删除存储桶
  1. 对输出存储桶重复上述说明。

删除 亚马逊云科技 Lambda 函数

  1. 登录 亚马逊云科技 管理控制台并打开 亚马逊云科技 Lambda 控制台。
  2. 在导航侧栏 中选择 “ 函数”。
  3. 函数 列表中,选择您创建的函数名称旁边的选项,然后 在页面顶部选择 操作。在下拉菜单 中单击 “ 删除”。
  4. 在输入框中输入 “删除”,然后点击 底部的 删除

删除 ECR 存储库

  1. 登录 亚马逊云科技 管理控制台并打开 Amazon ECR 控制台。
  2. 在导航侧栏中选择 存储库
  3. 私有存储库 列表中,选择您创建的存储库名称旁边的选项,然后 在页面顶部选择 删除
  4. 在输入框中输入 “删除”,然后点击 底部的 删除

结论

在这篇文章中,我们演示了一种解决方案,可帮助您 使用 亚马逊云科技 无服务器技术 将图像转换为 COG 。 我们演练了创建必要的输入和输出 S3 存储桶,以及如何构建容器化 Lambda 函数,该函数可由 Amazon S3 的输入触发,从而将这些输入转换为 COG。最后,我们演示了如何使用地理空间分析软件 QGIS 快速远程访问输出 S3 存储桶中的 COG 图像。

通过使用 COG,用户不再需要复制数据。用户可以立即访问大型卫星图像,而不必在本地下载,这可能需要几分钟。用户还可以流式传输他们需要的部分图像,而不是使用整张图像,从而加快处理速度。更快地访问和处理数据的能力可以提高用户的效率和生产力。

感谢您阅读这篇文章。如果您有任何意见或问题,请将其留在评论部分。