📄 geotrans_base.cpp
字号:
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// Module Library: //
// Projection_GeoTRANS //
// //
//-------------------------------------------------------//
// //
// GEOTRANS_Base.cpp //
// //
// Copyright (C) 2003 by //
// Olaf Conrad //
// //
//-------------------------------------------------------//
// //
// This file is part of 'SAGA - System for Automated //
// Geoscientific Analyses'. SAGA is free software; you //
// can redistribute it and/or modify it under the terms //
// of the GNU General Public License as published by the //
// Free Software Foundation; version 2 of the License. //
// //
// SAGA is distributed in the hope that it will be //
// useful, but WITHOUT ANY WARRANTY; without even the //
// implied warranty of MERCHANTABILITY or FITNESS FOR A //
// PARTICULAR PURPOSE. See the GNU General Public //
// License for more details. //
// //
// You should have received a copy of the GNU General //
// Public License along with this program; if not, //
// write to the Free Software Foundation, Inc., //
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, //
// USA. //
// //
//-------------------------------------------------------//
// //
// e-mail: oconrad@saga-gis.org //
// //
// contact: Olaf Conrad //
// Institute of Geography //
// University of Goettingen //
// Goldschmidtstr. 5 //
// 37077 Goettingen //
// Germany //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#include "GEOTRANS_Base.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CGEOTRANS_Base::CGEOTRANS_Base(void)
{
// CSG_String Path(SG_File_Get_Path(MLB_Interface.Get_File_Name()));
CSG_Parameter *pNode_0, *pNode_Source, *pNode_Target;
bInitialized = false;
//-----------------------------------------------------
Parameters.Add_FilePath(
NULL, "DATA_ELLIPSOID" , _TL("Ellipsoids"),
_TL(""),
NULL //, SG_File_Make_Path(Path, "Projection_GeoTRANS_Ellipsoid.dat")
);
Parameters.Add_FilePath(
NULL, "DATA_DATUM_7" , _TL("Datums (7 Parameters)"),
_TL(""),
NULL //, SG_File_Make_Path(Path, "Projection_GeoTRANS_Datum_7.dat")
);
Parameters.Add_FilePath(
NULL, "DATA_DATUM_3" , _TL("Datums (3 Parameters)"),
_TL(""),
NULL //, SG_File_Make_Path(Path, "Projection_GeoTRANS_Datum_3.dat")
);
Parameters.Add_FilePath(
NULL, "DATA_GEOID" , _TL("Geoid"),
_TL(""),
NULL //, SG_File_Make_Path(Path, "Projection_GeoTRANS_Geoid_EGM96.dat")
);
//-----------------------------------------------------
Parameters.Add_Node(NULL, "SOURCE_NODE", _TL("Source Parameters"), _TL(""));
Parameters.Add_Node(NULL, "TARGET_NODE", _TL("Target Parameters"), _TL(""));
//-----------------------------------------------------
pProjection = Add_Parameters("PROJECTION", _TL("Projection Parameters"), _TL(""));
pNode_Source = pProjection->Add_Node(
NULL , "SOURCE_NODE" , _TL("Source Parameters"),
_TL("")
);
pNode_Target = pProjection->Add_Node(
NULL , "TARGET_NODE" , _TL("Target Parameters"),
_TL("")
);
pNode_0 = pProjection->Add_Choice(
pNode_Source, "SOURCE_DATUM" , _TL("Source Datum"),
_TL(""),
_TL("[not set]|")
);
pNode_0 = pProjection->Add_Choice(
pNode_Target, "TARGET_DATUM" , _TL("Target Datum"),
_TL(""),
_TL("[not set]|")
);
pNode_0 = pProjection->Add_Choice(
pNode_Source, "SOURCE_PROJECTION" , _TL("Source Projection"),
_TL(""),
_TL("[not set]|")
);
pNode_0 = pProjection->Add_Choice(
pNode_Target, "TARGET_PROJECTION" , _TL("Target Projection"),
_TL(""),
_TL("[not set]|")
);
}
//---------------------------------------------------------
CGEOTRANS_Base::~CGEOTRANS_Base(void)
{
}
///////////////////////////////////////////////////////////
// //
// Initialization //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CGEOTRANS_Base::Initialize(void)
{
char datum_code[10], datum_name[40], system_name[50];
long error_code, i, count;
CSG_String sList;
//-----------------------------------------------------
if( bInitialized
&& !fn_Ellipsoid .Cmp(Parameters("DATA_ELLIPSOID") ->asString())
&& !fn_Datum7 .Cmp(Parameters("DATA_DATUM_7") ->asString())
&& !fn_Datum3 .Cmp(Parameters("DATA_DATUM_3") ->asString())
&& !fn_Geoid .Cmp(Parameters("DATA_GEOID") ->asString()) )
{
return( true );
}
bInitialized = false;
fn_Ellipsoid = Parameters("DATA_ELLIPSOID") ->asString();
fn_Datum7 = Parameters("DATA_DATUM_7") ->asString();
fn_Datum3 = Parameters("DATA_DATUM_3") ->asString();
fn_Geoid = Parameters("DATA_GEOID") ->asString();
if( Initialize_Engine_File(fn_Ellipsoid.b_str(), fn_Datum7.b_str(), fn_Datum3.b_str(), fn_Geoid.b_str()) != ENGINE_NO_ERROR )
{
Error_Set(_TL("GeoTRANS engine initializing error!\n\nPlease check your data path settings!"));
}
//-----------------------------------------------------
else
{
if( (error_code = Get_Coordinate_System_Count(&count)) == 0 )
{
sList.Clear();
for(i=0; i<count; i++)
{
error_code = Get_Coordinate_System_Name(i + 1, system_name);
sList.Append(CSG_String::Format(SG_T("%s|"), system_name));
}
if( sList.Length() > 0 )
{
((CSG_Parameter_Choice *)pProjection->Get_Parameter("SOURCE_PROJECTION")->Get_Data())->Set_Items(sList);
((CSG_Parameter_Choice *)pProjection->Get_Parameter("TARGET_PROJECTION")->Get_Data())->Set_Items(sList);
}
}
else
{
return( false );
}
//-----------------------------------------------------
if( (error_code = Get_Datum_Count(&count)) == 0 )
{
sList.Clear();
for(i=0; i<count; i++)
{
error_code = Get_Datum_Code(i + 1, datum_code);
error_code = Get_Datum_Name(i + 1, datum_name);
sList.Append(CSG_String::Format(SG_T("%-8s: %s|"), datum_code, datum_name));
}
if( sList.Length() > 0 )
{
((CSG_Parameter_Choice *)pProjection->Get_Parameter("SOURCE_DATUM")->Get_Data())->Set_Items(sList);
((CSG_Parameter_Choice *)pProjection->Get_Parameter("TARGET_DATUM")->Get_Data())->Set_Items(sList);
}
}
else
{
return( false );
}
bInitialized = true;
}
return( bInitialized );
}
//---------------------------------------------------------
CSG_Parameters * CGEOTRANS_Base::Get_Projection_Parameters(bool bSource, Coordinate_Type Type, bool bShow_Dialog)
{
CSG_String sName, sIdentifier;
CSG_Parameters *pParameters;
//-----------------------------------------------------
pParameters = NULL;
sName .Printf(bSource ? _TL("Source Parameters") : _TL("Target Parameters"));
sIdentifier .Printf(bSource ? SG_T("SOURCE_") : SG_T("TARGET_"));
switch( Type )
{
//-----------------------------------------------------
case Albers_Equal_Area_Conic:
sIdentifier.Append(SG_T("ALBERS"));
if( (pParameters = Get_Parameters(sIdentifier)) == NULL
&& (pParameters = Add_Parameters(sIdentifier, sName, _TL(""))) != NULL )
{
pParameters->Add_Info_String(NULL, "TYPE" , _TL("Projection") , _TL(""), _TL("Albers Equal Area Conic"));
pParameters->Add_Value (NULL, "MERIDIAN" , _TL("Central Meridian") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "LATITUDE" , _TL("Origin Latitude" ) , _TL(""), PARAMETER_TYPE_Degree, 45.0);
pParameters->Add_Value (NULL, "PARALLEL_1" , _TL("1st Std. Parallel") , _TL(""), PARAMETER_TYPE_Degree, 40.0);
pParameters->Add_Value (NULL, "PARALLEL_2" , _TL("2nd Std. Parallel") , _TL(""), PARAMETER_TYPE_Degree, 50.0);
pParameters->Add_Value (NULL, "EASTING" , _TL("False Easting [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
pParameters->Add_Value (NULL, "NORTHING" , _TL("False Northing [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
}
break;
//-----------------------------------------------------
case Azimuthal_Equidistant:
sIdentifier.Append(SG_T("AZIMUTHAL"));
if( (pParameters = Get_Parameters(sIdentifier)) == NULL
&& (pParameters = Add_Parameters(sIdentifier, sName, _TL(""))) != NULL )
{
pParameters->Add_Info_String(NULL, "TYPE" , _TL("Projection") , _TL(""), _TL("Azimuthal Equidistant"));
pParameters->Add_Value (NULL, "MERIDIAN" , _TL("Central Meridian") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "LATITUDE" , _TL("Origin Latitude") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "EASTING" , _TL("False Easting [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
pParameters->Add_Value (NULL, "NORTHING" , _TL("False Northing [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
}
break;
//-----------------------------------------------------
case Bonne:
sIdentifier.Append(SG_T("BONNE"));
if( (pParameters = Get_Parameters(sIdentifier)) == NULL
&& (pParameters = Add_Parameters(sIdentifier, sName, _TL(""))) != NULL )
{
pParameters->Add_Info_String(NULL, "TYPE" , _TL("Projection" ) , _TL(""), _TL("Bonne"));
pParameters->Add_Value (NULL, "MERIDIAN" , _TL("Central Meridian") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "LATITUDE" , _TL("Origin Latitude") , _TL(""), PARAMETER_TYPE_Degree, 45.0);
pParameters->Add_Value (NULL, "EASTING" , _TL("False Easting [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
pParameters->Add_Value (NULL, "NORTHING" , _TL("False Northing [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
}
break;
//-----------------------------------------------------
case Cassini:
sIdentifier.Append(SG_T("CASSINI"));
if( (pParameters = Get_Parameters(sIdentifier)) == NULL
&& (pParameters = Add_Parameters(sIdentifier, sName, _TL(""))) != NULL )
{
pParameters->Add_Info_String(NULL, "TYPE" , _TL("Projection") , _TL(""), _TL("Cassini"));
pParameters->Add_Value (NULL, "MERIDIAN" , _TL("Central Meridian") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "LATITUDE" , _TL("Origin Latitude" ) , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "EASTING" , _TL("False Easting [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
pParameters->Add_Value (NULL, "NORTHING" , _TL("False Northing [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
}
break;
//-----------------------------------------------------
case Cylindrical_Equal_Area:
sIdentifier.Append(SG_T("CYLINDRICAL"));
if( (pParameters = Get_Parameters(sIdentifier)) == NULL
&& (pParameters = Add_Parameters(sIdentifier, sName, _TL(""))) != NULL )
{
pParameters->Add_Info_String(NULL, "TYPE" , _TL("Projection") , _TL(""), _TL("Cylindrical Equal Area"));
pParameters->Add_Value (NULL, "MERIDIAN" , _TL("Central Meridian") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "LATITUDE" , _TL("Origin Latitude" ) , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "EASTING" , _TL("False Easting [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
pParameters->Add_Value (NULL, "NORTHING" , _TL("False Northing [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
}
break;
//-----------------------------------------------------
case Eckert4:
case Eckert6:
sIdentifier.Append(SG_T("ECKERT"));
if( (pParameters = Get_Parameters(sIdentifier)) == NULL
&& (pParameters = Add_Parameters(sIdentifier, sName, _TL(""))) != NULL )
{
pParameters->Add_Info_String(NULL, "TYPE" , _TL("Projection") , _TL(""), _TL("Eckert IV/VI"));
pParameters->Add_Value (NULL, "MERIDIAN" , _TL("Central Meridian") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "EASTING" , _TL("False Easting [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
pParameters->Add_Value (NULL, "NORTHING" , _TL("False Northing [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
}
break;
//-----------------------------------------------------
case Equidistant_Cylindrical:
sIdentifier.Append(SG_T("EQUIDSTCYL"));
if( (pParameters = Get_Parameters(sIdentifier)) == NULL
&& (pParameters = Add_Parameters(sIdentifier, sName, _TL(""))) != NULL )
{
pParameters->Add_Info_String(NULL, "TYPE" , _TL("Projection") , _TL(""), _TL("Equidistant Cylindrical"));
pParameters->Add_Value (NULL, "MERIDIAN" , _TL("Central Meridian") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "PARALLEL" , _TL("Standard Parallel") , _TL(""), PARAMETER_TYPE_Degree, 0.0);
pParameters->Add_Value (NULL, "EASTING" , _TL("False Easting [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
pParameters->Add_Value (NULL, "NORTHING" , _TL("False Northing [m]") , _TL(""), PARAMETER_TYPE_Double, 0.0);
}
break;
//-----------------------------------------------------
case Geocentric: // Layout:0*0*3
sIdentifier.Append(SG_T("GEOCENTRIC"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -