[mapserver-commits] r10000 - trunk/mapserver

svn at osgeo.org svn at osgeo.org
Wed Mar 24 12:23:06 EDT 2010


Author: warmerdam
Date: 2010-03-24 12:23:04 -0400 (Wed, 24 Mar 2010)
New Revision: 10000

Modified:
   trunk/mapserver/HISTORY.TXT
   trunk/mapserver/mapdrawgdal.c
   trunk/mapserver/mapraster.c
   trunk/mapserver/maprasterquery.c
   trunk/mapserver/mapresample.c
   trunk/mapserver/mapwcs.c
Log:
Reworked so that msGetGDALGeoTransform() assumes TLOCK_GDAL already held,
and it only releases it for GetExtent call.  Also avoid calling the OWS
GetExtent function if we know there is ows metadata to avoid extra gdalopens.
Finally fixed raster GetExtent to use same lower level origin assumptions
for ungeoreferenced rasters as msGetGDALGeoTransform() makes. (#3368)


Modified: trunk/mapserver/HISTORY.TXT
===================================================================
--- trunk/mapserver/HISTORY.TXT	2010-03-24 15:26:31 UTC (rev 9999)
+++ trunk/mapserver/HISTORY.TXT	2010-03-24 16:23:04 UTC (rev 10000)
@@ -26,6 +26,8 @@
 
 - Correct mutex locking problem with rasters with no inherent georef. (#3368) 
 
+- Correct ungeoreferenced defaults via GetExtent() on raster layer (#3368)
+
 - PHP Mapscript refactoring: take full advantage of PHP 5 / Zend Engine 2 (#3278)"
 
 - Fixed msRemoveHashTable() to return the proper value on failure/success.

Modified: trunk/mapserver/mapdrawgdal.c
===================================================================
--- trunk/mapserver/mapdrawgdal.c	2010-03-24 15:26:31 UTC (rev 9999)
+++ trunk/mapserver/mapdrawgdal.c	2010-03-24 16:23:04 UTC (rev 10000)
@@ -1819,7 +1819,8 @@
 /*                       msGetGDALGeoTransform()                        */
 /*                                                                      */
 /*      Cover function that tries GDALGetGeoTransform(), a world        */
-/*      file or OWS extents.                                            */
+/*      file or OWS extents.  It is assumed that TLOCK_GDAL is held     */
+/*      before this function is called.                                 */
 /************************************************************************/
 
 int msGetGDALGeoTransform( GDALDatasetH hDS, mapObj *map, layerObj *layer, 
@@ -1827,6 +1828,8 @@
 
 {
     const char *extent_priority = NULL;
+    const char *value;
+
 #if defined(USE_WMS_SVR) || defined (USE_WFS_SVR)
     rectObj  rect;
 #endif
@@ -1881,29 +1884,42 @@
 /* -------------------------------------------------------------------- */
 /*      Try worldfile.                                                  */
 /* -------------------------------------------------------------------- */
-    else if( GDALGetDescription(hDS) != NULL 
-             && GDALReadWorldFile(GDALGetDescription(hDS), "wld", 
-                                  padfGeoTransform) )
+    if( GDALGetDescription(hDS) != NULL 
+        && GDALReadWorldFile(GDALGetDescription(hDS), "wld", 
+                             padfGeoTransform) )
     {
         return MS_SUCCESS;
     }
 
 /* -------------------------------------------------------------------- */
-/*      Try OWS extent metadata.                                        */
+/*      Try OWS extent metadata.  We only try this if we know there     */
+/*      is metadata so that we don't end up going into the layer        */
+/*      getextent function which will in turn reopen the file with      */
+/*      potential performance and locking problems.                     */
 /* -------------------------------------------------------------------- */
 #if defined(USE_WMS_SVR) || defined (USE_WFS_SVR)
-    else if( msOWSGetLayerExtent( map, layer, "MFCO", &rect ) == MS_SUCCESS )
+    if ((value = msOWSLookupMetadata(&(layer->metadata), "MFCO", "extent"))
+        != NULL)
     {
-        padfGeoTransform[0] = rect.minx;
-        padfGeoTransform[1] = (rect.maxx - rect.minx) /
-            (double) GDALGetRasterXSize( hDS );
-        padfGeoTransform[2] = 0;
-        padfGeoTransform[3] = rect.maxy;
-        padfGeoTransform[4] = 0;
-        padfGeoTransform[5] = (rect.miny - rect.maxy) /
-            (double) GDALGetRasterYSize( hDS );
+        int success;
 
-        return MS_SUCCESS;
+        msReleaseLock( TLOCK_GDAL );
+        success = msOWSGetLayerExtent( map, layer, "MFCO", &rect );
+        msAcquireLock( TLOCK_GDAL );
+
+        if( success == MS_SUCCESS )
+        {
+            padfGeoTransform[0] = rect.minx;
+            padfGeoTransform[1] = (rect.maxx - rect.minx) /
+                (double) GDALGetRasterXSize( hDS );
+            padfGeoTransform[2] = 0;
+            padfGeoTransform[3] = rect.maxy;
+            padfGeoTransform[4] = 0;
+            padfGeoTransform[5] = (rect.miny - rect.maxy) /
+                (double) GDALGetRasterYSize( hDS );
+            
+            return MS_SUCCESS;
+        }
     }
 #endif
 
@@ -1912,17 +1928,14 @@
 /*      Reset our default geotransform.  GDALGetGeoTransform() may      */
 /*      have altered it even if GDALGetGeoTransform() failed.           */
 /* -------------------------------------------------------------------- */
-    else
-    {
-        padfGeoTransform[0] = 0.0;
-        padfGeoTransform[1] = 1.0;
-        padfGeoTransform[2] = 0.0;
-        padfGeoTransform[3] = GDALGetRasterYSize(hDS);
-        padfGeoTransform[4] = 0.0;
-        padfGeoTransform[5] = -1.0;
-
-        return MS_FAILURE;
-    }
+    padfGeoTransform[0] = 0.0;
+    padfGeoTransform[1] = 1.0;
+    padfGeoTransform[2] = 0.0;
+    padfGeoTransform[3] = GDALGetRasterYSize(hDS);
+    padfGeoTransform[4] = 0.0;
+    padfGeoTransform[5] = -1.0;
+    
+    return MS_FAILURE;
 }
 
 /************************************************************************/

Modified: trunk/mapserver/mapraster.c
===================================================================
--- trunk/mapserver/mapraster.c	2010-03-24 15:26:31 UTC (rev 9999)
+++ trunk/mapserver/mapraster.c	2010-03-24 16:23:04 UTC (rev 10000)
@@ -601,9 +601,7 @@
         }
     }
 
-    msReleaseLock( TLOCK_GDAL );
     msGetGDALGeoTransform( hDS, map, layer, adfGeoTransform );
-    msAcquireLock( TLOCK_GDAL );
 
     /* 
     ** We want to resample if the source image is rotated, if

Modified: trunk/mapserver/maprasterquery.c
===================================================================
--- trunk/mapserver/maprasterquery.c	2010-03-24 15:26:31 UTC (rev 9999)
+++ trunk/mapserver/maprasterquery.c	2010-03-24 16:23:04 UTC (rev 10000)
@@ -1381,6 +1381,7 @@
   GDALDatasetH hDS;
   shapefileObj *tileshpfile;
   int tilelayerindex = -1; 
+  CPLErr eErr = CE_Failure;
 
   /*
   ** For the time being we only automatically derive extents from
@@ -1431,17 +1432,25 @@
   {
     nXSize = GDALGetRasterXSize( hDS );
     nYSize = GDALGetRasterYSize( hDS );
-    GDALGetGeoTransform( hDS, adfGeoTransform );
+    eErr = GDALGetGeoTransform( hDS, adfGeoTransform );
     
     GDALClose( hDS );
   }
   
   msReleaseLock( TLOCK_GDAL );
 
-  if( hDS == NULL )
+  if( hDS == NULL || eErr != CE_None )
   {
       return MS_FAILURE;
   }
+
+  /* If this appears to be an ungeoreferenced raster than flip it for
+     mapservers purposes. */
+  if( adfGeoTransform[5] == 1.0 && adfGeoTransform[3] == 0.0 )
+  {
+      adfGeoTransform[5] = -1.0;
+      adfGeoTransform[3] = nYSize;
+  }
   
   extent->minx = adfGeoTransform[0];
   extent->maxy = adfGeoTransform[3];

Modified: trunk/mapserver/mapresample.c
===================================================================
--- trunk/mapserver/mapresample.c	2010-03-24 15:26:31 UTC (rev 9999)
+++ trunk/mapserver/mapresample.c	2010-03-24 16:23:04 UTC (rev 10000)
@@ -1472,9 +1472,7 @@
 
     memcpy( adfDstGeoTransform, map->gt.geotransform, sizeof(double)*6 );
 
-    msReleaseLock( TLOCK_GDAL );
     msGetGDALGeoTransform( hDS, map, layer, adfSrcGeoTransform );
-    msAcquireLock( TLOCK_GDAL );
 
     nSrcXSize = GDALGetRasterXSize( hDS );
     nSrcYSize = GDALGetRasterYSize( hDS );

Modified: trunk/mapserver/mapwcs.c
===================================================================
--- trunk/mapserver/mapwcs.c	2010-03-24 15:26:31 UTC (rev 9999)
+++ trunk/mapserver/mapwcs.c	2010-03-24 16:23:04 UTC (rev 10000)
@@ -2062,7 +2062,6 @@
       return MS_FAILURE;
     }
 
-
     msGetGDALGeoTransform( hDS, layer->map, layer, cm->geotransform );
 
     cm->xsize = GDALGetRasterXSize( hDS );



More information about the mapserver-commits mailing list