Чтение изображений с чередованием полос из URL-адреса в Matlab

Я пытаюсь читать с веб-картографического сервера без использования инструментария картографирования (точнее, без использования объекта WebMapServer). Я могу сам создать URL-адрес без проблем и могу просто использовать imread для WMS, которые возвращают файлы bmp. Однако одна из WMS возвращает файлы BIL (Band InterLeaved), и функция imread() не распознает ее.

Как я могу прочитать файл BIL с URL-адреса без использования набора инструментов сопоставления?

Изменить: вот пример URL-адреса, который я хотел бы прочитать:

http://www.nasa.network.com/elev?SERVICE=WMS&LAYERS=mergedAsterElevations&EXCEPTIONS=application/vnd.ogc.se_xml&FORMAT=image%2Fbil&TRANSPARENT=FALSE&HEIGHT=1113&BGCOLOR=0xFFFFFF&REQUEST=GetMap&WIDTH=925&BBOX=-118.545692,33.960524,-118.44569200000001,34.060523999999994&STYLES=&SRS=EPSG:4326&VERSION=1.3.0

Кроме того, если я попытаюсь просто получить байтовые данные с URL-адресом, а затем записать их в файл, некоторые значения будут потеряны.

bytedata = urlread( mapurl );
fp = fopen( 'tmp.bil', 'w' );
fwrite( fp, bytedata, 'uint8' );
fclose( fp );
fp = fopen( 'tmp.bil', 'r' );
z = fread( fp, 'int16' );
imagesc( reshape( z, 925, 1113 )' );

Приведенное выше отображает изображение, похожее на то, которое возвращает набор инструментов сопоставления, но есть регионы, для которых установлено постоянное значение, которое не должно быть.


person AnonSubmitter85    schedule 15.10.2012    source источник
comment
Пробовали ли вы выполнить простой поиск в Google по запросу matlab bandinterleaved, первый результат — mathworks.com/help /matlab/ref/multibandread.html   -  person slayton    schedule 15.10.2012
comment
@slayton: Да, но он читает только файлы. Мне нужно прочитать URL-адрес.   -  person AnonSubmitter85    schedule 15.10.2012
comment
Да, я понимаю. Первое, что я бы попробовал, это сохранить данные из URL-адреса как временный файл и посмотреть, сможет ли multibandread открыть этот темповый файл. Затем, если это сработает, я бы прочитал исходный код для multibandread и реализовал свой собственный ридер.   -  person slayton    schedule 15.10.2012
comment
@slayton: я не получаю одинаковых значений.   -  person AnonSubmitter85    schedule 15.10.2012


Ответы (1)


Решение вышеуказанной проблемы заключается в использовании urlwrite(), а не urlread(), так как последний не будет правильно обрабатывать двоичные данные.

fname = tempname();
urlwrite(mapurl,fname);
fp = fopen(fname,'r');
map = reshape(fread(fp,'int16=>int16'),Ncols,Nrows)';
fclose(fp);
delete(fname);
person AnonSubmitter85    schedule 02.12.2012