VSIS3を使用してS3バケットからGDALのファイルに効率的にアクセスする方法は?


17

そのため、GDALは最近、S3バケットファイルのランダム読み取りを可能にする新しい機能を追加しました。ファイル全体をダウンロードせずに、画像の複数のタイルからGDAL画像をトリミングしようとしています。GDALを使用してS3バケットを設定およびアクセスする方法に関する非常にまばらなドキュメントしか見ていませんが、開始方法について少し混乱していますか?この目標を達成するために、GDALの仮想ファイルシステムをどのように設定するかについて、非常に短い例/チュートリアルを提供してくれる人がいますか?ソリューションでPythonを使用したスクリプト作成が許可されている場合、ボーナスポイント!

明確にするために、すでにPythonでそれを行っています。Pythonの問題は、画像全体をダウンロードして操作する必要があることです。GDALの最新バージョンでは、S3バケットのマウントがサポートされているため、画像のごく一部をトリミングする必要がある場合、その小さな部分を直接操作できます。残念ながら、この機能は1月に安定版ブランチでのみリリースされたため、ドキュメントは見つかりませんでした。そのため、ソリューションでは、GDALの最新リリースのVSI3システムを使用するか、システムをスマートに使用して、ユーザーがイメージ全体をEBSドライブにダウンロードして操作する必要がないようにします。

つまり、GDALの最新バージョンにあるVSI APIを使用する回答に対して賞金が授与されるため、ファイル全体をメモリまたはディスクに読み込む必要はありません。また、使用するバケットは常に公開されているわけではないため、投稿されるHTTPトリックの多くは、多くの状況で機能しません。



S3 /バケットの経験はありませんが、この投稿は興味深いかもしれません:link。同様に使用(?)
cm1

@ cm1ありがとう、ドキュメントはこれまでのところ最高の助けになっています。
スカイライオン

それを聞いてうれしい。これはあなたが尋ねた素晴らしい質問だと思います。私は注意深く見ています。あなた/他の人が解決し、ここに素晴らしい解決策を投稿することを願っています!
cm1

回答:


18

GDALで何かが特に適切に文書化されていない場合、テストを調べることが役立つことがあります。

/vsis3テストモジュールは、それが実際に読んチャンクのいずれかの例を持っていませんが、いくつかの簡単な例があります。

テストモジュールに基づいて以下のコードを作成しましたが、GDAL / vsis3に認証情報が必要であり、AWSアカウントがないため、テストできません。

"""This should read from the Sentinal-2 public dataset
   More info - http://sentinel-pds.s3-website.eu-central-1.amazonaws.com"""

from osgeo import gdal
import numpy as np

# These only need to be set if they're not already in the environment,
# ~/.aws/config, or you're running on an EC2 instance with an IAM role.
gdal.SetConfigOption('AWS_REGION', 'eu-central-1')
gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', 'MY_AWS_SECRET_ACCESS_KEY')
gdal.SetConfigOption('AWS_ACCESS_KEY_ID', 'MY_AWS_ACCESS_KEY_ID')
gdal.SetConfigOption('AWS_SESSION_TOKEN', 'MY_AWS_SESSION_TOKEN')

# 'sentinel-pds' is the S3 bucket name
path = '/vsis3/sentinel-pds/tiles/10/S/DG/2015/12/7/0/B01.jp2'
ds = gdal.Open(path)

band = ds.GetRasterBand(1)

xoff, yoff, xcount, ycount = (0, 0, 10, 10)
np_array = band.ReadAsArray(xoff, yoff, xcount, ycount)

1
Wootは魅力のように機能します!コマンドラインbtwからのトリミングの例を次に示します。gdal_translate --config AWS_REGION "some_region" --config AWS_ACCESS_KEY_ID "KEY_ID" --config AWS_SECRET_ACCESS_KEY "ACCESS_KEY" \ -srcwin 000 000 1000 1000 \ "/vsis3/bucket/file.ext" from_s3.tif
スカイライオン

あなたが隠したこれらの価値観はどのようなものですか?KEY_IDはユーザー名のような短いテキスト文字列だと思います。ACCESS_KEYとは何ですか?それはペムファイルにあるもののようですが、それは約1000文字ですので、それは何か他のものに違いありません。
ソルクス

