[mapserver-commits] r9288 - trunk/mapserver
svn at osgeo.org
svn at osgeo.org
Tue Sep 1 23:16:00 EDT 2009
Author: sdlime
Date: 2009-09-01 23:16:00 -0400 (Tue, 01 Sep 2009)
New Revision: 9288
Modified:
trunk/mapserver/HISTORY.TXT
trunk/mapserver/mapwcs.c
Log:
Fixed WCS processing when both crs and response_crs are specified. (#3083)
Modified: trunk/mapserver/HISTORY.TXT
===================================================================
--- trunk/mapserver/HISTORY.TXT 2009-09-02 03:13:15 UTC (rev 9287)
+++ trunk/mapserver/HISTORY.TXT 2009-09-02 03:16:00 UTC (rev 9288)
@@ -14,6 +14,8 @@
Current Version (SVN trunk):
----------------------------
+- Fixed WCS processing when both crs and response_crs are specified (#3083)
+
- Fixed msFreeMap causing memory corruption in msFreeOutputFormat (#3113)
- Fix WMC XML output when Dimension is used (#3110)
Modified: trunk/mapserver/mapwcs.c
===================================================================
--- trunk/mapserver/mapwcs.c 2009-09-02 03:13:15 UTC (rev 9287)
+++ trunk/mapserver/mapwcs.c 2009-09-02 03:16:00 UTC (rev 9288)
@@ -1434,7 +1434,7 @@
/* fill in bands rangeset info, if required. */
msWCSSetDefaultBandsRangeSetInfo(params, &cm, lp);
- /* handle the response CRS, that is set the map object projection */
+ /* handle the response CRS, that is, set the map object projection */
if(params->response_crs || params->crs ) {
int iUnits;
const char *crs_to_use = params->response_crs;
@@ -1442,18 +1442,16 @@
if( crs_to_use == NULL )
crs_to_use = params->crs;
- if (strncasecmp(crs_to_use, "EPSG:", 5) == 0
- || strncasecmp(crs_to_use,"urn:ogc:def:crs:",16) == 0 ) {
+ if (strncasecmp(crs_to_use, "EPSG:", 5) == 0 || strncasecmp(crs_to_use,"urn:ogc:def:crs:",16) == 0 ) {
if (msLoadProjectionString(&(map->projection), (char *) crs_to_use) != 0)
- return msWCSException( map, NULL, NULL,params->version);
+ return msWCSException( map, NULL, NULL,params->version);
} else if( strcasecmp(crs_to_use,"imageCRS") == 0 ) {
- /* use layer native CRS, and rework bounding box accordingly */
- if( msWCSGetCoverage_ImageCRSSetup( map, request, params, &cm, lp )
- != MS_SUCCESS )
- return MS_FAILURE;
+ /* use layer native CRS, and rework bounding box accordingly */
+ if( msWCSGetCoverage_ImageCRSSetup( map, request, params, &cm, lp ) != MS_SUCCESS )
+ return MS_FAILURE;
} else { /* should we support WMS style AUTO: projections? (not for now) */
msSetError(MS_WCSERR, "Unsupported SRS namespace (only EPSG currently supported).", "msWCSGetCoverage()");
- return msWCSException(map, "InvalidParameterValue", "srs",params->version);
+ return msWCSException(map, "InvalidParameterValue", "srs", params->version);
}
iUnits = GetMapserverUnitUsingProj(&(map->projection));
@@ -1471,28 +1469,24 @@
/* check format of TIME parameter */
if(strchr(params->time, ',')) {
msSetError( MS_WCSERR, "Temporal lists are not supported, only individual values.", "msWCSGetCoverage()" );
- return msWCSException(map, "InvalidParameterValue", "time",
- params->version);
+ return msWCSException(map, "InvalidParameterValue", "time", params->version);
}
if(strchr(params->time, '/')) {
msSetError( MS_WCSERR, "Temporal ranges are not supported, only individual values.", "msWCSGetCoverage()" );
- return msWCSException(map, "InvalidParameterValue", "time",
- params->version);
+ return msWCSException(map, "InvalidParameterValue", "time", params->version);
}
/* TODO: will need to expand this check if a time period is supported */
value = msOWSLookupMetadata(&(lp->metadata), "COM", "timeposition");
if(!value) {
msSetError( MS_WCSERR, "The coverage does not support temporal subsetting.", "msWCSGetCoverage()" );
- return msWCSException(map, "InvalidParameterValue", "time",
- params->version );
+ return msWCSException(map, "InvalidParameterValue", "time", params->version );
}
/* check if timestamp is covered by the wcs_timeposition definition */
if (msValidateTimeValue(params->time, value) == MS_FALSE) {
msSetError( MS_WCSERR, "The coverage does not have a time position of %s.", "msWCSGetCoverage()", params->time );
- return msWCSException(map, "InvalidParameterValue", "time",
- params->version);
+ return msWCSException(map, "InvalidParameterValue", "time", params->version);
}
/* make sure layer is tiled appropriately */
@@ -1527,84 +1521,72 @@
}
if( strncasecmp(params->version,"1.0",3) == 0 )
- status = msWCSGetCoverageBands10( map, request, params, lp, &bandlist );
+ status = msWCSGetCoverageBands10( map, request, params, lp, &bandlist );
else
- status = msWCSGetCoverageBands11( map, request, params, lp, &bandlist );
+ status = msWCSGetCoverageBands11( map, request, params, lp, &bandlist );
if( status != MS_SUCCESS )
- return status;
+ return status;
/* did we get BBOX values? if not use the exent stored in the coverageMetadataObj */
- if( fabs((params->bbox.maxx - params->bbox.minx)) < 0.000000000001
- || fabs(params->bbox.maxy - params->bbox.miny) < 0.000000000001 ) {
+ if( fabs((params->bbox.maxx - params->bbox.minx)) < 0.000000000001 || fabs(params->bbox.maxy - params->bbox.miny) < 0.000000000001 ) {
+ params->bbox = cm.extent;
- params->bbox = cm.extent;
-
- /* WCS 1.1 boundbox is center of pixel oriented. */
- if( strncasecmp(params->version,"1.1",3) == 0 )
- {
- params->bbox.minx += cm.geotransform[1]/2 + cm.geotransform[2]/2;
- params->bbox.maxx -= cm.geotransform[1]/2 + cm.geotransform[2]/2;
- params->bbox.maxy += cm.geotransform[4]/2 + cm.geotransform[5]/2;
- params->bbox.miny -= cm.geotransform[4]/2 + cm.geotransform[5]/2;
- }
+ /* WCS 1.1 boundbox is center of pixel oriented. */
+ if( strncasecmp(params->version,"1.1",3) == 0 ) {
+ params->bbox.minx += cm.geotransform[1]/2 + cm.geotransform[2]/2;
+ params->bbox.maxx -= cm.geotransform[1]/2 + cm.geotransform[2]/2;
+ params->bbox.maxy += cm.geotransform[4]/2 + cm.geotransform[5]/2;
+ params->bbox.miny -= cm.geotransform[4]/2 + cm.geotransform[5]/2;
+ }
}
/* WCS 1.1+ GridOrigin is effectively resetting the minx/maxy
BOUNDINGBOX values, so apply that here */
- if( params->originx != 0.0 || params->originy != 0.0 )
- {
- /* should never be 1.0 in this logic. */
- assert( strncasecmp(params->version,"1.0",3) != 0 );
- params->bbox.minx = params->originx;
- params->bbox.maxy = params->originy;
+ if( params->originx != 0.0 || params->originy != 0.0 ) {
+ assert( strncasecmp(params->version,"1.0",3) != 0 ); /* should always be 1.0 in this logic. */
+ params->bbox.minx = params->originx;
+ params->bbox.maxy = params->originy;
}
- /* if necessary, project the BBOX */
+ /* if necessary, project the BBOX to the map->projection */
+ if(params->response_crs && params->crs) {
+ projectionObj tmp_proj;
- /* in WCS 1.1 the default is full resolution */
- if( strncasecmp(params->version,"1.1",3) == 0
- && params->resx == 0.0 && params->resy == 0.0 ) {
+ msInitProjection(&tmp_proj);
+ if (msLoadProjectionString(&tmp_proj, (char *) params->crs) != 0)
+ return msWCSException( map, NULL, NULL, params->version);
+ msProjectRect(&tmp_proj, &map->projection, &(params->bbox));
+ msFreeProjection(&tmp_proj);
+ }
+ /* in WCS 1.1 the default is full resolution */
+ if( strncasecmp(params->version,"1.1",3) == 0 && params->resx == 0.0 && params->resy == 0.0 ) {
params->resx = cm.geotransform[1];
params->resy = fabs(cm.geotransform[5]);
}
/* compute width/height from BBOX and cellsize. */
- if( (params->resx == 0.0 || params->resy == 0.0)
- && params->width != 0 && params->height != 0 ) {
-
- /* should always be 1.0 in this logic. */
- assert( strncasecmp(params->version,"1.0",3) == 0 );
-
+ if( (params->resx == 0.0 || params->resy == 0.0) && params->width != 0 && params->height != 0 ) {
+ assert( strncasecmp(params->version,"1.0",3) == 0 ); /* should always be 1.0 in this logic. */
params->resx = (params->bbox.maxx -params->bbox.minx) / params->width;
params->resy = (params->bbox.maxy -params->bbox.miny) / params->height;
}
/* compute cellsize/res from bbox and raster size. */
- if( (params->width == 0 || params->height == 0)
- && params->resx != 0 && params->resy != 0 ) {
+ if( (params->width == 0 || params->height == 0) && params->resx != 0 && params->resy != 0 ) {
/* WCS 1.0 boundbox is edge of pixel oriented. */
- if( strncasecmp(params->version,"1.0",3) == 0 )
- {
- params->width = (int) ((params->bbox.maxx - params->bbox.minx)
- / params->resx + 0.5);
- params->height = (int) ((params->bbox.maxy - params->bbox.miny)
- / params->resy + 0.5);
- }
- else
- {
- params->width = (int) ((params->bbox.maxx - params->bbox.minx)
- / params->resx + 1.000001);
- params->height = (int) ((params->bbox.maxy - params->bbox.miny)
- / params->resy + 1.000001);
+ if( strncasecmp(params->version,"1.0",3) == 0 ) {
+ params->width = (int) ((params->bbox.maxx - params->bbox.minx) / params->resx + 0.5);
+ params->height = (int) ((params->bbox.maxy - params->bbox.miny) / params->resy + 0.5);
+ } else {
+ params->width = (int) ((params->bbox.maxx - params->bbox.minx) / params->resx + 1.000001);
+ params->height = (int) ((params->bbox.maxy - params->bbox.miny) / params->resy + 1.000001);
- /* recompute bounding box so we get exactly the origin and
- resolution requested. */
- params->bbox.maxx = params->bbox.minx
- + (params->width-1) * params->resx;
- params->bbox.miny = params->bbox.maxy
- - (params->height-1) * params->resy;
+ /* recompute bounding box so we get exactly the origin and
+ resolution requested. */
+ params->bbox.maxx = params->bbox.minx + (params->width-1) * params->resx;
+ params->bbox.miny = params->bbox.maxy - (params->height-1) * params->resy;
}
}
@@ -1618,28 +1600,22 @@
/* Do we need to force special handling? */
if( fabs(params->resx/params->resy - 1.0) > 0.001 ) {
- map->gt.need_geotransform = MS_TRUE;
- if( map->debug )
- msDebug( "RESX and RESY don't match. Using geotransform/resample.\n");
+ map->gt.need_geotransform = MS_TRUE;
+ if( map->debug ) msDebug( "RESX and RESY don't match. Using geotransform/resample.\n");
}
/* Do we have a specified interpolation method */
- if( params->interpolation != NULL )
- {
- if( strncasecmp(params->interpolation,"NEAREST",7) == 0 )
- msLayerSetProcessingKey(lp, "RESAMPLE", "NEAREST");
- else if( strcasecmp(params->interpolation,"BILINEAR") == 0 )
- msLayerSetProcessingKey(lp, "RESAMPLE", "BILINEAR");
- else if( strcasecmp(params->interpolation,"AVERAGE") == 0 )
- msLayerSetProcessingKey(lp, "RESAMPLE", "AVERAGE");
- else
- {
- msSetError( MS_WCSERR,
- "INTERPOLATION=%s specifies an unsupported interpolation method.",
- "msWCSGetCoverage()",
- params->interpolation );
- return msWCSException(map, "InvalidParameterValue", "interpolation", params->version);
- }
+ if( params->interpolation != NULL ) {
+ if( strncasecmp(params->interpolation,"NEAREST",7) == 0 )
+ msLayerSetProcessingKey(lp, "RESAMPLE", "NEAREST");
+ else if( strcasecmp(params->interpolation,"BILINEAR") == 0 )
+ msLayerSetProcessingKey(lp, "RESAMPLE", "BILINEAR");
+ else if( strcasecmp(params->interpolation,"AVERAGE") == 0 )
+ msLayerSetProcessingKey(lp, "RESAMPLE", "AVERAGE");
+ else {
+ msSetError( MS_WCSERR, "INTERPOLATION=%s specifies an unsupported interpolation method.", "msWCSGetCoverage()", params->interpolation );
+ return msWCSException(map, "InvalidParameterValue", "interpolation", params->version);
+ }
}
/* apply region and size to map object. */
@@ -1647,12 +1623,11 @@
map->height = params->height;
/* adjust OWS BBOX to MapServer's pixel model */
- if( strncasecmp(params->version,"1.0",3) == 0 )
- {
- params->bbox.minx += params->resx*0.5;
- params->bbox.miny += params->resy*0.5;
- params->bbox.maxx -= params->resx*0.5;
- params->bbox.maxy -= params->resy*0.5;
+ if( strncasecmp(params->version,"1.0",3) == 0 ) {
+ params->bbox.minx += params->resx*0.5;
+ params->bbox.miny += params->resy*0.5;
+ params->bbox.maxx -= params->resx*0.5;
+ params->bbox.maxy -= params->resy*0.5;
}
map->extent = params->bbox;
More information about the mapserver-commits
mailing list