/** * Gets the current area of interest provided by {@link #getViewport()#getBounds()}. * * <p>If the viewport has not been created, it will be filled in by default based on the layer * bounds provided by {@link #getMaxBounds()}. * * @return Current area of interest */ public ReferencedEnvelope getAreaOfInterest() { return getViewport().getBounds(); }
/** * The extent of the map currently (sometimes called the map "viewport". * * <p>Note Well: The bounds should match your screen aspect ratio (or the map will appear * squashed). Please note this only covers spatial extent; you may wish to use the user data map * to record the current viewport time or elevation. */ ReferencedEnvelope getBounds() { monitor.readLock().lock(); try { return getViewport().getBounds(); } finally { monitor.readLock().unlock(); } }
/** {@inheritDoc} */ @Override public ReferencedEnvelope getDisplayArea() { paramsLock.readLock().lock(); try { if (mapContent != null) { return mapContent.getViewport().getBounds(); } else if (pendingDisplayArea != null) { return new ReferencedEnvelope(pendingDisplayArea); } else { return new ReferencedEnvelope(); } } finally { paramsLock.readLock().unlock(); } }
/** Called after the base image has been dragged. Sets the new map area and transforms */ protected void afterImageMoved() { paramsLock.writeLock().lock(); try { int dx = imageOrigin.x; int dy = imageOrigin.y; DirectPosition2D newPos = new DirectPosition2D(dx, dy); mapContent.getViewport().getScreenToWorld().transform(newPos, newPos); ReferencedEnvelope env = new ReferencedEnvelope(mapContent.getViewport().getBounds()); env.translate(env.getMinimum(0) - newPos.x, env.getMaximum(1) - newPos.y); doSetDisplayArea(env); imageOrigin.setLocation(0, 0); baseImageMoved.set(false); } finally { paramsLock.writeLock().unlock(); } }
@Override public void draw(Graphics2D graphics, MapContent map, MapViewport theViewport) { LOGGER.fine("Started drawing"); final MapViewport viewport = new MapViewport(theViewport); final ReferencedEnvelope viewportExtent = viewport.getBounds(); int scale = calculateScale(viewportExtent, viewport.getScreenArea()); Collection<Tile> tiles = service.findTilesInExtent(viewportExtent, scale, false, 128); BufferedImage mosaickedImage = createImage(viewport.getScreenArea()); Graphics2D g2d = mosaickedImage.createGraphics(); renderTiles(tiles, g2d, viewportExtent, viewport.getWorldToScreen()); this.coverage = gridFactory.create("GridCoverage", mosaickedImage, viewportExtent); graphics.drawImage(mosaickedImage, 0, 0, null); LOGGER.fine("Drawing done"); }
/** * Creates a context from the provided map content. * * <p>This method is used to prevent duplication in classes supporting deprecated * getMapContext() methods. * * @param content MapContent to be represented */ public MapContext(MapContent content) { this(content.getCoordinateReferenceSystem()); for (Layer layer : content.layers()) { addLayer(layer); } this.setAreaOfInterest(content.getViewport().getBounds()); } /**
private void assertAspectCorrection(Rectangle screenArea, ReferencedEnvelope expectedBounds) { MapViewport vp = new MapViewport(WORLD_1_1, true); vp.setScreenArea(screenArea); assertTrue(expectedBounds.boundsEquals2D(vp.getBounds(), TOL)); }
/** * Checks if two viewports have equal attributes other than their editable setting. * * @param vp1 first viewport * @param vp2 second viewport */ private void assertViewportsEqual(MapViewport vp1, MapViewport vp2) { assertEquals(vp1.getBounds(), vp2.getBounds()); assertEquals(vp1.getScreenArea(), vp2.getScreenArea()); assertEquals(vp1.getScreenToWorld(), vp2.getScreenToWorld()); assertEquals(vp1.isMatchingAspectRatio(), vp2.isMatchingAspectRatio()); }
@Test public void setBoundsNoAspectCorrection() { MapViewport vp = new MapViewport(); vp.setScreenArea(SCREEN_2_1); vp.setBounds(WORLD_1_1); assertTrue(WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL)); }
/** * Calling {@link MapContent#getViewport()} initially creates a new viewport instance with * default settings. */ @Test public void getDefaultViewport() throws Exception { mapContent.addLayer(new MockLayer(WORLD)); MapViewport viewport = mapContent.getViewport(); assertNotNull(viewport); assertTrue(WORLD.boundsEquals2D(viewport.getBounds(), TOL)); }
@Test public void newBoundsAreHonoured_NoAspectMatching() { MapViewport vp = new MapViewport(false); vp.setScreenArea(SCREEN_1_1); vp.setBounds(WORLD_1_1); vp.setBounds(BIG_WORLD_1_1); assertTrue(BIG_WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL)); }
@Test public void newBoundsAreHonoured_AspectMatching() { MapViewport vp = new MapViewport(true); vp.setScreenArea(SCREEN_1_1); vp.setBounds(WORLD_1_1); vp.setBounds(BIG_WORLD_1_1); assertTrue(BIG_WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL)); }
@Test public void callSetBoundsWhenNonEditable() throws Exception { MapViewport vp = new MapViewport(); vp.setBounds(WORLD_1_1); vp.setEditable(false); grabLogger(); vp.setBounds(BIG_WORLD_1_1); String s = getLogOutput(); assertTrue(s.contains("Ignored call to setBounds")); assertTrue(WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL)); releaseLogger(); }
@Test public void boundsChangeWithScreenArea() { MapViewport vp = new MapViewport(true); vp.setScreenArea(SCREEN_1_1); vp.setBounds(WORLD_1_1); vp.setScreenArea(SCREEN_2_1); ReferencedEnvelope expectedBounds = new ReferencedEnvelope( WORLD_1_1.getMinX(), WORLD_1_1.getMaxX() + WORLD_1_1.getWidth(), WORLD_1_1.getMinY(), WORLD_1_1.getMaxY(), WORLD_1_1.getCoordinateReferenceSystem()); assertTrue(expectedBounds.boundsEquals2D(vp.getBounds(), TOL)); }
@Test public void booleanCtor() { MapViewport vp = new MapViewport(true); assertTrue(vp.isEmpty()); assertTrue(vp.isMatchingAspectRatio()); assertTrue(vp.getBounds().isEmpty()); assertTrue(vp.getScreenArea().isEmpty()); }
@Test public void testLineDoubleDash() throws Exception { StreamingRenderer renderer = setupLineMap("lineDoubleDash.sld"); MapViewport viewport = renderer.getMapContent().getViewport(); ReferencedEnvelope re = viewport.getBounds(); ReferencedEnvelope shifted = new ReferencedEnvelope( re.getMinX() + 2, re.getMaxX() - 3, re.getMinY() + 2, re.getMaxY() - 3, re.getCoordinateReferenceSystem()); viewport.setBounds(shifted); BufferedImage image = RendererBaseTest.showRender( "Lines with double dash array (2 fts)", renderer, TIME, shifted); ImageAssert.assertEquals(file("doubleDash"), image, 10); }
@Test public void fullCtor() { MapViewport vp = new MapViewport(WORLD_1_1, true); assertTrue(vp.isEmpty()); assertTrue(vp.isMatchingAspectRatio()); assertTrue(vp.getScreenArea().isEmpty()); assertTrue(WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL)); }
@Test public void boundsCtor() { MapViewport vp = new MapViewport(WORLD_1_1); assertTrue(vp.isEmpty()); assertFalse(vp.isMatchingAspectRatio()); assertTrue(vp.getScreenArea().isEmpty()); assertTrue(WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL)); }
@Test public void defaultCtor() { MapViewport vp = new MapViewport(); assertFalse(vp.isMatchingAspectRatio()); assertTrue(vp.isEmpty()); assertTrue(vp.getBounds().isEmpty()); assertTrue(vp.getScreenArea().isEmpty()); assertNull(vp.getCoordinateReferenceSystem()); }
@Test public void coordinateTransform_MatchingAspectRatioEnabled() throws Exception { MapViewport vp = new MapViewport(true); // world and screen bounds with different aspect ratios final Rectangle screen = SCREEN_2_1; vp.setBounds(WORLD_1_1); vp.setScreenArea(screen); ReferencedEnvelope actualWorld = vp.getBounds(); double[] screenXY = { screen.getMinX(), screen.getMinY(), screen.getMaxX(), screen.getMaxY() }; double[] worldXY = new double[screenXY.length]; vp.getScreenToWorld().transform(screenXY, 0, worldXY, 0, screenXY.length / 2); assertEquals(actualWorld.getMinX(), worldXY[0], TOL); assertEquals(actualWorld.getMaxY(), worldXY[1], TOL); assertEquals(actualWorld.getMaxX(), worldXY[2], TOL); assertEquals(actualWorld.getMinY(), worldXY[3], TOL); }