Bagaimana cara mengakses file dengan GDAL secara efisien dari bucket S3 menggunakan VSIS3?

18

Jadi, GDAL baru- baru ini menambahkan fitur baru yang memungkinkan pembacaan acak file bucket S3. Saya ingin memotong gambar GDAL dari beberapa ubin gambar tanpa harus mengunduh seluruh file. Saya hanya melihat dokumentasi yang sangat jarang tentang cara mengkonfigurasi dan mengakses ember S3 melalui GDAL dan saya sedikit bingung tentang bagaimana memulainya? Apakah seseorang akan berbaik hati untuk memberikan contoh / tutorial yang sangat singkat tentang bagaimana seseorang akan mengatur sistem file virtual untuk GDAL untuk mencapai tujuan ini? Poin bonus jika solusi Anda memungkinkannya dituliskan melalui Python!

Untuk memperjelas: Kami sudah melakukannya dengan Python. Masalah dengan Python adalah Anda harus mengunduh seluruh gambar untuk mengoperasikannya. Versi terbaru GDAL memiliki dukungan untuk memasang bucket S3 sehingga jika kita perlu mengatakan pemangkasan sebagian kecil dari gambar, kita dapat beroperasi secara langsung pada bagian yang lebih kecil itu. Sayangnya, karena fitur ini baru dirilis pada cabang stabil pada bulan Januari, saya belum menemukan dokumentasi apa pun tentangnya. Jadi solusinya harus menggunakan sistem VSI3 dalam rilis terbaru GDAL atau dengan cerdas menggunakan sistem untuk mencegah pengguna dari perlu mengunduh seluruh gambar ke drive EBS untuk beroperasi di atasnya.

Artinya hadiah akan diberikan untuk menjawab yang menggunakan VSI API yang ditemukan di versi terbaru GDAL sehingga seluruh file tidak perlu dibaca ke dalam memori atau disk. Selain itu, kami, keranjang yang kami gunakan tidak selalu publik sehingga banyak trik HTTP yang diposting tidak akan berfungsi di banyak situasi kami.

Skylion
sumber
Tidak ada pengalaman dengan S3 / keranjang, tetapi pos ini mungkin menarik: tautan . Digunakan dengan cara yang sama (?)
cm1
@ cm1 Terima kasih, dokumentasi itu sejauh ini merupakan bantuan terbaik.
Skylion
Senang mendengarnya. Saya pikir ini adalah pertanyaan besar yang Anda tanyakan dan saya perhatikan dengan seksama. Semoga Anda / orang lain menyelesaikan dan mengirim solusi yang bagus di sini!
cm1

Jawaban:

18

Saya telah menemukan ketika ada sesuatu yang tidak terdokumentasi dengan baik di GDAL, yang melihat melalui tes mereka dapat berguna.

The /vsis3uji modul memiliki beberapa contoh sederhana, meskipun tidak memiliki contoh benar-benar membaca potongan.

Saya telah menyusun kode di bawah ini berdasarkan modul tes, tetapi saya tidak dapat menguji karena GDAL / vsis3 memerlukan kredensial dan saya tidak memiliki akun 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)
pengguna2856
sumber
2
Woot bekerja seperti pesona! Berikut ini adalah contoh pemangkasan dari baris perintah btw: gdal_translate --config AWS_REGION "some_region" --config AWS_ACCESS_KEY_ID "KEY_ID" --config AWS_SECRET_ACCESS_KEY "ACCESS_KEY" ACCESS_KEY "ACCESS_KEY" \ -srcwin 0003/ 1000/sekarang//sekarang 000 000/1/sekstilaksetelah 1.000/sekarang/sekitar 000 000/sekarang 1000/1000/sekarang/terdapatdengan " from_s3.tif
Skylion
Seperti apa nilai-nilai yang Anda sembunyikan itu? Saya pikir KEY_ID adalah string teks pendek, seperti nama pengguna. Apa itu ACCESS_KEY? Sepertinya itu adalah apa yang ada di file pem tapi itu sekitar 1000 karakter, jadi pasti ada sesuatu yang lain.
Solx
Itu hanya berupa string dengan angka dan huruf seperti nama pengguna dan kata sandi. Anda dapat memperoleh string tersebut dengan menetapkan peran IAM di AWS
RutgerH
10

Karena /vsis3/diimplementasikan dalam GDAL, Anda juga dapat menggunakan rasteriountuk membaca kumpulan data Windows S3. Ini membutuhkan kredensial Anda untuk diatur untuk boto atau menggunakan pengendali sesi AWS rasterios .

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.

Lihat juga rasterios windowed-rw dan VSI docs.

Kersten
sumber
1

Coba gunakan file XML untuk menyimpan info WMS, detail lebih lanjut ada di dokumentasi GDAL WMS .

Berikut adalah contoh file XML WMS untuk mengambil data dari API Elevasi Mapzen:

<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>

Anda kemudian dapat klip ke kotak pembatas seperti:

gdalwarp -of "GTiff" -te -13648825.0817 4552130.7825 -13627575.5878 4565507.2624 mapzen_wms.xml test.tif
clhenrick
sumber
Meskipun ini adalah jawaban yang berguna, kami sudah menumpukan metadata dengan cara yang serupa, tetapi kami ingin tahu cara menggunakan VSI API sehingga kami dapat dengan cepat memotong bagian kecil dari gambar besar.
Skylion
Saya tidak yakin apakah itu karena titik akhir API Mapzen adalah WMS ubin tetapi kode di atas berjalan untuk saya dalam waktu kurang dari satu menit, apakah Anda yakin bahwa VSI API akan lebih cepat?
clhenrick
Kami bekerja dengan raster SANGAT besar dan dataset raster besar, bottleneck jelas adalah IO. Bucket yang kami gunakan bersifat pribadi dan memerlukan kredensial yang berarti menggunakan API S3 http tidak akan berfungsi dalam kasus kami. Bukannya kita harus membaca setiap gambar, tapi kita tahu bahwa kita harus menghabiskan sebagian kecil dari gambar yang sangat besar.
Skylion
0

Saya tidak tahu banyak tentang bucket S3 tetapi tampaknya ini adalah drive penyimpanan cloud dengan otentikasi menggunakan layanan http REST. yaitu dapat digunakan sebagai titik pemasangan biasa, dengan uri terkait.

Jika Anda mencari memotong bagian gambar / raster maka file tersebut harus dalam format yang sesuai.

Lihatlah spesifikasi TMS http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification

(Mungkin netCDF juga bisa melakukan triknya.)

GDAL juga membaca dan menulis format TMS. Pada dasarnya ini hanya struktur direktori standar dengan beberapa file metadata.

Sekarang, triknya adalah membuat url dengan parameter parameter geografis melalui driver TMS.

Lihatlah dokumentasi driver TMS OpenLayers: http://dev.openlayers.org/docs/files/OpenLayers/Layer/TMS-js.html Untuk melihat bagaimana menangani permintaan berdasarkan lokasi, zoom dan luasan.

Tentu saja itu bisa dilakukan dengan Python. Anda pertama-tama perlu membuat URI "titik pemasangan" (atau jalur) yang sesuai dengan viscurl (sesuai dengan dokumentasi) dan kemudian, setelah dipasang pergi ke ubin khusus sesuai dengan spesifikasi TMS (yang merupakan perpanjangan dari jalur) .

Juan
sumber
Saya baru saja menambahkan beberapa klarifikasi untuk membedakannya dari hanya menggunakan antarmuka S3 dengan Python.
Skylion