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 <[email protected]>
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)
*/