वीएसआईएस 3 का उपयोग करके S3 बाल्टी से GDAL के साथ फ़ाइलों को कुशलतापूर्वक एक्सेस कैसे करें?


19

इसलिए, GDAL ने हाल ही में एक नई सुविधा जोड़ी है जो S3 बाल्टी फ़ाइलों के यादृच्छिक पढ़ने की अनुमति देता है। मैं पूरी फाइल को डाउनलोड किए बिना एक छवि के कई टाइल्स से GDAL छवियों को क्रॉप करना चाहता हूं। मैंने केवल बहुत ही विरल प्रलेखन देखा है कि कैसे एक S3 बाल्टी को कॉन्फ़िगर और एक्सेस करना है हालांकि GDAL और मैं कैसे शुरू करने पर थोड़ा भ्रमित हूं? क्या कोई व्यक्ति इस लक्ष्य को पूरा करने के लिए GDAL के लिए वर्चुअल फ़ाइल सिस्टम की स्थापना के बारे में एक अत्यंत संक्षिप्त उदाहरण / ट्यूटोरियल प्रदान करने के लिए पर्याप्त होगा? यदि आपका समाधान पायथन के माध्यम से स्क्रिप्ट करने की अनुमति देता है तो बोनस पीटीएस!

स्पष्ट करने के लिए: हम पहले ही पाइथन में कर चुके हैं। पायथन के साथ मुद्दा यह है कि आपको इसे संचालित करने के लिए पूरी छवि डाउनलोड करनी होगी। GDAL के नवीनतम संस्करण में S3 बाल्टी को बढ़ाने के लिए समर्थन है ताकि अगर हमें फसल को छवि का एक छोटा सा हिस्सा कहने की आवश्यकता हो, तो हम सीधे उस छोटे हिस्से पर काम कर सकते हैं। काश, जैसा कि फीचर केवल जनवरी में स्थिर शाखा पर जारी किया गया था, मुझे इस पर कोई दस्तावेज नहीं मिला। इसलिए समाधान को GDAL की नवीनतम रिलीज़ में VSI3 सिस्टम का उपयोग करना चाहिए या अन्यथा उपयोगकर्ता को उस पर कार्य करने के लिए संपूर्ण छवि को EBS ड्राइव में डाउनलोड करने की आवश्यकता को रोकने के लिए स्मार्टली सिस्टम का उपयोग करता है।

यह कहना है कि इनाम को GDAL के नवीनतम संस्करणों में पाए गए VSI APIs का उपयोग करने वाले उत्तर के लिए दिया जाएगा ताकि पूरी फ़ाइल को मेमोरी या डिस्क में पढ़ने की आवश्यकता न हो। इसके अलावा, हम जिन बकेट्स का उपयोग करते हैं, वे हमेशा सार्वजनिक नहीं होते हैं इसलिए पोस्ट की जा रही कई HTTP ट्रिक्स हमारी कई स्थितियों में काम नहीं करेंगी।



S3 / बकेट के साथ कोई अनुभव नहीं है, लेकिन यह पोस्ट ब्याज की हो सकती है: लिंक । इसी तरह (?)
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)

2
वूट एक आकर्षण की तरह काम करता है! यहाँ कमांड लाइन btw से एक उदाहरण है from_s3.tif
Skylion

आप उन मूल्यों को क्या छिपाते हैं जो दिखते हैं? मुझे लगता है कि KEY_ID एक उपयोगकर्ता नाम की तरह एक छोटा पाठ स्ट्रिंग है। ACCESS_KEY क्या है? ऐसा लगता है कि यह एक पेम फ़ाइल में है, लेकिन यह लगभग 1000 अक्षर है, इसलिए यह कुछ और होना चाहिए।
21

वे केवल एक उपयोगकर्ता नाम और पासवर्ड की तरह संख्याओं और अक्षरों के साथ तार होंगे। AWS
RutgerH

10

