aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Knudsen <busstoptaktik@users.noreply.github.com>2018-01-08 03:41:45 +0100
committerGitHub <noreply@github.com>2018-01-08 03:41:45 +0100
commit07bb446ec474cf62094070a8ea848b37c911a075 (patch)
treef3212861bb79716af0d4d7008e3b3e44e40f2cd3 /src
parent4809a281abca09085cba6494a0da247c03f0a487 (diff)
downloadPROJ-07bb446ec474cf62094070a8ea848b37c911a075.tar.gz
PROJ-07bb446ec474cf62094070a8ea848b37c911a075.zip
Discern between 2D projected and 3D cartesian linear units (#732)
Diffstat (limited to 'src')
-rw-r--r--src/PJ_axisswap.c5
-rw-r--r--src/PJ_cart.c3
-rw-r--r--src/PJ_deformation.c4
-rw-r--r--src/PJ_helmert.c10
-rw-r--r--src/PJ_horner.c2
-rw-r--r--src/PJ_ob_tran.c2
-rw-r--r--src/PJ_unitconvert.c5
-rw-r--r--src/pj_internal.c12
-rw-r--r--src/proj_internal.h12
-rw-r--r--src/projects.h8
10 files changed, 35 insertions, 28 deletions
diff --git a/src/PJ_axisswap.c b/src/PJ_axisswap.c
index aee3c56e..62a9fba3 100644
--- a/src/PJ_axisswap.c
+++ b/src/PJ_axisswap.c
@@ -242,10 +242,9 @@ PJ *CONVERSION(axisswap,0) {
P->left = PJ_IO_UNITS_RADIANS;
P->right = PJ_IO_UNITS_RADIANS;
} else {
- P->left = PJ_IO_UNITS_METERS;
- P->right = PJ_IO_UNITS_METERS;
+ P->left = PJ_IO_UNITS_PROJECTED;
+ P->right = PJ_IO_UNITS_PROJECTED;
}
return P;
}
-
diff --git a/src/PJ_cart.c b/src/PJ_cart.c
index 12b5876a..8e11c030 100644
--- a/src/PJ_cart.c
+++ b/src/PJ_cart.c
@@ -214,7 +214,6 @@ PJ *CONVERSION(cart,1) {
P->fwd = cart_forward;
P->inv = cart_reverse;
P->left = PJ_IO_UNITS_RADIANS;
- P->right = PJ_IO_UNITS_METERS;
+ P->right = PJ_IO_UNITS_CARTESIAN;
return P;
}
-
diff --git a/src/PJ_deformation.c b/src/PJ_deformation.c
index d227e49f..797af006 100644
--- a/src/PJ_deformation.c
+++ b/src/PJ_deformation.c
@@ -306,8 +306,8 @@ PJ *TRANSFORMATION(deformation,1) {
P->fwd = 0;
P->inv = 0;
- P->left = PJ_IO_UNITS_METERS;
- P->right = PJ_IO_UNITS_METERS;
+ P->left = PJ_IO_UNITS_CARTESIAN;
+ P->right = PJ_IO_UNITS_CARTESIAN;
P->destructor = destructor;
return P;
diff --git a/src/PJ_helmert.c b/src/PJ_helmert.c
index ca14a5cb..f726d946 100644
--- a/src/PJ_helmert.c
+++ b/src/PJ_helmert.c
@@ -477,8 +477,14 @@ PJ *TRANSFORMATION(helmert, 0) {
P->fwd = helmert_forward;
P->inv = helmert_reverse;
- P->left = PJ_IO_UNITS_METERS;
- P->right = PJ_IO_UNITS_METERS;
+ /* In most cases, we work on 3D cartesian coordinates */
+ P->left = PJ_IO_UNITS_CARTESIAN;
+ P->right = PJ_IO_UNITS_CARTESIAN;
+ /* But in the 2D case, the coordinates are projected */
+ if (pj_param_exists (P->params, "theta")) {
+ P->left = PJ_IO_UNITS_PROJECTED;
+ P->right = PJ_IO_UNITS_PROJECTED;
+ }
/* Translations */
if (pj_param (P->ctx, P->params, "tx").i)
diff --git a/src/PJ_horner.c b/src/PJ_horner.c
index fe0452d6..d1146aa1 100644
--- a/src/PJ_horner.c
+++ b/src/PJ_horner.c
@@ -434,7 +434,7 @@ PJ *PROJECTION(horner) {
P->inv3d = 0;
P->fwd = 0;
P->inv = 0;
- P->left = P->right = PJ_IO_UNITS_METERS;
+ P->left = P->right = PJ_IO_UNITS_PROJECTED;
P->destructor = horner_freeup;
/* Polynomial degree specified? */
diff --git a/src/PJ_ob_tran.c b/src/PJ_ob_tran.c
index 43211fe7..debb211c 100644
--- a/src/PJ_ob_tran.c
+++ b/src/PJ_ob_tran.c
@@ -233,7 +233,7 @@ PJ *PROJECTION(ob_tran) {
/* Support some rather speculative test cases, where the rotated projection */
/* is actually latlong. We do not want scaling in that case... */
if (Q->link->right==PJ_IO_UNITS_RADIANS)
- P->right = PJ_IO_UNITS_METERS;
+ P->right = PJ_IO_UNITS_PROJECTED;
return P;
diff --git a/src/PJ_unitconvert.c b/src/PJ_unitconvert.c
index bf1fcd37..06224362 100644
--- a/src/PJ_unitconvert.c
+++ b/src/PJ_unitconvert.c
@@ -397,8 +397,8 @@ PJ *CONVERSION(unitconvert,0) {
P->fwd = forward_2d;
P->inv = reverse_2d;
- P->left = PJ_IO_UNITS_METERS;
- P->right = PJ_IO_UNITS_METERS;
+ P->left = PJ_IO_UNITS_WHATEVER;
+ P->right = PJ_IO_UNITS_WHATEVER;
/* if no time input/output unit is specified we can skip them */
Q->t_in_id = -1;
@@ -485,4 +485,3 @@ PJ *CONVERSION(unitconvert,0) {
return P;
}
-
diff --git a/src/pj_internal.c b/src/pj_internal.c
index 88fb2b62..deb0c054 100644
--- a/src/pj_internal.c
+++ b/src/pj_internal.c
@@ -40,16 +40,16 @@
enum pj_io_units pj_left (PJ *P) {
enum pj_io_units u = P->inverted? P->right: P->left;
- if (u==PJ_IO_UNITS_RADIANS)
- return PJ_IO_UNITS_RADIANS;
- return PJ_IO_UNITS_METERS;
+ if (u==PJ_IO_UNITS_CLASSIC)
+ return PJ_IO_UNITS_PROJECTED;
+ return u;
}
enum pj_io_units pj_right (PJ *P) {
enum pj_io_units u = P->inverted? P->left: P->right;
- if (u==PJ_IO_UNITS_RADIANS)
- return PJ_IO_UNITS_RADIANS;
- return PJ_IO_UNITS_METERS;
+ if (u==PJ_IO_UNITS_CLASSIC)
+ return PJ_IO_UNITS_PROJECTED;
+ return u;
}
diff --git a/src/proj_internal.h b/src/proj_internal.h
index 3dd04e62..41f95c07 100644
--- a/src/proj_internal.h
+++ b/src/proj_internal.h
@@ -61,12 +61,14 @@ extern "C" {
#define PJ_EPS_LAT 1e-12
-/* This enum is also conditionally defined in projects.h - but we need it here */
-/* for the pj_left/right prototypes, and enums cannot be forward declared */
+/* This enum is also conditionally defined in projects.h - but enums cannot */
+/* be forward declared and we need it here for the pj_left/right prototypes */
enum pj_io_units {
- PJ_IO_UNITS_CLASSIC = 0, /* Scaled meters (right) */
- PJ_IO_UNITS_METERS = 1, /* Meters */
- PJ_IO_UNITS_RADIANS = 2 /* Radians */
+ PJ_IO_UNITS_WHATEVER = 0, /* Doesn't matter (or depends on pipeline neighbours) */
+ PJ_IO_UNITS_CLASSIC = 1, /* Scaled meters (right), projected system */
+ PJ_IO_UNITS_PROJECTED = 2, /* Meters, projected system */
+ PJ_IO_UNITS_CARTESIAN = 3, /* Meters, 3D cartesian system */
+ PJ_IO_UNITS_RADIANS = 4 /* Radians */
};
enum pj_io_units pj_left (PJ *P);
enum pj_io_units pj_right (PJ *P);
diff --git a/src/projects.h b/src/projects.h
index 209d6f39..86ca2524 100644
--- a/src/projects.h
+++ b/src/projects.h
@@ -192,9 +192,11 @@ typedef struct PJ_REGION_S PJ_Region;
typedef struct ARG_list paralist; /* parameter list */
#ifndef PROJ_INTERNAL_H
enum pj_io_units {
- PJ_IO_UNITS_CLASSIC = 0, /* Scaled meters (right) */
- PJ_IO_UNITS_METERS = 1, /* Meters */
- PJ_IO_UNITS_RADIANS = 2 /* Radians */
+ PJ_IO_UNITS_WHATEVER = 0, /* Doesn't matter (or depends on pipeline neighbours) */
+ PJ_IO_UNITS_CLASSIC = 1, /* Scaled meters (right), projected system */
+ PJ_IO_UNITS_PROJECTED = 2, /* Meters, projected system */
+ PJ_IO_UNITS_CARTESIAN = 3, /* Meters, 3D cartesian system */
+ PJ_IO_UNITS_RADIANS = 4 /* Radians */
};
#endif
#ifndef PROJ_H