[mapguide-commits] r5547 - sandbox/adsk/2.3r/Web/src/HttpHandler

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Feb 14 21:48:25 EST 2011


Author: liuar
Date: 2011-02-14 18:48:25 -0800 (Mon, 14 Feb 2011)
New Revision: 5547

Modified:
   sandbox/adsk/2.3r/Web/src/HttpHandler/WmsMapUtil.cpp
Log:
Ticket #1594 Layer with EPSG:3398 CS not visible after publishing as WMS


Modified: sandbox/adsk/2.3r/Web/src/HttpHandler/WmsMapUtil.cpp
===================================================================
--- sandbox/adsk/2.3r/Web/src/HttpHandler/WmsMapUtil.cpp	2011-02-15 02:47:25 UTC (rev 5546)
+++ sandbox/adsk/2.3r/Web/src/HttpHandler/WmsMapUtil.cpp	2011-02-15 02:48:25 UTC (rev 5547)
@@ -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,8 @@
                         filter = gl->GetFilter();
                     }
 
-                    
                     Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(mgLayer->GetFeatureSourceId());
+
                     STRING qualifiedName = mgLayer->GetFeatureClassName();
 
                     int pos = qualifiedName.find(L":");
@@ -225,6 +224,51 @@
                         Ptr<MgPropertyDefinition> prop = propDefCol->GetItem(i);
                         if(prop->GetPropertyType() == MgFeaturePropertyType::GeometricProperty)
                         {
+                            STRING spatialContextAssociation = L"";
+                            STRING layerCoordSysWkt = L"";
+                            
+                            //Get the layer CS
+                            MgGeometricPropertyDefinition* geomProp = static_cast<MgGeometricPropertyDefinition*>(prop.p);
+                            spatialContextAssociation = geomProp->GetSpatialContextAssociation();
+
+                            Ptr<MgSpatialContextReader> scReader = featureService->GetSpatialContexts(fsId, false);
+                            if(scReader.p != NULL)
+                            {
+                                while(scReader->ReadNext())
+                                {
+                                    STRING csrName = scReader->GetName();
+                                    if(!spatialContextAssociation.empty() &&  csrName == spatialContextAssociation)
+                                    {
+                                        layerCoordSysWkt = scReader->GetCoordinateSystemWkt();
+                                        break;
+                                    }
+                                    else if(layerCoordSysWkt.empty())
+                                    {
+                                        // This is the 1st spatial context returned
+                                        // This will be overwritten if we find the association
+                                        layerCoordSysWkt = scReader->GetCoordinateSystemWkt();
+                                    }
+                                }
+                                scReader->Close();
+                            }
+
+                            Ptr<MgCoordinateSystem> layerCs = (layerCoordSysWkt.empty()) ? NULL : factory->Create(layerCoordSysWkt);
+                            if(layerCs != NULL)
+                            {   
+                                csTrans = factory->GetTransform(mapCs,layerCs);
+                                csTrans->IgnoreDatumShiftWarning(true);
+                                csTrans->IgnoreOutsideDomainWarning(true);
+                            }
+
+                            // 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 propName = prop->GetName();
                             
                             STRING boundingboxGeom = L"GeomFromText('POLYGON((" 



More information about the mapguide-commits mailing list