Làm cách nào để truy cập hiệu quả các tệp với GDAL từ nhóm S3 bằng VSIS3?


17

Vì vậy, GDAL gần đây đã thêm một tính năng mới cho phép đọc ngẫu nhiên các tệp nhóm S3. Tôi đang tìm cách cắt ảnh GDAL từ nhiều ô của ảnh mà không phải tải xuống toàn bộ tệp. Tôi chỉ thấy tài liệu rất thưa thớt về cách định cấu hình và truy cập nhóm S3 mặc dù GDAL và hơi bối rối về cách bắt đầu? Ai đó có đủ tử tế để cung cấp một ví dụ / hướng dẫn cực kỳ ngắn về cách người ta sẽ thiết lập hệ thống tệp ảo cho GDAL để thực hiện mục tiêu này không? Phần thưởng nếu giải pháp của bạn cho phép nó được viết kịch bản thông qua Python!

Để làm rõ: Chúng tôi đã thực hiện nó trong Python. Vấn đề với Python là bạn phải tải xuống toàn bộ hình ảnh để vận hành nó. Phiên bản mới nhất của GDAL có hỗ trợ gắn thùng S3 để nếu chúng ta cần cắt một phần nhỏ của hình ảnh, chúng ta có thể thao tác trực tiếp trên phần nhỏ hơn đó. Than ôi, vì tính năng chỉ được phát hành trên nhánh ổn định vào tháng 1, tôi không tìm thấy bất kỳ tài liệu nào về nó. Vì vậy, giải pháp nên sử dụng hệ thống VSI3 trong bản phát hành GDAL mới nhất hoặc sử dụng hệ thống một cách thông minh để ngăn người dùng không cần tải toàn bộ hình ảnh xuống ổ EBS để hoạt động trên nó.

Điều đó có nghĩa là tiền thưởng sẽ được trao để trả lời sử dụng API VSI được tìm thấy trong các phiên bản mới nhất của GDAL để toàn bộ tệp không cần phải đọc vào bộ nhớ hoặc đĩa. Ngoài ra, chúng tôi các nhóm chúng tôi sử dụng không phải lúc nào cũng công khai nên nhiều thủ thuật HTTP được đăng sẽ không hoạt động trong nhiều tình huống của chúng tôi.



Chưa có kinh nghiệm với S3 / xô, nhưng bài đăng này có thể được quan tâm: liên kết . Được sử dụng tương tự (?)
cm1

@ cm1 Cảm ơn bạn, tài liệu đó đã được trợ giúp tốt nhất cho đến nay.
Skylion

Vui mừng khi nghe nó. Tôi nghĩ rằng đây là một câu hỏi tuyệt vời mà bạn đã hỏi và tôi đang theo dõi chặt chẽ. Hy vọng bạn / người khác giải quyết và đăng một giải pháp tốt đẹp ở đây!
cm1

Câu trả lời:


18

Tôi đã tìm thấy khi một cái gì đó không đặc biệt được ghi lại trong GDAL, rằng xem qua các thử nghiệm của họ có thể hữu ích.

Các /vsis3mô-đun kiểm tra có một số ví dụ đơn giản, mặc dù nó không có bất kỳ ví dụ về khối thực sự đọc.

Tôi đã ghép mã dưới đây dựa trên mô-đun thử nghiệm, nhưng tôi không thể kiểm tra vì GDAL / vsis3 yêu cầu thông tin xác thực và tôi không có tài khoản 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 hoạt động như một nét duyên dáng! Dưới đây là một ví dụ cắt xén từ dòng lệnh btw: gdal_translate --config AWS_REGION "some_region" --config AWS_ACCESS_KEY_ID "KEY_ID" --config AWS_SECRET_ACCESS_KEY "ACCESS_KEY" from_s3.tif
Skylion

