Чтение из SRTM30

0 голосов
спросил 15 Март, 10 от MDmitry (200 баллов) в категории Цифровые материалы
Не могу организовать нормальное считываение из DEM-файла. Описание нашёл только такое (перевод с документации). DEM-файл состоит из 16-битных целых чисел со знаком в простом бинарном растре. В изображении нет заголовка или конца файла. Данные хранятся последовательно

Считываю таким образом (код написан на Blitz3D, но разобраться по комментариям можно)

file_height=ReadFile("E020N90.DEM") ; Подключаем файл с высотами
height=ReadByte(file_height) ; Считываем первый байт
While Not Eof(file_height) ; Пока не достигнут конец файоа
arr_heights(x,y)=ReadShort(file_height) ; Считываем по два байта
x=x+1 ; Передвигаемся к следующей высоте
If x=6000 Then ; Переходим на 1 ячейку вниз, если достигнут конец сетки
y=y+1
x=0
EndIf
Wend

Результат получается примерно такой (дан фрагмент, т.е. кусочек сетки)
x= 1 Высоты 29 138 289 2088 65507 155 295 1507 65507 155 307 1526 65507 159 296 1980 65507 128 438 1639 65507 155 0
x= 2 Высоты 30 142 17 2156 65507 148 427 1500 65507 148 334 1513 65507 156 293 1925 65507 143 408 1587 65507 154 0
x= 3 Высоты 6 148 251 1870 65507 152 436 1509 65507 154 306 1772 65507 144 291 1667 65507 154 408 1706 65507 155 0
x= 4 Высоты 65280 145 246 2017 65507 156 426 1509 65507 155 283 1545 65507 157 287 2026 65507 153 394 2013 65507 157 0
x= 5 Высоты 65528 153 244 2015 65507 150 434 1504 65507 150 271 1602 65507 152 287 1874 65507 152 376 2151 65507 152 0
x= 6 Высоты 65525 158 243 1627 65507 151 462 1498 65507 147 277 1584 65507 150 287 1544 65507 155 361 1805 65507 156 0
x= 7 Высоты 65518 149 499 1781 65507 146 757 1511 65507 156 313 1659 65507 153 286 1681 65507 156 327 1980 65507 158 0
x= 8 Высоты 65516 143 266 1774 65507 147 524 1524 65507 154 353 1715 65507 166 288 1627 65507 164 321 1677 65507 156 0
x= 9 Высоты 65510 152 316 1751 65507 150 258 1490 65507 151 371 1713 65507 152 288 1961 65507 155 325 1791 65507 160 0
x= 10 Высоты 65508 151 335 1758 65507 148 766 1484 65507 154 411 1709 65507 154 289 1555 65507 158 321 1716 65507 155 0

Как правильно считать высоты?   

5 Ответы

0 голосов
ответил 15 Март, 10 от pooperec (10,820 баллов)
1. А у меня файл имеет ширину 1201 (и высоту 1201).
2. А у меня значение 65507, тоже присутствует, оно значит некоректный отсчёт (такое к сожалению бывает).
3. А не сдвигаетесь ли Вы на 1 байт при считывании 1 байта (height=ReadByte(file_height))? Потому что если неправильно "встать", то будут проблем...
4. ReadShort, а почему Short, а не Word (насколько я помню, в DEM значения беззнаковые).

Это на вскидку...
0 голосов
ответил 15 Март, 10 от pooperec (10,820 баллов)
5. Порядок следования бит влияет например...

А ещё, советую например самому посмотреть данные, которые Вы кормите сначала. Вот, к примеру, у меня на периоде 16*1201 бит данные выглядят не просто отлично, но ещё и видно, что дествительно первое Word число 04 DF, действительно значит высоту 1247 метров, которую я проверил через ENVI.

Порядок следования ЛБЗ. Тип WORD, ширина 1201*16 бит, Высота 1201 строка.

Считывайте начиная с первого слова, по слову (WORD - 16 бит, беззнаковый), проверяйте  порядок следования (может считывать как ПБЗ), установите ширину 1201, и будет Вам сопутствывать удача во всех начинаниях...

