python3.6: gdal.Open ('*. tif') успешно выполнен, но ReadAsArray () получил ошибку NoneType - PullRequest
0 голосов
/ 26 ноября 2018

Я использую gdal для чтения jp2 по строкам, вот код:

def open(self):
    if self.ds is None:
        self.ds = gdal.Open(self.file_path, gdal.GA_ReadOnly)
        self.geo_transform = self.ds.GetGeoTransform()
        self.rows = self.ds.RasterYSize
        self.cols = self.ds.RasterXSize

def read_strip(self, y_start, read_y_size):
    """
    y_start : y in projection coordinate
    """
    self.open()
    if not self.ds:
        raise IOError("Could not open '%s'" % self.file_path)

    y_off = int((y_start - self.geo_transform[3]) / self.geo_transform[5])
    if y_off < 0 or y_off >= self.rows:
        return None
    else:
        read_y_size_in_data = min(self.rows - y_off, read_y_size)

        try:
            read_data = self.ds.ReadAsArray(0, y_off, ysize=read_y_size_in_data)
            band_data = read_data.astype(float)
            self.logger.info('{}, {}, {}'.format(read_y_size, y_off, read_y_size_in_data))
            return band_data
        except Exception:
            self.logger.exception('this file is Nonetype, file: {}'.format(self.file_path))

            self.logger.info('{}, {}, {}'.format(read_y_size, y_off, read_y_size_in_data))
    self.close()

Вот сообщение об ошибке:

Traceback (most recent call last): File "scene_reader.py", line 62, in read_strip band_data = read_data.astype(float), 'NoneType' object has no attribute 'astype'

Каждый раз, когда явыполнить код, я не получил IOError, что означает, что файл jp2 успешно открыт, в то время как ReadAsArray () получил ошибку «Nonetype».Кстати, я пытался просто использовать gdal.Open () и ReadAsArray (), чтобы прочитать один и тот же файл в несколько строк в ipython, все в порядке, так что я уверен, что нет ничего плохого в самом файле jp2,так, кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 26 ноября 2018

Я думаю, что вы должны выбрать группу, даже если это набор данных с одной полосой.ds.GetRasterBand(1).ReadAsArray() так.Я всегда ссылаюсь на это GDAL API Tutorial , в котором есть простые примеры.

...