package org.mapfish.print.attribute.map; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.CRS; import org.junit.Test; import org.opengis.referencing.crs.CoordinateReferenceSystem; import java.awt.Rectangle; import static org.geotools.referencing.crs.DefaultGeographicCRS.WGS84; import static org.junit.Assert.assertEquals; import static org.mapfish.print.Constants.PDF_DPI; import static org.mapfish.print.attribute.map.CenterScaleMapBoundsTest.CH1903; public class BBoxMapBoundsTest { public static final CoordinateReferenceSystem SPHERICAL_MERCATOR; static { try { SPHERICAL_MERCATOR = CRS.decode("EPSG:3857"); } catch (Throwable e) { throw new RuntimeException(e); } } @Test public void testToReferencedEnvelope() throws Exception { final BBoxMapBounds bboxMapBounds = new BBoxMapBounds(WGS84, -180, -90, 180, 90); final ReferencedEnvelope envelope = bboxMapBounds.toReferencedEnvelope(new Rectangle(10, 5)); assertEquals(-180, envelope.getMinX(), 0.001); assertEquals(180, envelope.getMaxX(), 0.001); assertEquals(-90, envelope.getMinY(), 0.001); assertEquals(90, envelope.getMaxY(), 0.001); assertEquals(WGS84, envelope.getCoordinateReferenceSystem()); } @Test public void testAdjustedEnvelope() throws Exception { final BBoxMapBounds bboxMapBounds = new BBoxMapBounds(WGS84, -10, -90, 10, 90); final MapBounds mapBounds = bboxMapBounds.adjustedEnvelope(new Rectangle(5, 5)); final ReferencedEnvelope envelope = mapBounds.toReferencedEnvelope(new Rectangle(5, 5)); assertEquals(-90, envelope.getMinX(), 0.001); assertEquals(90, envelope.getMaxX(), 0.001); assertEquals(-90, envelope.getMinY(), 0.001); assertEquals(90, envelope.getMaxY(), 0.001); assertEquals(WGS84, envelope.getCoordinateReferenceSystem()); } @Test public void testAdjustToScale() throws Exception { int scaleDenominator = 24000; double dpi = 100; Rectangle screen = new Rectangle(100, 100); ZoomLevels zoomLevels = new ZoomLevels(15000, 20000, 25000, 30000, 350000); final CenterScaleMapBounds mapBounds = new CenterScaleMapBounds(CH1903, 50000, 50000, scaleDenominator); final ReferencedEnvelope originalBBox = mapBounds.toReferencedEnvelope(screen); BBoxMapBounds linear = new BBoxMapBounds(CH1903, originalBBox.getMinX(), originalBBox.getMinY(), originalBBox.getMaxX(), originalBBox.getMaxY()); final MapBounds newMapBounds = linear.adjustBoundsToNearestScale(zoomLevels, 0.05, ZoomLevelSnapStrategy.CLOSEST_LOWER_SCALE_ON_TIE, false, screen, dpi); ReferencedEnvelope newBBox = newMapBounds.toReferencedEnvelope(screen); final double delta = 0.00001; assertEquals(originalBBox.getMedian(0), newBBox.getMedian(0), delta); assertEquals(originalBBox.getMedian(1), newBBox.getMedian(1), delta); double expectedScale = 25000; CenterScaleMapBounds expectedMapBounds = new CenterScaleMapBounds(CH1903, originalBBox.centre().x, originalBBox.centre().y, expectedScale); assertEquals(expectedMapBounds.toReferencedEnvelope(screen), newBBox); } @Test public void testAdjustToScaleLatLong() throws Exception { int scaleDenominator = 24000; double dpi = 100; Rectangle screen = new Rectangle(100, 100); ZoomLevels zoomLevels = new ZoomLevels(15000, 20000, 25000, 30000, 350000); final CenterScaleMapBounds mapBounds = new CenterScaleMapBounds(SPHERICAL_MERCATOR, 5, 5, scaleDenominator); final ReferencedEnvelope originalBBox = mapBounds.toReferencedEnvelope(screen); BBoxMapBounds linear = new BBoxMapBounds(SPHERICAL_MERCATOR, originalBBox.getMinX(), originalBBox.getMinY(), originalBBox.getMaxX(), originalBBox.getMaxY()); final MapBounds newMapBounds = linear.adjustBoundsToNearestScale(zoomLevels, 0.05, ZoomLevelSnapStrategy.CLOSEST_LOWER_SCALE_ON_TIE, false, screen, dpi); ReferencedEnvelope newBBox = newMapBounds.toReferencedEnvelope(screen); final double delta = 0.00001; assertEquals(originalBBox.getMedian(0), newBBox.getMedian(0), delta); assertEquals(originalBBox.getMedian(1), newBBox.getMedian(1), delta); double expectedScale = 25000; CenterScaleMapBounds expectedMapBounds = new CenterScaleMapBounds(SPHERICAL_MERCATOR, originalBBox.centre().x, originalBBox.centre().y, expectedScale); assertEquals(expectedMapBounds.getScale(screen, dpi), newMapBounds.getScale(screen, dpi)); assertEquals(expectedMapBounds.getCenter(), newMapBounds.getCenter()); assertEquals(expectedMapBounds.toReferencedEnvelope(screen), newBBox); } @Test public void testZoomOut() throws Exception { BBoxMapBounds bboxMapBounds = new BBoxMapBounds(WGS84, -10, -10, 10, 10); MapBounds bounds = bboxMapBounds.zoomOut(1); assertEquals(bboxMapBounds, bounds); bounds = bboxMapBounds.zoomOut(2); ReferencedEnvelope envelope = bounds.toReferencedEnvelope(new Rectangle(5, 5)); assertEquals(-20, envelope.getMinX(), 0.001); assertEquals(20, envelope.getMaxX(), 0.001); assertEquals(-20, envelope.getMinY(), 0.001); assertEquals(20, envelope.getMaxY(), 0.001); assertEquals(WGS84, envelope.getCoordinateReferenceSystem()); bboxMapBounds = new BBoxMapBounds(WGS84, -10, -5, 10, 5); bounds = bboxMapBounds.zoomOut(1); assertEquals(bboxMapBounds, bounds); bounds = bboxMapBounds.zoomOut(4); envelope = bounds.toReferencedEnvelope(new Rectangle(40, 20)); assertEquals(-40, envelope.getMinX(), 0.001); assertEquals(40, envelope.getMaxX(), 0.001); assertEquals(-20, envelope.getMinY(), 0.001); assertEquals(20, envelope.getMaxY(), 0.001); assertEquals(WGS84, envelope.getCoordinateReferenceSystem()); } @Test public void testAdjustToGeodeticScale() throws Exception { int scaleDenominator = 24000; double dpi = 100; Rectangle screen = new Rectangle(100, 100); ZoomLevels zoomLevels = new ZoomLevels(15000, 20000, 25000, 30000, 350000); final CenterScaleMapBounds mapBounds = new CenterScaleMapBounds(SPHERICAL_MERCATOR, 400000, 5000000, scaleDenominator); final ReferencedEnvelope originalBBox = mapBounds.toReferencedEnvelope(screen); BBoxMapBounds linear = new BBoxMapBounds(SPHERICAL_MERCATOR, originalBBox.getMinX(), originalBBox.getMinY(), originalBBox.getMaxX(), originalBBox.getMaxY()); final MapBounds newMapBounds = linear.adjustBoundsToNearestScale(zoomLevels, 0.005, ZoomLevelSnapStrategy.CLOSEST_LOWER_SCALE_ON_TIE, true, screen, dpi); ReferencedEnvelope newBBox = newMapBounds.toReferencedEnvelope(screen); final double delta = 0.00001; assertEquals(originalBBox.getMedian(0), newBBox.getMedian(0), delta); assertEquals(originalBBox.getMedian(1), newBBox.getMedian(1), delta); assertEquals(20000, newMapBounds.getScale(screen, dpi).getGeodeticDenominator( SPHERICAL_MERCATOR, dpi, newBBox.centre()), 1); assertEquals(26428, newMapBounds.getScale(screen, dpi).getDenominator(dpi), 1); assertEquals(399664, newBBox.getMinX(), 1); assertEquals(4999664, newBBox.getMinY(), 1); assertEquals(400335, newBBox.getMaxX(), 1); assertEquals(5000335, newBBox.getMaxY(), 1); } }