42 #ifdef CHECK_MEMORY_LEAKS
44 #endif // CHECK_MEMORY_LEAKS
59 const Boundary& orig,
const Boundary& conv,
int shift,
bool inverse,
bool baseFound):
65 myProjectionMethod(NONE),
68 myGeoScale(pow(10, (double) - shift)),
69 myUseInverseProjection(inverse),
70 myBaseFound(baseFound),
75 }
else if (proj ==
"-") {
77 }
else if (proj ==
"UTM") {
79 }
else if (proj ==
"DHDN") {
84 myProjection = pj_init_plus(proj.c_str());
85 if (myProjection == 0) {
96 if (myProjection != 0) {
97 pj_free(myProjection);
116 if (myProjection != 0) {
117 pj_free(myProjection);
120 if (orig.myProjection != 0) {
130 std::string proj =
"!";
131 int shift = oc.
getInt(
"proj.scale");
133 bool inverse = oc.
exists(
"proj.inverse") && oc.
getBool(
"proj.inverse");
134 bool baseFound = !oc.
exists(
"offset.disable-normalization") ||
135 oc.
getBool(
"offset.disable-normalization") ||
139 if (oc.
getBool(
"simple-projection")) {
145 WRITE_ERROR(
"Inverse projection works only with explicit proj parameters.");
148 unsigned numProjections = oc.
getBool(
"simple-projection") + oc.
getBool(
"proj.utm") + oc.
getBool(
"proj.dhdn") + (oc.
getString(
"proj").length() > 1);
149 if (numProjections > 1) {
150 WRITE_ERROR(
"The projection method needs to be uniquely defined.");
156 }
else if (oc.
getBool(
"proj.dhdn")) {
183 oc.
addSynonyme(
"simple-projection",
"proj.simple",
true);
184 oc.
addDescription(
"simple-projection",
"Projection",
"Uses a simple method for projection");
188 oc.
addDescription(
"proj.scale",
"Projection",
"Number of places to shift decimal point to right in geo-coordinates");
192 oc.
addDescription(
"proj.utm",
"Projection",
"Determine the UTM zone (for a universal transversal mercator projection based on the WGS84 ellipsoid)");
195 oc.
addDescription(
"proj.dhdn",
"Projection",
"Determine the DHDN zone (for a transversal mercator projection based on the bessel ellipsoid)");
198 oc.
addDescription(
"proj",
"Projection",
"Uses STR as proj.4 definition for projection");
201 oc.
addDescription(
"proj.inverse",
"Projection",
"Inverses projection");
228 p = pj_inv(p, myProjection);
242 if (myProjection == 0) {
246 int zone = (
int)(x + 180) / 6 + 1;
248 " +ellps=WGS84 +datum=WGS84 +units=m +no_defs";
254 int zone = (
int)(x / 3);
255 if (zone < 1 || zone > 5) {
260 " +k=1 +x_0=" +
toString(zone * 1000000 + 500000) +
261 " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs";
284 if (includeInBoundary) {
301 if (x > 180.1 || x < -180.1 || y > 90.1 || y < -90.1) {
305 if (myProjection != 0) {
307 p.u = x * DEG_TO_RAD;
308 p.v = y * DEG_TO_RAD;
309 p = pj_fwd(p, myProjection);
319 x *= 111320. * cos(ys *
PI / 180.0);