bool GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { if (includeInBoundary) { myOrigBoundary.add(from); } // init projection parameter on first use #ifdef PROJ_API_FILE if (myProjection == nullptr) { double x = from.x() * myGeoScale; switch (myProjectionMethod) { case DHDN_UTM: { int zone = (int)((x - 500000.) / 1000000.); if (zone < 1 || zone > 5) { WRITE_WARNING("Attempt to initialize DHDN_UTM-projection on invalid longitude " + toString(x)); return false; } myProjString = "+proj=tmerc +lat_0=0 +lon_0=" + toString(3 * zone) + " +k=1 +x_0=" + toString(zone * 1000000 + 500000) + " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; #ifdef PROJ_VERSION_MAJOR myInverseProjection = proj_create(PJ_DEFAULT_CTX, myProjString.c_str()); myGeoProjection = proj_create(PJ_DEFAULT_CTX, "+proj=latlong +datum=WGS84"); #else myInverseProjection = pj_init_plus(myProjString.c_str()); myGeoProjection = pj_init_plus("+proj=latlong +datum=WGS84"); #endif //!!! check pj_errno x = ((x - 500000.) / 1000000.) * 3; // continues with UTM } FALLTHROUGH; case UTM: { int zone = (int)(x + 180) / 6 + 1; myProjString = "+proj=utm +zone=" + toString(zone) + " +ellps=WGS84 +datum=WGS84 +units=m +no_defs"; #ifdef PROJ_VERSION_MAJOR myProjection = proj_create(PJ_DEFAULT_CTX, myProjString.c_str()); #else myProjection = pj_init_plus(myProjString.c_str()); #endif //!!! check pj_errno } break; case DHDN: { int zone = (int)(x / 3); if (zone < 1 || zone > 5) { WRITE_WARNING("Attempt to initialize DHDN-projection on invalid longitude " + toString(x)); return false; } myProjString = "+proj=tmerc +lat_0=0 +lon_0=" + toString(3 * zone) + " +k=1 +x_0=" + toString(zone * 1000000 + 500000) + " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; #ifdef PROJ_VERSION_MAJOR myProjection = proj_create(PJ_DEFAULT_CTX, myProjString.c_str()); #else myProjection = pj_init_plus(myProjString.c_str()); #endif //!!! check pj_errno } break; default: break; } } if (myInverseProjection != nullptr) { #ifdef PROJ_VERSION_MAJOR PJ_COORD c; c.xy.x = from.x(); c.xy.y = from.y(); c = proj_trans(myInverseProjection, PJ_INV, c); from.set(proj_todeg(c.lp.lam), proj_todeg(c.lp.phi)); #else double x = from.x(); double y = from.y(); if (pj_transform(myInverseProjection, myGeoProjection, 1, 1, &x, &y, nullptr)) { WRITE_WARNING("Could not transform (" + toString(x) + "," + toString(y) + ")"); } from.set(double(x * RAD_TO_DEG), double(y * RAD_TO_DEG)); #endif } #endif // perform conversion bool ok = x2cartesian_const(from); if (ok) { if (includeInBoundary) { myConvBoundary.add(from); } } return ok; }
bool GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { if (includeInBoundary) { myOrigBoundary.add(from); } // init projection parameter on first use #ifdef HAVE_PROJ if (myProjection == 0) { double x = from.x() * myGeoScale; switch (myProjectionMethod) { case DHDN_UTM: { int zone = (int)((x - 500000.) / 1000000.); if (zone < 1 || zone > 5) { WRITE_WARNING("Attempt to initialize DHDN_UTM-projection on invalid longitude " + toString(x)); return false; } myProjString = "+proj=tmerc +lat_0=0 +lon_0=" + toString(3 * zone) + " +k=1 +x_0=" + toString(zone * 1000000 + 500000) + " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; myInverseProjection = pj_init_plus(myProjString.c_str()); myGeoProjection = pj_init_plus("+proj=latlong +datum=WGS84"); //!!! check pj_errno x = ((x - 500000.) / 1000000.) * 3; // continues with UTM } case UTM: { int zone = (int)(x + 180) / 6 + 1; myProjString = "+proj=utm +zone=" + toString(zone) + " +ellps=WGS84 +datum=WGS84 +units=m +no_defs"; myProjection = pj_init_plus(myProjString.c_str()); //!!! check pj_errno } break; case DHDN: { int zone = (int)(x / 3); if (zone < 1 || zone > 5) { WRITE_WARNING("Attempt to initialize DHDN-projection on invalid longitude " + toString(x)); return false; } myProjString = "+proj=tmerc +lat_0=0 +lon_0=" + toString(3 * zone) + " +k=1 +x_0=" + toString(zone * 1000000 + 500000) + " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; myProjection = pj_init_plus(myProjString.c_str()); //!!! check pj_errno } break; default: break; } } if (myInverseProjection != 0) { double x = from.x(); double y = from.y(); if (pj_transform(myInverseProjection, myGeoProjection, 1, 1, &x, &y, NULL)) { WRITE_WARNING("Could not transform (" + toString(x) + "," + toString(y) + ")"); } from.set(SUMOReal(x * RAD_TO_DEG), SUMOReal(y * RAD_TO_DEG)); } #endif // perform conversion bool ok = x2cartesian_const(from); if (ok) { if (includeInBoundary) { myConvBoundary.add(from); } } return ok; }