如何通过 Flask 应用程序在 Python 中使用 GDAL 打开远程文件

How to open a remote file with GDAL in Python through a Flask application

所以,我正在开发一个使用 GDAL 库的 Flask 应用程序,我想在其中通过 url.

流式传输 .tif 文件

现在我有使用gdal.Open(文件路径)读取.tif 文件的方法。当 运行 在 Flask 环境之外时(比如在 Python 控制台中),它可以通过指定本地文件的文件路径和 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

但是,当在 Flask 环境中执行以下代码时,我收到以下消息: 错误 4:“http://xxxxxxx.blob.core.windows.net/dsm/DSM_1km_6349_614.tif”确实 文件系统中不存在, 并且未被识别为受支持的数据集名称。

如果我改为将文件下载到 Flask 应用程序的本地文件系统,并插入文件路径,如下所示:

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)

效果很好... 问题是,由于我请求一些大文件 (200 mb),我想使用 url 而不是本地文件引用来流式传输文件。

有没有人知道是什么原因造成的?我还尝试按照其他地方的建议将“/vsicurl_streaming/”放在 url 前面。

我正在使用 Python 2.7,32 位 GDAL 2.0.2

请尝试以下代码片段:

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

它使用 GDAL 内存映射文件直接将通过 HTTP 检索的图像作为 NumPy 数组打开,而不保存到临时文件。 有关详细信息,请参阅 https://gist.github.com/jleinonen/5781308