This is an automated email from the ASF dual-hosted git repository. jsorel pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
The following commit(s) were added to refs/heads/geoapi-4.0 by this push: new 1590b5a41b Hide aggregated resources in GIMI store, fix incorrect tile raster offset 1590b5a41b is described below commit 1590b5a41b680be8b007d237432384501c3385d4 Author: jsorel <johann.so...@geomatys.com> AuthorDate: Wed Oct 2 11:18:07 2024 +0200 Hide aggregated resources in GIMI store, fix incorrect tile raster offset --- .../main/module-info.java | 2 ++ .../org/apache/sis/storage/gimi/GimiProvider.java | 12 ++++++++- .../org/apache/sis/storage/gimi/GimiStore.java | 22 +++++++++++++++- .../apache/sis/storage/gimi/ResourcePyramid.java | 2 +- .../apache/sis/storage/gimi/ResourceUnknown.java | 15 +++++++++++ .../storage/gimi/internal/MatrixGridRessource.java | 6 +++-- .../apache/sis/storage/gimi/isobmff/gimi/GIMI.java | 6 ++++- .../gimi/TiledImageConfigurationBox.java} | 29 ++++++++-------------- .../gimi/isobmff/iso23001_17/ISO23001_17.java | 2 +- .../gimi/isobmff/iso23001_17/TAIClockInfo.java | 1 + 10 files changed, 72 insertions(+), 25 deletions(-) diff --git a/incubator/src/org.apache.sis.storage.gimi/main/module-info.java b/incubator/src/org.apache.sis.storage.gimi/main/module-info.java index c3b6f462db..453daa9cd2 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/module-info.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/module-info.java @@ -27,6 +27,8 @@ module org.apache.sis.storage.gimi { exports org.apache.sis.storage.gimi.isobmff; + uses org.apache.sis.storage.gimi.isobmff.BoxRegistry; + provides org.apache.sis.storage.DataStoreProvider with org.apache.sis.storage.gimi.GimiProvider; diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java index 239e08d1e5..a8e26482d1 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java @@ -21,24 +21,34 @@ import java.nio.file.Path; import org.opengis.parameter.ParameterDescriptor; import org.opengis.parameter.ParameterDescriptorGroup; import org.apache.sis.parameter.ParameterBuilder; +import org.apache.sis.storage.Aggregate; import org.apache.sis.storage.DataStore; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.DataStoreProvider; import org.apache.sis.storage.ProbeResult; import org.apache.sis.storage.StorageConnector; import static org.apache.sis.storage.DataStoreProvider.LOCATION; +import org.apache.sis.storage.GridCoverageResource; +import org.apache.sis.storage.base.Capability; +import org.apache.sis.storage.base.StoreMetadata; +import org.apache.sis.storage.tiling.TiledResource; /** * * @author Johann Sorel (Geomatys) */ +@StoreMetadata(formatName = GimiProvider.NAME, + capabilities = {Capability.READ}, + fileSuffixes = {"heij", "heif", "heic", "avif"}, + resourceTypes = {Aggregate.class, GridCoverageResource.class, TiledResource.class}, + yieldPriority = false) public final class GimiProvider extends DataStoreProvider { /** * Format name. */ - public static final String NAME = "gimi"; + public static final String NAME = "GIMI"; /** * Format mime type. diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java index 5490c19cb4..f383d49897 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java @@ -21,9 +21,11 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import org.opengis.metadata.Metadata; import org.opengis.parameter.ParameterValueGroup; import org.apache.sis.io.stream.ChannelDataInput; @@ -41,6 +43,7 @@ import org.apache.sis.storage.gimi.isobmff.iso14496_12.GroupList; import org.apache.sis.storage.gimi.isobmff.iso14496_12.ItemInfo; import org.apache.sis.storage.gimi.isobmff.iso14496_12.ItemInfoEntry; import org.apache.sis.storage.gimi.isobmff.iso14496_12.Meta; +import org.apache.sis.storage.gimi.isobmff.iso14496_12.SingleItemTypeReference; import org.apache.sis.storage.gimi.isobmff.iso23008_12.ImagePyramidEntityGroup; import org.apache.sis.util.iso.Names; @@ -127,8 +130,11 @@ public final class GimiStore extends DataStore implements Aggregate { components = new ArrayList<>(); componentIndex = new HashMap<>(); - try { + //collect elements which should not be displayed since they are part of a larger image (grid or pyramid) + final Set<Integer> includedInParents = new HashSet<>(); + + try { final Box root = getRootBox(); final Meta meta = (Meta) root.getChild(Meta.FCC, null); @@ -146,6 +152,12 @@ public final class GimiStore extends DataStore implements Aggregate { } else if (ResourceGrid.TYPE.equals(iie.itemType)) { //tiled image resource = new ResourceGrid(item); + + for (SingleItemTypeReference refs : item.references) { + for (int i :refs.toItemId) { + includedInParents.add(i); + } + } } else { //TODO resource = new ResourceUnknown(this, item); @@ -167,6 +179,9 @@ public final class GimiStore extends DataStore implements Aggregate { //force initialize now, pyramids may amend existing grids pyramid.getGridGeometry(); + for (int i :img.entitiesId) { + includedInParents.add(i); + } } } } @@ -175,6 +190,11 @@ public final class GimiStore extends DataStore implements Aggregate { ex.printStackTrace(); } + //remove resources which are in a parent + for (Integer itemId : includedInParents) { + components.remove(componentIndex.get(itemId)); + } + return components; } diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java index ffef8b7d67..6838a5464d 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java @@ -75,7 +75,7 @@ final class ResourcePyramid extends AbstractGridCoverageResource implements Tile @Override public Optional<GenericName> getIdentifier() throws DataStoreException { - return Optional.of(Names.createLocalName(null, null, "" + group.groupId)); + return Optional.of(Names.createLocalName(null, null, "ImagePyramidEntityGroup " + group.groupId)); } private synchronized void initialize() throws DataStoreException { diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java index ca31067625..635b8673e6 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java @@ -16,10 +16,13 @@ */ package org.apache.sis.storage.gimi; +import java.util.Optional; import org.apache.sis.storage.AbstractResource; import org.apache.sis.storage.DataStore; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.base.StoreResource; +import org.apache.sis.util.iso.Names; +import org.opengis.util.GenericName; /** @@ -31,11 +34,23 @@ final class ResourceUnknown extends AbstractResource implements StoreResource { private final GimiStore store; private final Item item; + private final GenericName identifier; public ResourceUnknown(GimiStore store, Item item) throws DataStoreException { super(store); this.store = store; this.item = item; + + if (item.entry.itemName == null || item.entry.itemName.isBlank()) { + this.identifier = Names.createLocalName(null, null, Integer.toString(item.entry.itemId)); + } else { + this.identifier = Names.createLocalName(null, null, item.entry.itemName); + } + } + + @Override + public Optional<GenericName> getIdentifier() throws DataStoreException { + return Optional.of(identifier); } @Override diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java index 6cbf6d0d35..9fe163fe80 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java @@ -123,8 +123,10 @@ public abstract class MatrixGridRessource extends TiledGridResource { } else { long[] tileCoord = iterator.getTileCoordinatesInResource(); final RenderedImage image = getTileImage(tileCoord); - result[iterator.getTileIndexInResultArray()] = - (image instanceof BufferedImage) ? ((BufferedImage)image).getRaster() : image.getData(); + var s = new Snapshot(iterator); + Raster raster = (image instanceof BufferedImage) ? ((BufferedImage)image).getRaster() : image.getData(); + raster = raster.createTranslatedChild(s.originX, s.originY); + result[iterator.getTileIndexInResultArray()] = raster; } } while (iterator.next()); } diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java index cf5010cd64..b258d5616a 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java @@ -28,7 +28,9 @@ import org.apache.sis.storage.gimi.isobmff.BoxRegistry; */ public final class GIMI implements BoxRegistry { - private static final Set<String> BOXES = Set.of(); + private static final Set<String> BOXES = Set.of( + TiledImageConfigurationBox.FCC + ); private static final Set<String> EXTENSIONS = Set.of( ModelTiePointProperty.UUID, ModelTransformationProperty.UUID, @@ -52,6 +54,8 @@ public final class GIMI implements BoxRegistry { @Override public Box create(String fourCC) throws IllegalNameException { + //TODO replace by String switch when SIS minimum java is updated + if (TiledImageConfigurationBox.FCC.equals(fourCC)) return new TiledImageConfigurationBox(); throw new IllegalNameException(); } diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java similarity index 58% copy from incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java copy to incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java index ca31067625..922213d3db 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java @@ -14,33 +14,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.sis.storage.gimi; - -import org.apache.sis.storage.AbstractResource; -import org.apache.sis.storage.DataStore; -import org.apache.sis.storage.DataStoreException; -import org.apache.sis.storage.base.StoreResource; +package org.apache.sis.storage.gimi.isobmff.gimi; +import java.io.IOException; +import org.apache.sis.storage.gimi.isobmff.FullBox; +import org.apache.sis.storage.gimi.isobmff.ISOBMFFReader; /** - * Unknown item type. + * Definition from OGC TestBed 20 : tild.pdf + * + * CAUTION : this is not final and may be changed in HEIF specification. * * @author Johann Sorel (Geomatys) */ -final class ResourceUnknown extends AbstractResource implements StoreResource { +public final class TiledImageConfigurationBox extends FullBox { - private final GimiStore store; - private final Item item; - - public ResourceUnknown(GimiStore store, Item item) throws DataStoreException { - super(store); - this.store = store; - this.item = item; - } + public static final String FCC = "tilC"; @Override - public DataStore getOriginator() { - return store; + public void readProperties(ISOBMFFReader reader) throws IOException { + throw new IOException("Not supported yet"); } } diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java index f683ed8e04..005aa8a19f 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java @@ -43,7 +43,7 @@ public final class ISO23001_17 implements BoxRegistry { DepthMappingInformation.FCC, FieldInterlaceType.FCC, FieldInterlaceProperty.FCC, - TAIClockInfo.FCC, + //TAIClockInfo.FCC, //TODO : find box structure, it seems to have a variable size TAITimeStamp.FCC ); private static final Set<String> EXTENSIONS = Set.of(); diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java index 0458e6bbce..77878aa346 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java @@ -23,6 +23,7 @@ import org.apache.sis.storage.gimi.isobmff.ISOBMFFReader; /** * From ISO/IEC 23001-17:2024 amendment 1 + * TODO : find box structure, it seems to have a variable size * * @author Johann Sorel (Geomatys) */