[mapguide-commits] r7545 - in sandbox/adsk/2.4j: . Server/src/Services/Feature
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Fri May 31 02:18:24 PDT 2013
Author: christinebao
Date: 2013-05-31 02:18:24 -0700 (Fri, 31 May 2013)
New Revision: 7545
Modified:
sandbox/adsk/2.4j/
sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.cpp
sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.h
sandbox/adsk/2.4j/Server/src/Services/Feature/TransformCache.cpp
Log:
#2258: Serve WFS in alternate CS: SRSNAME not respected in getfeature, alternate SRS not available
Integrate 7541, 7542, 7543 to http://svn.osgeo.org/mapguide/sandbox/adsk/2.4j.
Property changes on: sandbox/adsk/2.4j
___________________________________________________________________
Modified: svn:mergeinfo
- /sandbox/rfc94:5099-5163
/trunk/MgDev:6346
+ /sandbox/rfc94:5099-5163
/trunk/MgDev:6346,7541-7543
Modified: sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.cpp
===================================================================
--- sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.cpp 2013-05-30 22:21:16 UTC (rev 7544)
+++ sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.cpp 2013-05-31 09:18:24 UTC (rev 7545)
@@ -1822,11 +1822,49 @@
}
MgCoordinateSystemFactory fact;
- Ptr<MgCoordinateSystem> mapCs = (srs.empty()) ? NULL : fact.Create(srs);
+ std::wstring wkt = srs;
+ if (wkt.empty())
+ {
+ //If there is no coordinate system pass in, get the default one in resource header.
+ MgServiceManager* serviceMan = MgServiceManager::GetInstance();
+ assert(NULL != serviceMan);
+ Ptr<MgResourceService> resourceService = dynamic_cast<MgResourceService*>(serviceMan->RequestService(MgServiceType::ResourceService));
+ assert(resourceService != NULL);
+ Ptr<MgByteReader> byteReaderHeader = resourceService->GetResourceHeader(fs);
+ Ptr<MgByteSink> byteSinkHeader = new MgByteSink(byteReaderHeader);
+ std::string resourceHeader;
+ byteSinkHeader->ToStringUtf8(resourceHeader);
+ //parse for default SRS of this WFS, the format is:
+ //<Property xsi:noNamespaceSchemaLocation="Property-1.0.0.xsd">
+ // <Name>_PrimarySRS</Name>
+ // <Value>EPSG:4326</Value>
+ //</Property>
+ std::string begin("EPSG:");
+ std::size_t beginPos = resourceHeader.find(begin);
+ if (beginPos != std::string::npos)
+ {
+ std::size_t endPos = resourceHeader.find("</Value>", beginPos);
+ if (endPos != std::string::npos)
+ {
+ std::string primarySRS = resourceHeader.substr(beginPos+begin.length(), endPos-beginPos-begin.length());
+ int epsgCode = atoi(primarySRS.c_str());
+ wkt = fact.ConvertEpsgCodeToWkt(epsgCode);
+ }
+ }
+ }
+ Ptr<MgCoordinateSystem> mapCs = NULL;
+ if (!wkt.empty())
+ {
+ MG_TRY();
+ mapCs = fact.Create(wkt);
+ MG_CATCH_AND_RELEASE();
+ }
+
//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)
@@ -1921,6 +1959,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)
@@ -2008,6 +2054,7 @@
featWriter = NULL;
propWriter = NULL;
xmlWriter = NULL; //flush and close file
+ transform = NULL;
//return the file
Ptr<MgByteSource> src = new MgByteSource(fileName, true);
@@ -2302,3 +2349,48 @@
return success;
}
+
+MgGMLCsTransform::MgGMLCsTransform(MgCoordinateSystemTransform *transform)
+ : FdoCoordinateSystemTransform(),
+ mTransform(transform)
+{}
+
+FdoIDirectPosition* MgGMLCsTransform::CoordinateSystemTransform(FdoIDirectPosition* sourceGeometry)
+{
+ //if not suitable transform available, return the original geometry.
+ if (mTransform == NULL)
+ {
+ return FDO_SAFE_ADDREF(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: sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.h
===================================================================
--- sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.h 2013-05-30 22:21:16 UTC (rev 7544)
+++ sandbox/adsk/2.4j/Server/src/Services/Feature/ServerFeatureService.h 2013-05-31 09:18:24 UTC (rev 7545)
@@ -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: sandbox/adsk/2.4j/Server/src/Services/Feature/TransformCache.cpp
===================================================================
--- sandbox/adsk/2.4j/Server/src/Services/Feature/TransformCache.cpp 2013-05-30 22:21:16 UTC (rev 7544)
+++ sandbox/adsk/2.4j/Server/src/Services/Feature/TransformCache.cpp 2013-05-31 09:18:24 UTC (rev 7545)
@@ -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