2016-07-13 3 views
0

그래서 URL을 통해 .tif 파일을 스트리밍하려는 GDAL 라이브러리를 사용하는 Flask 응용 프로그램을 개발하고 있습니다.Flask 응용 프로그램을 통해 Python에서 GDAL로 원격 파일을 여는 방법

지금은 gdal.Open (filepath)을 사용하여 .tif 파일을 읽는 방법이 있습니다. (파이썬 콘솔과 같은) Flask 환경 외부에서 실행될 때, 로컬 파일과 URL에 대한 파일 경로를 지정하는 것만으로도 작동합니다. ERROR : 4 :`http://xxxxxxx.blob.core.windows.net/dsm/DSM_1km_6349_614.tif는 ' 는, 파일 시스템에 존재하지 않으며 지원으로 인식되지 않는 다음과 같은 코드가 플라스크 environement 내에서 실행될 때

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 

그러나, 다음과 같은 메시지가 뜹니다 데이터 세트 이름.

내가 대신 플라스크 응용 프로그램의 로컬 파일 시스템에 파일을 다운로드하고 다음과 같이 파일의 경로를 삽입하는 경우 :

잘 작동
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) 

가 ... 것은이 이후 큰 파일 (200MB)을 요청하고 있는데 로컬 파일 참조 대신 URL을 사용하여 파일을 스트리밍하려고합니다.

누구에게이 문제를 일으킬 수있는 아이디어가 있습니까? 나는 또한 다른 곳에 제안 된 것처럼 URL 앞에 "/ vsicurl_streaming /"을 넣으려고 시도했다.

내가 파이썬 2.7, GDAL 32 비트를 사용하고 2.0.2

답변

2

추적 코드 스 니펫 (snippet)을 시도하십시오 : 검색 이미지를 엽니 다 GDAL 메모리 매핑 된 파일을 사용

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 

HTTP를 통해 임시 파일에 저장하지 않고 NumPy 배열로 직접 전송할 수 있습니다. 자세한 내용은 https://gist.github.com/jleinonen/5781308을 참조하십시오.

+0

감사합니다. 게리,이 작품처럼 매력! – thallium

+0

향후 방문자 :이 수정 프로그램은 .ECW 확장명의 파일과 작동하지 않는 것으로 보입니다. – thallium