चूंकि /vsis3/GDAL में लागू किया गया है आप rasterioS3 डेटासेट के विंडोज को पढ़ने के लिए भी उपयोग कर सकते हैं । इसके लिए या तो आपके क्रेडेंशियल्स को बोटो के लिए सेट करना होगा या रैस्टरियोस एडब्ल्यूएस सेशन हैंडलर का उपयोग करना होगा ।

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 को विंडो-आरडब्ल्यू और VSI डॉक्स भी देखें ।


1

WMS जानकारी को संग्रहीत करने के लिए XML फ़ाइल का उपयोग करने का प्रयास करें, अधिक विवरण GDAL WMS प्रलेखन में हैं

Mapzen की एलिवेशन 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

हालांकि यह एक उपयोगी उत्तर है, हम पहले से ही मेटाडेटा को एक समान तरीके से कैश करते हैं, लेकिन हम जानना चाहते हैं कि वीएसआई एपीआई का उपयोग कैसे करें ताकि हम बड़ी छवियों के छोटे हिस्से को जल्दी से क्रॉप कर सकें।
स्काईलियन जूल

मैं निश्चित नहीं हूं कि यह इसलिए है क्योंकि Mapzen API एंडपॉइंट एक टाइल वाला WMS है, लेकिन उपरोक्त कोड एक मिनट के भीतर मेरे लिए चला गया, क्या आप सुनिश्चित हैं कि VSI API कोई तेज़ होगा?
क्लेरिक जूल

हम बहुत बड़े रैस्टर्स के साथ काम कर रहे हैं और बड़े रैस्टर डेटासेट में अड़चन निश्चित रूप से आईओ है। इसके अलावा, हम जिस बाल्टी का उपयोग करते हैं वह निजी होती है और हमारे मामले में S3 http API का उपयोग करने के लिए क्रेडेंशियल्स की आवश्यकता होती है। ऐसा नहीं है कि हमें हर छवि को पढ़ना है, यह है कि हम जानते हैं कि हमें एक बहुत बड़ी छवि के एक छोटे से हिस्से को बकवास करना है।
स्काईलियन

0

मुझे S3 बाल्टियों के बारे में ज्यादा जानकारी नहीं है, लेकिन ऐसा लगता है कि यह HTTP रेस्ट सेवाओं का उपयोग करके प्रमाणीकरण के साथ क्लाउड स्टोरेज ड्राइव है। यानी संबंधित यूरिया के साथ एक सामान्य बढ़ते बिंदु के रूप में इस्तेमाल किया जा सकता है।

यदि आप छवियों / रेखापुंज के कुछ हिस्सों की तलाश कर रहे हैं, तो फ़ाइल को एक उचित प्रारूप में होना चाहिए।

TMS विनिर्देश पर एक नज़र डालें http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification

(शायद netCDF भी चाल कर सकता है।)

GDAL टीएमएस फॉर्मेट को भी पढ़ता और लिखता है। मूल रूप से यह केवल कुछ मेटाडेटा फ़ाइलों के साथ एक मानक निर्देशिका संरचना है।

अब, टीएमएस चालक के माध्यम से भौगोलिक सीमा के मापदंडों के साथ उड़ने के लिए यूआरएल बनाने की चाल है।

OpenLayers TMS ड्राइवर प्रलेखन पर एक नज़र डालें: http://dev.openlayers.org/docs/files/OpenLayers/Layer/TMS-js.html यह देखने के लिए कि यह स्थान, ज़ूम और एक्सटेंशन के आधार पर अनुरोधों को कैसे संभालता है।

बेशक यह पायथन में किया जा सकता है। आपको पहले उपयुक्त "माउंटिंग-पॉइंट" (या पथ) बनाने की आवश्यकता है, जिसमें UCR विस्कोर्ल (डॉक्यूमेंटेशन के अनुसार) है और फिर, एक बार TMS विनिर्देशन के अनुसार विशिष्ट टाइल पर जाएँ (जो पथ का विस्तार है) ।


मैंने अभी-अभी पायथन में S3 इंटरफ़ेस का उपयोग करके इसे अलग करने के लिए कुछ स्पष्टीकरण जोड़े हैं।
Skylion
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.