/* * Khoros: $Id$ */ #if !defined(__lint) && !defined(__CODECENTER__) static char rcsid[] = "Khoros: $Id$"; #endif /* * Copyright (C) 1997, INPE. Sergio Donizete Faria, Gerald Jean Francis Banon * All rights reserved. See $K_PROG/repos/license/License. */ /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<< >>>> >>>> Main program for kgeoutm >>>> >>>> Private: >>>> main >>>> >>>> Static: >>>> Public: >>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<< */ #include "kgeoutm.h" clui_info_struct *clui_info = NULL; /*----------------------------------------------------------- | | Routine Name: main() - GEO -> UTM | | Purpose: main program for kgeoutm | | Input: | double clui_info->a_double; {Semi-eixo maior do elipsoide} | int clui_info->a_flag; {TRUE if -a specified} | | double clui_info->e_double; {Excentricidade do elipsoide} | int clui_info->e_flag; {TRUE if -e specified} | | double clui_info->lat0_double; {Latitude da origem} | int clui_info->lat0_flag; {TRUE if -lat0 specified} | | double clui_info->long0_double; {Longitude do meridiano central} | int clui_info->long0_flag; {TRUE if -long0 specified} | | double clui_info->k0_double; {Coeficinte de deformacao} | int clui_info->k0_flag; {TRUE if -k0 specified} | | double clui_info->lat_double; {Latitude do ponto} | int clui_info->lat_flag; {TRUE if -lat specified} | | double clui_info->long_double; {LOngitude do ponto} | int clui_info->long_flag; {TRUE if -long specified} | | char *clui_info->f_file; {Formatted ASCII output file} | int clui_info->f_flag; {TRUE if -f specified} | | Output: | Returns: | | Written By: Sergio Donizete Faria | Date: July 1, 1997 | Modifications: | ------------------------------------------------------------*/ int main( int argc, char **argv) { /* -main_variable_list */ kfile *ascii_file=NULL; char *filename=NULL; int output_ascii; double se_a, excen, la0, lo0, ck0, la, lo; double la0_rad, lo0_rad, la_rad, lo_rad; double excen2, excen4, excen6, excen2_l; double n, t, c, azao, m, m0; double x, y, k, coord_e, coord_n; /* -main_variable_list_end */ khoros_init(argc, argv, "MATCHING", PRODUCT_RELEASE_DATE, PRODUCT_RELEASE_NAME, PRODUCT_RELEASE_VERSION, PRODUCT_RELEASE_MAJOR, PRODUCT_RELEASE_MINOR, "$MATCHING/objects/kroutine/kgeoutm"); kexit_handler(kgeoutm_free_args, NULL); /* -main_get_args_call */ kclui_init("MATCHING", "kgeoutm", KGEN_KROUTINE, &clui_uis_spec, kgeoutm_usage_additions, kgeoutm_get_args, kgeoutm_free_args); /* -main_get_args_call_end */ /* -main_before_lib_call */ /* * Open the ASCII output file. */ output_ascii = TRUE; if (clui_info->f_flag) ascii_file = kfopen(clui_info->f_file, "w"); else output_ascii = FALSE; /* * If ascii output, print the object size now */ if (output_ascii) { kfprintf(ascii_file," Transformacao de Coordenadas Geograficas em UTM: "); kfprintf(ascii_file,"\n"); } /* *************************************************************** */ se_a = clui_info->a_double; excen = clui_info->e_double; la0 = clui_info->lat0_double; lo0 = clui_info->long0_double; ck0 = clui_info->k0_double; la = clui_info->lat_double; lo = clui_info->long_double; la0_rad = 3.141592654 * la0/180.0; lo0_rad = 3.141592654 * lo0/180; la_rad = 3.141592654 * la/180.0; lo_rad = 3.141592654 * lo/180; excen2 = ksqr(excen); excen4 = ksqr(excen2); excen6 = kpow(excen, 6); excen2_l = excen2/(1 - excen2); n = se_a/ksqrt(1 - excen2 * ksqr(ksin(la_rad))); t = ksqr(ktan(la_rad)); c = excen2_l * ksqr(kcos(la_rad)); azao = (lo_rad - lo0_rad) * kcos(la_rad); m = se_a * (( (1.0 - (excen2/4.0) - (3.0 * (excen4/64.0)) - (5.0 * (excen6/256.0)) ) * la_rad) - (( (3.0 * excen2/8.0) + (3.0 * (excen4/32.0)) + (45.0 * (excen6/1024.0)) ) * ksin(2.0*la_rad)) + (( (15.0 * excen4/32.0) + (45 * (excen6/1024.0)) ) * ksin(4.0*la_rad)) - ((35 * excen6/3072.0) * ksin(6.0 * la_rad))); m0 = se_a * (( (1.0 - (excen2/4.0) - (3.0 * (excen4/64.0)) - (5.0 * (excen6/256.0)) ) * la0_rad) - (( (3.0 * excen2/8.0) + (3.0 * (excen4/32.0)) + (45.0 * (excen6/1024.0)) ) * ksin(2.0*la0_rad)) + (( (15.0 * excen4/32.0) + (45 * (excen6/1024.0)) ) * ksin(4.0*la0_rad)) - ((35 * excen6/3072.0) * ksin(6.0 * la0_rad))); kfprintf(ascii_file,"\n"); kfprintf(ascii_file," Parametros para transformacao: "); if (output_ascii) kfprintf(ascii_file,"\n"); kfprintf(ascii_file," e2l = %g ", excen2_l); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," N = %g ", n); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," T = %g ", t); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," C = %g ", c); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," A = %g ", azao); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," M = %g ", m); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," M0 = %g ", m0); kfprintf(ascii_file,"\n"); kfprintf(ascii_file,"\n"); x = ck0 * n * (azao + ((1.0 - t + c) * ((kpow(azao,3))/6.0)) + ((5.0 - 18.0 * t + ksqr(t) + 72.0 * c - 58.0 * excen2_l) * ((kpow(azao,5))/120.0)) ); coord_e = x + 500000.0; y = ck0 * (m - m0 + (n * ktan(la_rad) * ((ksqr(azao)/2.0) + ((5.0 - t + 9.0 * c + 4.0 * ksqr(c)) * ((kpow(azao,4))/24.0)) + ((61.0 - 58.0 * t + ksqr(t) + 600.0 * c - 330.0 * excen2_l) * ((kpow(azao,6))/720.0)) ) ) ); coord_n = y + 10000000.0; k = ck0 * (1 + ((1 + c) * (ksqr(azao)/2)) + ((5.0 - 4.0 * t + 42.0 * c + 13.0 * ksqr(c) - 28.0 * excen2_l) * ((kpow(azao,4))/24.0)) + ((61.0 - 148.0 * t + 16 * ksqr(t)) * ((kpow(azao,6))/720.0)) ); kfprintf(ascii_file," Coordenadas Planas da Projecao UTM: "); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," x = %f ", x); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," y = %f ", y); kfprintf(ascii_file,"\n"); kfprintf(ascii_file,"\n"); kfprintf(ascii_file," Coordenadas UTM: "); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," E = %f ", coord_e); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," N = %f ", coord_n); kfprintf(ascii_file,"\n"); if (output_ascii) kfprintf(ascii_file," k = %f ", k); kfprintf(ascii_file,"\n"); /* -main_before_lib_call_end */ /* -main_library_call */ /* -main_library_call_end */ /* -main_after_lib_call */ /* -main_after_lib_call_end */ kexit(KEXIT_SUCCESS); return KEXIT_SUCCESS; } /*----------------------------------------------------------- | | Routine Name: kgeoutm_usage_additions | | Purpose: Prints usage additions in kgeoutm_usage routine | | Input: None | | Output: None | Written By: ghostwriter -oname kgeoutm | Date: July 1, 1997 | Modifications: | ------------------------------------------------------------*/ void kgeoutm_usage_additions(void) { kfprintf(kstderr, "\tGEO -> UTM\n"); /* -usage_additions */ /* -usage_additions_end */ } /*----------------------------------------------------------- | | Routine Name: kgeoutm_free_args | | Purpose: Frees CLUI struct allocated in kgeoutm_get_args() | | Input: None | | Output: None | Written By: ghostwriter -oname kgeoutm | Date: July 1, 1997 | Modifications: | ------------------------------------------------------------*/ /* ARGSUSED */ void kgeoutm_free_args( kexit_status status, kaddr client_data) { /* do the wild and free thing */ if (clui_info != NULL) { kfree_and_NULL(clui_info->f_file); kfree_and_NULL(clui_info); } /* -free_handler_additions */ /* -free_handler_additions_end */ }