diff --git a/deegree-core/deegree-core-commons/src/main/java/org/deegree/commons/utils/MapUtils.java b/deegree-core/deegree-core-commons/src/main/java/org/deegree/commons/utils/MapUtils.java index 9005ffc2067..1c436bae4d3 100644 --- a/deegree-core/deegree-core-commons/src/main/java/org/deegree/commons/utils/MapUtils.java +++ b/deegree-core/deegree-core-commons/src/main/java/org/deegree/commons/utils/MapUtils.java @@ -104,4 +104,22 @@ public static final double calcMetricResFromScale(final double scale) { return scale * DEFAULT_PIXEL_SIZE; } + /** + * Calculates the scale hint from the scale denominator with DEFAULT_PIXEL_SIZE + * @param scaleDenominator + * @return scaleHint calculated from scaleDenominator + */ + public static double calcScaleHint(double scaleDenominator) { + return Math.sqrt(Math.pow((scaleDenominator * DEFAULT_PIXEL_SIZE), 2) * 2); + } + + /** + * Calculates the scale denominator from the scale hint with DEFAULT_PIXEL_SIZE + * @param scaleHint + * @return scaleDenominator calculated from scaleHint + */ + public static double calcScaleDenominator(double scaleHint) { + return (Math.sqrt((Math.pow(scaleHint, 2) / 2))) / DEFAULT_PIXEL_SIZE; + } + } diff --git a/deegree-core/deegree-core-commons/src/test/java/org/deegree/commons/utils/MapUtilsTests.java b/deegree-core/deegree-core-commons/src/test/java/org/deegree/commons/utils/MapUtilsTests.java new file mode 100644 index 00000000000..481d5e287d1 --- /dev/null +++ b/deegree-core/deegree-core-commons/src/test/java/org/deegree/commons/utils/MapUtilsTests.java @@ -0,0 +1,22 @@ +package org.deegree.commons.utils; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * @author Lyn Goltz + */ +public class MapUtilsTests { + + @Test + public void testCalcScaleDenominatorAndScaleHint() { + double scaleDenom = 500; + double scaleHint = MapUtils.calcScaleHint(scaleDenom); + assertEquals(0.1979898987322333, scaleHint, 0d); + + double scaleDenomFromHint = MapUtils.calcScaleDenominator(scaleHint); + assertEquals(scaleDenom, scaleDenomFromHint, 0d); + } + +} diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapter.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapter.java index e27ffebc3d1..a448dbdf515 100644 --- a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapter.java +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapter.java @@ -34,6 +34,8 @@ ----------------------------------------------------------------------------*/ package org.deegree.protocol.wms.client; +import static java.lang.Double.NEGATIVE_INFINITY; +import static java.lang.Double.POSITIVE_INFINITY; import static org.deegree.cs.coordinatesystems.GeographicCRS.WGS84; import static org.deegree.protocol.i18n.Messages.get; @@ -41,6 +43,8 @@ import org.apache.axiom.om.OMElement; import org.deegree.commons.tom.ows.Version; +import org.deegree.commons.utils.DoublePair; +import org.deegree.commons.utils.MapUtils; import org.deegree.commons.xml.XPath; import org.deegree.cs.persistence.CRSManager; import org.deegree.geometry.Envelope; @@ -115,4 +119,22 @@ protected String getExtendedCapabilitiesRootXPath() { return "//WMT_MS_Capabilities/Capability/VendorSpecificCapabilities"; } + @Override + protected DoublePair parseScaleDenominators(OMElement lay) { + double minScaleHint = getNodeAsDouble(lay, new XPath(getPrefix() + "ScaleHint/@min", nsContext), -1); + double maxScaleHint = getNodeAsDouble(lay, new XPath(getPrefix() + "ScaleHint/@max", nsContext), -1); + if (minScaleHint > -1 || maxScaleHint > -1) { + double minScaleDenominator = calculateScaleDenominator(minScaleHint, NEGATIVE_INFINITY); + double maxScaleDenominator = calculateScaleDenominator(maxScaleHint, POSITIVE_INFINITY); + return new DoublePair(minScaleDenominator, maxScaleDenominator); + } + return new DoublePair(NEGATIVE_INFINITY, POSITIVE_INFINITY); + } + + private double calculateScaleDenominator(double scaleHint, double defaultValue) { + if (scaleHint < 0) + return defaultValue; + return MapUtils.calcScaleDenominator(scaleHint); + } + } diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapter.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapter.java index a769920f597..f6b559ce343 100644 --- a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapter.java +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapter.java @@ -34,11 +34,14 @@ ----------------------------------------------------------------------------*/ package org.deegree.protocol.wms.client; +import static java.lang.Double.NEGATIVE_INFINITY; +import static java.lang.Double.POSITIVE_INFINITY; import static org.deegree.cs.coordinatesystems.GeographicCRS.WGS84; import static org.deegree.protocol.i18n.Messages.get; import org.apache.axiom.om.OMElement; import org.deegree.commons.tom.ows.Version; +import org.deegree.commons.utils.DoublePair; import org.deegree.commons.xml.XPath; import org.deegree.cs.persistence.CRSManager; import org.deegree.geometry.Envelope; @@ -116,4 +119,13 @@ protected String getExtendedCapabilitiesRootXPath() { return "//wms:WMS_Capabilities/wms:Capability"; } + @Override + protected DoublePair parseScaleDenominators(OMElement lay) { + double minScaleDenominator = getNodeAsDouble(lay, new XPath(getPrefix() + "MinScaleDenominator", nsContext), + NEGATIVE_INFINITY); + double maxScaleDenominator = getNodeAsDouble(lay, new XPath(getPrefix() + "MaxScaleDenominator", nsContext), + POSITIVE_INFINITY); + return new DoublePair(minScaleDenominator, maxScaleDenominator); + } + } diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSCapabilitiesAdapter.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSCapabilitiesAdapter.java index abd6ee6b523..adfb20495d5 100644 --- a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSCapabilitiesAdapter.java +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSCapabilitiesAdapter.java @@ -60,6 +60,7 @@ import org.deegree.commons.tom.ows.CodeType; import org.deegree.commons.tom.ows.LanguageString; import org.deegree.commons.tom.ows.Version; +import org.deegree.commons.utils.DoublePair; import org.deegree.commons.utils.Pair; import org.deegree.commons.xml.XMLAdapter; import org.deegree.commons.xml.XMLParsingException; @@ -404,6 +405,7 @@ private LayerMetadata extractMetadata(OMElement lay) { } } md.setStyles(styles); + md.setScaleDenominators(parseScaleDenominators(lay)); return md; } @@ -618,6 +620,8 @@ public OMElement getExtendedCapabilities(String prefix, String localName, String protected abstract String getPrefix(); + protected abstract DoublePair parseScaleDenominators(OMElement lay); + public void parseWMSSpecificCapabilities(OperationsMetadata operationsMetadata) { namedLayers = parseNamedLayers(); operationToFormats = parseFormats(operationsMetadata); diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSClient.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSClient.java index e4b69a8b548..8d296fee99d 100644 --- a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSClient.java +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/client/WMSClient.java @@ -295,29 +295,24 @@ public Pair getMap(GetMap getMap, Map har * @param hardParameters parameters to override in the request, may be null * @throws IOException */ - public Pair getMap(GetMap getMap, Map hardParameters, int timeout, + public Pair getMap(GetMap getMap, Map hardParameters, int timeoutInSeconds, boolean errorsInImage) throws IOException { - if (VERSION_111.equals(wmsVersion)) { + if (VERSION_111.equals(wmsVersion) || VERSION_130.equals(wmsVersion)) { Worker worker = new Worker(getMap.getLayers(), getMap.getStyles(), getMap.getWidth(), getMap.getHeight(), getMap.getBoundingBox(), getMap.getCoordinateSystem(), getMap.getFormat(), getMap.getTransparent(), errorsInImage, false, null, hardParameters); - - Pair result; try { - if (timeout == -1) { - result = worker.call(); - } - else { - result = Executor.getInstance().performSynchronously(worker, timeout * 1000); + if (timeoutInSeconds == -1) { + return worker.call(); } + return Executor.getInstance().performSynchronously(worker, timeoutInSeconds * 1000); } catch (Throwable e) { throw new IOException(e.getMessage(), e); } - - return result; } - throw new IllegalArgumentException("GetMap request for other versions than 1.1.1 are not supported yet."); + throw new IllegalArgumentException( + "GetMap request for other versions than 1.1.1 or 1.3.0 are not supported yet."); } /** @@ -537,7 +532,7 @@ private Pair getMap(List layers, List Map map = new HashMap(); map.put("request", "GetMap"); - map.put("version", "1.1.1"); + map.put("version", wmsVersion.toString()); map.put("service", "WMS"); map.put("layers", join(",", layers)); String stylesParam = ""; @@ -563,7 +558,8 @@ private Pair getMap(List layers, List map.put("height", Integer.toString(reqHeight)); map.put("bbox", reqEnv.getMin().get0() + "," + reqEnv.getMin().get1() + "," + reqEnv.getMax().get0() + "," + reqEnv.getMax().get1()); - map.put("srs", srs.getAlias()); + String crsParamKey = VERSION_130.equals(wmsVersion) ? "crs" : "srs"; + map.put(crsParamKey, srs.getAlias()); map.put("format", format); map.put("transparent", Boolean.toString(transparent)); if (hardParameters != null) { diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapterTest.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapterTest.java index 7d70f22b37e..960a762f40b 100644 --- a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapterTest.java +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS111CapabilitiesAdapterTest.java @@ -47,10 +47,13 @@ import org.apache.axiom.om.OMXMLBuilderFactory; import org.apache.axiom.om.OMXMLParserWrapper; import org.deegree.commons.tom.ows.Version; +import org.deegree.commons.utils.DoublePair; +import org.deegree.commons.utils.MapUtils; import org.deegree.cs.exceptions.UnknownCRSException; import org.deegree.cs.persistence.CRSManager; import org.deegree.geometry.Envelope; import org.deegree.geometry.GeometryFactory; +import org.deegree.layer.metadata.LayerMetadata; import org.junit.Test; /** @@ -112,6 +115,15 @@ public void testWMS111CapabilitiesgetLatLonBoundingBox() throws XMLStreamExcepti assertTrue(boundingBox.equals(bbox)); } + @Test + public void testWMS111Capabilities_scaleDenominators() throws XMLStreamException { + WMSCapabilitiesAdapter capabilities = createCapabilities(); + LayerMetadata layer = capabilities.getLayer("citelayers"); + DoublePair scaleDenominators = layer.getScaleDenominators(); + assertEquals(0.0, scaleDenominators.first, 0); + assertEquals(2.525381361380527E10, scaleDenominators.second, 0); + } + @Override protected String getGetGetMapUrl() { return GETMAP_URL; diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapterTest.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapterTest.java index 67e026d1729..6a049fc3ffe 100644 --- a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapterTest.java +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/test/java/org/deegree/protocol/wms/client/WMS130CapabilitiesAdapterTest.java @@ -48,10 +48,12 @@ import org.apache.axiom.om.OMXMLBuilderFactory; import org.apache.axiom.om.OMXMLParserWrapper; import org.deegree.commons.tom.ows.Version; +import org.deegree.commons.utils.DoublePair; import org.deegree.cs.exceptions.UnknownCRSException; import org.deegree.cs.persistence.CRSManager; import org.deegree.geometry.Envelope; import org.deegree.geometry.GeometryFactory; +import org.deegree.layer.metadata.LayerMetadata; import org.junit.Test; /** @@ -94,6 +96,15 @@ public void testWMS130CapabilitiesgetLatLonBoundingBox() throws XMLStreamExcepti assertTrue(boundingBox.equals(bbox)); } + @Test + public void testWMS130Capabilities_scaleDenominators() throws XMLStreamException { + WMSCapabilitiesAdapter capabilities = createCapabilities(); + LayerMetadata layer = capabilities.getLayer("citelayers"); + DoublePair scaleDenominators = layer.getScaleDenominators(); + assertEquals(1.0, scaleDenominators.first, 0); + assertEquals(100000.0, scaleDenominators.second, 0); + } + @Override protected WMSCapabilitiesAdapter createCapabilities() throws XMLStreamException { return createCapabilities("wms130.xml"); diff --git a/deegree-services/deegree-services-wms/src/main/java/org/deegree/services/wms/controller/capabilities/theme/WmsCapabilities111ThemeWriter.java b/deegree-services/deegree-services-wms/src/main/java/org/deegree/services/wms/controller/capabilities/theme/WmsCapabilities111ThemeWriter.java index 4fa3bdb8ece..b02678cb618 100644 --- a/deegree-services/deegree-services-wms/src/main/java/org/deegree/services/wms/controller/capabilities/theme/WmsCapabilities111ThemeWriter.java +++ b/deegree-services/deegree-services-wms/src/main/java/org/deegree/services/wms/controller/capabilities/theme/WmsCapabilities111ThemeWriter.java @@ -42,6 +42,7 @@ Occam Labs UG (haftungsbeschränkt) import static java.lang.Double.MAX_VALUE; import static java.lang.Double.MIN_VALUE; +import static org.deegree.commons.utils.MapUtils.calcScaleHint; import static org.deegree.commons.xml.CommonNamespaces.XLINK_PREFIX; import static org.deegree.commons.xml.CommonNamespaces.XLNNS; import static org.deegree.commons.xml.XMLAdapter.writeElement; @@ -443,9 +444,9 @@ private void writeScaleHint(final XMLStreamWriter writer, DoublePair hint) throw if (!hint.first.isInfinite() || !hint.second.isInfinite()) { writer.writeStartElement("ScaleHint"); writer.writeAttribute("min", - scaleFormat.format(hint.first.isInfinite() ? MIN_VALUE : calculateScaleHint(hint.first))); + scaleFormat.format(hint.first.isInfinite() ? MIN_VALUE : calcScaleHint(hint.first))); writer.writeAttribute("max", - scaleFormat.format(hint.second.isInfinite() ? MAX_VALUE : calculateScaleHint(hint.second))); + scaleFormat.format(hint.second.isInfinite() ? MAX_VALUE : calcScaleHint(hint.second))); writer.writeEndElement(); } } @@ -459,9 +460,4 @@ private void writeOnlineResource(final XMLStreamWriter writer, final String url) } } - private double calculateScaleHint(double scaleDenominator) { - double pixelSize = 0.00028; - return Math.sqrt(Math.pow((scaleDenominator * pixelSize), 2) * 2); - } - }