diff --git a/src/core/qgsrasterdataprovider.cpp b/src/core/qgsrasterdataprovider.cpp index f0ec88880f5..ca0e14ad1a5 100644 --- a/src/core/qgsrasterdataprovider.cpp +++ b/src/core/qgsrasterdataprovider.cpp @@ -279,6 +279,7 @@ QgsRasterBandStats QgsRasterDataProvider::bandStatistics( int theBandNo ) int myBandXSize = xSize(); int myBandYSize = ySize(); + int maxCount = xSize() * ySize(); for ( int iYBlock = 0; iYBlock < myNYBlocks; iYBlock++ ) { for ( int iXBlock = 0; iXBlock < myNXBlocks; iXBlock++ ) @@ -306,12 +307,15 @@ QgsRasterBandStats QgsRasterDataProvider::bandStatistics( int theBandNo ) double myValue = readValue( myData, myDataType, iX + ( iY * myXBlockSize ) ); QgsDebugMsgLevel( QString( "%1 %2 value %3" ).arg( iX ).arg( iY ).arg( myValue ), 10 ); - if ( mValidNoDataValue && ( qAbs( myValue - myNoDataValue ) <= TINY_VALUE ) ) + if ( mValidNoDataValue && + ( ( std::isnan( myNoDataValue ) && std::isnan( myValue ) ) || qAbs( myValue - myNoDataValue ) <= TINY_VALUE ) ) { continue; // NULL } myRasterBandStats.sum += myValue; + // sum can easily run out of limits + myRasterBandStats.mean += myValue / maxCount; ++myRasterBandStats.elementCount; //only use this element if we have a non null element if ( myFirstIterationFlag ) @@ -342,7 +346,8 @@ QgsRasterBandStats QgsRasterDataProvider::bandStatistics( int theBandNo ) //end of first pass through data now calculate the range myRasterBandStats.range = myRasterBandStats.maximumValue - myRasterBandStats.minimumValue; //calculate the mean - myRasterBandStats.mean = myRasterBandStats.sum / myRasterBandStats.elementCount; + //myRasterBandStats.mean = myRasterBandStats.sum / myRasterBandStats.elementCount; + myRasterBandStats.mean = maxCount * ( myRasterBandStats.mean / myRasterBandStats.elementCount ); //for the second pass we will get the sum of the squares / mean for ( int iYBlock = 0; iYBlock < myNYBlocks; iYBlock++ ) @@ -373,21 +378,20 @@ QgsRasterBandStats QgsRasterDataProvider::bandStatistics( int theBandNo ) double myValue = readValue( myData, myDataType, iX + ( iY * myXBlockSize ) ); //QgsDebugMsg ( "myValue = " + QString::number(myValue) ); - if ( mValidNoDataValue && ( qAbs( myValue - myNoDataValue ) <= TINY_VALUE ) ) + if ( mValidNoDataValue && + ( ( std::isnan( myNoDataValue ) && std::isnan( myValue ) ) || qAbs( myValue - myNoDataValue ) <= TINY_VALUE ) ) { continue; // NULL } - myRasterBandStats.sumOfSquares += static_cast < double > - ( pow( myValue - myRasterBandStats.mean, 2 ) ); + myRasterBandStats.sumOfSquares += static_cast < double >( pow( myValue - myRasterBandStats.mean, 2 ) ); } } } //end of column wise loop } //end of row wise loop //divide result by sample size - 1 and get square root to get stdev - myRasterBandStats.stdDev = static_cast < double >( sqrt( myRasterBandStats.sumOfSquares / - ( myRasterBandStats.elementCount - 1 ) ) ); + myRasterBandStats.stdDev = static_cast < double >( sqrt( myRasterBandStats.sumOfSquares / ( myRasterBandStats.elementCount - 1 ) ) ); #ifdef QGISDEBUG QgsDebugMsg( "************ STATS **************" ); diff --git a/src/providers/wcs/qgswcscapabilities.cpp b/src/providers/wcs/qgswcscapabilities.cpp index 533cde790de..04250db004e 100644 --- a/src/providers/wcs/qgswcscapabilities.cpp +++ b/src/providers/wcs/qgswcscapabilities.cpp @@ -192,9 +192,27 @@ bool QgsWcsCapabilities::retrieveServerCapabilities( ) clear(); QStringList versions; - // 1.0.0 - VERSION - // 1.1.0 - AcceptedVersions (not supported by UMN Mapserver 6.0.3 - defaults to 1.1.1 - versions << "AcceptVersions=1.1.0,1.0.0" << "VERSION=1.0.0"; + QString preferredVersion = mUri.param( "version" ); + + if ( !preferredVersion.isEmpty() ) + { + // This is not + if ( preferredVersion.startsWith ( "1.0" ) ) + { + versions << "VERSION=" + preferredVersion; + } + else if ( preferredVersion.startsWith ( "1.1" ) ) + { + // Ignored by UMN Mapserver 6.0.3, see below + versions << "AcceptVersions=" + preferredVersion; + } + } + else + { + // 1.0.0 - VERSION + // 1.1.0 - AcceptVersions (not supported by UMN Mapserver 6.0.3 - defaults to latest 1.1 + versions << "AcceptVersions=1.1,1.0" << "VERSION=1.0"; + } foreach( QString v, versions ) { diff --git a/tests/src/providers/CMakeLists.txt b/tests/src/providers/CMakeLists.txt index 69b8a6faa24..4bc16db4c2e 100644 --- a/tests/src/providers/CMakeLists.txt +++ b/tests/src/providers/CMakeLists.txt @@ -22,6 +22,10 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ADD_DEFINITIONS(-DTEST_DATA_DIR="\\"${TEST_DATA_DIR}\\"") ADD_DEFINITIONS(-DINSTALL_PREFIX="\\"${CMAKE_INSTALL_PREFIX}\\"") + +SET(TEST_SERVER_URL "http://127.0.0.1/test/${COMPLETE_VERSION}") +ADD_DEFINITIONS(-DTEST_SERVER_URL="\\"${TEST_SERVER_URL}\\"") + ############################################################# # libraries diff --git a/tests/src/providers/testqgswcsprovider.cpp b/tests/src/providers/testqgswcsprovider.cpp index 8bafe41063c..93179003ec2 100644 --- a/tests/src/providers/testqgswcsprovider.cpp +++ b/tests/src/providers/testqgswcsprovider.cpp @@ -43,11 +43,12 @@ class TestQgsWcsProvider: public QObject void read(); private: - bool read( QString identifier, QString theFilePath, QString & theReport ); + bool read( QString theIdentifier, QString theWcsUri, QString theFilePath, QString & theReport ); // Log error in html void error( QString theMessage, QString &theReport ); // compare values and add table row in html report, set ok to false if not equal QString compareHead(); + bool compare ( double wcsVal, double gdalVal, double theTolerance ); void compare( QString theParamName, int wcsVal, int gdalVal, QString &theReport, bool &theOk ); void compare( QString theParamName, double wcsVal, double gdalVal, QString &theReport, bool &theOk, double theTolerance = 0 ); void compareRow( QString theParamName, QString wcsVal, QString gdalVal, QString &theReport, bool theOk, QString theDifference = "", QString theTolerance = "" ); @@ -82,7 +83,7 @@ void TestQgsWcsProvider::initTestCase() mTestDataDir = QString( TEST_DATA_DIR ) + QDir::separator() + "raster"; qDebug() << "mTestDataDir = " << mTestDataDir; - mUrl = "http://127.0.0.1//cgi-bin/wcstest"; + mUrl = QString( TEST_SERVER_URL ) + QDir::separator() + "wcs"; } //runs after all tests @@ -102,39 +103,52 @@ void TestQgsWcsProvider::cleanupTestCase() void TestQgsWcsProvider::read( ) { bool ok = true; + QStringList versions; + + versions << "1.0" << "1.1"; + QStringList identifiers; // identifiers in mapfile have the same name as files without .tif extension identifiers << "band1_byte_noct_epsg4326"; identifiers << "band1_int16_noct_epsg4326"; identifiers << "band1_float32_noct_epsg4326"; + identifiers << "band3_byte_noct_epsg4326"; + identifiers << "band3_int16_noct_epsg4326"; + identifiers << "band3_float32_noct_epsg4326"; // How to reasonably log multiple fails within this loop? - foreach( QString identifier, identifiers ) + foreach( QString version, versions ) { - QString filePath = mTestDataDir + QDir::separator() + identifier + ".tif"; - if ( !read( identifier, filePath, mReport ) ) + foreach( QString identifier, identifiers ) { - ok = false; + QString filePath = mTestDataDir + QDir::separator() + identifier + ".tif"; + + QgsDataSourceURI uri; + uri.setParam( "url", mUrl ); + uri.setParam( "identifier", identifier ); + uri.setParam( "crs", "epsg:4326" ); + uri.setParam( "version", version ); + + if ( !read( identifier, uri.encodedUri(), filePath, mReport ) ) + { + ok = false; + } } } QVERIFY2( ok, "Reading data failed. See report for details." ); } -bool TestQgsWcsProvider::read( QString theIdentifier, QString theFilePath, QString & theReport ) +bool TestQgsWcsProvider::read( QString theIdentifier, QString theWcsUri, QString theFilePath, QString & theReport ) { bool ok = true; - QgsDataSourceURI uri; - uri.setParam( "url", mUrl ); - uri.setParam( "identifier", theIdentifier ); - uri.setParam( "crs", "epsg:4326" ); theReport += QString( "

Identifier (coverage): %1

" ).arg( theIdentifier ); - QgsRasterDataProvider* wcsProvider = QgsRasterLayer::loadProvider( "wcs", uri.encodedUri() ); + QgsRasterDataProvider* wcsProvider = QgsRasterLayer::loadProvider( "wcs", theWcsUri ); if ( !wcsProvider || !wcsProvider->isValid() ) { - error( QString( "Cannot load WCS provider with URI: %1" ).arg( QString( uri.encodedUri() ) ), theReport ); + error( QString( "Cannot load WCS provider with URI: %1" ).arg( QString( theWcsUri ) ), theReport ); ok = false; } @@ -147,7 +161,7 @@ bool TestQgsWcsProvider::read( QString theIdentifier, QString theFilePath, QStri if ( !ok ) return false; - theReport += QString( "WCS URI: %1
" ).arg( QString( uri.encodedUri() ).replace( "&", "&" ) ); + theReport += QString( "WCS URI: %1
" ).arg( theWcsUri.replace( "&", "&" ) ); theReport += QString( "GDAL URI: %1
" ).arg( theFilePath ); theReport += "
"; @@ -212,7 +226,7 @@ bool TestQgsWcsProvider::read( QString theIdentifier, QString theFilePath, QStri continue; } - if ( !statsOk || typesOk ) + if ( !statsOk || !typesOk ) { allOk = false; // create values table anyway so that values are available @@ -247,7 +261,7 @@ bool TestQgsWcsProvider::read( QString theIdentifier, QString theFilePath, QStri double gdalVal = gdalProvider->readValue( gdalData, gdalProvider->dataType( band ), row * width + col ); QString valStr; - if ( wcsVal == gdalVal ) + if ( compare ( wcsVal, gdalVal, 0 ) ) { valStr = QString( "%1" ).arg( wcsVal ); } @@ -299,10 +313,15 @@ void TestQgsWcsProvider::compare( QString theParamName, int wcsVal, int gdalVal, if ( !ok ) theOk = false; } +bool TestQgsWcsProvider::compare ( double wcsVal, double gdalVal, double theTolerance ) +{ + // values may be nan + return ( std::isnan( wcsVal ) && std::isnan( gdalVal ) ) || ( qAbs( wcsVal - gdalVal ) <= theTolerance ); +} + void TestQgsWcsProvider::compare( QString theParamName, double wcsVal, double gdalVal, QString &theReport, bool &theOk, double theTolerance ) { - bool ok = ( qAbs( wcsVal - gdalVal ) <= theTolerance ); - + bool ok = compare ( wcsVal, gdalVal, theTolerance ); compareRow( theParamName, QString::number( wcsVal ), QString::number( gdalVal ), theReport, ok, QString::number( wcsVal - gdalVal ), QString::number( theTolerance ) ); if ( !ok ) theOk = false; } diff --git a/tests/testdata/raster/band1_byte_ct_epsg4326.tif b/tests/testdata/raster/band1_byte_ct_epsg4326.tif new file mode 100644 index 00000000000..0eeec5a6049 Binary files /dev/null and b/tests/testdata/raster/band1_byte_ct_epsg4326.tif differ diff --git a/tests/testdata/raster/band1_byte_ct_epsg4326.tif.aux.xml b/tests/testdata/raster/band1_byte_ct_epsg4326.tif.aux.xml new file mode 100644 index 00000000000..17baac178ae --- /dev/null +++ b/tests/testdata/raster/band1_byte_ct_epsg4326.tif.aux.xml @@ -0,0 +1,13 @@ + + + + 2.000000e+00 1.280000e+02 0 255 0 255 255 0 + 1.280000e+02 2.540000e+02 255 255 0 255 0 0 + 2 + 254 + 135.53086419753 + 2 + 73.957459647589 + + + diff --git a/tests/testdata/raster/band1_byte_noct_epsg4326.tif b/tests/testdata/raster/band1_byte_noct_epsg4326.tif new file mode 100644 index 00000000000..4a6d8bd4b83 Binary files /dev/null and b/tests/testdata/raster/band1_byte_noct_epsg4326.tif differ diff --git a/tests/testdata/raster/band1_byte_noct_epsg4326.tif.aux.xml b/tests/testdata/raster/band1_byte_noct_epsg4326.tif.aux.xml new file mode 100644 index 00000000000..17baac178ae --- /dev/null +++ b/tests/testdata/raster/band1_byte_noct_epsg4326.tif.aux.xml @@ -0,0 +1,13 @@ + + + + 2.000000e+00 1.280000e+02 0 255 0 255 255 0 + 1.280000e+02 2.540000e+02 255 255 0 255 0 0 + 2 + 254 + 135.53086419753 + 2 + 73.957459647589 + + + diff --git a/tests/testdata/raster/band1_float32_noct_epsg4326.tif b/tests/testdata/raster/band1_float32_noct_epsg4326.tif new file mode 100644 index 00000000000..d740eeca26d Binary files /dev/null and b/tests/testdata/raster/band1_float32_noct_epsg4326.tif differ diff --git a/tests/testdata/raster/band1_float32_noct_epsg4326.tif.aux.xml b/tests/testdata/raster/band1_float32_noct_epsg4326.tif.aux.xml new file mode 100644 index 00000000000..009f2c59fde --- /dev/null +++ b/tests/testdata/raster/band1_float32_noct_epsg4326.tif.aux.xml @@ -0,0 +1,12 @@ + + + + 0.000000e+00 0.000000e+00 255 127 0 255 127 0 + 1 + 3.3999999521444e+38 + 2.4177777984595e+37 + -3.3319999287626e+38 + 1.9800745699579e+38 + + + diff --git a/tests/testdata/raster/band1_int16_noct_epsg4326.tif b/tests/testdata/raster/band1_int16_noct_epsg4326.tif new file mode 100644 index 00000000000..9d6e5985e21 Binary files /dev/null and b/tests/testdata/raster/band1_int16_noct_epsg4326.tif differ diff --git a/tests/testdata/raster/band1_int16_noct_epsg4326.tif.aux.xml b/tests/testdata/raster/band1_int16_noct_epsg4326.tif.aux.xml new file mode 100644 index 00000000000..f5853a6bb7d --- /dev/null +++ b/tests/testdata/raster/band1_int16_noct_epsg4326.tif.aux.xml @@ -0,0 +1,13 @@ + + + + -3.211166e+04 3.276700e+02 0 255 0 255 255 0 + 3.276700e+02 3.276700e+04 255 255 0 255 0 0 + 2 + 32767 + 2330.024691358 + -32111 + 19082.231766347 + + + diff --git a/tests/testdata/raster/band3_byte_noct_epsg4326.tif b/tests/testdata/raster/band3_byte_noct_epsg4326.tif new file mode 100644 index 00000000000..65918e2c33d Binary files /dev/null and b/tests/testdata/raster/band3_byte_noct_epsg4326.tif differ diff --git a/tests/testdata/raster/band3_byte_noct_epsg4326.tif.aux.xml b/tests/testdata/raster/band3_byte_noct_epsg4326.tif.aux.xml new file mode 100644 index 00000000000..b273919e9d6 --- /dev/null +++ b/tests/testdata/raster/band3_byte_noct_epsg4326.tif.aux.xml @@ -0,0 +1,35 @@ + + + + 2.000000e+00 1.280000e+02 0 255 0 255 255 0 + 1.280000e+02 2.540000e+02 255 255 0 255 0 0 + 2 + 254 + 135.53086419753 + 2 + 73.957459647589 + + + + + 2.000000e+00 1.280000e+02 0 255 0 255 255 0 + 1.280000e+02 2.540000e+02 255 255 0 255 0 0 + 2 + 254 + 135.53086419753 + 2 + 73.957459647589 + + + + + 2.000000e+00 1.280000e+02 0 255 0 255 255 0 + 1.280000e+02 2.540000e+02 255 255 0 255 0 0 + 2 + 254 + 135.53086419753 + 2 + 73.957459647589 + + + diff --git a/tests/testdata/raster/band3_float32_noct_epsg4326.tif b/tests/testdata/raster/band3_float32_noct_epsg4326.tif new file mode 100644 index 00000000000..a13b3d46121 Binary files /dev/null and b/tests/testdata/raster/band3_float32_noct_epsg4326.tif differ diff --git a/tests/testdata/raster/band3_float32_noct_epsg4326.tif.aux.xml b/tests/testdata/raster/band3_float32_noct_epsg4326.tif.aux.xml new file mode 100644 index 00000000000..1510a2a22dc --- /dev/null +++ b/tests/testdata/raster/band3_float32_noct_epsg4326.tif.aux.xml @@ -0,0 +1,32 @@ + + + + 0.000000e+00 0.000000e+00 255 127 0 255 127 0 + 1 + 3.3999999521444e+38 + 2.4177777984595e+37 + -3.3319999287626e+38 + 1.9800745699579e+38 + + + + + 0.000000e+00 0.000000e+00 255 127 0 255 127 0 + 1 + 3.3999999521444e+38 + 2.4177777984595e+37 + -3.3319999287626e+38 + 1.9800745699579e+38 + + + + + 0.000000e+00 0.000000e+00 255 127 0 255 127 0 + 1 + 3.3999999521444e+38 + 2.4177777984595e+37 + -3.3319999287626e+38 + 1.9800745699579e+38 + + + diff --git a/tests/testdata/raster/band3_int16_noct_epsg4326.tif b/tests/testdata/raster/band3_int16_noct_epsg4326.tif new file mode 100644 index 00000000000..6d71b75ac4c Binary files /dev/null and b/tests/testdata/raster/band3_int16_noct_epsg4326.tif differ diff --git a/tests/testdata/raster/band3_int16_noct_epsg4326.tif.aux.xml b/tests/testdata/raster/band3_int16_noct_epsg4326.tif.aux.xml new file mode 100644 index 00000000000..98e30a7dc86 --- /dev/null +++ b/tests/testdata/raster/band3_int16_noct_epsg4326.tif.aux.xml @@ -0,0 +1,35 @@ + + + + -3.211166e+04 3.276700e+02 0 255 0 255 255 0 + 3.276700e+02 3.276700e+04 255 255 0 255 0 0 + 2 + 32767 + 2330.024691358 + -32111 + 19082.231766347 + + + + + -3.211166e+04 3.276700e+02 0 255 0 255 255 0 + 3.276700e+02 3.276700e+04 255 255 0 255 0 0 + 2 + 32767 + 2330.024691358 + -32111 + 19082.231766347 + + + + + -3.211166e+04 3.276700e+02 0 255 0 255 255 0 + 3.276700e+02 3.276700e+04 255 255 0 255 0 0 + 2 + 32767 + 2330.024691358 + -32111 + 19082.231766347 + + + diff --git a/tests/testdata/raster/wcs.map b/tests/testdata/raster/wcs.map new file mode 100644 index 00000000000..0e91a7e30d9 --- /dev/null +++ b/tests/testdata/raster/wcs.map @@ -0,0 +1,207 @@ +MAP + NAME WCS + STATUS ON + SHAPEPATH "/path/to/qgis/tests/testdata/raster" + + OUTPUTFORMAT + # NAME is used in 1.0.0 as format in capabilities and describe coverage + # in 1.1 the MIMETYPE is used instead + NAME "GEOTIFFBYTE" + DRIVER "GDAL/GTiff" + MIMETYPE "image/tiff" + # IMAGEMODE: standard modes: PC256, RGB, RGBA + # WCS (GDAL) modes: BYTE, INT16, FLOAT32 + IMAGEMODE "BYTE" + EXTENSION "tif" + END + + OUTPUTFORMAT + NAME "GEOTIFFINT16" + DRIVER "GDAL/GTiff" + MIMETYPE "image/tiff16" + IMAGEMODE "INT16" + EXTENSION "tif" + END + + OUTPUTFORMAT + NAME "GEOTIFFFLOAT32" + DRIVER "GDAL/GTiff" + MIMETYPE "image/tiff32" + IMAGEMODE "FLOAT32" + EXTENSION "tif" + END + + # Color table is not currently supported by UMN Mapserver + #OUTPUTFORMAT + #NAME "GEOTIFFINT8_COLORTABLE" + #DRIVER "GDAL/GTiff" + #MIMETYPE "image/tiff" + #IMAGEMODE "PC256" + #EXTENSION "tif" + #END + + WEB + METADATA + "wcs_label" "Quantum GIS WCS Test" + "wcs_description" "Test server to be used by Quantum GIS test suite" + #"wcs_onlineresource" "http://127.0.0.1/cgi-bin/mapserv?" ### recommended + "wcs_crs" "EPSG:4326" + "wcs_fees" "none" + "wcs_accessconstraints" "none" + "wcs_keywordlist" "qgis,wcs,test" + "wcs_metadatalink_type" "TC211" + "wcs_metadatalink_format" "text/plain" + "wcs_metadatalink_href" "http://someurl.com" + "wcs_address" "none" + "wcs_city" "none" + "wcs_stateorprovince" "none" + "wcs_postcode" "none" + "wcs_country" "none" + "wcs_contactelectronicmailaddress" "blah@blah" + "wcs_contactperson" "none" + "wcs_contactorganization" "none" + "wcs_contactposition" "none" + "wcs_contactvoicetelephone" "none" + "wcs_contactfacimiletelephone" "613-555-1235" + "wcs_enable_request" "*" + END + END + + PROJECTION + "init=epsg:4326" + END + + LAYER + NAME band3_int16_noct_epsg4326 + METADATA + "wcs_label" "band3_int16_noct_epsg4326" ### required + "wcs_rangeset_name" "Range1" ### required to support DescribeCoverage request + "wcs_rangeset_label" "My Label" ### required to support DescribeCoverage request + "wcs_rangeset_nullvalue" "-32768" + "wcs_srs" "EPSG:4326 EPSG:900913" # native must be first! + "wcs_formats" "GEOTIFFINT16" + #"wcs_nativeformat" "geotiff" + END + TYPE RASTER ### required + STATUS ON + DATA band3_int16_noct_epsg4326.tif + PROJECTION + "init=epsg:4326" + END + END + + LAYER + NAME band1_int16_noct_epsg4326 + METADATA + "wcs_label" "band1_int16_noct_epsg4326" ### required + "wcs_rangeset_name" "Range1" ### required to support DescribeCoverage request + "wcs_rangeset_label" "My Label" ### required to support DescribeCoverage request + "wcs_rangeset_nullvalue" "-32768" + "wcs_srs" "EPSG:4326 EPSG:900913" # native must be first! + "wcs_formats" "GEOTIFFINT16" + #"wcs_nativeformat" "geotiff" + END + TYPE RASTER ### required + STATUS ON + DATA band1_int16_noct_epsg4326.tif + PROJECTION + "init=epsg:4326" + END + END + + LAYER + NAME band1_float32_noct_epsg4326 + METADATA + "wcs_label" "band1_float32_noct_epsg4326" ### required + "wcs_rangeset_name" "Range1" ### required to support DescribeCoverage request + "wcs_rangeset_label" "My Label" ### required to support DescribeCoverage request + "wcs_rangeset_nullvalue" "nan" + "wcs_srs" "EPSG:4326 EPSG:900913" # native must be first! + "wcs_formats" "GEOTIFFFLOAT32" + #"wcs_nativeformat" "geotiff" + END + TYPE RASTER ### required + STATUS ON + DATA band1_float32_noct_epsg4326.tif + PROJECTION + "init=epsg:4326" + END + END + + LAYER + NAME band3_byte_noct_epsg4326 + METADATA + "wcs_label" "band3_byte_noct_epsg4326" ### required + "wcs_rangeset_name" "Range1" ### required to support DescribeCoverage request + "wcs_rangeset_label" "My Label" ### required to support DescribeCoverage request + "wcs_rangeset_nullvalue" "255" + "wcs_srs" "EPSG:4326 EPSG:900913" # native must be first! + "wcs_formats" "GEOTIFFBYTE" + #"wcs_nativeformat" "geotiff" + END + TYPE RASTER ### required + STATUS ON + DATA band3_byte_noct_epsg4326.tif + PROJECTION + "init=epsg:4326" + END + END + + LAYER + NAME band1_byte_ct_epsg4326 + METADATA + "wcs_label" "band1_byte_ct_epsg4326" ### required + "wcs_rangeset_name" "Range1" ### required to support DescribeCoverage request + "wcs_rangeset_label" "My Label" ### required to support DescribeCoverage request + "wcs_rangeset_nullvalue" "255" + "wcs_srs" "EPSG:4326 EPSG:900913" # native must be first! + "wcs_formats" "GEOTIFFBYTE" + #"wcs_nativeformat" "geotiff" + END + TYPE RASTER ### required + STATUS ON + DATA band1_byte_ct_epsg4326.tif + PROJECTION + "init=epsg:4326" + END + END + + LAYER + NAME band3_float32_noct_epsg4326 + METADATA + "wcs_label" "band3_float32_noct_epsg4326" ### required + "wcs_rangeset_name" "Range1" ### required to support DescribeCoverage request + "wcs_rangeset_label" "My Label" ### required to support DescribeCoverage request + "wcs_rangeset_nullvalue" "nan" + "wcs_srs" "EPSG:4326 EPSG:900913" # native must be first! + "wcs_formats" "GEOTIFFFLOAT32" + #"wcs_nativeformat" "geotiff" + END + TYPE RASTER ### required + STATUS ON + DATA band3_float32_noct_epsg4326.tif + PROJECTION + "init=epsg:4326" + END + END + + LAYER + NAME band1_byte_noct_epsg4326 + METADATA + "wcs_label" "band1_byte_noct_epsg4326" ### required + "wcs_rangeset_name" "Range1" ### required to support DescribeCoverage request + "wcs_rangeset_label" "My Label" ### required to support DescribeCoverage request + "wcs_rangeset_nullvalue" "255" + "wcs_srs" "EPSG:4326 EPSG:900913" # native must be first! + "wcs_formats" "GEOTIFFBYTE" + #"wcs_nativeformat" "geotiff" + END + TYPE RASTER ### required + STATUS ON + DATA band1_byte_noct_epsg4326.tif + PROJECTION + "init=epsg:4326" + END + END +END +