VSIS3를 사용하여 S3 버킷에서 GDAL로 파일에 효율적으로 액세스하는 방법은 무엇입니까?


19

따라서 GDAL은 최근 S3 버킷 파일을 임의로 읽을 수 있는 새로운 기능 을 추가했습니다 . 전체 파일을 다운로드하지 않고 이미지의 여러 타일에서 GDAL 이미지를 자르려고합니다. GDAL을 통해 S3 버킷을 구성하고 액세스하는 방법에 대한 매우 드문 문서 만 보았으며 시작 방법에 대해 약간 혼란 스럽습니까? 이 목표를 달성하기 위해 GDAL의 가상 파일 시스템을 설정하는 방법에 대해 매우 짧은 예 / 자습을 제공 할 수있는 사람이 있습니까? 솔루션에서 Python을 통해 스크립트를 작성할 수있는 경우 보너스 pt!

명확히하기 위해 : 우리는 이미 파이썬으로했습니다. 파이썬의 문제는 전체 이미지를 다운로드하여 작동시켜야한다는 것입니다. 최신 버전의 GDAL은 S3 버킷 마운트를 지원하므로 이미지의 작은 부분을 자르려면 작은 부분에서 직접 작업 할 수 있습니다. 아아,이 기능은 1 월 안정적인 지점에서만 릴리스되었으므로 관련 문서를 찾지 못했습니다. 따라서 솔루션은 최신 GDAL 릴리스에서 VSI3 시스템을 사용하거나 시스템을 스마트하게 사용하여 사용자가 전체 이미지를 EBS 드라이브로 다운로드하여 작동하지 않도록해야합니다.

즉, 전체 파일을 메모리 나 디스크로 읽을 필요가 없도록 최신 버전의 GDAL에있는 VSI API를 사용하는 현상금에 현상금이 수여됩니다. 또한 우리가 사용하는 버킷은 항상 공개되지 않으므로 게시되는 많은 HTTP 트릭은 많은 상황에서 작동하지 않습니다.



S3 / 버킷에 대한 경험이 없지만이 게시물에 관심이있을 수 있습니다 : link . 비슷하게 (?)
cm1

@ cm1 감사합니다. 지금까지 설명서가 가장 도움이되었습니다.
Skylion

그것을 듣고 기뻐. 나는 이것이 당신이 요청한 좋은 질문이라고 생각하며 자세히 지켜보고 있습니다. 당신 / 다른 사람들이 여기에 좋은 해결책을 해결하고 게시하기를 바랍니다!
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)

2
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 \ "/vsis3/bucket/file.ext" from_s3.tif
Skylion

숨겨둔 그 가치는 어떻게 생겼습니까? KEY_ID는 사용자 이름과 같은 짧은 텍스트 문자열이라고 생각합니다. ACCESS_KEY 란 무엇입니까? 그것은 pem 파일에있는 것처럼 보이지만 약 1000 자이므로 다른 것이어야합니다.
Solx 2019

그것들은 사용자 이름 및 암호와 같은 숫자와 문자가있는 문자열 일뿐입니다. AWS에서 IAM 역할을 설정하여 이러한 문자열을 얻을 수 있습니다.
RutgerH

10

이후 /vsis3/GDAL에 구현 당신은 또한 사용할 수 있습니다 rasterioS3 데이터 세트의 윈도우를 읽을 수 있습니다. 이를 위해서는 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-rwVSI 문서 도 참조하십시오 .


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를 사용하는 방법을 알고 큰 이미지의 작은 부분을 빠르게자를 수 있습니다.
Skylion

Mapzen API 끝 점이 타일 WMS이기 때문에 확실하지 않지만 위의 코드가 1 분 안에 실행되었습니다 .VSI API가 더 빠를 것이라고 확신합니까?
clhenrick

우리는 병목 현상이 확실히 IO 인 매우 큰 래스터 및 큰 래스터 데이터 세트로 작업하고 있습니다. 또한 우리가 사용하는 버킷은 비공개이며 S3 http API를 사용하는 자격 증명이 필요합니다. 모든 이미지를 읽을 필요는 없으며, 매우 큰 이미지의 작은 부분을 긁어 야한다는 것을 알고 있습니다.
스카이 리온

0

S3 버킷에 대해서는 잘 모르지만 http REST 서비스를 사용하여 인증을받은 클라우드 스토리지 드라이브 인 것 같습니다. 즉, 관련 uri와 함께 일반적인 장착 지점으로 사용될 수 있습니다.

이미지 / 래스터의 일부를 자르려면 파일이 적절한 형식이어야합니다.

TMS 사양 http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification을 살펴보십시오 .

(아마 netCDF도 트릭을 수행 할 수 있습니다.)

또한 GDAL은 TMS 형식을 읽고 씁니다. 기본적으로 일부 메타 데이터 파일이있는 표준 디렉토리 구조 일뿐입니다.

이제 TMS 드라이버를 통해 지리적 범위 매개 변수를 사용하여 URL을 즉석에서 작성하는 것이 요령입니다.

OpenLayers TMS 드라이버 문서 를 참조하십시오 . http://dev.openlayers.org/docs/files/OpenLayers/Layer/TMS-js.html 위치, 확대 / 축소 및 범위에 따라 요청을 처리하는 방법을 확인하십시오.

물론 파이썬으로도 가능합니다. 먼저 viscurl을 사용하여 (문서에 따라) 적절한 "마운트 포인트"(또는 경로) URI를 생성 한 다음 TMS 사양 (경로의 확장)에 따라 특정 타일로 이동합니다. .


파이썬에서 S3 인터페이스를 사용하는 것과 구별하기 위해 약간의 설명을 추가했습니다.
Skylion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.