aboutsummaryrefslogtreecommitdiff
path: root/com/ProjDef.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'com/ProjDef.cpp')
-rwxr-xr-xcom/ProjDef.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/com/ProjDef.cpp b/com/ProjDef.cpp
new file mode 100755
index 00000000..c64a6e19
--- /dev/null
+++ b/com/ProjDef.cpp
@@ -0,0 +1,115 @@
+// ProjDef.cpp : Implementation of CProjDef
+#include "stdafx.h"
+#include "COMTest1.h"
+#include "ProjDef.h"
+#include "proj_api.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// CProjDef
+
+
+STDMETHODIMP CProjDef::Initialize(BSTR proj_string, int *success)
+{
+ USES_CONVERSION;
+ psProj = pj_init_plus( W2A(proj_string) );
+
+ if( psProj != NULL )
+ *success = 1;
+ else
+ {
+ SetProjError( "pj_init_plus failed." );
+ //SetError( (const char *) W2A(proj_string) );
+ *success = 0;
+ }
+
+ return S_OK;
+}
+
+STDMETHODIMP CProjDef::TransformPoint3D(IUnknown *srcProj, double *x, double *y, double *z, int *success)
+{
+ void *psProjOther;
+ IProjDef *srcProjReal;
+
+ srcProj->QueryInterface( IID_IProjDef, (void **) &srcProjReal );
+ srcProjReal->GetHandle( (long *) &psProjOther );
+
+ if( psProjOther == NULL || psProj == NULL )
+ {
+ SetError( "One of projections not set." );
+ *success = 0;
+ return E_FAIL;
+ }
+
+ if( pj_is_latlong( psProjOther ) )
+ {
+ *x *= DEG_TO_RAD;
+ *y *= DEG_TO_RAD;
+ }
+
+ *success = pj_transform( psProjOther, psProj, 1, 0, x, y, z ) == 0;
+ if( ! *success )
+ SetProjError( "pj_transform failed." );
+
+ else if( pj_is_latlong( psProj ) )
+ {
+ *x *= RAD_TO_DEG;
+ *y *= RAD_TO_DEG;
+ }
+
+ return S_OK;
+}
+
+STDMETHODIMP CProjDef::GetHandle(long *pHandle)
+{
+ *pHandle = (long) psProj;
+
+ return S_OK;
+}
+
+STDMETHODIMP CProjDef::IsLatLong(int *result)
+{
+ if( psProj != NULL )
+ {
+ *result = pj_is_latlong( (projPJ) psProj );
+ return S_OK;
+ }
+ else
+ {
+ SetError( "Projection is null" );
+ return E_FAIL;
+ }
+}
+
+STDMETHODIMP CProjDef::GetLastError( BSTR *error )
+{
+ *error = SysAllocString( sLastError );
+
+ return S_OK;
+}
+
+void CProjDef::SetError( const char *pszMessage )
+
+{
+ USES_CONVERSION;
+
+ if( sLastError != NULL )
+ {
+ SysFreeString( sLastError );
+ sLastError = NULL;
+ }
+
+ sLastError = SysAllocString( A2BSTR( pszMessage ) );
+}
+
+void CProjDef::SetProjError( const char *pszMessage )
+
+{
+ int *pj_errno = pj_get_errno_ref();
+
+ if( *pj_errno > 0 )
+ SetError( strerror( *pj_errno ) );
+ else if( *pj_errno < 0 )
+ SetError( pj_strerrno( *pj_errno ) );
+ else
+ SetError( pszMessage );
+}