41 #ifdef CHECK_MEMORY_LEAKS
43 #endif // CHECK_MEMORY_LEAKS
58 const Boundary& orig,
const Boundary& conv,
int shift,
bool inverse,
bool baseFound):
64 myGeoScale(pow(10, (double) - shift)),
65 myProjectionMethod(NONE),
66 myUseInverseProjection(inverse),
67 myBaseFound(baseFound),
71 myConvBoundary(conv) {
74 }
else if (proj ==
"-") {
76 }
else if (proj ==
"UTM") {
78 }
else if (proj ==
"DHDN") {
83 myProjection = pj_init_plus(proj.c_str());
84 if (myProjection == 0) {
95 if (myProjection != 0) {
96 pj_free(myProjection);
115 if (myProjection != 0) {
116 pj_free(myProjection);
119 if (orig.myProjection != 0) {
129 std::string proj =
"!";
130 int shift = oc.
getInt(
"proj.scale");
132 bool inverse = oc.
exists(
"proj.inverse") && oc.
getBool(
"proj.inverse");
133 bool baseFound = !oc.
exists(
"offset.disable-normalization") ||
134 oc.
getBool(
"offset.disable-normalization") ||
138 if (oc.
getBool(
"simple-projection")) {
144 WRITE_ERROR(
"Inverse projection works only with explicit proj parameters.");
147 unsigned numProjections = oc.
getBool(
"simple-projection") + oc.
getBool(
"proj.utm") + oc.
getBool(
"proj.dhdn") + (oc.
getString(
"proj").length() > 1);
148 if (numProjections > 1) {
149 WRITE_ERROR(
"The projection method needs to be uniquely defined.");
155 }
else if (oc.
getBool(
"proj.dhdn")) {
182 oc.
addSynonyme(
"simple-projection",
"proj.simple",
true);
183 oc.
addDescription(
"simple-projection",
"Projection",
"Uses a simple method for projection");
187 oc.
addDescription(
"proj.scale",
"Projection",
"Number of places to shift decimal point to right in geo-coordinates");
191 oc.
addDescription(
"proj.utm",
"Projection",
"Determine the UTM zone (for a universal transversal mercator projection based on the WGS84 ellipsoid)");
194 oc.
addDescription(
"proj.dhdn",
"Projection",
"Determine the DHDN zone (for a transversal mercator projection based on the bessel ellipsoid)");
197 oc.
addDescription(
"proj",
"Projection",
"Uses STR as proj.4 definition for projection");
200 oc.
addDescription(
"proj.inverse",
"Projection",
"Inverses projection");
227 p = pj_inv(p, myProjection);
241 if (myProjection == 0) {
245 int zone = (
int)(x + 180) / 6 + 1;
247 " +ellps=WGS84 +datum=WGS84 +units=m +no_defs";
253 int zone = (
int)(x / 3);
254 if (zone < 1 || zone > 5) {
259 " +k=1 +x_0=" +
toString(zone * 1000000 + 500000) +
260 " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs";
283 if (includeInBoundary) {
300 if (x > 180.1 || x < -180.1 || y > 90.1 || y < -90.1) {
304 if (myProjection != 0) {
306 p.u = x * DEG_TO_RAD;
307 p.v = y * DEG_TO_RAD;
308 p = pj_fwd(p, myProjection);
318 x *= 111320. * cos(ys *
PI / 180.0);