From dc7a23f5e45c63a0cb1548a94b5f99abc68a4ff3 Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Tue, 27 May 2025 21:33:59 -0400 Subject: [PATCH] Update requirements matrix H.2 - use GetTile / text/mapml for rasters Prune tiles returned for a tile-shaped GetMap to just the one Add formats.raster = text/mapml to advertised_formats.properties --- .../java/org/geoserver/mapml/MapMLDocumentBuilder.java | 5 +---- .../main/java/org/geoserver/mapml/MapMLFeatureUtil.java | 9 ++++++++- .../org/geoserver/gwc/advertised_formats.properties | 1 + .../geoserver/mapml/MapMLFormatOptionsMatrixTest.java | 8 ++++---- 4 files changed, 14 insertions(+), 9 deletions(-) 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 83206c19161..d7b5bed395e 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 @@ -1643,10 +1643,7 @@ private void generateWMTSClientLinks(MapMLLayerMetadata mapMLLayerMetadata) { params.put("tilematrix", "{z}"); params.put("TileCol", "{x}"); params.put("TileRow", "{y}"); - // if it's a raster layer, use the image format even if features are requested - boolean isRasterLayer = mapMLLayerMetadata.getLayerInfo() != null - && mapMLLayerMetadata.getLayerInfo().getResource() instanceof CoverageInfo; - if (mapMLLayerMetadata.isUseFeatures() && !isRasterLayer) { + if (mapMLLayerMetadata.isUseFeatures()) { params.put("format", MAPML_MIME_TYPE); params.put( "format_options", diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLFeatureUtil.java b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLFeatureUtil.java index f6faeff8fd7..89a998865c5 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLFeatureUtil.java +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLFeatureUtil.java @@ -85,6 +85,7 @@ public class MapMLFeatureUtil { private static final Logger LOGGER = Logging.getLogger(MapMLFeatureUtil.class); + private static final double IS_TILE_TOL = 0.002D; public static final String STYLE_CLASS_PREFIX = "."; public static final String STYLE_CLASS_DELIMITER = " "; public static final String BBOX_DISPLAY_NONE = ".bbox {display:none}"; @@ -324,7 +325,13 @@ public static Mapml layerContextsToMapMLDocument( } } Collections.sort(tiles); - featuresOrTiles.addAll(tiles); + boolean isTile = (getMapRequest.getWidth() == getMapRequest.getHeight() + && tiles.get(0).getDistance() < IS_TILE_TOL); + if (isTile) { + featuresOrTiles.add(tiles.get(0)); + } else { + featuresOrTiles.addAll(tiles); + } } } catch (FactoryException | GeoWebCacheException | TransformException e) { throw new ServiceException("Error while looking up MapML gridset", e); diff --git a/src/extension/mapml/src/main/resources/org/geoserver/gwc/advertised_formats.properties b/src/extension/mapml/src/main/resources/org/geoserver/gwc/advertised_formats.properties index 132e8ce4a82..cf3cd2e2496 100644 --- a/src/extension/mapml/src/main/resources/org/geoserver/gwc/advertised_formats.properties +++ b/src/extension/mapml/src/main/resources/org/geoserver/gwc/advertised_formats.properties @@ -4,3 +4,4 @@ # for more info. formats.vector = text/mapml formats.layergroup = text/mapml +formats.raster = text/mapml diff --git a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLFormatOptionsMatrixTest.java b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLFormatOptionsMatrixTest.java index 0ceff05ebb9..cf1b823753d 100644 --- a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLFormatOptionsMatrixTest.java +++ b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLFormatOptionsMatrixTest.java @@ -403,12 +403,12 @@ public void testScenarioH2_RasterWithCache() throws Exception { // For cached raster: should have GetTile URL assertXpathExists("//html:map-link[@rel='tile']", doc); - // Verify that the tile link contains "GetTile" - String tileUrl = xpath.evaluate("//html:map-link[@rel='tile']/@tref", doc); + // Verify that the tile link contains "GetTile" and has type=text/mapml + String tileUrl = xpath.evaluate("//html:map-link[@rel='tile'][@type='text/mapml']/@tref", doc); assertTrue("Tile URL should contain GetTile", tileUrl.contains("GetTile")); - // Verify that the tile link uses image format for rasters - assertTrue("Tile URL should use image format for rasters", tileUrl.contains("image/png")); + // Verify that the tile link uses text/mapml for rasters with mapmlusefeatures:true + assertTrue("Tile URL should use text/mapml for vector tiles", tileUrl.contains("text/mapml")); } finally { disableTileCaching(new QName(MockData.CITE_URI, "World"), getCatalog());