You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2026/08/14 17:16:59 UTC
(sis) 01/01: Merge branch 'geoapi-4.0' into geoapi-3.1
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch geoapi-3.1
in repository https://gitbox.apache.org/repos/asf/sis.git
commit b7f39770a226034d9fddcd1593a36db65b33954c
Merge: e3537fc7c1 ccf06de245
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Fri Aug 14 19:16:38 2026 +0200
Merge branch 'geoapi-4.0' into geoapi-3.1
.../apache/sis/buildtools/gradle/Dependency.java | 3 +-
.../org/apache/sis/console/HelpCommandTest.java | 1 +
.../org.apache.sis.feature/main/module-info.java | 5 +
.../sis/coverage/grid/ClippedGridCoverage.java | 4 +-
.../apache/sis/coverage/grid/GridCRSBuilder.java | 156 +++--
.../org/apache/sis/coverage/grid/GridCoverage.java | 17 +-
.../apache/sis/coverage/grid/GridCoverage2D.java | 100 ++-
.../sis/coverage/grid/GridCoverageBuilder.java | 6 +-
.../apache/sis/coverage/grid/GridDerivation.java | 2 +-
.../org/apache/sis/coverage/grid/GridExtent.java | 136 ++--
.../org/apache/sis/coverage/grid/GridGeometry.java | 43 +-
.../apache/sis/coverage/grid/ImageRenderer.java | 121 +---
.../apache/sis/coverage/grid/SliceGeometry.java | 3 +-
.../org/apache/sis/feature/AbstractFeature.java | 5 -
.../org/apache/sis/feature/internal/Resources.java | 15 +
.../sis/feature/internal/Resources.properties | 3 +
.../sis/feature/internal/Resources_fr.properties | 3 +
.../main/org/apache/sis/image/BandSelectImage.java | 4 +-
.../apache/sis/image/BandedSampleConverter.java | 6 +-
.../main/org/apache/sis/image/ComputedImage.java | 12 +-
.../main/org/apache/sis/image/ImageLayout.java | 38 +-
.../main/org/apache/sis/image/ImageOverlay.java | 2 +-
.../org/apache/sis/image/MultiSourcePrefetch.java | 5 +-
.../main/org/apache/sis/image/PlanarImage.java | 128 ++--
.../main/org/apache/sis/image/PrefetchedImage.java | 4 +-
.../org/apache/sis/image/SourceAlignedImage.java | 2 +-
.../apache/sis/image/WritableComputedImage.java | 8 +-
.../org/apache/sis/image/internal/Summarizer.java | 275 ++++++++
.../apache/sis/image/internal}/package-info.java | 14 +-
.../image/internal/shared/BatchComputedImage.java | 27 +-
.../image/internal/shared/ColorModelFactory.java | 54 +-
.../image/internal/shared/DeferredProperty.java | 47 +-
.../sis/image/internal/shared/ImageUtilities.java | 36 +-
.../sis/image/internal/shared/RasterFactory.java | 21 +-
.../sis/image/internal/shared/ReshapedImage.java | 115 +++-
.../image/internal/shared/ScaledColorSpace.java | 13 +-
.../sis/image/internal/shared/TileOpExecutor.java | 7 +-
.../sis/image/internal/shared/TiledImage.java | 6 +-
.../image/internal/shared/WritableTiledImage.java | 16 +-
...ervableImage.java => WritableUntiledImage.java} | 272 ++++++--
.../apache/sis/coverage/grid/GridExtentTest.java | 57 +-
.../coverage/grid/ResampledGridCoverageTest.java | 6 +-
.../test/org/apache/sis/image/ImageLayoutTest.java | 9 +
.../test/org/apache/sis/image/TiledImageMock.java | 71 ++-
.../image/internal/shared/ReshapedImageTest.java | 5 +-
.../org/apache/sis/metadata/AbstractMetadata.java | 6 +-
.../main/org/apache/sis/metadata/CacheKey.java | 9 +-
.../org/apache/sis/metadata/MetadataCopier.java | 2 +-
.../org/apache/sis/metadata/MetadataStandard.java | 393 ++++++++----
.../org/apache/sis/metadata/MetadataVisitor.java | 15 +-
.../apache/sis/metadata/ModifiableMetadata.java | 46 +-
.../org/apache/sis/metadata/PropertyAccessor.java | 3 +-
.../main/org/apache/sis/metadata/Pruner.java | 4 +-
.../main/org/apache/sis/metadata/StateChanger.java | 2 +-
.../main/org/apache/sis/metadata/TreeNode.java | 10 +-
.../apache/sis/metadata/UnresolvedTypePolicy.java} | 40 +-
.../apache/sis/metadata/internal/Resources.java | 5 +
.../sis/metadata/internal/Resources.properties | 1 +
.../sis/metadata/internal/Resources_fr.properties | 1 +
.../sis/metadata/internal/shared/Merger.java | 88 ++-
.../iso/extent/DefaultGeographicBoundingBox.java | 2 +-
.../main/org/apache/sis/metadata/package-info.java | 2 +-
.../sis/metadata/sql/internal/shared/Dialect.java | 43 +-
.../metadata/sql/internal/shared/SQLBuilder.java | 11 +-
.../sis/metadata/sql/internal/shared/Supports.java | 7 +-
.../org/apache/sis/util/iso/DefaultRecordType.java | 2 +-
.../apache/sis/xml/bind/cat/CodeListAdapter.java | 2 +-
.../test/org/apache/sis/metadata/HashCodeTest.java | 4 +-
.../apache/sis/metadata/InformationMapTest.java | 1 +
.../apache/sis/metadata/MetadataStandardTest.java | 28 +-
.../test/org/apache/sis/metadata/NameMapTest.java | 1 +
.../test/org/apache/sis/metadata/PrunerTest.java | 1 +
.../org/apache/sis/metadata/SpecialCasesTest.java | 1 +
.../apache/sis/metadata/TreeNodeChildrenTest.java | 2 +-
.../test/org/apache/sis/metadata/TypeMapTest.java | 1 +
.../sis/metadata/internal/shared/MergerTest.java | 24 +-
.../org/apache/sis/map/coverage/RenderingData.java | 24 +-
.../apache/sis/map/coverage/RenderingDataTest.java | 256 ++++++++
.../main/module-info.java | 1 +
.../main/org/apache/sis/geometry/Envelopes.java | 51 +-
.../org/apache/sis/parameter/MatrixParameters.java | 2 +-
.../sis/referencing/datum/DatumOrEnsemble.java | 2 +-
.../operation/CoordinateOperationContext.java | 6 +-
.../operation/CoordinateOperationFinder.java | 32 +-
.../referencing/operation/SubOperationInfo.java | 40 +-
.../operation/provider/DatumShiftMethod.java | 6 +-
.../transform/AbstractLinearTransform.java | 7 +-
.../operation/transform/PassThroughTransform.java | 6 +-
.../operation/transform/TransformJoiner.java | 11 +-
.../org/apache/sis/storage/geotiff/DataSubset.java | 2 +-
.../org/apache/sis/storage/netcdf/base/Axis.java | 23 +-
.../apache/sis/storage/netcdf/base/Variable.java | 7 +
.../sis/storage/netcdf/ucar/VariableWrapper.java | 22 +-
.../sis/storage/sql/feature/SelectionClause.java | 77 ++-
.../storage/sql/feature/SelectionClauseWriter.java | 35 +-
.../sis/storage/sql/postgis/RasterReader.java | 4 +-
.../org/apache/sis/storage/sql/SQLStoreTest.java | 20 +-
.../org/apache/sis/storage/gpx/MetadataTest.java | 8 +-
.../org/apache/sis/storage/gpx/ReaderTest.java | 85 ++-
.../org.apache.sis.storage/main/module-info.java | 6 +-
.../main/org/apache/sis/storage/DataStore.java | 4 +-
.../main/org/apache/sis/storage/Resource.java | 4 +-
.../sis/storage/aggregate/JoinFeatureSet.java | 7 +-
.../apache/sis/storage/aggregate/package-info.java | 2 +-
.../org/apache/sis/storage/esri/RasterStore.java | 13 +-
.../sis/storage/event/CascadedStoreEvent.java | 2 +-
.../apache/sis/storage/event/StoreListener.java | 6 +-
.../apache/sis/storage/event/StoreListeners.java | 16 +-
.../sis/storage/metadata/MetadataBuilder.java | 2 +-
.../sis/storage/tiling/ArtificiallyTiledImage.java | 261 ++++++++
.../apache/sis/storage/tiling/ImageTileMatrix.java | 2 +-
.../apache/sis/storage/tiling/TileReadEvent.java | 63 +-
.../sis/storage/tiling/TiledDeferredImage.java | 2 +-
.../sis/storage/tiling/TiledGridCoverage.java | 10 +-
.../storage/tiling/TiledGridCoverageResource.java | 547 +++++++++++++---
.../org/apache/sis/storage/DataStoreTestCase.java | 4 +-
.../sis/storage/event/StoreListenersTest.java | 6 +-
.../src/org.apache.sis.util/main/module-info.java | 2 +
.../main/org/apache/sis/math/Statistics.java | 3 +
.../main/org/apache/sis/util/Classes.java | 9 +-
.../sis/util/collection/WeakValueHashMap.java | 4 +-
.../apache/sis/util/internal/shared/Numerics.java | 2 +-
.../main/org/apache/sis/util/resources/Errors.java | 5 +
.../apache/sis/util/resources/Errors.properties | 1 +
.../apache/sis/util/resources/Errors_fr.properties | 1 +
.../sis/util/resources/IndexedResourceBundle.java | 14 +-
.../org/apache/sis/util/resources/Messages.java | 5 +
.../apache/sis/util/resources/Messages.properties | 1 +
.../sis/util/resources/Messages_fr.properties | 3 +-
.../org/apache/sis/util/resources/Vocabulary.java | 25 +-
.../sis/util/resources/Vocabulary.properties | 5 +-
.../sis/util/resources/Vocabulary_fr.properties | 7 +-
.../apache/sis/util/collection/RangeSetTest.java | 4 +-
incubator/build.gradle.kts | 33 +-
.../org.apache.sis.geometries.processor.Processor | 28 -
.../org.apache.sis.geometry/main/module-info.java | 30 +-
.../org/apache/sis/geometries/BoundaryType.java | 3 +-
.../sis/geometries/ParametricCurveSurface.java | 4 -
.../main/org/apache/sis/geometries/Polygon.java | 3 +-
.../main/org/apache/sis/geometries/Sphere.java | 18 +
.../geometries/csg/ConstructiveSolidGeometry.java | 39 +-
.../sis/geometries/ellipsoidal}/package-info.java | 6 +-
.../sis/geometries/math/ArrayFactoryHAT.java | 255 ++++++++
.../org/apache/sis/geometries/math/Vector3D.java | 29 +
.../geometries/operation/GeometryOperations.java | 33 +-
.../geometries/polyhedron/AbstractPolyhedron.java | 189 ++++++
.../sis/geometries/polyhedron/Dodecahedron.java | 90 +++
.../sis/geometries/polyhedron/Hexahedron.java | 68 ++
.../sis/geometries/polyhedron/Icosahedron.java | 90 +++
.../sis/geometries/polyhedron/Octahedron.java | 68 ++
.../polyhedron/RhombicTriacontahedron.java | 127 ++++
.../sis/geometries/polyhedron/Tetrahedron.java | 62 ++
.../polyhedron/TruncatedIcosahedron.java | 176 ++++++
.../{scene => polyhedron}/package-info.java | 17 +-
.../org/apache/sis/geometries/scene/Material.java | 628 ------------------
.../sis/geometries/spherical/GreatCircleArc.java | 79 +++
.../spherical/SphericalConvexPolygon.java | 85 +++
.../geometries/spherical/SphericalTriangle.java | 183 ++++++
.../sis/geometries/spherical}/package-info.java | 6 +-
.../org/apache/sis/geometries/spirals/Spiral.java | 2 +-
.../geometries/splinesurfaces/BSplineSurface.java | 1 -
.../sis/{geometries => }/scene/Animation.java | 2 +-
.../{geometries => }/scene/AnimationSampler.java | 2 +-
.../apache/sis/{geometries => }/scene/Camera.java | 2 +-
.../apache/sis/{geometries => }/scene/Model.java | 3 +-
.../sis/{geometries => }/scene/MorphTarget.java | 2 +-
.../apache/sis/{geometries => }/scene/Sampler.java | 2 +-
.../sis/{geometries => }/scene/SceneNode.java | 31 +-
.../main/org/apache/sis/scene/SceneUtilities.java} | 30 +-
.../apache/sis/{geometries => }/scene/Skin.java | 2 +-
.../apache/sis/{geometries => }/scene/Surface.java | 6 +-
.../apache/sis/{geometries => }/scene/Texture.java | 2 +-
.../org/apache/sis/scene/light/Directional.java | 107 ++++
.../main/org/apache/sis/scene/light/HDRI.java | 128 ++++
.../main/org/apache/sis/scene/light/Light.java | 77 +++
.../main/org/apache/sis/scene/light/Point.java | 131 ++++
.../main/org/apache/sis/scene/light/Quad.java | 157 +++++
.../main/org/apache/sis/scene/light/Ring.java | 172 +++++
.../main/org/apache/sis/scene/light/Spot.java | 154 +++++
.../org/apache/sis/scene/material/BlinnPhong.java | 198 ++++++
.../org/apache/sis/scene/material/Material.java | 209 ++++++
.../main/org/apache/sis/scene/material/PBR.java | 342 ++++++++++
.../main/org/apache/sis/scene/material/PBRSG.java | 203 ++++++
.../sis/{geometries => }/scene/package-info.java | 2 +-
.../{geometries => }/scene/physics/Collider.java | 2 +-
.../scene/physics/ColliderGeometry.java | 2 +-
.../scene/physics/CollisionFilter.java | 2 +-
.../sis/{geometries => }/scene/physics/Joint.java | 4 +-
.../sis/{geometries => }/scene/physics/Motion.java | 2 +-
.../scene/physics/PhysicalMaterial.java | 2 +-
.../{geometries => }/scene/physics/Trigger.java | 4 +-
.../scene/physics/package-info.java | 2 +-
.../apache/sis/geometries/math/Vector3DTest.java | 108 ++++
.../geometries/spherical/GreatCircleArcTest.java | 62 ++
.../spherical/SphericalConvexPolygonTest.java | 89 +++
.../spherical/SphericalTriangleTest.java | 145 +++++
.../org/apache/sis/scene/SceneUtilitiesTest.java | 62 ++
...g.dggs.DiscreteGlobalGridReferenceSystemFactory | 1 +
.../main/module-info.java | 41 ++
.../sis/referencing/dggs/DiscreteGlobalGrid.java | 139 ++++
.../dggs/DiscreteGlobalGridHierarchy.java | 135 ++++
.../dggs/DiscreteGlobalGridReferenceSystem.java | 157 +++++
.../DiscreteGlobalGridReferenceSystemFactory.java | 56 ++
.../dggs/DiscreteGlobalGridReferenceSystems.java | 221 +++++++
.../referencing/dggs/DiscreteGlobalGridSystem.java | 87 +++
.../sis/referencing/dggs/GridConstraints.java | 124 ++++
.../referencing/dggs/PolyhedronOrientation.java | 56 ++
.../referencing/dggs/PolyhedronParameters.java} | 24 +-
.../sis/referencing/dggs/RefinementLevel.java | 98 +++
.../sis/referencing/dggs/RefinementStrategy.java | 133 ++++
.../apache/sis/referencing/dggs/SubZoneOrder.java | 114 ++++
.../sis/referencing/dggs/ZonalReferenceSystem.java | 47 ++
.../main/org/apache/sis/referencing/dggs/Zone.java | 230 +++++++
.../shared/AbstractDiscreteGlobalGrid.java | 132 ++++
.../AbstractDiscreteGlobalGridHierarchy.java | 57 ++
.../shared/AbstractDiscreteGlobalGridSystem.java | 55 ++
.../dggs/internal/shared/AbstractZone.java | 145 +++++
.../dggs/internal/shared/AuthalicSphere.java | 134 ++++
.../shared/DefaultZonalReferenceSystem.java} | 35 +-
.../apache/sis/referencing/dggs/package-info.java | 35 +
.../apache/sis/referencing/dggs/s2/S2Coder.java | 83 +++
.../org/apache/sis/referencing/dggs/s2/S2Dgg.java | 138 ++++
.../org/apache/sis/referencing/dggs/s2/S2Dggh.java | 95 +++
.../apache/sis/referencing/dggs/s2/S2Dggrs.java | 131 ++++
.../org/apache/sis/referencing/dggs/s2/S2Dggs.java | 85 +++
.../apache/sis/referencing/dggs/s2/S2Factory.java | 55 ++
.../org/apache/sis/referencing/dggs/s2/S2Zone.java | 154 +++++
.../main/org/apache/sis/referencing/rs/Code.java | 197 ++++++
.../apache/sis/referencing/rs/CodeOperation.java | 104 +++
.../org/apache/sis/referencing/rs/CompoundRS.java | 207 ++++++
.../sis/referencing/rs/ReferenceSystems.java | 264 ++++++++
.../rs/internal/shared/CodeOperations.java | 518 +++++++++++++++
.../apache/sis/referencing/rs}/package-info.java | 7 +-
.../sis/storage/coverage/BandedCoverageExt.java} | 32 +-
.../storage/coverage/BandedCoverageResource.java | 226 +++++++
.../sis/storage/coverage/CoverageUtilities.java | 65 ++
.../apache/sis/storage/coverage/FeatureExt.java | 241 +++++++
.../dggs/DiscreteGlobalGridCoverageProcessor.java | 702 +++++++++++++++++++++
.../storage/dggs/DiscreteGlobalGridGeometry.java | 400 ++++++++++++
.../storage/dggs/DiscreteGlobalGridResource.java | 128 ++++
.../storage/dggs/DiscreteGlobalGridSystems.java | 325 ++++++++++
.../storage/dggs/DiscreteGlobalGridTransform.java | 411 ++++++++++++
.../shared/AbstractDiscreteGlobalGridCoverage.java | 164 +++++
.../shared/ArrayDiscreteGlobalGridCoverage.java | 171 +++++
...ingTiledDiscreteGlobalGridCoverageResource.java | 160 +++++
.../internal/shared/ComputedZoneIndexList.java | 162 +++++
.../FeatureSetAsDiscreteGlobalGridResource.java | 181 ++++++
.../shared/GridAsDiscreteGlobalGridResource.java | 140 ++++
.../shared/IndexedDiscreteGlobalGridCoverage.java | 266 ++++++++
.../shared/MemoryDiscreteGlobalGridResource.java | 73 +++
.../shared/RasterDiscreteGlobalGridCoverage.java | 172 +++++
.../shared/TiledDiscreteGlobalGridCoverage.java | 315 +++++++++
.../TiledDiscreteGlobalGridCoverageResource.java | 120 ++++
...leTiledDiscreteGlobalGridCoverageResource.java} | 15 +-
.../sis/storage/image/internal/ImageBuilder.java | 226 +++++++
.../sis/storage/image/internal/MergeOperator.java} | 7 +-
.../org/apache/sis/storage/rs/CodeIterator.java | 125 ++++
.../org/apache/sis/storage/rs/CodeTransform.java} | 17 +-
.../org/apache/sis/storage/rs/CodedCoverage.java | 204 ++++++
.../org/apache/sis/storage/rs/CodedCoverages.java | 60 ++
.../org/apache/sis/storage/rs/CodedGeometry.java | 384 +++++++++++
.../org/apache/sis/storage/rs/CodedResource.java | 177 ++++++
.../sis/storage/rs/CompoundCodedGeometry.java | 103 +++
.../sis/storage/rs/WritableCodeIterator.java | 91 +++
.../rs/internal/shared/AbstractCodedCoverage.java | 397 ++++++++++++
.../rs/internal/shared/AddDimCodedCoverage.java | 201 ++++++
.../rs/internal/shared/AddDimCodedResource.java | 108 ++++
.../rs/internal/shared/ArrayCodedCoverage.java | 203 ++++++
.../storage/rs/internal/shared/CodeTransforms.java | 458 ++++++++++++++
.../internal/shared/CodedCoverageAsFeatureSet.java | 282 +++++++++
.../rs/internal/shared/CompoundCodedCoverage.java | 118 ++++
.../rs/internal/shared/CompoundCodedResource.java | 254 ++++++++
.../rs/internal/shared/GridAsCodedResource.java | 306 +++++++++
.../rs/internal/shared/MemoryCodedResource.java | 65 ++
.../rs/internal/shared/ResampledCodedCoverage.java | 159 +++++
.../storage/rs/internal/shared/SubTransform.java | 47 ++
.../sis/storage/rs/internal/shared/s2/Factory.java | 323 ++++++++++
.../sis/storage/rs/internal/shared/s2/S2.java | 268 ++++++++
.../sis/storage/rs/internal/shared/s2/Wrapper.java | 97 +++
.../sis/referencing/dggs/AbstractDggrsTest.java | 252 ++++++++
.../org/apache/sis/referencing/dggs/s2/S2Test.java | 61 ++
.../sis/referencing/rs/CodeOperationTest.java | 175 +++++
.../rs/ArrayReferencedGridCoverageTest.java | 184 ++++++
.../coveragejson/binding/CategoryEncoding.java | 82 ---
.../storage/coveragejson/binding/Dictionary.java | 73 ---
.../sis/storage/coveragejson/binding/I18N.java | 125 ----
.../storage/coveragejson/binding/Parameters.java | 78 ---
.../sis/storage/coveragejson/binding/Ranges.java | 74 ---
.../org.apache.sis.storage.DataStoreProvider | 0
.../main/module-info.java | 27 +-
.../storage/coveragejson/CoverageJsonStore.java | 17 +-
.../coveragejson/CoverageJsonStoreProvider.java | 0
.../sis/storage/coveragejson/CoverageResource.java | 18 +-
.../sis/storage/coveragejson/binding/Axe.java | 9 +-
.../sis/storage/coveragejson/binding/Axes.java | 16 +-
.../sis/storage/coveragejson/binding/Category.java | 10 +-
.../coveragejson/binding/CategoryEncoding.java} | 16 +-
.../sis/storage/coveragejson/binding/Coverage.java | 47 +-
.../coveragejson/binding/CoverageCollection.java | 10 +-
.../coveragejson/binding/CoverageJsonObject.java | 37 +-
.../sis/storage/coveragejson/binding/Domain.java | 7 +-
.../coveragejson/binding/GeographicCRS.java | 7 +-
.../sis/storage/coveragejson/binding/I18N.java | 77 +++
.../storage/coveragejson/binding/IdentifierRS.java | 10 +-
.../sis/storage/coveragejson/binding/NdArray.java | 7 +-
.../coveragejson/binding/ObservedProperty.java | 9 +-
.../storage/coveragejson/binding/Parameter.java | 7 +-
.../coveragejson/binding/ParameterGroup.java | 7 +-
.../storage/coveragejson/binding/ProjectedCRS.java | 7 +-
.../binding/ReferenceSystemConnection.java | 9 +-
.../sis/storage/coveragejson/binding/Symbol.java | 9 +-
.../coveragejson/binding/TargetConcept.java | 9 +-
.../storage/coveragejson/binding/TemporalRS.java | 7 +-
.../sis/storage/coveragejson/binding/TileSet.java | 9 +-
.../storage/coveragejson/binding/TiledNdArray.java | 9 +-
.../sis/storage/coveragejson/binding/Unit.java | 9 +-
.../storage/coveragejson/binding/VerticalCRS.java | 7 +-
.../storage/coveragejson/binding/package-info.java | 0
.../sis/storage/coveragejson/package-info.java | 0
.../org/apache/sis/storage/geojson/GeoJSON.java | 165 +++++
.../apache/sis/storage/geojson/GeoJSONMapper.java | 481 ++++++++++++++
.../storage/geojson/binding/GeoJSONFeature.java | 318 ++++++++++
.../geojson/binding/GeoJSONFeatureCollection.java | 322 ++++++++++
.../storage/geojson/binding/GeoJSONGeometry.java | 134 ++++
.../geojson/binding/GeoJSONGeometryCollection.java | 84 +++
.../storage/geojson/binding/GeoJSONLineString.java | 85 +++
.../geojson/binding/GeoJSONMultiLineString.java | 85 +++
.../storage/geojson/binding/GeoJSONMultiPoint.java | 85 +++
.../geojson/binding/GeoJSONMultiPolygon.java | 85 +++
.../sis/storage/geojson/binding/GeoJSONObject.java | 104 +++
.../sis/storage/geojson/binding/GeoJSONPoint.java | 88 +++
.../storage/geojson/binding/GeoJSONPolygon.java | 85 +++
.../geojson/binding/JSONFGCircularString.java | 88 +++
.../geojson/binding/JSONFGCompoundCurve.java | 88 +++
.../storage/geojson/binding/JSONFGCoordRefSys.java | 131 ++++
.../geojson/binding/JSONFGCurvePolygon.java | 89 +++
.../storage/geojson/binding/JSONFGMeasures.java | 123 ++++
.../storage/geojson/binding/JSONFGMultiCurve.java | 89 +++
.../geojson/binding/JSONFGMultiPolyhedron.java | 85 +++
.../storage/geojson/binding/JSONFGMultiPrism.java | 85 +++
.../geojson/binding/JSONFGMultiSurface.java | 88 +++
.../storage/geojson/binding/JSONFGPolyhedron.java | 86 +++
.../sis/storage/geojson/binding/JSONFGPrism.java | 127 ++++
.../sis/storage/geojson/binding/JSONFGTime.java | 124 ++++
.../sis/storage/geojson/binding}/package-info.java | 12 +-
.../sis/storage/json/DataTransferObject.java | 100 +++
.../movingfeature/binding/MFCoordRefSys.java | 110 ++++
.../movingfeature/binding/MFMovingFeature.java | 277 ++++++++
.../binding/MFMovingFeatureCollection.java | 270 ++++++++
.../binding/MFMovingGeometryBase.java | 101 +++
.../binding/MFMovingGeometryCollection.java | 93 +++
.../movingfeature/binding/MFMovingLineString.java | 87 +++
.../movingfeature/binding/MFMovingPoint.java | 86 +++
.../movingfeature/binding/MFMovingPointCloud.java | 89 +++
.../movingfeature/binding/MFMovingPolygon.java | 88 +++
.../movingfeature/binding/MFOrientation.java | 103 +++
.../movingfeature/binding/MFTemporalGeometry.java | 128 ++++
.../binding/MFTemporalPrimitiveGeometry.java | 152 +++++
.../binding/MFTemporalPropertyGroup.java | 94 +++
.../binding/MFTemporalPropertyValue.java | 186 ++++++
.../movingfeature/binding}/package-info.java | 11 +-
.../main/org/apache/sis/storage/ogcjson/Link.java | 280 ++++++++
.../apache/sis/storage/ogcjson}/package-info.java | 6 +-
.../coveragejson/CoverageJsonStoreTest.java | 0
.../storage/coveragejson/binding/BindingTest.java | 69 +-
.../sis/storage/coveragejson/binding/LICENSE.md | 0
.../storage/coveragejson/binding/axe_bounds.json | 0
.../storage/coveragejson/binding/axe_polygon.json | 0
.../storage/coveragejson/binding/axe_regular.json | 0
.../storage/coveragejson/binding/axe_tuples.json | 0
.../binding/coverage_vertical_profile.json | 0
.../binding/coverage_vertical_profile_nocs.json | 0
.../coveragejson/binding/coveragecollection.json | 0
.../storage/coveragejson/binding/domain_grid.json | 0
.../coveragejson/binding/domain_trajectory.json | 0
.../coveragejson/binding/domaintype_grid.json | 0
.../binding/domaintype_multipoint.json | 0
.../binding/domaintype_multipointseries.json | 0
.../binding/domaintype_multipolygon.json | 0
.../binding/domaintype_multipolygonseries.json | 0
.../coveragejson/binding/domaintype_point.json | 0
.../binding/domaintype_pointseries.json | 0
.../coveragejson/binding/domaintype_polygon.json | 0
.../binding/domaintype_polygonseries.json | 0
.../coveragejson/binding/domaintype_section.json | 0
.../binding/domaintype_trajectory.json | 0
.../binding/domaintype_vertical_profile.json | 0
.../binding/geographiccrs_longlat.json | 0
.../binding/geographiccrs_longlatheight.json | 0
.../sis/storage/coveragejson/binding/ndarray.json | 0
.../binding/parameter_categoricaldata.json | 0
.../binding/parameter_continuousdata.json | 0
.../binding/parametergroup_uncertainty.json | 0
.../binding/parametergroup_vectorquantity.json | 0
.../binding/projectedcrs_britishnationalgrid.json | 0
.../binding/reference_system_connection.json | 0
.../storage/coveragejson/binding/temporalrs.json | 0
.../storage/coveragejson/binding/tiledndarray.json | 0
.../coveragejson/binding/verticalcrs_navd88.json | 0
.../sis/storage/coveragejson/coverage_xyzt.json | 0
.../sis/storage/geojson/binding/BindingTest.java} | 13 +-
.../storage/geojson/binding/geojson_feature.json | 10 +
.../geojson/binding/geojson_featurecollection.json | 48 ++
.../binding/geojson_geometrycollection.json | 13 +
.../geojson/binding/geojson_linestring.json | 7 +
.../geojson/binding/geojson_multilinestring.json | 13 +
.../geojson/binding/geojson_multipoint.json | 7 +
.../geojson/binding/geojson_multipolygon.json | 30 +
.../sis/storage/geojson/binding/geojson_point.json | 4 +
.../storage/geojson/binding/geojson_polygon.json | 12 +
.../binding/jsonfg_circularstring_measures.json | 13 +
.../binding/jsonfg_circularstring_no_measures.json | 8 +
.../binding/jsonfg_compoundcurve_measures.json | 25 +
.../binding/jsonfg_compoundcurve_no_measures.json | 20 +
.../geojson/binding/jsonfg_coordrefsys.json | 18 +
.../binding/jsonfg_curvepolygon_measures.json | 20 +
.../binding/jsonfg_curvepolygon_no_measures.json | 15 +
.../storage/geojson/binding/jsonfg_feature.json | 49 ++
.../jsonfg_geometrycollection_measures.json | 21 +
.../jsonfg_geometrycollection_no_measures.json | 16 +
.../binding/jsonfg_linestring_measures.json | 12 +
.../binding/jsonfg_linestring_no_measures.json | 7 +
.../binding/jsonfg_multicurve_measures.json | 25 +
.../binding/jsonfg_multicurve_no_measures.json | 20 +
.../binding/jsonfg_multilinestring_measures.json | 18 +
.../jsonfg_multilinestring_no_measures.json | 13 +
.../binding/jsonfg_multipoint_measures.json | 12 +
.../binding/jsonfg_multipoint_no_measures.json | 7 +
.../binding/jsonfg_multipolygon_measures.json | 35 +
.../binding/jsonfg_multipolygon_no_measures.json | 30 +
.../binding/jsonfg_multipolyhedron_measures.json | 23 +
.../jsonfg_multipolyhedron_no_measures.json | 18 +
.../binding/jsonfg_multiprism_measures.json | 27 +
.../binding/jsonfg_multiprism_no_measures.json | 22 +
.../binding/jsonfg_multisurface_measures.json | 37 ++
.../binding/jsonfg_multisurface_no_measures.json | 32 +
.../geojson/binding/jsonfg_point_measures.json | 9 +
.../geojson/binding/jsonfg_point_no_measures.json | 4 +
.../geojson/binding/jsonfg_polygon_measures.json | 17 +
.../binding/jsonfg_polygon_no_measures.json | 12 +
.../binding/jsonfg_polyhedron_measures.json | 21 +
.../binding/jsonfg_polyhedron_no_measures.json | 16 +
.../geojson/binding/jsonfg_prism_measures.json | 22 +
.../geojson/binding/jsonfg_prism_no_measures.json | 17 +
.../storage/geojson/binding/jsonfg_time_date.json | 15 +
.../geojson/binding/jsonfg_time_interval.json | 18 +
.../binding/jsonfg_time_interval_open_end.json | 18 +
.../binding/jsonfg_time_interval_open_start.json | 18 +
.../geojson/binding/jsonfg_time_timestamp.json | 15 +
.../sis/storage/json/AbstractBindingTest.java | 76 +++
.../movingfeature/binding/BindingTest.java} | 13 +-
netbeans-project/ivy.xml | 6 +
netbeans-project/nbproject/project.properties | 2 +-
.../apache/sis/gui/coverage/CoverageCanvas.java | 211 ++-----
.../apache/sis/gui/coverage/CoverageControls.java | 2 +-
.../apache/sis/gui/coverage/CoverageExplorer.java | 2 +-
.../org/apache/sis/gui/coverage/GridControls.java | 2 +-
.../main/org/apache/sis/gui/coverage/GridView.java | 2 +-
.../apache/sis/gui/coverage/RectangleMerger.java | 111 ++++
.../sis/gui/coverage/StyledRenderingData.java | 5 +
.../apache/sis/gui/coverage/TileReadListener.java | 327 ++++++++++
.../org/apache/sis/gui/dataset/WindowHandler.java | 2 +-
.../org/apache/sis/gui/internal/LogHandler.java | 2 +-
.../apache/sis/gui/internal/ShapeConverter.java | 5 +-
.../org/apache/sis/gui/map/EvanescentPane.java | 1 +
.../main/org/apache/sis/gui/map/MapCanvas.java | 40 +-
.../main/org/apache/sis/gui/map/MultiCanvas.java | 2 +-
.../org/apache/sis/gui/map/ValuesFormatter.java | 7 +-
.../org/apache/sis/gui/map/ValuesUnderCursor.java | 2 +-
.../org/apache/sis/storage/gdal/TiledResource.java | 16 +-
settings.gradle.kts | 1 +
471 files changed, 28807 insertions(+), 2775 deletions(-)
diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/SubOperationInfo.java
index 965cc63358,764ba76372..c692d2cbca
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/SubOperationInfo.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/SubOperationInfo.java
@@@ -31,7 -31,13 +31,10 @@@ import org.apache.sis.referencing.inter
import org.apache.sis.referencing.operation.matrix.Matrices;
import org.apache.sis.referencing.operation.matrix.MatrixSIS;
import org.apache.sis.referencing.operation.transform.MathTransforms;
+ import org.apache.sis.measure.NumberRange;
+ import org.apache.sis.util.Classes;
+ import org.apache.sis.util.internal.shared.Strings;
-// Specific to the geoapi-4.0 branch:
-import org.apache.sis.referencing.legacy.DefaultImageCRS;
-
/**
* Information about the operation from a source component to a target component in {@code CompoundCRS} instances.
diff --cc incubator/src/org.apache.sis.referencing.dggs/main/org/apache/sis/referencing/rs/CompoundRS.java
index 0000000000,7e8b8b26ee..c467a7e6f7
mode 000000,100644..100644
--- a/incubator/src/org.apache.sis.referencing.dggs/main/org/apache/sis/referencing/rs/CompoundRS.java
+++ b/incubator/src/org.apache.sis.referencing.dggs/main/org/apache/sis/referencing/rs/CompoundRS.java
@@@ -1,0 -1,207 +1,207 @@@
+ /*
+ * 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.sis.referencing.rs;
+
+ import java.util.List;
+ import java.util.ArrayList;
+ import java.util.LinkedList;
+ import java.util.Collections;
+ import java.util.Objects;
-import org.apache.sis.metadata.iso.DefaultIdentifier;
++import org.apache.sis.referencing.NamedIdentifier;
+ import org.apache.sis.referencing.CRS;
+ import org.apache.sis.referencing.CommonCRS;
+ import org.apache.sis.referencing.gazetteer.ReferencingByIdentifiers;
+ import org.apache.sis.referencing.dggs.DiscreteGlobalGridReferenceSystem;
-import org.opengis.metadata.Identifier;
++import org.opengis.referencing.ReferenceIdentifier;
+ import org.opengis.referencing.ReferenceSystem;
+ import org.opengis.referencing.crs.CompoundCRS;
+ import org.opengis.referencing.crs.CoordinateReferenceSystem;
+ import org.opengis.referencing.crs.SingleCRS;
+ import org.opengis.util.FactoryException;
+
+
+ /**
+ * A <abbr>RS</abbr> describing the position of points through two or more independent <abbr>RS</abbr>s.
+ * Two <abbr>RS</abbr>s are independent of each other if coordinate values in one cannot be converted or
+ * transformed into coordinate values in the other.
+ *
+ * <p>This interface is a generalized version of CompoundCRS.</p>
+ *
+ * @author Johann Sorel (Geomatys)
+ */
+ public final class CompoundRS implements ReferenceSystem {
+
- private final Identifier name;
++ private final ReferenceIdentifier name;
+ private final List<ReferenceSystem> rss;
+ private final CoordinateReferenceSystem leaningCrs;
+
- public CompoundRS(Identifier name, List<ReferenceSystem> rss) {
++ public CompoundRS(ReferenceIdentifier name, List<ReferenceSystem> rss) {
+ if (rss.size() < 2) {
+ throw new IllegalArgumentException("Provide at least two systems to create a CompoundRS.");
+ }
+
+ if (name == null) {
+ final StringBuilder sb = new StringBuilder("CompundLS [");
+ for (int i = 0, n = rss.size(); i < n; i++) {
+ final ReferenceSystem cdt = rss.get(i);
+ if (i != 0) sb.append(',');
+ sb.append(cdt.getName().toString());
+ }
+ sb.append(']');
- name = new DefaultIdentifier(sb.toString());
++ name = new NamedIdentifier(null, sb.toString());
+ }
+ this.name = name;
+ this.rss = Collections.unmodifiableList(rss);
+
+ final List<CoordinateReferenceSystem> crss = new ArrayList<>(rss.size()+1);
+ for (int i = 0; i < rss.size(); i++) {
+ final ReferenceSystem srs = rss.get(i);
+ if (srs instanceof CoordinateReferenceSystem crs) {
+ crss.add(crs);
+ } else if (srs instanceof DiscreteGlobalGridReferenceSystem dggrs) {
+ crss.add(dggrs.getGridSystem().getCrs());
+ } else if (srs instanceof ReferencingByIdentifiers rbi) {
+ crss.add(CommonCRS.WGS84.normalizedGeographic());
+ } else {
+ throw new UnsupportedOperationException("todo");
+ }
+ }
+ try {
+ leaningCrs = CRS.compound(crss.toArray(CoordinateReferenceSystem[]::new));
+ } catch (FactoryException ex) {
+ throw new IllegalArgumentException(ex);
+ }
+ }
+
+ /**
+ * {@inheritDoc }
+ */
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return name;
+ }
+
+ /**
+ * Returns the ordered list of <abbr>RS</abbr> components.
+ * The returned list may contain nested compound <abbr>RS</abbr>.
+ * For a list without nesting, as required by ISO 19111, see {@link #getSingleComponents()}.
+ *
+ * @return the ordered list of components of this compound <abbr>RS</abbr>.
+ */
+ public List<ReferenceSystem> getComponents() {
+ return rss;
+ }
+
+ /**
+ * Returns the ordered list of <abbr>CRS</abbr> components, none of which itself compound.
+ * If this compound <abbr>CRS</abbr> contains nested compound <abbr>CRS</abbr> components,
+ * then those components are flattened recursively in a sequence of {@link SingleCRS} objects.
+ *
+ * @return the ordered list of components of this compound <abbr>CRS</abbr>, none of which itself compound.
+ *
+ * @since 3.1
+ */
+ public List<ReferenceSystem> getSingleComponents() {
+ var singles = new ArrayList<ReferenceSystem>(5);
+ flatten(singles, new LinkedList<>()); // Linked list is cheap to construct and efficient with 0 or 1 element.
+ return Collections.unmodifiableList(singles);
+ }
+
+
+ public synchronized CoordinateReferenceSystem getLeaningCrs() {
+ return leaningCrs;
+ }
+
+ /**
+ * Appends recursively all single components in the given list.
+ *
+ * @param singles the list where to add single components.
+ * @param safety a safety against infinite recursive method calls.
+ * @throws IllegalStateException if recursive components are detected.
+ */
+ private void flatten(final List<ReferenceSystem> singles, final List<Object> safety) {
+ for (ReferenceSystem rs : getComponents()) {
+ if (rs instanceof SingleCRS) {
+ singles.add((SingleCRS) rs);
+ } else if (rs instanceof ReferencingByIdentifiers) {
+ singles.add(rs);
+ } else if (rs instanceof CompoundRS) {
+ final CompoundRS r = (CompoundRS) rs;
+ for (Object previous : safety) {
+ if (previous == this) {
+ throw new IllegalStateException("Recursive components detected.");
+ }
+ }
+ safety.add(this);
+ singles.addAll(r.getSingleComponents());
+
+ } else if (rs instanceof CompoundCRS) {
+ final CompoundCRS r = (CompoundCRS) rs;
+ //todo CompoundCRS should be a CompoundRS
+ for (Object previous : safety) {
+ if (previous == this) {
+ throw new IllegalStateException("Recursive components detected.");
+ }
+ }
+ safety.add(this);
+ singles.addAll(r.getSingleComponents());
+ } else {
+ throw new IllegalArgumentException("Unknown reference system type : " + rs.getName());
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("CompoundRS[ " + name.toString()+" ");
+ final List<ReferenceSystem> components = getComponents();
+ for (int i = 0, n = components.size(); i < n; i++) {
+ if (i > 0)sb.append(',');
+ final ReferenceSystem rs = components.get(i);
+ sb.append(rs.toString().replaceAll("\n", " \n"));
+ }
+ sb.append(']');
+ return sb.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 5;
+ hash = 23 * hash + Objects.hashCode(this.name);
+ hash = 23 * hash + Objects.hashCode(this.rss);
+ return hash;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final CompoundRS other = (CompoundRS) obj;
+ if (!Objects.equals(this.name, other.name)) {
+ return false;
+ }
+ return Objects.equals(this.rss, other.rss);
+ }
+
+ }
diff --cc incubator/src/org.apache.sis.referencing.dggs/main/org/apache/sis/referencing/rs/internal/shared/CodeOperations.java
index 0000000000,00bcba9af7..24e502c6e7
mode 000000,100644..100644
--- a/incubator/src/org.apache.sis.referencing.dggs/main/org/apache/sis/referencing/rs/internal/shared/CodeOperations.java
+++ b/incubator/src/org.apache.sis.referencing.dggs/main/org/apache/sis/referencing/rs/internal/shared/CodeOperations.java
@@@ -1,0 -1,518 +1,518 @@@
+ /*
+ * 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.sis.referencing.rs.internal.shared;
+
+ import java.util.Arrays;
+ import org.apache.sis.referencing.CRS;
+ import org.apache.sis.referencing.NamedIdentifier;
+ import org.apache.sis.referencing.gazetteer.ReferencingByIdentifiers;
+ import org.apache.sis.referencing.rs.Code;
+ import org.apache.sis.referencing.rs.CodeOperation;
+ import org.apache.sis.referencing.rs.ReferenceSystems;
+ import org.apache.sis.util.iso.Names;
+ import org.opengis.geometry.DirectPosition;
-import org.opengis.metadata.Identifier;
++import org.opengis.referencing.ReferenceIdentifier;
+ import org.opengis.referencing.ReferenceSystem;
+ import org.opengis.referencing.crs.CoordinateReferenceSystem;
+ import org.opengis.referencing.gazetteer.Location;
+ import org.opengis.referencing.operation.CoordinateOperation;
+ import org.opengis.referencing.operation.MathTransform;
+ import org.opengis.referencing.operation.NoninvertibleTransformException;
+ import org.opengis.referencing.operation.TransformException;
+ import org.opengis.util.FactoryException;
+
+ /**
+ *
+ * @author Johann Sorel (Geomatys)
+ */
+ public final class CodeOperations {
+
+ private CodeOperations(){}
+
+ public static CodeOperation identity(ReferenceSystem sourceRs, ReferenceSystem targetRs) {
+ return new Identity(sourceRs, targetRs);
+ }
+
+ public static CodeOperation RbiToCrs(ReferencingByIdentifiers.Coder coder) throws FactoryException {
+ return new RbiToCrs(coder);
+ }
+
+ public static CodeOperation CrsToRbi(ReferencingByIdentifiers.Coder coder) throws FactoryException {
+ return new CrsToRbi(coder);
+ }
+
+ public static CodeOperation CrsToCrs(CoordinateOperation op) throws FactoryException {
+ return new CrsToCrs(op);
+ }
+
+ public static CodeOperation concatenate(CodeOperation op1, CodeOperation op2) throws FactoryException {
+ if (op1 instanceof Identity) return op2;
+ if (op2 instanceof Identity) return op1;
+ return new Concatenate(op1, op2);
+ }
+
+ public static CodeOperation concatenate(CodeOperation... ops) throws FactoryException {
+ if (ops.length == 1) return ops[0];
+ CodeOperation cop = concatenate(ops[0], ops[1]);
+ for (int i = 2; i < ops.length; i++) {
+ cop = concatenate(cop, ops[i]);
+ }
+ return cop;
+ }
+
+ public static CodeOperation compound(CodeOperation op1, CodeOperation op2) throws FactoryException {
+ return new Compound(op1, op2, null, null);
+ }
+
+ public static CodeOperation compound(CodeOperation... ops) throws FactoryException {
+ if (ops.length == 1) return ops[0];
+ CodeOperation cop = compound(ops[0], ops[1]);
+ for (int i = 2; i < ops.length; i++) {
+ cop = compound(cop, ops[i], null, null);
+ }
+ return cop;
+ }
+
+ public static CodeOperation reorder(ReferenceSystem sourceRs, ReferenceSystem targetRs, int[] targetMapping) {
+ return new Reorder(sourceRs, targetRs, targetMapping);
+ }
+
+ public static final class Identity implements CodeOperation {
+
+ private final ReferenceSystem sourceRs;
+ private final ReferenceSystem targetRs;
+
+ public Identity(ReferenceSystem sourceRs, ReferenceSystem targetRs) {
+ this.sourceRs = sourceRs;
+ this.targetRs = targetRs;
+ }
+
+ @Override
+ public ReferenceSystem getSourceRS() {
+ return sourceRs;
+ }
+
+ @Override
+ public ReferenceSystem getTargetRS() {
+ return targetRs;
+ }
+
+ @Override
+ public CodeOperation inverse() throws NoninvertibleTransformException {
+ return new Identity(targetRs, sourceRs);
+ }
+
+ @Override
+ public Code transform(Code source, Code target) throws TransformException {
+ if (target == null) return new Code(targetRs, source.getOrdinates());
+ target.setOrdinates(source.getOrdinates());
+ return target;
+ }
+
+ @Override
+ public void transform(Code[] source, int soffset, Code[] target, int toffset, int nb) throws TransformException {
+ for (int i = 0; i < nb; i++) {
+ target[toffset+i] = transform(source[soffset+i], target[toffset+i]);
+ }
+ }
+
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return new NamedIdentifier(Names.createLocalName(null, null, "Identity"));
+ }
+
+ @Override
+ public String toString() {
+ return "Identity";
+ }
+
+ }
+
+ public static final class Reorder implements CodeOperation {
+
+ private final ReferenceSystem sourceRs;
+ private final ReferenceSystem targetRs;
+ private final int[] targetMapping;
+
+ public Reorder(ReferenceSystem sourceRs, ReferenceSystem targetRs, int[] targetMapping) {
+ this.sourceRs = sourceRs;
+ this.targetRs = targetRs;
+ this.targetMapping = targetMapping;
+ }
+
+ @Override
+ public ReferenceSystem getSourceRS() {
+ return sourceRs;
+ }
+
+ @Override
+ public ReferenceSystem getTargetRS() {
+ return targetRs;
+ }
+
+ public int[] getTargetMapping() {
+ return targetMapping.clone();
+ }
+
+ @Override
+ public CodeOperation inverse() throws NoninvertibleTransformException {
+ if (targetMapping.length != ReferenceSystems.getDimension(sourceRs)) {
+ throw new NoninvertibleTransformException();
+ }
+ final int[] inv = new int[targetMapping.length];
+ for (int i = 0; i < targetMapping.length; i++) {
+ inv[targetMapping[i]] = i;
+ }
+ return new Reorder(targetRs, sourceRs, inv);
+ }
+
+ @Override
+ public Code transform(Code source, Code target) throws TransformException {
+ if (target == null) return new Code(targetRs);
+ target.setOrdinates(source.getOrdinates());
+ return target;
+ }
+
+ @Override
+ public void transform(Code[] source, int soffset, Code[] target, int toffset, int nb) throws TransformException {
+ for (int i = 0; i < nb; i++) {
+ target[toffset+i] = transform(source[soffset+i], target[toffset+i]);
+ }
+ }
+
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return new NamedIdentifier(Names.createLocalName(null, null, "Reorder"));
+ }
+
+ @Override
+ public String toString() {
+ return "Reorder \n targetMapping : "+ Arrays.toString(targetMapping);
+ }
+ }
+
+ public static final class RbiToCrs implements CodeOperation {
+
+ private final ReferencingByIdentifiers.Coder coder;
+ private final CoordinateReferenceSystem leaningCrs;
+
+ public RbiToCrs(ReferencingByIdentifiers.Coder coder, CoordinateReferenceSystem leaningCrs) {
+ this.coder = coder;
+ this.leaningCrs = leaningCrs;
+ }
+
+ public RbiToCrs(ReferencingByIdentifiers.Coder coder) throws FactoryException {
+ this(coder, ReferenceSystems.getLeaningCRS(coder.getReferenceSystem()));
+ }
+
+ @Override
+ public ReferenceSystem getSourceRS() {
+ return coder.getReferenceSystem();
+ }
+
+ @Override
+ public ReferenceSystem getTargetRS() {
+ return leaningCrs;
+ }
+
+ @Override
+ public CodeOperation inverse() throws NoninvertibleTransformException {
+ return new CrsToRbi(leaningCrs, coder);
+ }
+
+ @Override
+ public Code transform(Code source, Code target) throws TransformException {
+ final Location location = coder.decode((CharSequence) source.getOrdinate(0));
+ if (target == null) target = new Code(leaningCrs, new Object[1]);
+ target.setOrdinate(0, location.getPosition());
+ return target;
+ }
+
+ @Override
+ public void transform(Code[] source, int soffset, Code[] target, int toffset, int nb) throws TransformException {
+ for (int i = 0; i < nb; i++) {
+ target[toffset+i] = transform(source[soffset+i], target[toffset+i]);
+ }
+ }
+
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return new NamedIdentifier(Names.createLocalName(null, null, getSourceRS().getName().getCode() + " to " + leaningCrs.getName().toString()));
+ }
+
+ @Override
+ public String toString() {
+ return "ReferenceByIdentifiers to leaning CRS"
+ + "\n Source : " + getSourceRS().toString().replaceAll("\n", "\n ")
+ + "\n Target : " + getTargetRS().toString().replaceAll("\n", "\n ");
+ }
+ }
+
+ public static final class CrsToCrs implements CodeOperation {
+
+ private final CoordinateOperation op;
+ private final MathTransform transform;
+
+ public CrsToCrs(CoordinateOperation op) {
+ this.op = op;
+ transform = op.getMathTransform();
+ }
+
+ @Override
+ public ReferenceSystem getSourceRS() {
+ return op.getSourceCRS();
+ }
+
+ @Override
+ public ReferenceSystem getTargetRS() {
+ return op.getTargetCRS();
+ }
+
+ @Override
+ public CodeOperation inverse() throws NoninvertibleTransformException {
+ try {
+ return new CrsToCrs(CRS.findOperation(op.getTargetCRS(), op.getSourceCRS(), null));
+ } catch (FactoryException ex) {
+ throw new NoninvertibleTransformException(ex);
+ }
+ }
+
+ @Override
+ public Code transform(Code source, Code target) throws TransformException {
+ final DirectPosition dp = transform.transform((DirectPosition) source.getOrdinate(0), null);
+ if (target == null) target = new Code(getTargetRS(), new Object[1]);
+ target.setOrdinate(0, dp);
+ return target;
+ }
+
+ @Override
+ public void transform(Code[] source, int soffset, Code[] target, int toffset, int nb) throws TransformException {
+ for (int i = 0; i < nb; i++) {
+ target[toffset+i] = transform(source[soffset+i], target[toffset+i]);
+ }
+ }
+
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return new NamedIdentifier(Names.createLocalName(null, null, getSourceRS().getName().toString() + " to " + getTargetRS().getName().getCode()));
+ }
+
+ @Override
+ public String toString() {
+ return "Crs to CRS"
+ + "\n Source : " + getSourceRS().toString().replaceAll("\n", "\n ")
+ + "\n Target : " + getTargetRS().toString().replaceAll("\n", "\n ");
+ }
+ }
+
+ public static final class CrsToRbi implements CodeOperation {
+
+ private final ReferencingByIdentifiers.Coder coder;
+ private final CoordinateReferenceSystem leaningCrs;
+
+ public CrsToRbi(ReferencingByIdentifiers.Coder coder) throws FactoryException {
+ this(ReferenceSystems.getLeaningCRS(coder.getReferenceSystem()), coder);
+ }
+
+ public CrsToRbi(CoordinateReferenceSystem leaningCrs, ReferencingByIdentifiers.Coder coder) {
+ this.leaningCrs = leaningCrs;
+ this.coder = coder;
+ }
+
+ @Override
+ public ReferenceSystem getSourceRS() {
+ return leaningCrs;
+ }
+
+ @Override
+ public ReferenceSystem getTargetRS() {
+ return coder.getReferenceSystem();
+ }
+
+ @Override
+ public CodeOperation inverse() throws NoninvertibleTransformException {
+ return new RbiToCrs(coder, leaningCrs);
+ }
+
+ @Override
+ public Code transform(Code source, Code target) throws TransformException {
+ final String code = coder.encode((DirectPosition) source.getOrdinate(0));
+ if (target == null) target = new Code(coder.getReferenceSystem(), new Object[1]);
+ target.setOrdinate(0, code);
+ return target;
+ }
+
+ @Override
+ public void transform(Code[] source, int soffset, Code[] target, int toffset, int nb) throws TransformException {
+ for (int i = 0; i < nb; i++) {
+ target[toffset+i] = transform(source[soffset+i], target[toffset+i]);
+ }
+ }
+
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return new NamedIdentifier(Names.createLocalName(null, null, leaningCrs.getName().toString() + " to " + getTargetRS().getName().getCode()));
+ }
+
+ @Override
+ public String toString() {
+ return "Leaning CRS to ReferenceByIdentifiers "
+ + "\n Source : " + getSourceRS().toString().replaceAll("\n", "\n ")
+ + "\n Target : " + getTargetRS().toString().replaceAll("\n", "\n ");
+ }
+ }
+
+ public static final class Concatenate implements CodeOperation {
+
+ private final CodeOperation op1;
+ private final CodeOperation op2;
+
+ public Concatenate(CodeOperation op1, CodeOperation op2) {
+ this.op1 = op1;
+ this.op2 = op2;
+ }
+
+ @Override
+ public ReferenceSystem getSourceRS() {
+ return op1.getSourceRS();
+ }
+
+ @Override
+ public ReferenceSystem getTargetRS() {
+ return op2.getTargetRS();
+ }
+
+ public CodeOperation getOperation1() {
+ return op1;
+ }
+
+ public CodeOperation getOperation2() {
+ return op2;
+ }
+
+ @Override
+ public CodeOperation inverse() throws NoninvertibleTransformException {
+ return new Concatenate(op2.inverse(), op1.inverse());
+ }
+
+ @Override
+ public Code transform(Code source, Code target) throws TransformException {
+ final Code r = op1.transform(source, null);
+ return op2.transform(r, target);
+ }
+
+ @Override
+ public void transform(Code[] source, int soffset, Code[] target, int toffset, int nb) throws TransformException {
+ for (int i = 0; i < nb; i++) {
+ target[toffset+i] = transform(source[soffset+i], target[toffset+i]);
+ }
+ }
+
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return new NamedIdentifier(Names.createLocalName(null, null, "Concatenate"));
+ }
+
+ @Override
+ public String toString() {
+ return "Concatenate "
+ + "\n First : " + op1.toString().replaceAll("\n", "\n ")
+ + "\n Second : " + op2.toString().replaceAll("\n", "\n ");
+ }
+ }
+
+ public static final class Compound implements CodeOperation {
+
+ private final ReferenceSystem sourceRS;
+ private final ReferenceSystem targetRS;
+ private final CodeOperation op1;
+ private final CodeOperation op2;
+ private final int dim1;
+ private final int dim2;
+ private final int dimRes;
+
+ public Compound(CodeOperation op1, CodeOperation op2, ReferenceSystem sourceRS, ReferenceSystem targetRS) {
+ this.sourceRS = sourceRS == null ? ReferenceSystems.createCompound(op1.getSourceRS(), op2.getSourceRS()) : sourceRS;
+ this.targetRS = targetRS == null ? ReferenceSystems.createCompound(op1.getTargetRS(), op2.getTargetRS()) : sourceRS;
+ this.op1 = op1;
+ this.op2 = op2;
+ this.dim1 = ReferenceSystems.getDimension(op1.getSourceRS());
+ this.dim2 = ReferenceSystems.getDimension(op2.getSourceRS());
+ this.dimRes = ReferenceSystems.getDimension(this.targetRS);
+ }
+
+ @Override
+ public ReferenceSystem getSourceRS() {
+ return sourceRS;
+ }
+
+ @Override
+ public ReferenceSystem getTargetRS() {
+ return targetRS;
+ }
+
+ public CodeOperation getOperation1() {
+ return op1;
+ }
+
+ public CodeOperation getOperation2() {
+ return op2;
+ }
+
+ @Override
+ public CodeOperation inverse() throws NoninvertibleTransformException {
+ return new Compound(op1.inverse(), op2.inverse(), targetRS, sourceRS);
+ }
+
+ @Override
+ public Code transform(Code source, Code target) throws TransformException {
+ final Object[] ordinates = source.getOrdinates();
+ final Code s1 = new Code(op1.getSourceRS(), Arrays.copyOfRange(ordinates, 0, dim1));
+ final Code s2 = new Code(op2.getSourceRS(), Arrays.copyOfRange(ordinates, dim1, dim1+dim2));
+ final Code r1 = op1.transform(s1, null);
+ final Code r2 = op2.transform(s2, null);
+ if (target == null) target = new Code(targetRS, new Object[dimRes]);
+ int k = 0;
+ for (int i = 0, n = r1.getDimension(); i < n; i++) {
+ target.setOrdinate(k++, r1.getOrdinate(i));
+ }
+ for (int i = 0, n = r2.getDimension(); i < n; i++) {
+ target.setOrdinate(k++, r2.getOrdinate(i));
+ }
+ return target;
+ }
+
+ @Override
+ public void transform(Code[] source, int soffset, Code[] target, int toffset, int nb) throws TransformException {
+ for (int i = 0; i < nb; i++) {
+ target[toffset+i] = transform(source[soffset+i], target[toffset+i]);
+ }
+ }
+
+ @Override
- public Identifier getName() {
++ public ReferenceIdentifier getName() {
+ return new NamedIdentifier(Names.createLocalName(null, null, "Compound"));
+ }
+
+ @Override
+ public String toString() {
+ return "Compound "
+ + "\n First : " + op1.toString().replaceAll("\n", "\n ")
+ + "\n Second : " + op2.toString().replaceAll("\n", "\n ");
+ }
+ }
+ }