MapObjects Connection


Using the Transform method in VC++

On the Transform method, the last two parameters are densification tolerance and a geotransformation object.  These are optional, which is why in VB you don't need to pass them.  Unfortunately, in C++, "optional" parameters are needed and are passed in a VARIANT structure.  If you look at the C++ wrapper files found in: \..\Samples\MFC\Common, and in: MoProjCoordSys.cpp, you'll see the Transform function declared as:

LPDISPATCH CMoProjCoordSys::Transform(LPDISPATCH FromCoordSys,
                                      LPDISPATCH FromShape,
                                      const VARIANT& DensificationTolerance,
                                      const VARIANT& GeoTransformation)

So, you'll need to set up two extra VARIANTs.  Here's some code to put within the OnMouseMove event handler that demonstrates this.

NB. I recommend that if you are switching in between datums then you do use geotransformation objects in all your projection work.

void CYourApplicationDlg::OnMouseMoveMap(short Button, short Shift, long X, long Y)

// Here, we'll demonstrate the Transform method whilst tracking
// the mouse coordinates in the debug window.  We're assuming that our mapcontrol
// has already been set to project to UTM Grid Zone 33N.

CMoPoint aPoint(m_map.ToMapPoint((float)X, (float)Y));
TRACE2( "Projected mouse position %f\t%f\n", aPoint.GetX(), aPoint.GetY() );
// define a Projected Coordinate System - or just get it from the mapcontrol!
CMoProjCoordSys aProjCoordSys;
// define a geographic coordsys
CMoGeoCoordSys aGeogCoordSys;
// create VARIANTs to be used for the transform method
// Note. If you did want to use the geotrans, the Variant should be
// set up to accept dispatch pointers:
// e.g. va.vt = VT_DISPATCH; and then va.pdispVal = myGeotrans.m_lpDispatch;
VARIANT va; // for the geotransformation object
va.vt = VT_NULL;
VARIANT vax; // for the densification tolerance - this should be passing a double
vax.vt = VT_R8;
vax.dblVal = 0.0;
// Now transform the point
CMoPoint aGeogPoint(aGeogCoordSys.Transform(aProjCoordSys.m_lpDispatch, aPoint.m_lpDispatch, vax, va));
TRACE2( "Geographic mouse position %f\t%f\n", aGeogPoint.GetX(), aGeogPoint.GetY() );
// and do some rubbish collection to recover memory

Back to MapObjects Connection