Skip to content

Commit

Permalink
fix #104 GDAL datasets without NODATA set
Browse files Browse the repository at this point in the history
  • Loading branch information
PeterPetrik committed Mar 20, 2019
1 parent 445ff67 commit 7d2a1b9
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 2 deletions.
9 changes: 7 additions & 2 deletions mdal/frmts/mdal_gdal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,11 @@ void MDAL::DriverGdal::addDataToOutput( GDALRasterBandH raster_band, std::shared
{
assert( raster_band );

double nodata = GDALGetRasterNoDataValue( raster_band, nullptr );
int pbSuccess;
double nodata = GDALGetRasterNoDataValue( raster_band, &pbSuccess );
if ( pbSuccess == 0 ) nodata = std::numeric_limits<double>::quiet_NaN();
bool hasNoData = !std::isnan( nodata );

unsigned int mXSize = meshGDALDataset()->mXSize;
unsigned int mYSize = meshGDALDataset()->mYSize;

Expand Down Expand Up @@ -349,7 +353,8 @@ void MDAL::DriverGdal::addDataToOutput( GDALRasterBandH raster_band, std::shared
{
unsigned int idx = x + mXSize * y;
double val = mPafScanline[x];
if ( !MDAL::equals( val, nodata ) )

if ( !hasNoData || !MDAL::equals( val, nodata ) )
{
// values is prepolulated with NODATA values, so store only legal values
if ( is_vector )
Expand Down
3 changes: 3 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ MACRO (ADD_MDAL_TEST TESTSRC)
SET (TESTNAME "mdal_${TESTNAME}_test")
ADD_EXECUTABLE(${TESTNAME} ${TESTSRC} $<TARGET_OBJECTS:mdaltestutils>)
TARGET_LINK_LIBRARIES(${TESTNAME} gtest gmock ${CMAKE_THREAD_LIBS_INIT} mdal)
IF(GDAL_FOUND)
TARGET_INCLUDE_DIRECTORIES(${TESTNAME} PRIVATE ${GDAL_INCLUDE_DIRS})
ENDIF(GDAL_FOUND)
ADD_TEST(${TESTNAME} ${CMAKE_CURRENT_BINARY_DIR}/${TESTNAME})
ENDMACRO (ADD_MDAL_TEST)

Expand Down
Binary file added tests/data/grib/saga_flow_without_nodata.grb
Binary file not shown.
74 changes: 74 additions & 0 deletions tests/data/grib/saga_flow_without_nodata.grb.aux.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<PAMDataset>
<PAMRasterBand band="1">
<Description>0[-] RESERVED(0) (Reserved)</Description>
<NoDataValue>2.55000000000000E+02</NoDataValue>
<Histograms>
<HistItem>
<HistMin>-0.0003535533845424652</HistMin>
<HistMax>0.7074603224694729</HistMax>
<BucketCount>1000</BucketCount>
<IncludeOutOfRange>0</IncludeOutOfRange>
<Approximate>0</Approximate>
<HistCounts>167689|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23489</HistCounts>
</HistItem>
</Histograms>
<Metadata>
<MDI key="grib_comment">x-flow</MDI>
<MDI key="GRIB_DISCIPLINE">0(Meteorological)</MDI>
<MDI key="GRIB_ELEMENT">unknown</MDI>
<MDI key="GRIB_FORECAST_SECONDS">0 sec</MDI>
<MDI key="GRIB_IDS">MASTER_TABLE=2 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=1970-01-01T00:00:00Z PROD_STATUS=255 TYPE=255</MDI>
<MDI key="GRIB_PDS_PDTN">0</MDI>
<MDI key="GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES">255 255 255 0 255 0 0 0 0 0 0 0 255 -127 -2147483647</MDI>
<MDI key="GRIB_PDS_TEMPLATE_NUMBERS">255 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255</MDI>
<MDI key="GRIB_REF_TIME">0 sec UTC</MDI>
<MDI key="GRIB_SHORT_NAME">0-RESERVED(0)</MDI>
<MDI key="GRIB_UNIT">[-]</MDI>
<MDI key="GRIB_VALID_TIME">0 sec UTC</MDI>
<MDI key="STATISTICS_MAXIMUM">0.70710676908493</MDI>
<MDI key="STATISTICS_MEAN">0.086878358906549</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">0.23213019283048</MDI>
<MDI key="STATISTICS_VALID_PERCENT">100</MDI>
</Metadata>
<Metadata domain="GRIB">
<MDI key="DRS_DRTN">4</MDI>
</Metadata>
</PAMRasterBand>
<PAMRasterBand band="2">
<Description>0[-] RESERVED(0) (Reserved)</Description>
<NoDataValue>2.55000000000000E+02</NoDataValue>
<Histograms>
<HistItem>
<HistMin>-0.0005</HistMin>
<HistMax>1.0005</HistMax>
<BucketCount>1000</BucketCount>
<IncludeOutOfRange>0</IncludeOutOfRange>
<Approximate>0</Approximate>
<HistCounts>96136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23489|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71553</HistCounts>
</HistItem>
</Histograms>
<Metadata>
<MDI key="grib_comment">y-flow</MDI>
<MDI key="GRIB_DISCIPLINE">0(Meteorological)</MDI>
<MDI key="GRIB_ELEMENT">unknown</MDI>
<MDI key="GRIB_FORECAST_SECONDS">0 sec</MDI>
<MDI key="GRIB_IDS">MASTER_TABLE=2 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=1970-01-01T00:00:00Z PROD_STATUS=255 TYPE=255</MDI>
<MDI key="GRIB_PDS_PDTN">0</MDI>
<MDI key="GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES">255 255 255 0 255 0 0 0 0 0 0 0 255 -127 -2147483647</MDI>
<MDI key="GRIB_PDS_TEMPLATE_NUMBERS">255 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255</MDI>
<MDI key="GRIB_REF_TIME">0 sec UTC</MDI>
<MDI key="GRIB_SHORT_NAME">0-RESERVED(0)</MDI>
<MDI key="GRIB_UNIT">[-]</MDI>
<MDI key="GRIB_VALID_TIME">0 sec UTC</MDI>
<MDI key="STATISTICS_MAXIMUM">1</MDI>
<MDI key="STATISTICS_MEAN">0.46115259548189</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">0.47227618606645</MDI>
<MDI key="STATISTICS_VALID_PERCENT">100</MDI>
</Metadata>
<Metadata domain="GRIB">
<MDI key="DRS_DRTN">4</MDI>
</Metadata>
</PAMRasterBand>
</PAMDataset>
50 changes: 50 additions & 0 deletions tests/test_gdal_grib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
//mdal
#include "mdal.h"
#include "mdal_testutils.hpp"
#include "gdal.h"

TEST( MeshGdalGribTest, ScalarFile )
{
Expand Down Expand Up @@ -98,6 +99,55 @@ TEST( MeshGdalGribTest, VectorFile )
MDAL_CloseMesh( m );
}

// with older GDAL versions it raises getgridtemplate: GDT Template 3.12 not defined.
#if GDAL_VERSION_MAJOR >=2 && GDAL_VERSION_MINOR >=4
TEST( MeshGdalGribTest, WithoutNODATA )
{
// see https://github.com/lutraconsulting/MDAL/issues/104
std::string path = test_file( "/grib/saga_flow_without_nodata.grb" );
MeshH m = MDAL_LoadMesh( path.c_str() );
ASSERT_NE( m, nullptr );
MDAL_Status s = MDAL_LastStatus();
EXPECT_EQ( MDAL_Status::None, s );
ASSERT_EQ( 1, MDAL_M_datasetGroupCount( m ) );

DatasetGroupH g = MDAL_M_datasetGroup( m, 0 );
ASSERT_NE( g, nullptr );

int meta_count = MDAL_G_metadataCount( g );
ASSERT_EQ( 1, meta_count );

const char *name = MDAL_G_name( g );
EXPECT_EQ( std::string( "flow" ), std::string( name ) );

bool scalar = MDAL_G_hasScalarData( g );
EXPECT_EQ( false, scalar );

bool onVertices = MDAL_G_isOnVertices( g );
EXPECT_EQ( true, onVertices );

ASSERT_EQ( 1, MDAL_G_datasetCount( g ) );
DatasetH ds = MDAL_G_dataset( g, 0 );
ASSERT_NE( ds, nullptr );

bool valid = MDAL_D_isValid( ds );
EXPECT_EQ( true, valid );

bool active = getActive( ds, 0 );
EXPECT_EQ( true, active );

int count = MDAL_D_valueCount( ds );
ASSERT_EQ( 191178, count );

double valueX = getValueX( ds, 1600 );
EXPECT_DOUBLE_EQ( 0, valueX );

double valueY = getValueY( ds, 1600 );
EXPECT_DOUBLE_EQ( 1, valueY );
MDAL_CloseMesh( m );
}
#endif

TEST( MeshGdalGribTest, ScalarFileWithUComponent )
{
// https://github.com/lutraconsulting/MDAL/issues/79
Expand Down

0 comments on commit 7d2a1b9

Please sign in to comment.