2013-04-30 5 views
0

Я пытаюсь прочитать данные о высоте, хранящиеся в файлах HGT. Насколько я знаю, их можно читать как двоичные файлы.Как читать файлы HGT в C++

Я нашел эту тему:
How do I access .HGT SRTM files in C++?

Основываясь на этом посту, мой пример кода:

#include <iostream> 
#include <fstream> 

int main(int argc, const char * argv[]) 
{ 

std::ifstream::pos_type size; 
char * memblock; 

std::ifstream file ("N45W066.hgt", std::ios::in|std::ios::binary|std::ios::ate); 

if (file.is_open()) 
{ 
    size = 2; 
    memblock = new char [size]; 

    file.seekg(0, std::ios::beg); 
    file.read(memblock, size); 

    int srtm_ver = 1201; 
    int height[1201][1021]; 

    for (int i = 0; i<srtm_ver; ++i){ 
     for (int j = 0; j < srtm_ver; ++j) { 

      height[i][j] = (memblock[0] << 8 | memblock[1]); 
      std::cout<<height[i][j]<<" "; 
     } 
     std::cout<<std::endl; 
    } 
} 


return 0; 
} 

После первого запуска, это дает мне кучу нулей, и ничего Остальное: | Файл hgt хорош, я протестировал его с помощью приложения, которое может читать несколько типов файлов карт, и содержит данные о высоте, которые мне нужны.

+0

Вы всего лишь читаете 2 байта из файла. Вам нужно прочитать 2 байта для каждого местоположения в массиве. У вас также есть опечатка во втором измерении размера массива. –

+0

Я гадал то же самое, но не могли бы вы помочь мне узнать, как читать весь файл? или как читать конкретное местоположение линии/пикселя? –

ответ

2

Это прочитает файл и заполнит массив правильно. Чтение 2 байтов за один раз обычно не самый эффективный способ сделать это, но это просто. Альтернативой было бы прочитать весь файл, а затем поменять байты позже.

Я переместил массив высоты за пределы основного, чтобы избежать проблемы с переполнением стека с размером стека по умолчанию в Visual Studio. Если ваш стек достаточно велик, вы можете переместить его назад или динамически распределить память в куче.

#include <iostream> 
#include <fstream> 

const int SRTM_SIZE = 1201; 
short height[SRTM_SIZE][SRTM_SIZE] = {0}; 

int main(int argc, const char * argv[]) 
{ 
    std::ifstream file("N45W066.hgt", std::ios::in|std::ios::binary); 
    if(!file) 
    { 
     std::cout << "Error opening file!" << std::endl; 
     return -1; 
    } 

    unsigned char buffer[2]; 
    for (int i = 0; i < SRTM_SIZE; ++i) 
    { 
     for (int j = 0; j < SRTM_SIZE; ++j) 
     { 
      if(!file.read(reinterpret_cast<char*>(buffer), sizeof(buffer))) 
      { 
       std::cout << "Error reading file!" << std::endl; 
       return -1; 
      } 
      height[i][j] = (buffer[0] << 8) | buffer[1]; 
     } 
    } 

    //Read single value from file at row,col 
    const int row = 500; 
    const int col = 1000; 
    size_t offset = sizeof(buffer) * ((row * SRTM_SIZE) + col); 
    file.seekg(offset, std::ios::beg); 
    file.read(reinterpret_cast<char*>(buffer), sizeof(buffer)); 
    short single_value = (buffer[0] << 8) | buffer[1]; 
    std::cout << "values at " << row << "," << col << ":" << std::endl; 
    std::cout << " height array: " << height[row][col] << ", file: " << single_value << std::endl; 

    return 0; 
} 
+0

Я также добавил пример ответа. Файл в основном представляет собой массив на диске, поэтому вы ищете подходящую строку, col и читаете здесь значение. –

+0

большое спасибо, это все, что мне нужно :) –

Смежные вопросы