[Git][debian-gis-team/proj][upstream] New upstream version 9.2.0~rc2

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Fri Feb 24 19:29:30 GMT 2023



Bas Couwenberg pushed to branch upstream at Debian GIS Project / proj


Commits:
047b9b34 by Bas Couwenberg at 2023-02-24T20:09:53+01:00
New upstream version 9.2.0~rc2
- - - - -


8 changed files:

- NEWS
- data/sql/proj_db_table_defs.sql
- src/iso19111/coordinates.cpp
- src/iso19111/datum.cpp
- src/iso19111/factory.cpp
- test/unit/gie_self_tests.cpp
- test/unit/test_crs.cpp
- test/unit/test_io.cpp


Changes:

=====================================
NEWS
=====================================
@@ -144,6 +144,7 @@
 
  o WKT1 parser: only emit warning when encountering invalid UNKNOWN WKT1 axis direction (#3618)
 
+ o projinfo: fix long option name --source-crs (#3601)
 
 
 9.1.1 Release Notes
@@ -208,8 +209,6 @@
 
  o Link geodtest against libm when available (#3341)
 
- o projinfo: fix long option name --source-crs (#3601)
-
 9.1.0 Release Notes
 -------------------
 


=====================================
data/sql/proj_db_table_defs.sql
=====================================
@@ -1411,75 +1411,75 @@ END;
 
 
 CREATE VIEW coordinate_operation_view AS
-    SELECT 'grid_transformation' AS table_name, auth_name, code, name,
+    SELECT CAST('grid_transformation' AS TEXT) AS table_name, auth_name, code, name,
            description,
            method_auth_name, method_code, method_name, source_crs_auth_name,
            source_crs_code, target_crs_auth_name, target_crs_code,
            accuracy, deprecated FROM grid_transformation
     UNION ALL
-    SELECT 'helmert_transformation' AS table_name, auth_name, code, name,
+    SELECT CAST('helmert_transformation' AS TEXT) AS table_name, auth_name, code, name,
            description,
            method_auth_name, method_code, method_name, source_crs_auth_name,
            source_crs_code, target_crs_auth_name, target_crs_code,
            accuracy, deprecated FROM helmert_transformation
     UNION ALL
-    SELECT 'other_transformation' AS table_name, auth_name, code, name,
+    SELECT CAST('other_transformation' AS TEXT) AS table_name, auth_name, code, name,
            description,
            method_auth_name, method_code, method_name, source_crs_auth_name,
            source_crs_code, target_crs_auth_name, target_crs_code,
            accuracy, deprecated FROM other_transformation
     UNION ALL
-    SELECT 'concatenated_operation' AS table_name, auth_name, code, name,
+    SELECT CAST('concatenated_operation' AS TEXT) AS table_name, auth_name, code, name,
            description,
-           NULL, NULL, NULL, source_crs_auth_name,
+           CAST(NULL AS TEXT) as method_auth_name, CAST(NULL AS INTEGER_OR_TEXT) as method_code, CAST(NULL AS TEXT) as method_name, source_crs_auth_name,
            source_crs_code, target_crs_auth_name, target_crs_code,
            accuracy, deprecated FROM concatenated_operation
 ;
 
 CREATE VIEW coordinate_operation_with_conversion_view AS
     SELECT auth_name, code, table_name AS type FROM coordinate_operation_view UNION ALL
-    SELECT auth_name, code, 'conversion' FROM conversion_table;
+    SELECT auth_name, code, CAST('conversion' AS TEXT) FROM conversion_table;
 
 CREATE VIEW crs_view AS
-    SELECT 'geodetic_crs' AS table_name, auth_name, code, name, type,
+    SELECT CAST('geodetic_crs' AS TEXT) AS table_name, auth_name, code, name, type,
            description,
            deprecated FROM geodetic_crs
     UNION ALL
-    SELECT 'projected_crs' AS table_name, auth_name, code, name, 'projected',
+    SELECT CAST('projected_crs' AS TEXT) AS table_name, auth_name, code, name, CAST('projected' AS TEXT),
            description,
            deprecated FROM projected_crs
     UNION ALL
-    SELECT 'vertical_crs' AS table_name, auth_name, code, name, 'vertical',
+    SELECT CAST('vertical_crs' AS TEXT) AS table_name, auth_name, code, name, CAST('vertical' AS TEXT),
            description,
            deprecated FROM vertical_crs
     UNION ALL
-    SELECT 'compound_crs' AS table_name, auth_name, code, name, 'compound',
+    SELECT CAST('compound_crs' AS TEXT) AS table_name, auth_name, code, name, CAST('compound' AS TEXT),
            description,
            deprecated FROM compound_crs
 ;
 
 CREATE VIEW object_view AS
-    SELECT 'unit_of_measure' AS table_name, auth_name, code, name, NULL as type, deprecated FROM unit_of_measure
+    SELECT CAST('unit_of_measure' AS TEXT) AS table_name, auth_name, code, name, CAST(NULL AS TEXT) as type, deprecated FROM unit_of_measure
     UNION ALL
-    SELECT 'celestial_body', auth_name, code, name, NULL, 0 FROM celestial_body
+    SELECT CAST('celestial_body' AS TEXT), auth_name, code, name, CAST(NULL AS TEXT) as type, CAST(0 AS BOOLEAN) AS deprecated FROM celestial_body
     UNION ALL
-    SELECT 'ellipsoid', auth_name, code, name, NULL, deprecated FROM ellipsoid
+    SELECT CAST('ellipsoid' AS TEXT), auth_name, code, name, CAST(NULL AS TEXT) as type, deprecated FROM ellipsoid
     UNION ALL
-    SELECT 'extent', auth_name, code, name, NULL, deprecated FROM extent
+    SELECT CAST('extent' AS TEXT), auth_name, code, name, CAST(NULL AS TEXT) as type, deprecated FROM extent
     UNION ALL
-    SELECT 'prime_meridian', auth_name, code, name, NULL, deprecated FROM prime_meridian
+    SELECT CAST('prime_meridian' AS TEXT), auth_name, code, name, CAST(NULL AS TEXT) as type, deprecated FROM prime_meridian
     UNION ALL
-    SELECT 'geodetic_datum', auth_name, code, name, CASE WHEN ensemble_accuracy IS NOT NULL THEN 'ensemble' ELSE 'datum' END, deprecated FROM geodetic_datum
+    SELECT CAST('geodetic_datum' AS TEXT), auth_name, code, name, CAST(CASE WHEN ensemble_accuracy IS NOT NULL THEN 'ensemble' ELSE 'datum' END AS TEXT), deprecated FROM geodetic_datum
     UNION ALL
-    SELECT 'vertical_datum', auth_name, code, name, CASE WHEN ensemble_accuracy IS NOT NULL THEN 'ensemble' ELSE 'datum' END, deprecated FROM vertical_datum
+    SELECT CAST('vertical_datum' AS TEXT), auth_name, code, name, CAST(CASE WHEN ensemble_accuracy IS NOT NULL THEN 'ensemble' ELSE 'datum' END AS TEXT), deprecated FROM vertical_datum
     UNION ALL
-    SELECT 'axis', auth_name, code, name, NULL, 0 as deprecated FROM axis
+    SELECT CAST('axis' AS TEXT), auth_name, code, name, CAST(NULL AS TEXT) as type, CAST(0 AS BOOLEAN) AS deprecated FROM axis
     UNION ALL
     SELECT table_name, auth_name, code, name, type, deprecated FROM crs_view
     UNION ALL
-    SELECT 'conversion', auth_name, code, name, NULL, deprecated FROM conversion_table
+    SELECT CAST('conversion' AS TEXT), auth_name, code, name, CAST(NULL AS TEXT) as type, deprecated FROM conversion_table
     UNION ALL
-    SELECT table_name, auth_name, code, name, NULL, deprecated FROM coordinate_operation_view
+    SELECT table_name, auth_name, code, name, CAST(NULL AS TEXT) as type, deprecated FROM coordinate_operation_view
 ;
 
 CREATE VIEW authority_list AS


=====================================
src/iso19111/coordinates.cpp
=====================================
@@ -40,6 +40,7 @@
 
 #include "proj_json_streaming_writer.hpp"
 
+#include <cmath>
 #include <limits>
 
 using namespace NS_PROJ::internal;
@@ -149,6 +150,17 @@ CoordinateMetadata::coordinateEpoch() PROJ_PURE_DEFN {
 
 // ---------------------------------------------------------------------------
 
+// Avoid rounding issues due to year -> second (SI unit) -> year roundtrips
+static double getRoundedEpochInDecimalYear(double year) {
+    // Try to see if the value is close to xxxx.yyy decimal year.
+    if (std::fabs(1000 * year - std::round(1000 * year)) <= 1e-3) {
+        year = std::round(1000 * year) / 1000.0;
+    }
+    return year;
+}
+
+// ---------------------------------------------------------------------------
+
 /** \brief Get the coordinate epoch associated with this CoordinateMetadata
  * object, as decimal year.
  *
@@ -157,8 +169,9 @@ CoordinateMetadata::coordinateEpoch() PROJ_PURE_DEFN {
  */
 double CoordinateMetadata::coordinateEpochAsDecimalYear() PROJ_PURE_DEFN {
     if (d->coordinateEpoch_.has_value()) {
-        return d->coordinateEpoch_->coordinateEpoch().convertToUnit(
-            common::UnitOfMeasure::YEAR);
+        return getRoundedEpochInDecimalYear(
+            d->coordinateEpoch_->coordinateEpoch().convertToUnit(
+                common::UnitOfMeasure::YEAR));
     }
     return std::numeric_limits<double>::quiet_NaN();
 }


=====================================
src/iso19111/datum.cpp
=====================================
@@ -119,11 +119,23 @@ void Datum::Private::exportAnchorDefinition(io::WKTFormatter *formatter) const {
 
 // ---------------------------------------------------------------------------
 
+// Avoid rounding issues due to year -> second (SI unit) -> year roundtrips
+static double getRoundedEpochInDecimalYear(double year) {
+    // Try to see if the value is close to xxxx.yyy decimal year.
+    if (std::fabs(1000 * year - std::round(1000 * year)) <= 1e-3) {
+        year = std::round(1000 * year) / 1000.0;
+    }
+    return year;
+}
+
+// ---------------------------------------------------------------------------
+
 void Datum::Private::exportAnchorEpoch(io::WKTFormatter *formatter) const {
     if (anchorEpoch->has_value()) {
         formatter->startNode(io::WKTConstants::ANCHOREPOCH, false);
-        formatter->add(
-            (*anchorEpoch)->convertToUnit(common::UnitOfMeasure::YEAR));
+        const double year =
+            (*anchorEpoch)->convertToUnit(common::UnitOfMeasure::YEAR);
+        formatter->add(getRoundedEpochInDecimalYear(year));
         formatter->endNode();
     }
 }
@@ -145,7 +157,9 @@ void Datum::Private::exportAnchorEpoch(io::JSONFormatter *formatter) const {
     if (anchorEpoch->has_value()) {
         auto writer = formatter->writer();
         writer->AddObjKey("anchor_epoch");
-        writer->Add((*anchorEpoch)->convertToUnit(common::UnitOfMeasure::YEAR));
+        const double year =
+            (*anchorEpoch)->convertToUnit(common::UnitOfMeasure::YEAR);
+        writer->Add(getRoundedEpochInDecimalYear(year));
     }
 }
 


=====================================
src/iso19111/factory.cpp
=====================================
@@ -3422,7 +3422,11 @@ DatabaseContext::getAliasFromOfficialName(const std::string &officialName,
     }
     sql += " ORDER BY deprecated";
     auto res = d->run(sql, {officialName});
-    if (res.empty()) {
+    // Sorry for the hack excluding NAD83 + geographic_3D_crs, but otherwise
+    // EPSG has a weird alias from NAD83 to EPSG:4152 which happens to be
+    // NAD83(HARN), and that's definitely not desirable.
+    if (res.empty() &&
+        !(officialName == "NAD83" && tableName == "geographic_3D_crs")) {
         res = d->run(
             "SELECT auth_name, code FROM alias_name WHERE table_name = ? AND "
             "alt_name = ? AND source IN ('EPSG', 'PROJ')",


=====================================
test/unit/gie_self_tests.cpp
=====================================
@@ -1189,13 +1189,15 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) {
 
         // Test a point along the equator.
         // The same point, but in two different representations.
-        input.xyz.x = 0;   // Lat in deg
-        input.xyz.y = 140; // Long in deg
-        input.xyz.z = 0;
+        input.xyzt.x = 0;   // Lat in deg
+        input.xyzt.y = 140; // Long in deg
+        input.xyzt.z = 0;
+        input.xyzt.t = HUGE_VAL;
 
-        input_over.xyz.x = 0;    // Lat in deg
-        input_over.xyz.y = -220; // Long in deg
-        input_over.xyz.z = 0;
+        input_over.xyzt.x = 0;    // Lat in deg
+        input_over.xyzt.y = -220; // Long in deg
+        input_over.xyzt.z = 0;
+        input_over.xyzt.t = HUGE_VAL;
 
         auto output = proj_trans(P, PJ_FWD, input);
         auto output_over = proj_trans(P, PJ_FWD, input_over);
@@ -1230,9 +1232,10 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) {
         ASSERT_TRUE(Pnormalized->over);
 
         PJ_COORD input_over_normalized;
-        input_over_normalized.xyz.x = -220; // Long in deg
-        input_over_normalized.xyz.y = 0;    // Lat in deg
-        input_over_normalized.xyz.z = 0;
+        input_over_normalized.xyzt.x = -220; // Long in deg
+        input_over_normalized.xyzt.y = 0;    // Lat in deg
+        input_over_normalized.xyzt.z = 0;
+        input_over_normalized.xyzt.t = HUGE_VAL;
         auto output_over_normalized =
             proj_trans(Pnormalized, PJ_FWD, input_over_normalized);
         EXPECT_NEAR(output_over_normalized.xyz.x, -24490287.974520184, 1e-8);
@@ -1253,13 +1256,15 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) {
         PJ_COORD input;
         PJ_COORD input_notOver;
 
-        input.xyz.x = 0;   // Lat in deg
-        input.xyz.y = 140; // Long in deg
-        input.xyz.z = 0;
+        input.xyzt.x = 0;   // Lat in deg
+        input.xyzt.y = 140; // Long in deg
+        input.xyzt.z = 0;
+        input.xyzt.t = HUGE_VAL;
 
-        input_notOver.xyz.x = 0;    // Lat in deg
-        input_notOver.xyz.y = -220; // Long in deg
-        input_notOver.xyz.z = 0;
+        input_notOver.xyzt.x = 0;    // Lat in deg
+        input_notOver.xyzt.y = -220; // Long in deg
+        input_notOver.xyzt.z = 0;
+        input_notOver.xyzt.t = HUGE_VAL;
 
         auto output = proj_trans(P, PJ_FWD, input);
         auto output_notOver = proj_trans(P, PJ_FWD, input_notOver);
@@ -1282,13 +1287,15 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) {
         PJ_COORD input;
         PJ_COORD input_notOver;
 
-        input.xyz.x = 0;   // Lat in deg
-        input.xyz.y = 140; // Long in deg
-        input.xyz.z = 0;
+        input.xyzt.x = 0;   // Lat in deg
+        input.xyzt.y = 140; // Long in deg
+        input.xyzt.z = 0;
+        input.xyzt.t = HUGE_VAL;
 
-        input_notOver.xyz.x = 0;    // Lat in deg
-        input_notOver.xyz.y = -220; // Long in deg
-        input_notOver.xyz.z = 0;
+        input_notOver.xyzt.x = 0;    // Lat in deg
+        input_notOver.xyzt.y = -220; // Long in deg
+        input_notOver.xyzt.z = 0;
+        input_notOver.xyzt.t = HUGE_VAL;
 
         auto output = proj_trans(P, PJ_FWD, input);
         auto output_notOver = proj_trans(P, PJ_FWD, input_notOver);
@@ -1313,13 +1320,15 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) {
         PJ_COORD input;
         PJ_COORD input_over;
 
-        input.xyz.x = 0;   // Lat in deg
-        input.xyz.y = 140; // Long in deg
-        input.xyz.z = 0;
+        input.xyzt.x = 0;   // Lat in deg
+        input.xyzt.y = 140; // Long in deg
+        input.xyzt.z = 0;
+        input.xyzt.t = HUGE_VAL;
 
-        input_over.xyz.x = 0;    // Lat in deg
-        input_over.xyz.y = -220; // Long in deg
-        input_over.xyz.z = 0;
+        input_over.xyzt.x = 0;    // Lat in deg
+        input_over.xyzt.y = -220; // Long in deg
+        input_over.xyzt.z = 0;
+        input_over.xyzt.t = HUGE_VAL;
 
         auto output = proj_trans(P, PJ_FWD, input);
         auto output_over = proj_trans(P, PJ_FWD, input_over);
@@ -1337,9 +1346,10 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) {
         }
 
         PJ_COORD input_over_normalized;
-        input_over_normalized.xyz.x = -220; // Long in deg
-        input_over_normalized.xyz.y = 0;    // Lat in deg
-        input_over_normalized.xyz.z = 0;
+        input_over_normalized.xyzt.x = -220; // Long in deg
+        input_over_normalized.xyzt.y = 0;    // Lat in deg
+        input_over_normalized.xyzt.z = 0;
+        input_over_normalized.xyzt.t = HUGE_VAL;
         auto output_over_normalized =
             proj_trans(Pnormalized, PJ_FWD, input_over_normalized);
         EXPECT_NEAR(output_over_normalized.xyz.x, 4980122.749364435, 1e-8);
@@ -1360,13 +1370,15 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) {
         PJ_COORD input;
         PJ_COORD input_over;
 
-        input.xyz.x = 0;   // Lat in deg
-        input.xyz.y = 140; // Long in deg
-        input.xyz.z = 0;
+        input.xyzt.x = 0;   // Lat in deg
+        input.xyzt.y = 140; // Long in deg
+        input.xyzt.z = 0;
+        input.xyzt.t = HUGE_VAL;
 
-        input_over.xyz.x = 0;    // Lat in deg
-        input_over.xyz.y = -220; // Long in deg
-        input_over.xyz.z = 0;
+        input_over.xyzt.x = 0;    // Lat in deg
+        input_over.xyzt.y = -220; // Long in deg
+        input_over.xyzt.z = 0;
+        input_over.xyzt.t = HUGE_VAL;
 
         auto output = proj_trans(P, PJ_FWD, input);
         auto output_over = proj_trans(P, PJ_FWD, input_over);


=====================================
test/unit/test_crs.cpp
=====================================
@@ -588,6 +588,31 @@ TEST(crs, geographic3D_crs_as_WKT1_ESRI_database) {
 
 // ---------------------------------------------------------------------------
 
+TEST(crs, geographic3D_NAD83_as_WKT1_ESRI_database) {
+    auto dbContext = DatabaseContext::create();
+    auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT(
+        "GEOGCS[\"GCS_North_American_1983\",DATUM[\"D_North_American_1983\","
+        "SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],"
+        "PRIMEM[\"Greenwich\",0.0],"
+        "UNIT[\"Degree\",0.0174532925199433]],"
+        "VERTCS[\"NAD_1983\",DATUM[\"D_North_American_1983\","
+        "SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],"
+        "PARAMETER[\"Vertical_Shift\",0.0],"
+        "PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0]]");
+    auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
+    ASSERT_TRUE(crs != nullptr);
+    WKTFormatterNNPtr f(
+        WKTFormatter::create(WKTFormatter::Convention::WKT1_ESRI, dbContext));
+    const auto wkt = "GEOGCS[\"GCS_NAD83\",DATUM[\"D_North_American_1983\","
+                     "SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],"
+                     "PRIMEM[\"Greenwich\",0.0],"
+                     "UNIT[\"Degree\",0.0174532925199433],"
+                     "LINUNIT[\"Meter\",1.0]]";
+    EXPECT_EQ(crs->exportToWKT(f.get()), wkt);
+}
+
+// ---------------------------------------------------------------------------
+
 TEST(crs, GeographicCRS_is2DPartOf3D) {
     EXPECT_TRUE(GeographicCRS::EPSG_4326->is2DPartOf3D(
         NN_NO_CHECK(GeographicCRS::EPSG_4979.get())));


=====================================
test/unit/test_io.cpp
=====================================
@@ -13163,11 +13163,13 @@ TEST(json_import, geodetic_reference_frame_with_explicit_prime_meridian) {
 // ---------------------------------------------------------------------------
 
 TEST(json_import, geodetic_reference_frame_with_anchor_epoch) {
+    // Use dummy anchor_epoch = 0 to avoid fp issues on some architectures
+    // (cf https://github.com/OSGeo/PROJ/issues/3632)
     auto json = "{\n"
                 "  \"$schema\": \"foo\",\n"
                 "  \"type\": \"GeodeticReferenceFrame\",\n"
                 "  \"name\": \"my_name\",\n"
-                "  \"anchor_epoch\": 2002.5,\n"
+                "  \"anchor_epoch\": 0,\n"
                 "  \"ellipsoid\": {\n"
                 "    \"name\": \"WGS 84\",\n"
                 "    \"semi_major_axis\": 6378137,\n"
@@ -15537,12 +15539,14 @@ TEST(json_import, vertical_crs_with_geoid_model_and_interpolation_crs) {
 // ---------------------------------------------------------------------------
 
 TEST(json_import, vertical_reference_frame_with_anchor_epoch) {
+    // Use dummy anchor_epoch = 0 to avoid fp issues on some architectures
+    // (cf https://github.com/OSGeo/PROJ/issues/3632)
     auto json = "{\n"
                 "  \"$schema\": \"foo\",\n"
                 "  \"type\": \"VerticalReferenceFrame\",\n"
                 "  \"name\": \"my_name\",\n"
                 "  \"anchor\": \"my_anchor_definition\",\n"
-                "  \"anchor_epoch\": 2002.5\n"
+                "  \"anchor_epoch\": 0\n"
                 "}";
     auto obj = createFromUserInput(json, nullptr);
     auto vrf = nn_dynamic_pointer_cast<VerticalReferenceFrame>(obj);



View it on GitLab: https://salsa.debian.org/debian-gis-team/proj/-/commit/047b9b348ccb0c3095733f8b72681a5cf3f498e3

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/proj/-/commit/047b9b348ccb0c3095733f8b72681a5cf3f498e3
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20230224/56862522/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list