Более

Каковы ограничения геоинструмента по геоинструментам?


Я пытаюсь обработать globcover, это файл .tif размером 374 МБ. Выполняем следующий код:

Файл tiffFile = новый файл ("C:  Users  CAA  Desktop  test.tif"); Читатель GeoTiffReader = новый GeoTiffReader (tiffFile); сетка = reader.read (ноль); gridData = grid.getRenderedImage (). getData (); // строка 32

Я получаю следующую ошибку:

java.lang.IllegalArgumentException: запрошенная область не может быть представлена ​​одним растром. в javax.media.jai.PlanarImage.getData (PlanarImage.java:2163) в javax.media.jai.PlanarImage.getData (PlanarImage.java:2016) в javax.media.jai.RenderedOp.getData (RenderedOp.java:2266 ) в de.myapplication.de.myapplicatoin.GeoTiff.initTif (GeoTiff.java:32)

Немного поигравшись с QGis и его инструментом Clipper, я заметил, что если я извлекаю меньшую область, ридер работает как задумано. Если я извлекаю более крупные области (т.е. всю Европу или весь мир), я снова получаю ошибку. Может быть, это просто корреляция, а не причинно-следственная связь, но это заставляет меня думать, что внутри читателя есть предел. Но каков предел?

В соответствии с запросом вывод gdalinfo для исходного файла tif.

Размер 129600, система координат 55800: GEOGCS ["WGS 84", DATUM ["WGS_1984", SPHEROID ["WGS 84", 6378137,298.257223563, AUTHORITY ["EPSG", "7030"]]], AUTHORITY ["EPSG" , «6326»]], PRIMEM [«Гринвич», 0], UNIT [«градус», 0,0174532925199433], AUTHORITY [«EPSG», «4326»]] Начало = (-180,0013888888900,90,001388888888883) Размер пикселя = (0,002777777777778, -0.002777777777778) Метаданные: AREA_OR_POINT = Авторы области = Софи Бонтемпс , Эрик Ван Богерт , Пьер Дефурни  Авторские права = Copyright ┬®UCL Geomatics, БЕЛЬГИЯ 1999-2010 Создать по = gdal_mean время начала процесса = 2010-12-23T09: 49: 37 файлов процесса = CL5_GLOBCOVER-L5_CLASSIF_2009_V2.3.20101220.tif время завершения процесса = 2010-12-23T09: 57 : 38 Метаданные структуры изображения: COMPRESSION = LZW INTERLEAVE = BAND Координаты углов: верхний левый (-180.0013889, 90.0013889) (180d 0 '5.00 "W, 90d 0' 5.00" N) Нижний левый (-180.0013889, -64.9986111) (180d 0 '5.00 "W, 64d59'55.00" S) Верхний правый (179.9986111, 90.0013889) (179d59'55.00 "E, 90d 0' 5.00" N) Нижний правый (179.9986111, -64.9986111) (179d59'55.00 "E, 64d59'55.00 "S) Центр (-0.0013889, 12.5013889) (0d 0 '5.00" W, 12d30' 5.00 "N) Полоса 1 Блок = 129600x1 Тип = Байт, ColorInterp = Серый Мин. = 11.000 Макс. = 230.000 Минимум = 11.000, Максимум = 230.000, Среднее значение = 183,164, StdDev = 55,663 Значение NoData = 0 Метаданные: STATISTICS_MAXIMUM = 230 STATISTICS_MEAN = 183,16435194952 STATISTICS_MINIMUM = 11 STATISTICS_STDDEV = 55,662605157347

Проблема, похоже, в том, что классы Java Raster, используемые для извлечения данных из вашего растра, используютintдля хранения количества ячеек в растре. Таким образом, для вашего файла это 129600 * 55800, что составляет 7 231 680 000, что превышает Max int (2 147 483 647), поэтому он округляется до отрицательного числа (-1 358 254 592). JAI услужливо сообщает вам, что вам нужно более одного растра для считывания данных в этом случае, хотя сообщение немного загадочно.

Таким образом, вы можете выбрать меньшее количество ячеек за раз для обработки, используя меньший конверт

gridData = grid.getRenderedImage (). getData (новый прямоугольник (100, 100));

или работайте с пикселями по одному:

GridEnvelope gridRange2D = grid.getGridGeometry (). GetGridRange (); для (int я = gridRange2D.getLow (0); я