aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2019-04-02 09:59:37 +0200
committerGitHub <noreply@github.com>2019-04-02 09:59:37 +0200
commitb8a62522b0eca6b4b806471cdff984a28ea1c8fe (patch)
tree57fa6179be8677826ac4c5ca31e6f4760245345d
parentf2842ae44c6294b096f8629bd65e0223f0aa145e (diff)
parent47dd4dbc40cbba140f4ceb775ea5d5d628fba961 (diff)
downloadPROJ-b8a62522b0eca6b4b806471cdff984a28ea1c8fe.tar.gz
PROJ-b8a62522b0eca6b4b806471cdff984a28ea1c8fe.zip
Merge pull request #1391 from kbevers/noop
Add no-op operation. It does nothing.
-rw-r--r--docs/source/operations/conversions/index.rst1
-rw-r--r--docs/source/operations/conversions/noop.rst28
-rw-r--r--src/Makefile.am1
-rw-r--r--src/conversions/noop.cpp19
-rw-r--r--src/iso19111/c_api.cpp3
-rw-r--r--src/iso19111/io.cpp5
-rw-r--r--src/lib_proj.cmake1
-rw-r--r--src/pj_list.h1
-rw-r--r--test/cli/testprojinfo_out.dist4
-rw-r--r--test/gie/more_builtins.gie17
-rw-r--r--test/unit/test_datum.cpp4
-rw-r--r--test/unit/test_io.cpp12
-rw-r--r--test/unit/test_operation.cpp20
13 files changed, 94 insertions, 22 deletions
diff --git a/docs/source/operations/conversions/index.rst b/docs/source/operations/conversions/index.rst
index a9d137ab..42ad079d 100644
--- a/docs/source/operations/conversions/index.rst
+++ b/docs/source/operations/conversions/index.rst
@@ -15,6 +15,7 @@ conversions.
cart
geoc
latlon
+ noop
pop
push
unitconvert
diff --git a/docs/source/operations/conversions/noop.rst b/docs/source/operations/conversions/noop.rst
new file mode 100644
index 00000000..a35b2b58
--- /dev/null
+++ b/docs/source/operations/conversions/noop.rst
@@ -0,0 +1,28 @@
+.. _noop:
+
+================================================================================
+No operation
+================================================================================
+
+.. versionadded:: 6.1.0
+
+Pass a coordinate through unchanged.
+
++---------------------+--------------------------------------------------------+
+| **Alias** | noop |
++---------------------+--------------------------------------------------------+
+| **Domain** | 4D |
++---------------------+--------------------------------------------------------+
+| **Input type** | Any |
++---------------------+--------------------------------------------------------+
+| **Output type** | Any |
++---------------------+--------------------------------------------------------+
+
+The no operation is a dummy operation that returns whatever is passed to it
+as seen in this example::
+
+ $ echo 12 34 56 78 | cct +proj=noop
+ 12.0000 34.0000 56.0000 78.0000
+
+The operation has no options and default options will not affect the output.
+
diff --git a/src/Makefile.am b/src/Makefile.am
index b62a11b0..9858d78f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -173,6 +173,7 @@ libproj_la_SOURCES = \
conversions/cart.cpp \
conversions/geoc.cpp \
conversions/geocent.cpp \
+ conversions/noop.cpp \
conversions/unitconvert.cpp \
\
transformations/affine.cpp \
diff --git a/src/conversions/noop.cpp b/src/conversions/noop.cpp
new file mode 100644
index 00000000..a5dd6023
--- /dev/null
+++ b/src/conversions/noop.cpp
@@ -0,0 +1,19 @@
+#define PJ_LIB__
+
+#include "proj_internal.h"
+
+PROJ_HEAD(noop, "No operation");
+
+static PJ_COORD noop(PJ_COORD coord, PJ *P) {
+ (void) P;
+ return coord;
+}
+
+PJ *CONVERSION(noop, 0) {
+ P->fwd4d = noop;
+ P->inv4d = noop;
+ P->left = PJ_IO_UNITS_WHATEVER;
+ P->right = PJ_IO_UNITS_WHATEVER;
+ return P;
+}
+
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp
index 1f4cecde..b15b8e34 100644
--- a/src/iso19111/c_api.cpp
+++ b/src/iso19111/c_api.cpp
@@ -134,8 +134,7 @@ static PJ *pj_obj_create(PJ_CONTEXT *ctx, const IdentifiedObjectNNPtr &objIn) {
auto formatter = PROJStringFormatter::create(
PROJStringFormatter::Convention::PROJ_5, dbContext);
auto projString = coordop->exportToPROJString(formatter.get());
- auto pj = pj_create_internal(
- ctx, projString.empty() ? "+proj=affine" : projString.c_str());
+ auto pj = pj_create_internal(ctx, projString.c_str());
if (pj) {
pj->iso_obj = objIn;
return pj;
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index 03fb6977..51fda1c1 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -5342,6 +5342,11 @@ const std::string &PROJStringFormatter::toString() const {
}
}
}
+
+ if (d->result_.empty()) {
+ d->appendToResult("+proj=noop");
+ }
+
return d->result_;
}
diff --git a/src/lib_proj.cmake b/src/lib_proj.cmake
index 72a8cc59..38bc05d8 100644
--- a/src/lib_proj.cmake
+++ b/src/lib_proj.cmake
@@ -174,6 +174,7 @@ set(SRC_LIBPROJ_CONVERSIONS
conversions/cart.cpp
conversions/geoc.cpp
conversions/geocent.cpp
+ conversions/noop.cpp
conversions/unitconvert.cpp
)
diff --git a/src/pj_list.h b/src/pj_list.h
index 8ab4cdc0..0923bba8 100644
--- a/src/pj_list.h
+++ b/src/pj_list.h
@@ -106,6 +106,7 @@ PROJ_HEAD(nell_h, "Nell-Hammer")
PROJ_HEAD(nicol, "Nicolosi Globular")
PROJ_HEAD(nsper, "Near-sided perspective")
PROJ_HEAD(nzmg, "New Zealand Map Grid")
+PROJ_HEAD(noop, "No operation")
PROJ_HEAD(ob_tran, "General Oblique Transformation")
PROJ_HEAD(ocea, "Oblique Cylindrical Equal Area")
PROJ_HEAD(oea, "Oblated Equal Area")
diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist
index 8698d6c1..f5cbb8bf 100644
--- a/test/cli/testprojinfo_out.dist
+++ b/test/cli/testprojinfo_out.dist
@@ -175,7 +175,7 @@ Operation n°1:
unknown id, Ballpark geographic offset from NAD27 to NAD83, unknown accuracy, World, has ballpark transformation
PROJ string:
-
++proj=noop
WKT2_2018 string:
COORDINATEOPERATION["Ballpark geographic offset from NAD27 to NAD83",
@@ -540,7 +540,7 @@ Operation n°7:
unknown id, Ballpark geographic offset from NAD27 to NAD83, unknown accuracy, World, has ballpark transformation
PROJ string:
-
++proj=noop
WKT2_2018 string:
COORDINATEOPERATION["Ballpark geographic offset from NAD27 to NAD83",
diff --git a/test/gie/more_builtins.gie b/test/gie/more_builtins.gie
index e16443d4..f6b52ea3 100644
--- a/test/gie/more_builtins.gie
+++ b/test/gie/more_builtins.gie
@@ -756,4 +756,21 @@ expect 359 10 0
-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+# No-op
+-------------------------------------------------------------------------------
+operation +proj=noop
+direction forward
+accept 25 25
+expect 25 25
+
+accept 25 25 25
+expect 25 25 25
+
+accept 25 25 25 25
+expect 25 25 25 25
+-------------------------------------------------------------------------------
+
+
+
</gie>
diff --git a/test/unit/test_datum.cpp b/test/unit/test_datum.cpp
index 23c14f67..fa53ff85 100644
--- a/test/unit/test_datum.cpp
+++ b/test/unit/test_datum.cpp
@@ -175,7 +175,7 @@ TEST(datum, prime_meridian_to_PROJString) {
EXPECT_EQ(PrimeMeridian::GREENWICH->exportToPROJString(
PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
EXPECT_EQ(PrimeMeridian::PARIS->exportToPROJString(
PROJStringFormatter::create().get()),
@@ -195,7 +195,7 @@ TEST(datum, prime_meridian_to_PROJString) {
PropertyMap().set(IdentifiedObject::NAME_KEY, "Origin meridian"),
Angle(0))
->exportToPROJString(PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
EXPECT_TRUE(PrimeMeridian::GREENWICH->isEquivalentTo(
PrimeMeridian::GREENWICH.get()));
diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp
index 17b3c334..edf987ba 100644
--- a/test/unit/test_io.cpp
+++ b/test/unit/test_io.cpp
@@ -6541,7 +6541,7 @@ TEST(io, projstringformatter_helmert_3_param_noop) {
fmt->addParam("x", 0);
fmt->addParam("y", 0);
fmt->addParam("z", 0);
- EXPECT_EQ(fmt->toString(), "");
+ EXPECT_EQ(fmt->toString(), "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -6557,7 +6557,7 @@ TEST(io, projstringformatter_helmert_7_param_noop) {
fmt->addParam("rz", 0);
fmt->addParam("s", 0);
fmt->addParam("convention", "position_vector");
- EXPECT_EQ(fmt->toString(), "");
+ EXPECT_EQ(fmt->toString(), "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -6587,7 +6587,7 @@ TEST(io, projstringformatter_merge_consecutive_helmert_3_param_noop) {
fmt->addParam("x", -10);
fmt->addParam("y", -20);
fmt->addParam("z", -30);
- EXPECT_EQ(fmt->toString(), "");
+ EXPECT_EQ(fmt->toString(), "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -6599,7 +6599,7 @@ TEST(io, projstringformatter_cart_grs80_wgs84) {
fmt->addStep("cart");
fmt->setCurrentStepInverted(true);
fmt->addParam("ellps", "GRS80");
- EXPECT_EQ(fmt->toString(), "");
+ EXPECT_EQ(fmt->toString(), "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -7334,7 +7334,7 @@ TEST(io, projparse_longlat_axis_neu) {
auto op = CoordinateOperationFactory::create()->createOperation(
GeographicCRS::EPSG_4326, NN_NO_CHECK(crs));
ASSERT_TRUE(op != nullptr);
- EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), "");
+ EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -7437,7 +7437,7 @@ TEST(io, projparse_longlat_axisswap) {
EXPECT_EQ(
op->exportToPROJString(PROJStringFormatter::create().get()),
(atoi(order1) == 2 && atoi(order2) == 1)
- ? ""
+ ? "+proj=noop"
: "+proj=pipeline +step +proj=axisswap +order=2,1 "
"+step +proj=axisswap +order=" +
std::string(order1) + "," + order2);
diff --git a/test/unit/test_operation.cpp b/test/unit/test_operation.cpp
index 32acbf22..c4cafef6 100644
--- a/test/unit/test_operation.cpp
+++ b/test/unit/test_operation.cpp
@@ -636,7 +636,7 @@ TEST(operation, transformation_createGeocentricTranslations_null) {
EXPECT_EQ(transf->inverse()->exportToPROJString(
PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -956,7 +956,7 @@ TEST(operation, transformation_successive_helmert_noop) {
std::vector<PositionalAccuracyNNPtr>{});
EXPECT_EQ(concat->exportToPROJString(PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -4131,7 +4131,7 @@ TEST(operation, PROJ_based_empty) {
SingleOperation::createPROJBased(PropertyMap(), "", nullptr, nullptr);
EXPECT_EQ(conv->exportToPROJString(PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
EXPECT_EQ(conv->exportToWKT(WKTFormatter::create().get()),
"CONVERSION[\"PROJ-based coordinate operation\",\n"
@@ -4144,7 +4144,7 @@ TEST(operation, PROJ_based_empty) {
EXPECT_EQ(conv->inverse()->exportToPROJString(
PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -4328,7 +4328,7 @@ TEST(operation, geogCRS_to_geogCRS_context_filter_bbox) {
ASSERT_EQ(list.size(), 1U);
EXPECT_EQ(
list[0]->exportToPROJString(PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
}
}
@@ -4344,7 +4344,7 @@ TEST(operation, geogCRS_to_geogCRS_context_incompatible_area) {
ctxt);
ASSERT_EQ(list.size(), 1U);
EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
}
// ---------------------------------------------------------------------------
@@ -4504,7 +4504,7 @@ TEST(operation, geogCRS_to_geogCRS_noop) {
GeographicCRS::EPSG_4326, GeographicCRS::EPSG_4326);
ASSERT_TRUE(op != nullptr);
EXPECT_EQ(op->nameStr(), "Null geographic offset from WGS 84 to WGS 84");
- EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), "");
+ EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), "+proj=noop");
EXPECT_EQ(op->inverse()->nameStr(), op->nameStr());
}
@@ -4651,7 +4651,7 @@ TEST(operation, geogCRS_to_geogCRS_CH1903_to_CH1903plus_context) {
EXPECT_EQ(list[0]->nameStr(),
"CH1903 to ETRS89 (1) + Inverse of CH1903+ to ETRS89 (1)");
EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()),
- "");
+ "+proj=noop");
EXPECT_EQ(list[1]->nameStr(), "CH1903 to CH1903+ (1)");
EXPECT_EQ(list[1]->exportToPROJString(PROJStringFormatter::create().get()),
@@ -4845,7 +4845,7 @@ TEST(operation, geocentricCRS_to_geocentricCRS_noop) {
ASSERT_TRUE(op != nullptr);
EXPECT_EQ(op->nameStr(),
"Ballpark geocentric translation from WGS 84 to WGS 84");
- EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), "");
+ EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), "+proj=noop");
EXPECT_EQ(op->inverse()->nameStr(), op->nameStr());
}
@@ -6571,7 +6571,7 @@ TEST(operation, compoundCRS_to_geogCRS_3D_context) {
PROJStringFormatter::Convention::PROJ_5,
authFactory->databaseContext())
.get()),
- "");
+ "+proj=noop");
}
}