[mapguide-commits] r5515 - trunk/MgDev/Web/src/HttpHandler

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Sun Jan 30 21:45:58 EST 2011


Author: liuar
Date: 2011-01-30 18:45:58 -0800 (Sun, 30 Jan 2011)
New Revision: 5515

Modified:
   trunk/MgDev/Web/src/HttpHandler/WmsMapUtil.cpp
Log:
Fix ticket #1594 Layer with EPSG:3398 CS not visible after publishing as WMS


Modified: trunk/MgDev/Web/src/HttpHandler/WmsMapUtil.cpp
===================================================================
--- trunk/MgDev/Web/src/HttpHandler/WmsMapUtil.cpp	2011-01-28 17:43:05 UTC (rev 5514)
+++ trunk/MgDev/Web/src/HttpHandler/WmsMapUtil.cpp	2011-01-31 02:45:58 UTC (rev 5515)
@@ -131,6 +131,10 @@
     // Add the requested layers
     if (NULL != layerDefIds && layerDefIds->GetCount() > 0)
     {
+        Ptr<MgCoordinateSystemFactory> factory = new MgCoordinateSystemFactory();
+        Ptr<MgCoordinateSystem> mapCs = factory->Create(sWKT);
+        Ptr<MgCoordinateSystemTransform> csTrans;
+
         Ptr<MgLayerCollection> mapLayers = map->GetLayers();
 
         for (INT32 i = layerDefIds->GetCount() - 1; i >= 0; --i)
@@ -171,18 +175,13 @@
                     sMaxY = L"0";
                 }
 
-                Ptr<MgCoordinate> lowerLeftCoord = extents->GetLowerLeftCoordinate();
-                Ptr<MgCoordinate> upperRightCoord = extents->GetUpperRightCoordinate();
-                double mapMinX = lowerLeftCoord->GetX();
-                double mapMinY = lowerLeftCoord->GetY();
-                double mapMaxX = upperRightCoord->GetX();
-                double mapMaxY = upperRightCoord->GetX();
+                // User defined Boundingbox under map CS
+                Ptr<MgEnvelope> wmsLayerExtent = new MgEnvelope(MgUtil::StringToDouble(sMinX), MgUtil::StringToDouble(sMinY), MgUtil::StringToDouble(sMaxX), MgUtil::StringToDouble(sMaxY));
 
                 // Optimization...
                 // If the request boundingbox (map boundingbox) within the user defined boundingbox (wms layer boundingbox),
                 // spatial query on the layer should be ignored. Just reuse the original layer's layer definition
-                if(mapMinX >= MgUtil::StringToDouble(sMinX) && mapMinY >= MgUtil::StringToDouble(sMinY)
-                    && mapMaxX <= MgUtil::StringToDouble(sMaxX) && mapMaxY <= MgUtil::StringToDouble(sMaxY))
+                if(wmsLayerExtent->Contains(extents))
                 {
                     wmsLayerResId = resId;
                 }
@@ -208,8 +207,35 @@
                         filter = gl->GetFilter();
                     }
 
-                    
                     Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(mgLayer->GetFeatureSourceId());
+
+                    //Get the layer CS
+                    Ptr<MgSpatialContextReader> scReader = featureService->GetSpatialContexts(fsId, false);
+                    if(scReader.p != NULL)
+                    {
+                        if(scReader->ReadNext())
+                        {
+                            STRING layerCoordSysWkt = scReader->GetCoordinateSystemWkt();
+                            Ptr<MgCoordinateSystem> layerCs = (layerCoordSysWkt.empty()) ? NULL : factory->Create(layerCoordSysWkt);
+                            if(layerCs != NULL)
+                            {   
+                                csTrans = factory->GetTransform(mapCs,layerCs);
+                                csTrans->IgnoreDatumShiftWarning(true);
+                                csTrans->IgnoreOutsideDomainWarning(true);
+                            }
+                        }
+                        scReader->Close();
+                    }
+
+                    // Transform user defined boundingbox to layer CS
+                    Ptr<MgEnvelope> layerCsExtent = csTrans->Transform(wmsLayerExtent);
+                    Ptr<MgCoordinate> layerCsLowerLeftCoordinate = layerCsExtent->GetLowerLeftCoordinate();
+                    Ptr<MgCoordinate> layerCsUpperRightCoordinate = layerCsExtent->GetUpperRightCoordinate();
+                    MgUtil::DoubleToString(layerCsLowerLeftCoordinate->GetX(),sMinX);
+                    MgUtil::DoubleToString(layerCsLowerLeftCoordinate->GetY(),sMinY);
+                    MgUtil::DoubleToString(layerCsUpperRightCoordinate->GetX(),sMaxX);
+                    MgUtil::DoubleToString(layerCsUpperRightCoordinate->GetY(),sMaxY);
+
                     STRING qualifiedName = mgLayer->GetFeatureClassName();
 
                     int pos = qualifiedName.find(L":");



More information about the mapguide-commits mailing list