З.Ы. Тестовый файл - S01E029.HGT, искать и качать при помощи Гугеля...
0 голосов
ответил 16 Март, 10 от MDmitry (200 баллов)
1. А у меня файл имеет ширину 1201 (и высоту 1201).



Считывайте начиная с первого слова, по слову (WORD - 16 бит, беззнаковый), проверяйте порядок следования (может считывать как ПБЗ), установите ширину 1201, и будет Вам сопутствывать удача во всех начинаниях...


Это SRTM3 или SRTM1 скорее всего. В SRTM30 содержится кусок 40 на 50 градусов с шагом 1 км или 30 арксекунд. Судя из файла заголовка
BYTEORDER      M
LAYOUT       BIL
NROWS        6000
NCOLS        4800
NBANDS        1
NBITS        16
BANDROWBYTES        9600
TOTALROWBYTES        9600
BANDGAPBYTES        0
NODATA        -9999
ULXMAP        20.00416666666667
ULYMAP        89.99583333333334
XDIM          0.00833333333333
YDIM          0.00833333333333

Матрица имеет размеры 6000 на 4800.

Без смещения в 1 байт.
x= 1 Высоты 7424 35328 8449 10248 58367 39680 9985 58117 58367 39680 13057 62981 58367 40704 10241 48134 58367 32768 46593 26374 58367 39680 0
x= 2 Высоты 7680 36352 4353 27656 58367 37888 43777 56325 58367 37888 19969 59653 58367 39936 9473 34055 58367 36608 38913 13062 58367 39424 0
x= 3 Высоты 1536 37888 64256 19976 58367 38912 46081 58629 58367 39424 12801 60421 58367 36864 8961 33543 58367 39424 38913 43526 58367 39680 0
x= 4 Высоты 0 37120 62976 57607 58367 39936 43521 58629 58367 39680 6913 2310 58367 40192 7937 59910 58367 39168 35329 56582 58367 40192 0
x= 5 Высоты 63743 39168 62464 57095 58367 38400 45569 57349 58367 38400 3841 16902 58367 38912 7937 20999 58367 38912 30721 26375 58367 38912 0
x= 6 Высоты 62975 40448 62208 23303 58367 38656 52737 55813 58367 37632 5377 12294 58367 38400 7937 2055 58367 39680 26881 3336 58367 39936 0
x= 7 Высоты 61183 38144 62208 62726 58367 37376 62721 59141 58367 39936 14593 31494 58367 39168 7681 37126 58367 39936 18177 48135 58367 40448 0
x= 8 Высоты 60671 36608 2561 60934 58367 37632 3074 62469 58367 39424 24833 45830 58367 42496 8193 23302 58367 41984 16641 36103 58367 39936 0
x= 9 Высоты 59135 38912 15361 55046 58367 38400 514 53765 58367 38656 29441 45318 58367 38912 8193 43270 58367 39680 17665 65286 58367 40960 0
x= 10 Высоты 58623 38656 20225 56838 58367 37888 65025 52229 58367 39424 39681 44294 58367 39424 8449 4871 58367 40448 16641 46086 58367 39680 0

Меня беспокоит не столько величина высот, сколько тот факт, что они "скачут" при x=const


    
0 голосов
ответил 16 Март, 10 от voland (4,260 баллов)
зачем вы считываете один байт перед циклом?
0 голосов
ответил 16 Март, 10 от MDmitry (200 баллов)
зачем вы считываете один байт перед циклом?

    
У меня был подобный файл, если считать один байт, то высоты получаются нормальные (не 60000 м, а где-то в районе 500-1000), но опять же со скачками. Но это ошибка, считывать 1 байт не нужно.

о ещё и видно, что дествительно первое Word число 04 DF, действительно значит высоту 1247 метров, которую я проверил через ENVI.


Я посмотрел через редактор бинарных файлов данный файл, оказалось, что у него порядок байтов big endian, а readshort считывает в little endian. Но даже при таком порядке попадаются целые строки с высотами > 65k. Видимо случайный шум.
...