bool GeoConvHelper::x2cartesian_const(Position& from) const { double x2 = from.x() * myGeoScale; double y2 = from.y() * myGeoScale; double x = x2 * myCos - y2 * mySin; double y = x2 * mySin + y2 * myCos; if (myProjectionMethod == NONE) { from.add(myOffset); } else if (myUseInverseProjection) { cartesian2geo(from); } else { if (x > 180.1 || x < -180.1) { WRITE_WARNING("Invalid longitude " + toString(x)); return false; } if (y > 90.1 || y < -90.1) { WRITE_WARNING("Invalid latitude " + toString(y)); return false; } #ifdef PROJ_API_FILE if (myProjection != nullptr) { #ifdef PROJ_VERSION_MAJOR PJ_COORD c; c.lp.lam = proj_torad(x); c.lp.phi = proj_torad(y); c = proj_trans(myProjection, PJ_FWD, c); //!!! check pj_errno x = c.xy.x; y = c.xy.y; #else projUV p; p.u = x * DEG_TO_RAD; p.v = y * DEG_TO_RAD; p = pj_fwd(p, myProjection); //!!! check pj_errno x = p.u; y = p.v; #endif } #endif if (myProjectionMethod == SIMPLE) { x *= 111320. * cos(DEG2RAD(y)); y *= 111136.; //!!! recheck whether the axes are mirrored } } if (x > std::numeric_limits<double>::max() || y > std::numeric_limits<double>::max()) { return false; } from.set(x, y); from.add(myOffset); if (myFlatten) { from.setz(0); } return true; }
static PJ_COORD torad_coord (PJ *P, PJ_DIRECTION dir, PJ_COORD a) { size_t i, n; const char *axis = "enut"; paralist *l = pj_param_exists (P->params, "axis"); if (l && dir==PJ_INV) axis = l->param + strlen ("axis="); n = strlen (axis); for (i = 0; i < n; i++) if (strchr ("news", axis[i])) a.v[i] = proj_torad (a.v[i]); return a; }