• 有点坑爹的GDALComputeRasterMinMax函数


    作者:朱金灿

    来源:http://blog.csdn.net/clever101

        

            GDALComputeRasterMinMax函数是gdal库为了求取指定波段的极值而提供的接口。最近看了这个接口的源码,发现这个接口有点坑爹。GDALComputeRasterMinMax实际上是调用GDALRasterBand类的virtual double GetMinimum( int *pbSuccess = NULL )virtual double GetMaximum(int *pbSuccess = NULL );两个接口。我们看看GDALRasterBand::GetMinimum函数的实现:


    double GDALRasterBand::GetMinimum( int *pbSuccess )
    
    {
        const char *pszValue = NULL;
        
        if( (pszValue = GetMetadataItem("STATISTICS_MINIMUM")) != NULL )
        {
            if( pbSuccess != NULL )
                *pbSuccess = TRUE;
            
            return CPLAtofM(pszValue);
        }
    
        if( pbSuccess != NULL )
            *pbSuccess = FALSE;
    
        switch( eDataType )
        {
          case GDT_Byte:
          {
            const char* pszPixelType = GetMetadataItem("PIXELTYPE", "IMAGE_STRUCTURE");
            if (pszPixelType != NULL && EQUAL(pszPixelType, "SIGNEDBYTE"))
                return -128;
            else
                return 0;
          }
    
          case GDT_UInt16:
            return 0;
    
          case GDT_Int16:
            return -32768;
    
          case GDT_Int32:
            return -2147483648.0;
    
          case GDT_UInt32:
            return 0;
    
          case GDT_Float32:
            return -4294967295.0; /* not actually accurate */
    
          case GDT_Float64:
            return -4294967295.0; /* not actually accurate */
    
          default:
            return -4294967295.0; /* not actually accurate */
        }
    }

        这段函数的意义是什么呢?就是说首先从元数据文件(一般是xml文件)中查找是否有最小值记录,如果有就取出来返回;如果没有就把波段类型的值域的最小值返回。这样做就有点坑爹了,因为求取的极值并非来自统计图像而来,就是说除非派生自GDALRasterBand类的波段类重写了GetMinimumGetMaximum两个接口,否则求取的极值基本上是不准确的。我查了一下,geotiff的波段类都没重写这两个接口。因此GDALComputeRasterMinMax这个接口应该慎用。

  • 相关阅读:
    spring 环绕通知 ProceedingJoinPoint 执行proceed方法的作用是什么
    SpringMVC之RequestContextHolder分析
    MySQL中索引不会被用到的情况
    使用Stream快速对List进行一些操作
    Vue中this.$refs[name].resetFields();的使用
    好看的字体
    转,javascript中call()、apply()、bind()的用法终于理解
    vue中的$props
    手机端页面自适应解决方案-rem布局
    查看项目里特定npm包的版本号
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470215.html
Copyright © 2020-2023  润新知