43 #ifdef CHECK_MEMORY_LEAKS
45 #endif // CHECK_MEMORY_LEAKS
66 myGeoScale(pow(10, (double) - shift)),
67 myProjectionMethod(NONE),
68 myUseInverseProjection(inverse),
70 myConvBoundary(conv) {
73 }
else if (proj ==
"-") {
75 }
else if (proj ==
"UTM") {
77 }
else if (proj ==
"DHDN") {
82 myProjection = pj_init_plus(proj.c_str());
83 if (myProjection == 0) {
94 if (myProjection != 0) {
95 pj_free(myProjection);
111 if (myProjection != 0) {
112 pj_free(myProjection);
115 if (orig.myProjection != 0) {
125 std::string proj =
"!";
126 int shift = oc.
getInt(
"proj.scale");
128 bool inverse = oc.
exists(
"proj.inverse") && oc.
getBool(
"proj.inverse");
130 if (oc.
getBool(
"simple-projection")) {
136 WRITE_ERROR(
"Inverse projection works only with explicit proj parameters.");
139 unsigned numProjections = oc.
getBool(
"simple-projection") + oc.
getBool(
"proj.utm") + oc.
getBool(
"proj.dhdn") + (oc.
getString(
"proj").length() > 1);
140 if (numProjections > 1) {
141 WRITE_ERROR(
"The projection method needs to be uniquely defined.");
147 }
else if (oc.
getBool(
"proj.dhdn")) {
175 oc.
addSynonyme(
"simple-projection",
"proj.simple",
true);
176 oc.
addDescription(
"simple-projection",
"Projection",
"Uses a simple method for projection");
180 oc.
addDescription(
"proj.scale",
"Projection",
"Number of places to shift decimal point to right in geo-coordinates");
184 oc.
addDescription(
"proj.utm",
"Projection",
"Determine the UTM zone (for a universal transversal mercator projection based on the WGS84 ellipsoid)");
187 oc.
addDescription(
"proj.dhdn",
"Projection",
"Determine the DHDN zone (for a transversal mercator projection based on the bessel ellipsoid)");
190 oc.
addDescription(
"proj",
"Projection",
"Uses STR as proj.4 definition for projection");
193 oc.
addDescription(
"proj.inverse",
"Projection",
"Inverses projection");
220 p = pj_inv(p, myProjection);
234 if (myProjection == 0) {
238 int zone = (
int)(x + 180) / 6 + 1;
240 " +ellps=WGS84 +datum=WGS84 +units=m +no_defs";
246 int zone = (
int)(x / 3);
247 if (zone < 1 || zone > 5) {
252 " +k=1 +x_0=" +
toString(zone * 1000000 + 500000) +
253 " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs";
266 if (includeInBoundary) {
283 if (x > 180.1 || x < -180.1 || y > 90.1 || y < -90.1) {
287 if (myProjection != 0) {
289 p.u = x * DEG_TO_RAD;
290 p.v = y * DEG_TO_RAD;
291 p = pj_fwd(p, myProjection);
299 x *= 111320. * cos(ys *
PI / 180.0);