Copilot commented on code in PR #2677:
URL: https://github.com/apache/sedona/pull/2677#discussion_r2871188731
##########
pom.xml:
##########
@@ -96,7 +96,7 @@
<scala-collection-compat.version>2.5.0</scala-collection-compat.version>
<geoglib.version>1.52</geoglib.version>
<caffeine.version>2.9.2</caffeine.version>
- <proj4sedona.version>0.0.6</proj4sedona.version>
+ <proj4sedona.version>0.0.8</proj4sedona.version>
Review Comment:
The PR description says proj4sedona is bumped to 0.0.7, but the build is set
to 0.0.8 here. Please align the PR description/release notes (and any
dependency compatibility claims) with the actual version being shipped, or
adjust the property to the intended version.
##########
common/src/test/java/org/apache/sedona/common/raster/CrsRoundTripComplianceTest.java:
##########
@@ -0,0 +1,720 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sedona.common.raster;
+
+import static org.junit.Assert.*;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.coverage.grid.GridCoverage2D;
+import org.junit.Test;
+
+/**
+ * Round-trip compliance tests for RS_SetCRS and RS_CRS across representative
EPSG codes.
+ *
+ * <p>For each EPSG code and each format (PROJ, PROJJSON, WKT1, WKT2), this
test:
+ *
+ * <ol>
+ * <li>Creates a raster with that CRS via RS_SetCRS("EPSG:xxxx")
+ * <li>Exports the CRS via RS_CRS(raster, format)
+ * <li>Re-imports the exported string via RS_SetCRS(exportedString)
+ * <li>Re-exports via RS_CRS(raster2, format) and verifies the exported
string is identical
+ * </ol>
+ */
+public class CrsRoundTripComplianceTest extends RasterTestBase {
+
+ private static final Pattern WKT1_PROJECTION_PATTERN =
+ Pattern.compile("PROJECTION\\[\"([^\"]+)\"");
+ private static final Pattern WKT1_AUTHORITY_PATTERN =
+ Pattern.compile("AUTHORITY\\[\"EPSG\",\\s*\"(\\d+)\"\\]");
+
+ //
---------------------------------------------------------------------------
+ // PROJ format round-trip tests
+ //
---------------------------------------------------------------------------
+
+ @Test
+ public void testProjRoundTrip_Geographic_4326() throws FactoryException {
+ assertProjRoundTrip(4326);
+ }
+
+ @Test
+ public void testProjRoundTrip_Geographic_NAD83_4269() throws
FactoryException {
+ assertProjRoundTrip(4269);
+ }
+
+ @Test
+ public void testProjRoundTrip_TransverseMercator_32617() throws
FactoryException {
+ assertProjRoundTrip(32617);
+ }
+
+ @Test
+ public void testProjRoundTrip_PseudoMercator_3857() throws FactoryException {
+ assertProjRoundTrip(3857);
+ }
+
+ @Test
+ public void testProjRoundTrip_Mercator1SP_3395() throws FactoryException {
+ assertProjRoundTrip(3395);
+ }
+
+ @Test
+ public void testProjRoundTrip_LambertConformalConic2SP_2154() throws
FactoryException {
+ assertProjRoundTrip(2154);
+ }
+
+ @Test
+ public void testProjRoundTrip_LambertAzimuthalEqualArea_Spherical_2163()
throws FactoryException {
+ assertProjRoundTrip(2163);
+ }
+
+ @Test
+ public void testProjRoundTrip_AlbersEqualArea_5070() throws FactoryException
{
+ assertProjRoundTrip(5070);
+ }
+
+ @Test
+ public void testProjRoundTrip_ObliqueStereographic_28992() throws
FactoryException {
+ assertProjRoundTrip(28992);
+ }
+
+ @Test
+ public void testProjRoundTrip_PolarStereographicB_3031() throws
FactoryException {
+ assertProjRoundTrip(3031);
+ }
+
+ @Test
+ public void testProjRoundTrip_LambertAzimuthalEqualArea_3035() throws
FactoryException {
+ assertProjRoundTrip(3035);
+ }
+
+ @Test
+ public void testProjRoundTrip_Mercator1SP_Spherical_3785() throws
FactoryException {
+ assertProjRoundTrip(3785);
+ }
+
+ @Test
+ public void testProjRoundTrip_EquidistantCylindrical_4087() throws
FactoryException {
+ assertProjRoundTrip(4087);
+ }
+
+ @Test
+ public void testProjRoundTrip_PolarStereographicA_32661() throws
FactoryException {
+ assertProjRoundTrip(32661);
+ }
+
+ @Test
+ public void testProjRoundTrip_TransverseMercator_OSGB_27700() throws
FactoryException {
+ assertProjRoundTrip(27700);
+ }
+
+ @Test
+ public void testProjRoundTrip_AlbersEqualArea_Australian_3577() throws
FactoryException {
+ assertProjRoundTrip(3577);
+ }
+
+ @Test
+ public void testProjRoundTrip_LambertConformalConic2SP_Vicgrid_3111() throws
FactoryException {
+ assertProjRoundTrip(3111);
+ }
+
+ @Test
+ public void testProjRoundTrip_PolarStereographicB_NSIDC_3413() throws
FactoryException {
+ assertProjRoundTrip(3413);
+ }
+
+ @Test
+ public void testProjRoundTrip_LambertAzimuthalEqualArea_EASE_6931() throws
FactoryException {
+ assertProjRoundTrip(6931);
+ }
+
+ //
---------------------------------------------------------------------------
+ // PROJJSON format round-trip tests
+ //
---------------------------------------------------------------------------
+
+ @Test
+ public void testProjJsonRoundTrip_Geographic_4326() throws FactoryException {
+ assertProjJsonRoundTrip(4326);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_Geographic_NAD83_4269() throws
FactoryException {
+ assertProjJsonRoundTrip(4269);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_TransverseMercator_32617() throws
FactoryException {
+ assertProjJsonRoundTrip(32617);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_PseudoMercator_3857() throws
FactoryException {
+ assertProjJsonRoundTrip(3857);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_Mercator1SP_3395() throws FactoryException
{
+ assertProjJsonRoundTrip(3395);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_LambertConformalConic2SP_2154() throws
FactoryException {
+ assertProjJsonRoundTrip(2154);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_AlbersEqualArea_5070() throws
FactoryException {
+ assertProjJsonRoundTrip(5070);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_ObliqueStereographic_28992() throws
FactoryException {
+ assertProjJsonRoundTrip(28992);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_PolarStereographicB_3031() throws
FactoryException {
+ assertProjJsonRoundTrip(3031);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_LambertAzimuthalEqualArea_3035() throws
FactoryException {
+ assertProjJsonRoundTrip(3035);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_EquidistantCylindrical_4087() throws
FactoryException {
+ assertProjJsonRoundTrip(4087);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_PolarStereographicA_32661() throws
FactoryException {
+ assertProjJsonRoundTrip(32661);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_TransverseMercator_OSGB_27700() throws
FactoryException {
+ assertProjJsonRoundTrip(27700);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_AlbersEqualArea_Australian_3577() throws
FactoryException {
+ assertProjJsonRoundTrip(3577);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_LambertConformalConic2SP_Vicgrid_3111()
+ throws FactoryException {
+ assertProjJsonRoundTrip(3111);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_PolarStereographicB_NSIDC_3413() throws
FactoryException {
+ assertProjJsonRoundTrip(3413);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_LambertAzimuthalEqualArea_EASE_6931()
throws FactoryException {
+ assertProjJsonRoundTrip(6931);
+ }
+
+ //
---------------------------------------------------------------------------
+ // WKT1 format round-trip tests
+ // WKT1 includes AUTHORITY["EPSG","xxxx"] so SRID is always preserved.
+ //
---------------------------------------------------------------------------
+
+ @Test
+ public void testWkt1RoundTrip_Geographic_4326() throws FactoryException {
+ assertWkt1RoundTrip(4326);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_Geographic_NAD83_4269() throws
FactoryException {
+ assertWkt1RoundTrip(4269);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_TransverseMercator_32617() throws
FactoryException {
+ assertWkt1RoundTrip(32617);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_PseudoMercator_3857() throws FactoryException {
+ assertWkt1RoundTrip(3857);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_Mercator1SP_3395() throws FactoryException {
+ assertWkt1RoundTrip(3395);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_LambertConformalConic2SP_2154() throws
FactoryException {
+ assertWkt1RoundTrip(2154);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_LambertAzimuthalEqualArea_Spherical_2163()
throws FactoryException {
+ assertWkt1RoundTrip(2163);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_AlbersEqualArea_5070() throws FactoryException
{
+ assertWkt1RoundTrip(5070);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_ObliqueStereographic_28992() throws
FactoryException {
+ assertWkt1RoundTrip(28992);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_PolarStereographicB_3031() throws
FactoryException {
+ assertWkt1RoundTrip(3031);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_LambertAzimuthalEqualArea_3035() throws
FactoryException {
+ assertWkt1RoundTrip(3035);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_Mercator1SP_Spherical_3785() throws
FactoryException {
+ assertWkt1RoundTrip(3785);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_EquidistantCylindrical_4087() throws
FactoryException {
+ assertWkt1RoundTrip(4087);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_PolarStereographicA_32661() throws
FactoryException {
+ assertWkt1RoundTrip(32661);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_TransverseMercator_OSGB_27700() throws
FactoryException {
+ assertWkt1RoundTrip(27700);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_AlbersEqualArea_Australian_3577() throws
FactoryException {
+ assertWkt1RoundTrip(3577);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_LambertConformalConic2SP_Vicgrid_3111() throws
FactoryException {
+ assertWkt1RoundTrip(3111);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_PolarStereographicB_NSIDC_3413() throws
FactoryException {
+ assertWkt1RoundTrip(3413);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_LambertAzimuthalEqualArea_EASE_6931() throws
FactoryException {
+ assertWkt1RoundTrip(6931);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_Krovak_2065() throws FactoryException {
+ // Krovak fails for PROJ/PROJJSON export but WKT1 is GeoTools-native, so
it works
+ assertWkt1RoundTrip(2065);
+ }
+
+ @Test
+ public void testWkt1RoundTrip_HotineObliqueMercator_2056() throws
FactoryException {
+ // Hotine Oblique Mercator fails for PROJ/PROJJSON export but works for
WKT1
+ assertWkt1RoundTrip(2056);
+ }
+
+ //
---------------------------------------------------------------------------
+ // WKT2 format round-trip tests
+ // WKT2 goes through proj4sedona for both export and import.
+ //
---------------------------------------------------------------------------
+
+ @Test
+ public void testWkt2RoundTrip_Geographic_4326() throws FactoryException {
+ assertWkt2RoundTrip(4326);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_Geographic_NAD83_4269() throws
FactoryException {
+ assertWkt2RoundTrip(4269);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_TransverseMercator_32617() throws
FactoryException {
+ assertWkt2RoundTrip(32617);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_PseudoMercator_3857() throws FactoryException {
+ assertWkt2RoundTrip(3857);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_Mercator1SP_3395() throws FactoryException {
+ assertWkt2RoundTrip(3395);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_LambertConformalConic2SP_2154() throws
FactoryException {
+ assertWkt2RoundTrip(2154);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_LambertAzimuthalEqualArea_Spherical_2163()
throws FactoryException {
+ assertWkt2RoundTrip(2163);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_AlbersEqualArea_5070() throws FactoryException
{
+ assertWkt2RoundTrip(5070);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_PolarStereographicB_3031() throws
FactoryException {
+ assertWkt2RoundTrip(3031);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_LambertAzimuthalEqualArea_3035() throws
FactoryException {
+ assertWkt2RoundTrip(3035);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_Mercator1SP_Spherical_3785() throws
FactoryException {
+ assertWkt2RoundTrip(3785);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_EquidistantCylindrical_4087() throws
FactoryException {
+ assertWkt2RoundTrip(4087);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_TransverseMercator_OSGB_27700() throws
FactoryException {
+ assertWkt2RoundTrip(27700);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_AlbersEqualArea_Australian_3577() throws
FactoryException {
+ assertWkt2RoundTrip(3577);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_LambertConformalConic2SP_Vicgrid_3111() throws
FactoryException {
+ assertWkt2RoundTrip(3111);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_PolarStereographicB_NSIDC_3413() throws
FactoryException {
+ assertWkt2RoundTrip(3413);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_PolarStereographicA_32661() throws
FactoryException {
+ assertWkt2RoundTrip(32661);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_LambertAzimuthalEqualArea_EASE_6931() throws
FactoryException {
+ assertWkt2RoundTrip(6931);
+ }
+
+ @Test
+ public void testWkt2RoundTrip_ObliqueStereographic_28992() throws
FactoryException {
+ assertWkt2RoundTrip(28992);
+ }
+
+ //
---------------------------------------------------------------------------
+ // PROJJSON import failures — spherical datums not parseable after round-trip
+ //
---------------------------------------------------------------------------
+
+ @Test
+ public void
testProjJsonRoundTrip_LambertAzimuthalEqualArea_Spherical_2163_importFails()
+ throws FactoryException {
+ assertProjJsonImportFails(2163);
+ }
+
+ @Test
+ public void testProjJsonRoundTrip_Mercator1SP_Spherical_3785() throws
FactoryException {
+ assertProjJsonRoundTrip(3785);
+ }
+
+ //
---------------------------------------------------------------------------
+ // Export failures — projection types not supported by proj4sedona
+ //
---------------------------------------------------------------------------
+
+ @Test
+ public void testSetCrs_LambertCylindricalEqualArea_6933() throws
FactoryException {
+ // EPSG:6933 setCrs works; WKT1 may not contain AUTHORITY so we just
verify it's parseable
+ GridCoverage2D baseRaster = RasterConstructors.makeEmptyRaster(1, 4, 4, 0,
0, 1);
+ GridCoverage2D result = RasterEditors.setCrs(baseRaster, "EPSG:6933");
+ String wkt1 = RasterAccessors.crs(result, "wkt1");
+ assertNotNull("EPSG:6933 should produce valid WKT1", wkt1);
+ assertTrue("WKT1 should contain PROJCS", wkt1.contains("PROJCS"));
+ }
+
+ @Test
+ public void testExportFails_Krovak_2065() throws FactoryException {
+ assertExportFails(2065);
+ }
+
+ @Test
+ public void testExportFails_HotineObliqueMercator_2056() throws
FactoryException {
+ assertExportFails(2056);
+ }
+
+ //
---------------------------------------------------------------------------
+ // Helper methods
+ //
---------------------------------------------------------------------------
+
+ /**
+ * Assert a full PROJ format round trip: EPSG → RS_CRS("proj") → RS_SetCRS →
RS_CRS("proj") →
+ * RS_SetCRS → RS_CRS("proj"). The first export from EPSG may carry extra
metadata, so we verify
+ * idempotency: the second and third exports (from PROJ string input) must
be identical.
+ */
+ private void assertProjRoundTrip(int epsg) throws FactoryException {
+ GridCoverage2D baseRaster = RasterConstructors.makeEmptyRaster(1, 4, 4, 0,
0, 1);
+ GridCoverage2D raster1 = RasterEditors.setCrs(baseRaster, "EPSG:" + epsg);
+
+ // First export from EPSG
+ String export1 = RasterAccessors.crs(raster1, "proj");
+ assertNotNull("EPSG:" + epsg + " export to PROJ should not be null",
export1);
+
+ // Re-import from PROJ string and re-export
+ GridCoverage2D raster2 = RasterEditors.setCrs(baseRaster, export1);
+ String export2 = RasterAccessors.crs(raster2, "proj");
+ assertNotNull("EPSG:" + epsg + " second export to PROJ should not be
null", export2);
+
+ // Third round-trip to verify idempotency
+ GridCoverage2D raster3 = RasterEditors.setCrs(baseRaster, export2);
+ String export3 = RasterAccessors.crs(raster3, "proj");
+ assertNotNull("EPSG:" + epsg + " third export to PROJ should not be null",
export3);
+
+ assertEquals(
+ "EPSG:" + epsg + " PROJ string should be stable after round trip
(export2 == export3)",
+ export2,
+ export3);
+ }
+
+ /**
+ * Assert a full PROJJSON format round trip: EPSG → RS_CRS("projjson") →
RS_SetCRS →
+ * RS_CRS("projjson") → RS_SetCRS → RS_CRS("projjson"). The first export
from EPSG may carry extra
+ * metadata (e.g., datum names), so we verify idempotency: the second and
third exports (from
+ * PROJJSON string input) must be identical.
+ */
+ private void assertProjJsonRoundTrip(int epsg) throws FactoryException {
+ GridCoverage2D baseRaster = RasterConstructors.makeEmptyRaster(1, 4, 4, 0,
0, 1);
+ GridCoverage2D raster1 = RasterEditors.setCrs(baseRaster, "EPSG:" + epsg);
+
+ // First export from EPSG
+ String export1 = RasterAccessors.crs(raster1, "projjson");
+ assertNotNull("EPSG:" + epsg + " export to PROJJSON should not be null",
export1);
+
+ // Re-import from PROJJSON string and re-export
+ GridCoverage2D raster2 = RasterEditors.setCrs(baseRaster, export1);
+ String export2 = RasterAccessors.crs(raster2, "projjson");
+ assertNotNull("EPSG:" + epsg + " second export to PROJJSON should not be
null", export2);
+
+ // Third round-trip to verify idempotency
+ GridCoverage2D raster3 = RasterEditors.setCrs(baseRaster, export2);
+ String export3 = RasterAccessors.crs(raster3, "projjson");
+ assertNotNull("EPSG:" + epsg + " third export to PROJJSON should not be
null", export3);
+
+ assertEquals(
+ "EPSG:" + epsg + " PROJJSON string should be stable after round trip
(export2 == export3)",
+ export2,
+ export3);
+ }
+
+ /**
+ * Assert a full WKT2 format round trip: EPSG → RS_CRS("wkt2") → RS_SetCRS →
RS_CRS("wkt2") →
+ * RS_SetCRS → RS_CRS("wkt2"). The first export from EPSG may carry extra
metadata, so we verify
+ * idempotency: the second and third exports (from WKT2 string input) must
be identical.
+ */
+ private void assertWkt2RoundTrip(int epsg) throws FactoryException {
+ GridCoverage2D baseRaster = RasterConstructors.makeEmptyRaster(1, 4, 4, 0,
0, 1);
+ GridCoverage2D raster1 = RasterEditors.setCrs(baseRaster, "EPSG:" + epsg);
+
+ // First export from EPSG
+ String export1 = RasterAccessors.crs(raster1, "wkt2");
+ assertNotNull("EPSG:" + epsg + " export to WKT2 should not be null",
export1);
+
+ // Re-import from WKT2 string and re-export
+ GridCoverage2D raster2 = RasterEditors.setCrs(baseRaster, export1);
+ String export2 = RasterAccessors.crs(raster2, "wkt2");
+ assertNotNull("EPSG:" + epsg + " second export to WKT2 should not be
null", export2);
+
+ // Third round-trip to verify idempotency
+ GridCoverage2D raster3 = RasterEditors.setCrs(baseRaster, export2);
+ String export3 = RasterAccessors.crs(raster3, "wkt2");
+ assertNotNull("EPSG:" + epsg + " third export to WKT2 should not be null",
export3);
+
+ assertEquals(
+ "EPSG:" + epsg + " WKT2 string should be stable after round trip
(export2 == export3)",
+ export2,
+ export3);
+ }
+
+ /**
+ * Assert that WKT2 export succeeds but re-import fails for certain CRS
types that proj4sedona can
+ * serialize to WKT2 but cannot re-parse.
+ */
+ private void assertWkt2ImportFails(int epsg) throws FactoryException {
+ GridCoverage2D baseRaster = RasterConstructors.makeEmptyRaster(1, 4, 4, 0,
0, 1);
+ GridCoverage2D raster1 = RasterEditors.setCrs(baseRaster, "EPSG:" + epsg);
+
+ // Export should succeed
+ String exported = RasterAccessors.crs(raster1, "wkt2");
+ assertNotNull("EPSG:" + epsg + " export to WKT2 should succeed", exported);
+
+ // Re-import should fail
+ Exception thrown =
+ assertThrows(
+ "EPSG:" + epsg + " WKT2 re-import should fail",
+ IllegalArgumentException.class,
+ () -> RasterEditors.setCrs(baseRaster, exported));
+ assertTrue(
+ "Error message should mention CRS parsing",
+ thrown.getMessage().contains("Cannot parse CRS string"));
+ }
Review Comment:
`assertWkt2ImportFails(...)` is defined but never used in this test class.
Consider removing it to keep the compliance suite focused, or add a targeted
test that exercises this helper (similar to the PROJJSON spherical-datum
import-failure coverage).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]