[mapguide-commits] r7541 - trunk/MgDev/Server/src/Services/Feature

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu May 30 00:13:23 PDT 2013


Author: christinebao
Date: 2013-05-30 00:13:22 -0700 (Thu, 30 May 2013)
New Revision: 7541

Modified:
   trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.cpp
   trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.h
   trunk/MgDev/Server/src/Services/Feature/TransformCache.cpp
Log:
#2258: Serve WFS in alternate CS: SRSNAME not respected in getfeature, alternate SRS not available
- Use MgGMLCsTransform to override FdoCoordinateSystemTransform, and do coordinate system transformation.

Modified: trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.cpp	2013-05-30 01:55:22 UTC (rev 7540)
+++ trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.cpp	2013-05-30 07:13:22 UTC (rev 7541)
@@ -1832,6 +1832,7 @@
     //get a transform from feature space to mapping space
     TransformCache* item = TransformCache::GetLayerToMapTransform(transformCache, lfeatureName, fs, mapCs, &fact, this);
     Ptr<MgCoordinateSystemTransform> trans = item? item->GetMgTransform() : NULL;
+    FdoPtr<MgGMLCsTransform> transform = new MgGMLCsTransform(trans);
 
     assert(fc != NULL);
     if (fc == NULL)
@@ -1926,6 +1927,14 @@
     flags->SetCollectionName(L"FeatureCollection");
     flags->SetMemberName(L"featureMember");
     flags->SetMemberUri(L"http://www.opengis.net/gml");
+    flags->SetCoordinateSystemTransform(transform);    
+    int epsgCode = 0;
+    if (mapCs != NULL)
+    {
+        epsgCode = mapCs->GetEpsgCode();
+    }
+    STRING srsName = L"EPSG:" + to_wstring((_Longlong)epsgCode) ;
+    flags->SetSrsName(srsName.c_str());
 
     // gml schema location and version
     if(L"text/xml; subtype=gml/2.1.2" == outputFormat)
@@ -2013,6 +2022,7 @@
     featWriter = NULL;
     propWriter = NULL;
     xmlWriter = NULL; //flush and close file
+    transform = NULL;
 
     //return the file
     Ptr<MgByteSource> src = new MgByteSource(fileName, true);
@@ -2307,3 +2317,42 @@
 
     return success;
 }
+
+MgGMLCsTransform::MgGMLCsTransform(MgCoordinateSystemTransform *transform)
+    : FdoCoordinateSystemTransform(),
+      mTransform(transform)
+{}
+
+FdoIDirectPosition* MgGMLCsTransform::CoordinateSystemTransform(FdoIDirectPosition* sourceGeometry)
+{
+    double x = sourceGeometry->GetX();
+    double y = sourceGeometry->GetY();
+    double z = 0;
+    double m = 0;
+    FdoInt32 dimension = sourceGeometry->GetDimensionality();
+    if (dimension & FdoDimensionality_Z)
+    {
+        z = sourceGeometry->GetZ();
+    }
+    if (dimension & FdoDimensionality_M)
+    {
+        m = sourceGeometry->GetM();
+    }
+    FdoPtr<FdoDirectPositionImpl> posImpl;
+    if (dimension & FdoDimensionality_M)
+    {
+        mTransform->TransformM(&x, &y, &z, &m);
+        posImpl = FdoDirectPositionImpl::Create(x, y, z, m);
+    }
+    else if (dimension & FdoDimensionality_Z)
+    {
+        mTransform->Transform(&x, &y, &z);
+        posImpl = FdoDirectPositionImpl::Create(x, y, z);
+    }
+    else
+    {
+        mTransform->Transform(&x, &y);
+        posImpl = FdoDirectPositionImpl::Create(x, y);
+    }
+    return FDO_SAFE_ADDREF(posImpl.p);
+}

Modified: trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.h
===================================================================
--- trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.h	2013-05-30 01:55:22 UTC (rev 7540)
+++ trunk/MgDev/Server/src/Services/Feature/ServerFeatureService.h	2013-05-30 07:13:22 UTC (rev 7541)
@@ -1057,4 +1057,15 @@
     INT32 m_nDataCacheSize;
 };
 
+//Used for WFS coordinate system transformation
+class MgGMLCsTransform : public FdoCoordinateSystemTransform
+{
+public:    
+    MgGMLCsTransform(MgCoordinateSystemTransform *transform);
+    virtual FdoIDirectPosition* CoordinateSystemTransform(FdoIDirectPosition* sourceGeometry);
+
+private:
+     MgCoordinateSystemTransform *mTransform;
+};
+
 #endif

Modified: trunk/MgDev/Server/src/Services/Feature/TransformCache.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Feature/TransformCache.cpp	2013-05-30 01:55:22 UTC (rev 7540)
+++ trunk/MgDev/Server/src/Services/Feature/TransformCache.cpp	2013-05-30 07:13:22 UTC (rev 7541)
@@ -167,7 +167,7 @@
                     cache[srcwkt] = item;
 
                     // Set the coordinate system transform
-                    Ptr<MgCoordinateSystemTransform> trans = csFactory->GetTransform(dstCs, srcCs);
+                    Ptr<MgCoordinateSystemTransform> trans = csFactory->GetTransform(srcCs, dstCs);
                     trans->IgnoreDatumShiftWarning(true);
                     trans->IgnoreOutsideDomainWarning(true);
 



More information about the mapguide-commits mailing list