Những giá trị mà bạn giấu trông như thế nào? Tôi nghĩ KEY_ID là một chuỗi văn bản ngắn, giống như tên người dùng. ACCESS_KEY là gì? Có vẻ như đó là những gì trong một tệp pem nhưng đó là khoảng 1000 ký tự, vì vậy nó phải là một cái gì đó khác.
Solx

Đó sẽ chỉ là những chuỗi có số và chữ cái giống như tên người dùng và mật khẩu. Bạn có thể có được các chuỗi đó bằng cách đặt các vai trò IAM trong AWS
RutgerH

9

/vsis3/được triển khai trong GDAL, bạn cũng có thể sử dụng rasteriođể đọc bộ dữ liệu Windows của S3. Điều này đòi hỏi thông tin đăng nhập của bạn phải được thiết lập cho boto hoặc sử dụng trình xử lý phiên AWS của 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.

Xem thêm rasterios windowed-rw và tài liệu VSI .


1

Hãy thử sử dụng tệp XML để lưu trữ thông tin WMS, chi tiết hơn có tại tài liệu GDAL WMS .

Dưới đây là ví dụ về tệp WMS XML để truy xuất dữ liệu từ API Độ cao của 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>

Sau đó, bạn có thể cắt vào một hộp giới hạn như vậy:

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

Mặc dù đây là một câu trả lời hữu ích, chúng tôi đã lưu trữ siêu dữ liệu theo cách tương tự, nhưng chúng tôi muốn biết cách sử dụng API VSI để có thể nhanh chóng cắt các phần nhỏ của hình ảnh lớn.
Skylion

Tôi không chắc chắn nếu đó là vì điểm cuối API Mapzen là WMS được xếp chồng nhưng đoạn mã trên đã chạy cho tôi trong vòng một phút, bạn có chắc chắn rằng API VSI sẽ nhanh hơn không?
clhenrick

Chúng tôi đang làm việc với Raster lớn và bộ dữ liệu raster lớn, nút cổ chai chắc chắn là IO. Ngoài ra, các nhóm chúng tôi sử dụng là riêng tư và yêu cầu thông tin xác thực có nghĩa là sử dụng API S3 http sẽ không hoạt động trong trường hợp của chúng tôi. Không phải là chúng ta phải đọc mọi hình ảnh, mà chúng ta biết rằng chúng ta phải làm hỏng một phần nhỏ của một hình ảnh rất lớn.
Skylion

0

Tôi không biết nhiều về các thùng S3 nhưng có vẻ như đó là ổ lưu trữ đám mây có xác thực bằng các dịch vụ http REST. tức là có thể được sử dụng như một điểm gắn kết thông thường, với một uri liên quan.

Nếu bạn đang tìm kiếm các phần cắt xén của hình ảnh / raster thì tệp cần phải ở định dạng phù hợp.

Hãy xem đặc tả TMS http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification

(Có lẽ netCDF cũng có thể thực hiện thủ thuật.)

GDAL cũng đọc và viết các định dạng TMS. Về cơ bản nó chỉ là một cấu trúc thư mục tiêu chuẩn với một số tệp siêu dữ liệu.

Bây giờ, mẹo là tạo ra các url với các tham số phạm vi địa lý thông qua trình điều khiển TMS.

Hãy xem tài liệu trình điều khiển TMS của OpenLayers: http://dev.openlayers.org/docs/files/OpenLayers/Layer/TMS-js.html Để xem cách nó xử lý các yêu cầu dựa trên vị trí, thu phóng và phạm vi.

Tất nhiên nó có thể được thực hiện bằng Python. Trước tiên, bạn cần tạo URI "điểm gắn" (hoặc đường dẫn) thích hợp bằng viscurl (theo tài liệu) và sau đó, một khi được gắn vào ô cụ thể theo thông số TMS (là phần mở rộng của đường dẫn) .


Tôi vừa thêm một số giải thích để phân biệt với việc chỉ sử dụng giao diện S3 trong Python.
Skylion
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.