所以,我正在开发一个使用GDAL库的Flask应用程序,我希望通过URL流式传输.tif文件。
现在我有使用gdal.Open(filepath)读取.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 environement中执行以下代码时,我收到以下消息: 错误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 /”放在网址前面。
我正在使用Python 2.7,32位和GDAL 2.0.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。