これらは、ユーザー名とパスワードのような数字と文字を含む文字列になります。AWSでIAMロールを設定することでこれらの文字列を取得できます
-RutgerH

9

以来/vsis3/、あなたも使用することができますGDALで実装されrasterioS3のデータセットのWindowsのを読み取ること。これには、boto用に資格情報を設定するか、rasterios AWSセッションハンドラーを使用する必要があります。

import rasterio

with rasterio.open('s3://landsat-pds/L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B1.TIF') as ds:
    window = ds.read(window=((0, 100), (0, 100)))  # read a 100 by 100 window in the upper left corner.

rasterios windowed -rwおよびVSI docs も参照してください。


1

XMLファイルを使用してWMS情報を保存してみてください。詳細については、GDAL WMSドキュメントを参照してください。

MapzenのElevation APIからデータを取得するWMS XMLファイルの例を次に示します。

<GDAL_WMS>
  <Service name="TMS">
    <ServerUrl>https://s3.amazonaws.com/elevation-tiles-prod/geotiff/${z}/${x}/${y}.tif</ServerUrl>
  </Service>
  <DataWindow>
    <UpperLeftX>-20037508.34</UpperLeftX>
    <UpperLeftY>20037508.34</UpperLeftY>
    <LowerRightX>20037508.34</LowerRightX>
    <LowerRightY>-20037508.34</LowerRightY>
    <TileLevel>14</TileLevel>
    <TileCountX>1</TileCountX>
    <TileCountY>1</TileCountY>
    <YOrigin>top</YOrigin>
  </DataWindow>
  <Projection>EPSG:3857</Projection>
  <BlockSizeX>512</BlockSizeX>
  <BlockSizeY>512</BlockSizeY>
  <BandsCount>1</BandsCount>
  <DataType>Int16</DataType>
  <ZeroBlockHttpCodes>403,404</ZeroBlockHttpCodes>
  <DataValues>
    <NoData>-32768</NoData>
  </DataValues>
  <Cache/>
</GDAL_WMS>

次に、次のように境界ボックスにクリップできます。

gdalwarp -of "GTiff" -te -13648825.0817 4552130.7825 -13627575.5878 4565507.2624 mapzen_wms.xml test.tif

これは便利な答えですが、メタデータは既に同様の方法でキャッシュされていますが、VSI APIを使用して大きな画像の小さな部分をすばやく切り取る方法を知りたいです。
スカイライオン

Mapzen APIエンドポイントがタイル化されたWMSであるかどうかは定かではありませんが、上記のコードは1分以内に実行されました。VSIAPIの方が高速になりますか?
-clhenrick

非常に大きなラスターと大きなラスターデータセットを使用しているため、ボトルネックは間違いなくIOです。また、使用するバケットはプライベートであり、資格情報が必要です。つまり、S3 http APIを使用しても機能しません。すべての画像を読む必要があるのではなく、非常に大きな画像のごく一部をクラップする必要があることを知っているのです。
スカイライオン

0

S3バケットについてはあまり知りませんが、http RESTサービスを使用した認証を備えたクラウドストレージドライブのようです。つまり、通常のマウントポイントとして、関連付けられたURIとともに使用できます。

画像/ラスターの一部をトリミングする場合、ファイルは適切な形式である必要があります。

TMS仕様をご覧ください http://wiki.osgeo.org/wiki/Tile_Map_Service_Specificationをご覧ください

(おそらく、netCDFもこのトリックを実行できます。)

GDALは、TMS形式の読み取りと書き込みも行います。基本的には、いくつかのメタデータファイルを含む標準のディレクトリ構造にすぎません。

ここでの秘driverは、TMSドライバーを介して地理的範囲パラメーターを使用してURLをオンザフライで作成することです。

OpenLayers TMSドライバーのドキュメント をご覧ください:http : //dev.openlayers.org/docs/files/OpenLayers/Layer/TMS-js.html場所、ズーム、範囲に基づいてリクエストを処理する方法を確認するには。

もちろん、Pythonで実行できます。まず、viscurlを使用して適切な「マウントポイント」(またはパス)URIを作成し(ドキュメントに従って)、その後、TMS仕様(パスの拡張)に従って特定のタイルにマウントします。 。


PythonでS3インターフェイスを使用することと区別するために、いくつかの説明を追加しました。
スカイライオン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.