2016-07-13 41 views
0

Also, ich entwickle eine Flask-Anwendung, die die GDAL-Bibliothek verwendet, wo ich eine .tif-Datei durch eine URL streamen möchte.Wie öffne ich eine Remote-Datei mit GDAL in Python durch eine Flask-Anwendung

Im Moment habe ich eine Methode, die eine .tif-Datei mit gdal.Open (Dateipfad) liest. Wenn es außerhalb der Flask-Umgebung (wie in einer Python-Konsole) ausgeführt wird, funktioniert es sowohl durch Angabe des Dateipfads zu einer lokalen Datei als auch durch eine URL.

from gdalconst import GA_ReadOnly 
import gdal 
filename = 'http://xxxxxxx.blob.core.windows.net/dsm/DSM_1km_6349_614.tif' 
dataset = gdal.Open(filename, GA_ReadOnly) 
if dataset is not None: 
    print 'Driver: ', dataset.GetDriver().ShortName,'/', \ 
     dataset.GetDriver().LongName 

Wenn jedoch der folgende Code im Inneren des Kolbens environement ausgeführt wird, erhalte ich die folgende Meldung: ERROR 4: `http://xxxxxxx.blob.core.windows.net/dsm/DSM_1km_6349_614.tif 'ist nicht im Dateisystem vorhanden ist, und nicht als unterstützt anerkannt Dateiname.

Wenn ich stattdessen die Datei auf das lokale Dateisystem des App Flask herunterladen und den Pfad die Datei einfügen, wie folgt aus:

block_blob_service = get_blobservice() #Initialize block service 
block_blob_service.get_blob_to_path('dsm', blobname, filename) # Get blob to local filesystem, path to file saved in filename 
dataset = gdal.Open(filename, GA_ReadOnly) 

Das funktioniert gut ... Die Sache ist, da Ich fordere einige große Dateien (200 MB), ich möchte die Dateien mit der URL statt der lokalen Dateiverweis streamen.

Hat jemand eine Idee von was könnte dies verursachen? Ich habe auch versucht, "/ vsicurl_streaming /" vor die URL zu setzen, wie an anderer Stelle vorgeschlagen.

Ich verwende Python 2.7, 32-Bit mit GDAL 2.0.2

Antwort

2

Bitte versuchen Sie die Folge Code-Schnipsel:

from gzip import GzipFile 
from io import BytesIO 
import urllib2 
from uuid import uuid4 
from gdalconst import GA_ReadOnly 
import gdal 

def open_http_query(url): 
    try: 
     request = urllib2.Request(url, 
      headers={"Accept-Encoding": "gzip"}) 
     response = urllib2.urlopen(request, timeout=30) 
     if response.info().get('Content-Encoding') == 'gzip': 
      return GzipFile(fileobj=BytesIO(response.read())) 
     else: 
      return response 
    except urllib2.URLError: 
     return None 


url = 'http://xxx.blob.core.windows.net/container/example.tif' 
image_data = open_http_query(url) 
mmap_name = "/vsimem/"+uuid4().get_hex() 
gdal.FileFromMemBuffer(mmap_name, image_data.read()) 
dataset = gdal.Open(mmap_name) 
if dataset is not None: 
    print 'Driver: ', dataset.GetDriver().ShortName,'/', \ 
     dataset.GetDriver().LongName 

, die eine GDAL Memory-Mapped-Datei verwenden, um ein Bild zu öffnen abgerufen über HTTP direkt als NumPy-Array ohne Speichern in eine temporäre Datei. Weitere Informationen finden Sie unter https://gist.github.com/jleinonen/5781308.

+0

Dank Gary, das funktioniert wie ein Charme! – thallium

+0

Für zukünftige Besucher: Ich sollte beachten, dass dieses Update scheint nicht mit Dateien der Erweiterung .ECW zu arbeiten. – thallium