2013-04-30 4 views
0

HGT 파일에 저장된 고도 데이터를 읽으려고합니다. 내가 아는 한 이진 파일로 읽을 수 있습니다.C++에서 HGT 파일을 읽는 방법

내가이 스레드 발견

: 해당 게시물을 바탕으로
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; 
} 

를, 그것은 나에게 제로의 무리, 아무것도를 제공합니다 else : | hgt 파일은 훌륭합니다. 여러 유형의 맵 파일을 읽을 수있는 응용 프로그램과 함께 테스트했으며, 필요한 높이 데이터가 들어 있습니다.

+0

총 파일에서 2 바이트 만 읽는 중입니다. 배열의 각 위치에 대해 2 바이트를 읽어야합니다. 또한 배열 크기의 두 번째 차원에 오타가 있습니다. –

+0

나는 똑같은 것을 짐작하고 있었지만 전체 파일을 읽는 방법을 알려 주실 수 있습니까? 또는 특정 라인/픽셀 위치를 읽는 방법? –

답변

2

그러면 파일을 읽고 배열을 올바르게 채 웁니다. 한 번에 2 바이트를 읽는 것이 일반적으로 가장 효율적인 방법은 아니지만 간단합니다. 대안은 전체 파일을 읽고 나중에 바이트를 스왑하는 것입니다.

Visual Studio에서 기본 스택 크기로 스택 오버플로 문제가 발생하지 않도록 main 외부에서 높이 배열을 이동했습니다. 스택이 충분히 크면 스택을 다시 이동하거나 힙에 동적으로 메모리를 할당 할 수 있습니다.

#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

대단히 고마워요.이게 내가 필요한 모든 것입니다. :) –