【问题标题】:Negative heights when converting SRTM data转换 SRTM 数据时的负高度
【发布时间】:2015-12-04 16:31:37
【问题描述】:

我想从 NASA SRTM 数据集 (http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/) 中获取某个纬度/经度对的高度。

作为初学者,我想从 HGT 文件中获取所有高度:

int totalPx = 1201; //3 degree
char buffer[2];
for (int i=0; i<totalPx; i++)
{
    for (int j=0; j<totalPx; j++)
    {
        int pos = (i * totalPx + j) * 2;

        m_openedFile.seek(pos); //m_openedFile is a Qt QFile
        m_openedFile.read(buffer, 2);
        short h = 0 | (buffer[0] << 8) | (buffer[1] << 0);
        if (h < 0)
            printf("%d", h);
    }
}

这似乎适用于某些坐标(例如,高度值看起来很合理),但也有许多负高度值。如何正确读取 SRTM/HGT 文件?

问候,

【问题讨论】:

  • 会不会低于海平面?
  • 试试buffer[0] | (buffer[1] &lt;&lt; 8)
  • 感谢您为我指明正确的方向。问题是签名的字符。 ùnsigned char buffer[2]; 工作。

标签: c++ c file binaryfiles


【解决方案1】:

char转换为int时注意符号扩展

// char buffer[2];
unsigned char buffer[2];
short h = buffer[0] << 8 | buffer[1];

【讨论】:

    【解决方案2】:

    我想通了:问题是有符号字符而不是无符号字符导致错误的位移:

    int totalPx = 1201; //3 degree
    unsigned char buffer[2];
    for (int i=0; i<totalPx; i++)
    {
        for (int j=0; j<totalPx; j++)
        {
            int pos = (i * totalPx + j) * 2;
    
            m_openedFile.seek(pos); //m_openedFile is a Qt QFile
            m_openedFile.read(buffer, 2);
            short h = 0 | (buffer[0] << 8) | (buffer[1] << 0);
            if (h < 0)
                printf("%d", h);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-16
      • 1970-01-01
      • 2013-05-30
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2015-10-16
      相关资源
      最近更新 更多