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);
- }
-
}