diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java index f852427ab56..1e72e9f9135 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java @@ -15,6 +15,7 @@ import static org.geoserver.mapml.MapMLHTMLOutput.PREVIEW_TCRS_MAP; import static org.geoserver.mapml.template.MapMLMapTemplate.MAPML_PREVIEW_HEAD_FTL; import static org.geoserver.mapml.template.MapMLMapTemplate.MAPML_XML_HEAD_FTL; +import static org.geoserver.wms.capabilities.DimensionHelper.getDataType; import freemarker.template.TemplateMethodModelEx; import java.io.IOException; @@ -26,6 +27,7 @@ import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; @@ -33,12 +35,17 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; +import org.geoserver.catalog.Catalog; +import org.geoserver.catalog.CoverageInfo; +import org.geoserver.catalog.CoverageStoreInfo; import org.geoserver.catalog.DimensionInfo; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.catalog.LayerGroupInfo; @@ -49,6 +56,7 @@ import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.catalog.impl.LayerGroupStyle; +import org.geoserver.catalog.util.ReaderDimensionsAccessor; import org.geoserver.config.GeoServer; import org.geoserver.gwc.GWC; import org.geoserver.gwc.layer.GeoServerTileLayer; @@ -84,12 +92,14 @@ import org.geoserver.wms.WMSInfo; import org.geoserver.wms.WMSMapContent; import org.geoserver.wms.capabilities.CapabilityUtil; +import org.geoserver.wms.capabilities.DimensionHelper; import org.geoserver.wms.featureinfo.FeatureTemplate; import org.geotools.api.feature.simple.SimpleFeatureType; import org.geotools.api.referencing.FactoryException; import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.api.referencing.operation.TransformException; import org.geotools.api.style.Style; +import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.CRS; import org.geotools.referencing.crs.DefaultGeographicCRS; @@ -97,6 +107,7 @@ import org.geotools.renderer.crs.ProjectionHandlerFinder; import org.geotools.util.NumberRange; import org.geotools.util.logging.Logging; +import org.geowebcache.filter.parameters.ParameterFilter; import org.geowebcache.grid.GridSubset; import org.locationtech.jts.geom.Envelope; @@ -171,13 +182,6 @@ public class MapMLDocumentBuilder { private Boolean isMultiExtent = MAPML_MULTILAYER_AS_MULTIEXTENT_DEFAULT; private MapMLMapTemplate mapMLMapTemplate = new MapMLMapTemplate(); - static { - PREVIEW_TCRS_MAP.put("OSMTILE", new TiledCRS("OSMTILE")); - PREVIEW_TCRS_MAP.put("CBMTILE", new TiledCRS("CBMTILE")); - PREVIEW_TCRS_MAP.put("APSTILE", new TiledCRS("APSTILE")); - PREVIEW_TCRS_MAP.put("WGS84", new TiledCRS("WGS84")); - } - /** * Constructor * @@ -1009,10 +1013,6 @@ private List prepareExtents() throws IOException { List extents = new ArrayList<>(); for (MapMLLayerMetadata mapMLLayerMetadata : mapMLLayerMetadataList) { Extent extent = new Extent(); - if (isMultiExtent) { - extent.setHidden(null); // not needed for multi-extent - extent.setLabel(mapMLLayerMetadata.layerTitle); - } extent.setUnits(projType); extentList = extent.getInputOrDatalistOrLink(); @@ -1054,12 +1054,27 @@ private List prepareExtents() throws IOException { String dimension = layerMeta.get("mapml.dimension", String.class); prepareExtentForLayer(mapMLLayerMetadata, dimension); generateTemplatedLinks(mapMLLayerMetadata); + if (isMultiExtent || isSingleLayerWithDimensionOptions(mapMLLayerMetadataList)) { + extent.setHidden(null); // not needed for multi-extent + extent.setLabel(mapMLLayerMetadata.layerTitle); + } extents.add(extent); } return extents; } + private boolean isSingleLayerWithDimensionOptions( + List mapMLLayerMetadataList) { + if (mapMLLayerMetadataList.size() == 1) { + MapMLLayerMetadata metadata = mapMLLayerMetadataList.get(0); + return metadata.isTimeEnabled() + || metadata.isElevationEnabled() + || StringUtils.isNotBlank(metadata.getCustomDimension()); + } + return false; + } + /** * Prepare the extent for a layer * @@ -1074,49 +1089,136 @@ private void prepareExtentForLayer(MapMLLayerMetadata mapMLLayerMetadata, String } LayerInfo layerInfo = mapMLLayerMetadata.getLayerInfo(); ResourceInfo resourceInfo = layerInfo.getResource(); + if (resourceInfo instanceof FeatureTypeInfo) { + prepareFeatureExtent((FeatureTypeInfo) resourceInfo, mapMLLayerMetadata, dimension); + } else if (resourceInfo instanceof CoverageInfo) { + prepareCoverageExtent((CoverageInfo) resourceInfo, mapMLLayerMetadata, dimension); + } + } + + @SuppressWarnings("unchecked") + private void prepareFeatureExtent( + FeatureTypeInfo typeInfo, MapMLLayerMetadata layerMetadata, String dimension) + throws IOException { + MetadataMap metadataMap = typeInfo.getMetadata(); + DimensionOptions options; if ("Time".equalsIgnoreCase(dimension)) { - if (resourceInfo instanceof FeatureTypeInfo) { - FeatureTypeInfo typeInfo = (FeatureTypeInfo) resourceInfo; - DimensionInfo timeInfo = - typeInfo.getMetadata().get(ResourceInfo.TIME, DimensionInfo.class); - if (timeInfo.isEnabled()) { - mapMLLayerMetadata.setTimeEnabled(true); - Set dates = wms.getFeatureTypeTimes(typeInfo); - Select select = new Select(); - select.setId("time"); - select.setName("time"); - extentList.add(select); - List