/* Convert lla to utm (float). * Note this conversion is not very accurate. If high accuracy needed use lla_of_utm_d. * @param[out] utm position in m, alt is copied directly from lla * @param[in] lla position in rad, alt in m */ void utm_of_lla_f(struct UtmCoor_f *utm, struct LlaCoor_f *lla) { // compute zone if not initialised if (utm->zone == 0) { utm->zone = UtmZoneOfLlaLonRad(lla->lon); } float lambda_c = LambdaOfUtmZone(utm->zone); float ll = isometric_latitude_f(lla->lat , E); float dl = lla->lon - lambda_c; float phi_ = asinf(sinf(dl) / coshf(ll)); float ll_ = isometric_latitude_fast_f(phi_); float lambda_ = atanf(sinhf(ll) / cosf(dl)); struct complex z_ = { lambda_, ll_ }; CScal(serie_coeff_proj_mercator[0], z_); int8_t k; for (k = 1; k < 3; k++) { struct complex z = { lambda_, ll_ }; CScal(2.*k, z); CSin(z); CScal(serie_coeff_proj_mercator[k], z); CAdd(z, z_); } CScal(N, z_); utm->east = DELTA_EAST + z_.im; utm->north = DELTA_NORTH + z_.re; // copy alt above reference ellipsoid utm->alt = lla->alt; }
void utm_of_lla_f(struct UtmCoor_f* utm, struct LlaCoor_f* lla) { float lambda_c = LambdaOfUtmZone(utm->zone); float ll = isometric_latitude_f(lla->lat , E); float dl = lla->lon - lambda_c; float phi_ = asin(sin(dl) / cosh(ll)); float ll_ = isometric_latitude_fast_f(phi_); float lambda_ = atan(sinh(ll) / cos(dl)); struct complex z_ = { lambda_, ll_ }; CScal(serie_coeff_proj_mercator[0], z_); uint8_t k; for(k = 1; k < 3; k++) { struct complex z = { lambda_, ll_ }; CScal(2*k, z); CSin(z); CScal(serie_coeff_proj_mercator[k], z); CAdd(z, z_); } CScal(N, z_); utm->east = DELTA_EAST + z_.im; utm->north = DELTA_NORTH + z_.re; }