| 37 | #define OUTPUT_UNITS P->left |
| 38 | |
| 39 | static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { |
| 40 | if (coo.v[0] == HUGE_VAL || coo.v[1] == HUGE_VAL || coo.v[2] == HUGE_VAL) { |
| 41 | proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); |
| 42 | return proj_coord_error (); |
| 43 | } |
| 44 | |
| 45 | /* The helmert datum shift will choke unless it gets a sensible 4D coordinate */ |
| 46 | if (HUGE_VAL==coo.v[2] && P->helmert) coo.v[2] = 0.0; |
| 47 | if (HUGE_VAL==coo.v[3] && P->helmert) coo.v[3] = 0.0; |
| 48 | |
| 49 | if (P->axisswap) |
| 50 | coo = proj_trans (P->axisswap, PJ_INV, coo); |
| 51 | |
| 52 | /* Handle remaining possible input types */ |
| 53 | switch (INPUT_UNITS) { |
| 54 | case PJ_IO_UNITS_WHATEVER: |
| 55 | return coo; |
| 56 | |
| 57 | case PJ_IO_UNITS_DEGREES: |
| 58 | return coo; |
| 59 | |
| 60 | /* de-scale and de-offset */ |
| 61 | case PJ_IO_UNITS_CARTESIAN: |
| 62 | coo.xyz.x *= P->to_meter; |
| 63 | coo.xyz.y *= P->to_meter; |
| 64 | coo.xyz.z *= P->to_meter; |
| 65 | if (P->is_geocent) { |
| 66 | coo = proj_trans (P->cart, PJ_INV, coo); |
| 67 | } |
| 68 | |
| 69 | return coo; |
| 70 | |
| 71 | case PJ_IO_UNITS_PROJECTED: |
| 72 | case PJ_IO_UNITS_CLASSIC: |
| 73 | coo.xyz.x = P->to_meter * coo.xyz.x - P->x0; |
| 74 | coo.xyz.y = P->to_meter * coo.xyz.y - P->y0; |
| 75 | coo.xyz.z = P->vto_meter * coo.xyz.z - P->z0; |
| 76 | if (INPUT_UNITS==PJ_IO_UNITS_PROJECTED) |
| 77 | return coo; |
| 78 | |
| 79 | /* Classic proj.4 functions expect plane coordinates in units of the semimajor axis */ |
| 80 | /* Multiplying by ra, rather than dividing by a because the CalCOFI projection */ |
| 81 | /* stomps on a and hence (apparently) depends on this to roundtrip correctly */ |
| 82 | /* (CalCOFI avoids further scaling by stomping - but a better solution is possible) */ |
| 83 | coo.xyz.x *= P->ra; |
| 84 | coo.xyz.y *= P->ra; |
| 85 | return coo; |
| 86 | |
| 87 | case PJ_IO_UNITS_RADIANS: |
| 88 | coo.lpz.z = P->vto_meter * coo.lpz.z - P->z0; |
| 89 | break; |
| 90 | } |
| 91 | |
| 92 | /* Should not happen, so we could return pj_coord_err here */ |
| 93 | return coo; |
| 94 | } |
| 95 | |
| 96 |
no test coverage detected