VSIS3 kullanarak bir S3 grubundan GDAL ile dosyalara verimli bir şekilde nasıl erişilir?


19

GDAL yakın zamanda S3 grup dosyalarının rastgele okunmasına izin veren yeni bir özellik ekledi . Tüm dosyayı indirmek zorunda kalmadan bir görüntünün birden çok döşemesinden GDAL görüntüleri kırpmak için arıyorum. Ben sadece GDAL olsa bir S3 kova yapılandırmak ve erişmek için çok seyrek belgeler gördüm ve nasıl başlar konusunda biraz kafam karıştı? Birisi bu hedefe ulaşmak için GDAL için sanal dosya sistemini nasıl ayarlayacağınız konusunda son derece kısa bir örnek / öğretici sunacak kadar kibar olurdu? Çözümünüz Python ile betiklenmesine izin veriyorsa bonus puan!

Açıklığa kavuşturmak için: Python'da zaten yaptık. Python ile ilgili sorun, görüntüyü onunla çalıştırmak için indirmeniz gerektiğidir. GDAL'ın en yeni sürümü, S3 kovasını monte etmek için desteğe sahiptir, böylece bir görüntünün küçük bir bölümünü kırpmamızı gerekirse, doğrudan o küçük kısımda çalışabiliriz. Ne yazık ki, özellik sadece Ocak ayında istikrarlı dalda yayınlandığı için, üzerinde herhangi bir belge bulamadım. Bu nedenle çözüm, GDAL'ın en yeni sürümünde VSI3 sistemini kullanmalı veya başka bir şekilde kullanıcının tüm görüntüyü üzerinde çalışmak için bir EBS sürücüsüne indirmesini önlemek için sistemi akıllıca kullanmalıdır.

Diğer bir deyişle, GDAL'nin en yeni sürümlerinde bulunan VSI API'lerini kullanan ve tüm dosyanın belleğe veya diske okunmasına gerek kalmayacak şekilde yanıt vermeye ödül verilecektir. Ayrıca, kullandığımız kovalar her zaman herkese açık değiliz, bu nedenle gönderilen HTTP numaralarının çoğu durumumuzda çalışmaz.



S3 / kovalarla ilgili deneyim yok, ancak bu yazı ilginizi çekebilir: bağlantı . Benzer şekilde kullanıldı (?)
cm1

@ cm1 Teşekkür ederiz, bu dokümantasyon şu ana kadar en iyi yardım olmuştur.
Skylion

Duyduğuma sevindim. Bence bu sorduğunuz harika bir soru ve yakından izliyorum. Umarım / diğerleri burada çözer ve güzel bir çözüm gönderir!
cm1

Yanıtlar:


18

GDAL'de bir şey özellikle iyi belgelenmediğinde, testlerine bakmanın yararlı olabileceğini buldum.

/vsis3Test modülü aslında okuma parçaları herhangi örnekler yok gerçi, bazı basit örnekler vardır.

Test modülüne dayalı olarak aşağıdaki kodu bir araya getirdim, ancak GDAL / vsis3 kimlik bilgileri gerektirdiğinden ve AWS hesabım olmadığından test yapamıyorum.

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

2
Woot bir cazibe gibi çalışır! İşte btw komut satırından bir kırpma örneği: 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 "" from_s3.tif
Skylion

Sakladığınız bu değerler neye benziyor? Bence KEY_ID, kullanıcı adı gibi kısa bir metin dizesi. ACCESS_KEY nedir? Bir pem dosyasında olduğu gibi görünüyor, ancak yaklaşık 1000 karakter, bu yüzden başka bir şey olmalı.
Solx

Bunlar sadece bir kullanıcı adı ve şifre gibi rakam ve harflerden oluşan dizeler olacak. Bu dizeleri AWS
RutgerH'da

10

Yana /vsis3/GDAL uygulanan ayrıca kullanabilirsiniz rasterioS3 veri kümelerinin Windows'u okumak için. Bu gerektiriyor ya da kimlik için kurulacak Boto veya rasterios kullanarak oturum yönetimini 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.

Ayrıca bkz. Pencereli rasterios ve VSI belgeleri.


1

WMS bilgilerini saklamak için bir XML dosyası kullanmayı deneyin, daha fazla ayrıntı GDAL WMS belgelerinde bulunmaktadır .

Mapzen Yükseklik API'sından veri almak için örnek bir WMS XML dosyası:

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

Daha sonra sınırlayıcı bir kutuya şu şekilde klipsleyebilirsiniz:

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

Bu yararlı bir yanıt olsa da, meta verileri zaten benzer bir şekilde önbelleğe alıyoruz, ancak büyük görüntülerin küçük kısımlarını hızlı bir şekilde kırpabilmemiz için VSI API'sinin nasıl kullanılacağını bilmek istiyoruz.
Skylion

Mapzen API uç noktası döşeli bir WMS olduğundan emin değilim ama yukarıdaki kod bir dakika içinde benim için koştu, VSI API daha hızlı olacağından emin misiniz?
clhenrick

ÇOK büyük rasterler ve büyük raster veri setleri ile çalışıyoruz darboğaz kesinlikle IO. Ayrıca kullandığımız kovalar özeldir ve S3 http API'sını kullanmak bizim durumumuzda çalışmayacak anlamına gelen kimlik bilgileri gerektirir. Her görüntüyü okumak zorunda değiliz, çok büyük bir görüntünün küçük bir kısmını kesmemiz gerektiğini biliyoruz.
Skylion

0

S3 kovaları hakkında fazla bir şey bilmiyorum ama http REST hizmetlerini kullanarak kimlik doğrulaması olan bir bulut depolama sürücüsü gibi görünüyor. yani ilişkili bir uri ile sıradan bir montaj noktası olarak kullanılabilir.

Görüntülerin / raster parçalarını kırpmak istiyorsanız, dosyanın uygun bir biçimde olması gerekir.

TMS spesifikasyonuna bir göz atın http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification

(Belki de netCDF hile yapabilir.)

GDAL ayrıca TMS formatlarını okur ve yazar. Temel olarak, yalnızca bazı meta veri dosyaları içeren standart bir dizin yapısıdır.

Şimdi, hile TMS sürücüsü aracılığıyla coğrafi kapsam parametreleri ile anında url oluşturmaktır.

OpenLayers TMS sürücü belgelerine bir göz atın: http://dev.openlayers.org/docs/files/OpenLayers/Layer/TMS-js.html Yer, yakınlaştırma ve uzantılara göre istekleri nasıl ele aldığını görmek için.

Tabii ki Python'da yapılabilir. Önce viscurl ile uygun "montaj noktası" (veya yol) URI'sini oluşturmanız gerekir (belgelere göre) ve daha sonra, monte edildikten sonra TMS spesifikasyonuna göre (yolun bir uzantısı olan) belirli döşemeye gidin .


Sadece Python'daki S3 arayüzünü kullanmaktan ayırmak için bazı açıklamalar ekledim.
Skylion
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.