2014-05-22 2 views
3

PRISM Climate Group의 강수량 데이터가 있습니다. 현재는 .bil 형식으로 제공되고 있습니다 (ESRI BIL, 제 생각 엔) 저는 파이썬으로이 데이터 세트를 읽을 수 있기를 바랍니다.파이썬으로 압축 된 ESRI BIL 파일 읽기

나는 spectral 패키지를 설치 한, 그러나 open_image() 방법은 오류 반환 :

def ReadBilFile(bil): 
    import spectral as sp 
    b = sp.open_image(bil) 
ReadBilFile(r'G:\truncated\ppt\1950\PRISM_ppt_stable_4kmM2_1950_bil.bil') 

IOError: Unable to determine file type or type not supported.

스펙트럼에 대한 문서는 명확하게, 그것은 BIL 파일을 지원하는 것을 말한다 다른 사람이 어떤 빛을 창고 수를 여기서 뭐하는거야? 나는 GDAL을 사용하고 있습니다. GDAL은 비슷하거나 유사한 ESRI EHDr 형식을 지원하지만, 시작하려면 좋은 코드 스 니펫을 찾을 수 없습니다.

답변

4

좋아요, 질문을 게시 한 다음 너무 빨리 답변을 드려 죄송합니다.에서 GDAL로 래스터 이미지 데이터를 열어 강의하는 멋진 슬라이드 세트를 발견했습니다. 기록을 위해 PRISM Climate Group 데이터 세트를 여는 데 사용한 코드는 다음과 같습니다 (EHdr 형식 임).

import gdal 

def ReadBilFile(bil): 

    gdal.GetDriverByName('EHdr').Register() 
    img = gdal.Open(bil) 
    band = img.GetRasterBand(1) 
    data = band.ReadAsArray() 
    return data 

if __name__ == '__main__': 
    a = ReadBilFile(r'G:\truncated\ppt\1950\PRISM_ppt_stable_4kmM2_1950_bil.bil') 
    print a[44, 565] 

내가 위에서 내 대답에 내장 및 설명서가 부족하다고 생각하기 때문에 여기를 공유하고 싶었던 2014년 5월 27일

편집 할 수 있습니다. 이제는 배열로 BIL 파일을 읽고 몇 가지 주요 특성을 반환하는 하나의 기본 메서드가있는 클래스가 있습니다.

import gdal 
import gdalconst 

class BilFile(object): 

    def __init__(self, bil_file): 
     self.bil_file = bil_file 
     self.hdr_file = bil_file.split('.')[0]+'.hdr' 

    def get_array(self, mask=None): 
     self.nodatavalue, self.data = None, None 
     gdal.GetDriverByName('EHdr').Register() 
     img = gdal.Open(self.bil_file, gdalconst.GA_ReadOnly) 
     band = img.GetRasterBand(1) 
     self.nodatavalue = band.GetNoDataValue() 
     self.ncol = img.RasterXSize 
     self.nrow = img.RasterYSize 
     geotransform = img.GetGeoTransform() 
     self.originX = geotransform[0] 
     self.originY = geotransform[3] 
     self.pixelWidth = geotransform[1] 
     self.pixelHeight = geotransform[5] 
     self.data = band.ReadAsArray() 
     self.data = np.ma.masked_where(self.data==self.nodatavalue, self.data) 
     if mask is not None: 
      self.data = np.ma.masked_where(mask==True, self.data) 
     return self.nodatavalue, self.data 

은 내가 read the BIL file directly from a zip file에 GDAL의 vsizip 기능을 사용하여 다음과 같은 기능을 사용하여이 클래스를 호출합니다.

import prism 
def getPrecipData(years=None): 
    grid_pnts = prism.getGridPointsFromTxt() 
    flrd_pnts = np.array(pd.read_csv(r'D:\truncated\PrismGridPointsFlrd.csv').grid_code) 
    mask = prism.makeGridMask(grid_pnts, grid_codes=flrd_pnts) 
    for year in years: 
     bil = r'/vsizip/G:\truncated\PRISM_ppt_stable_4kmM2_{0}_all_bil.zip\PRISM_ppt_stable_4kmM2_{0}_bil.bil'.format(year) 
     b = prism.BilFile(bil) 
     nodatavalue, data = b.get_array(mask=mask) 
     data *= mm_to_in 
     b.write_to_csv(data, 'PrismPrecip_{}.txt'.format(year)) 
    return 

# Get datasets 
years = range(1950, 2011, 5) 
getPrecipData(years=years) 
1

당신은 이미 파일 읽기에 대한 해결책을 알아 냈으므로이 오류는 발생한 오류에 대한 불빛을 차단하는 것과 관련이 있습니다.

spectral 패키지가 Esri multiband raster format을 지원하지 않는 문제가 있습니다. BIL (라인으로 밴드 인터리브 됨)은 특정 파일 형식이 아닙니다. 오히려 많은 파일 형식으로 사용될 수있는 BIP 및 BSQ와 같은 데이터 인터리브 체계입니다. 스펙트럼 패키지는 인식하는 파일 형식 (예 : ENVI, Erdas LAN)에 대해 BIL을 지원하지만 Esri 래스터 헤더는 해당 형식 중 하나가 아닙니다.

+0

설명해 주셔서 감사합니다. – Jason

1

지금은 2017이며 약간 더 나은 옵션이 있습니다. 패키지 rasterio는 bil 파일을 지원합니다.

>>>import rasterio 
>>>tmean = rasterio.open('PRISM_tmean_stable_4kmD1_20060101_bil.bil') 
>>>tmean.affine 
Affine(0.041666666667, 0.0, -125.0208333333335, 
     0.0, -0.041666666667, 49.9375000000025) 
>>> tmean.crs 
CRS({'init': 'epsg:4269'}) 
>>> tmean.width 
1405 
>>> tmean.height 
621 
>>> tmean.read().shape 
(1, 621, 1405)