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
+