expandBy = 0.0001; if (bounds.getWidth() == 0 || bounds.getHeight() == 0) { bounds.expandBy(expandBy);
/** * Returns the envelope length along the specified dimension. This length is equals to the * maximum ordinate minus the minimal ordinate. */ public double getSpan(final int dimension) { switch (dimension) { case 0: return getWidth(); case 1: return getHeight(); default: throw new IndexOutOfBoundsException(String.valueOf(dimension)); } }
/** * Calculates transforms suitable for no aspect ratio matching. * * @param requestedBounds requested display area in world coordinates */ private void calculateSimpleTransforms(ReferencedEnvelope requestedBounds) { double xscale = screenArea.getWidth() / requestedBounds.getWidth(); double yscale = screenArea.getHeight() / requestedBounds.getHeight(); worldToScreen = new AffineTransform( xscale, 0, 0, -yscale, -xscale * requestedBounds.getMinX(), yscale * requestedBounds.getMaxY()); try { screenToWorld = worldToScreen.createInverse(); } catch (NoninvertibleTransformException ex) { throw new RuntimeException("Unable to create coordinate transforms.", ex); } }
/** * Calculates transforms suitable for aspect ratio matching. The world bounds will be centred in * the screen area. */ private void calculateCenteringTransforms() { double xscale = screenArea.getWidth() / bounds.getWidth(); double yscale = screenArea.getHeight() / bounds.getHeight(); double scale = Math.min(xscale, yscale); double xoff = bounds.getMedian(0) * scale - screenArea.getCenterX(); double yoff = bounds.getMedian(1) * scale + screenArea.getCenterY(); worldToScreen = new AffineTransform(scale, 0, 0, -scale, -xoff, yoff); try { screenToWorld = worldToScreen.createInverse(); } catch (NoninvertibleTransformException ex) { throw new RuntimeException("Unable to create coordinate transforms.", ex); } hasCenteringTransforms = true; }
private boolean isNotEmpty(ReferencedEnvelope envelope) { return !envelope.isEmpty() && !envelope.isNull() && envelope.getWidth() > 0 && envelope.getHeight() > 0; }
@Test public void testEmptyBounds() throws Exception { // test the bounds of a single point Catalog cat = getCatalog(); FeatureTypeInfo fti = cat.getFeatureTypeByName(toString(MockData.POINTS)); assertEquals( Point.class, fti.getFeatureType().getGeometryDescriptor().getType().getBinding()); assertEquals(1, fti.getFeatureSource(null, null).getCount(Query.ALL)); CatalogBuilder cb = new CatalogBuilder(cat); cb.setStore(cat.getStoreByName(MockData.CGF_PREFIX, DataStoreInfo.class)); FeatureTypeInfo built = cb.buildFeatureType(fti.getQualifiedName()); cb.setupBounds(built); assertTrue(built.getNativeBoundingBox().getWidth() > 0); assertTrue(built.getNativeBoundingBox().getHeight() > 0); }
/** Execute the GetMap request */ GridCoverage2D getMap(ReferencedEnvelope requestedEnvelope, int width, int height, String time) throws IOException { // build the request ReferencedEnvelope gridEnvelope = initTileRequest(requestedEnvelope, width, height, time); // issue the request and wrap response in a grid coverage try { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log( Level.FINE, "Issuing request: " + getTileRequest().getFinalURL(), new RuntimeException("TRACE!")); } BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); getTileRequest().setCRS(gridEnvelope.getCoordinateReferenceSystem()); Set<Tile> responses = wmts.issueRequest(getTileRequest()); double xscale = width / requestedEnvelope.getWidth(); double yscale = height / requestedEnvelope.getHeight(); double scale = Math.min(xscale, yscale); double xoff = requestedEnvelope.getMedian(0) * scale - width / 2; double yoff = requestedEnvelope.getMedian(1) * scale + height / 2; // C ould we use RenderUtilities here? AffineTransform worldToScreen = new AffineTransform(scale, 0, 0, -scale, -xoff, yoff); renderTiles(responses, image.createGraphics(), requestedEnvelope, worldToScreen); return gcf.create(layer.getTitle(), image, gridEnvelope); } catch (ServiceException e) { throw new IOException("GetMap failed", e); } }
/** * Creates {@code count} point features positioned randomly in the given envelope. * * @param env bounding envelope * @param count number of features to create */ private void createPointFeatures(ReferencedEnvelope env, int count) { for (int i = 0; i < count; i++) { double x = WORLD.getMinX() + rand.nextDouble() * WORLD.getWidth(); double y = WORLD.getMinY() + rand.nextDouble() * WORLD.getHeight(); featureList.add(createPointFeature(x, y)); } featureCollection = new ListFeatureCollection(TYPE, featureList); }
@Test public void testBounds() throws Exception { ReferencedEnvelope bounds2d = point_test_2d.getBounds(); ReferencedEnvelope bounds3d = point_test.getBounds(); double aspect2d = bounds2d.getWidth() / bounds2d.getHeight(); double aspect3d = bounds3d.getWidth() / bounds3d.getHeight(); assertEquals(aspect2d, aspect3d, 0.0005); ReferencedEnvelope bbox2d = JTS.toGeographic(bounds2d); ReferencedEnvelope bbox3d = JTS.toGeographic(bounds3d); aspect2d = bbox2d.getWidth() / bbox2d.getHeight(); aspect3d = bbox3d.getWidth() / bbox3d.getHeight(); assertEquals(aspect2d, aspect3d, 0.000005); }
private void checkPadding( Rectangle screenSize, ReferencedEnvelope requestedEnvelope, int padding) throws FactoryException, IOException { // Setup padding Hints Hints hints = new Hints(GridCoverageRenderer.PADDING, padding); GridCoverageReaderHelper helper = new GridCoverageReaderHelper( worldReader, screenSize, requestedEnvelope, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), hints); // Get the read envelope which should have been expanded by padding ReferencedEnvelope readEnvelope = helper.getReadEnvelope(); assertEquals(requestedEnvelope.getWidth() + padding * 2, readEnvelope.getWidth(), DELTA); assertEquals(requestedEnvelope.getHeight() + padding * 2, readEnvelope.getHeight(), DELTA); }
@Test public void testNullSymbolizer() throws Exception { CoordinateReferenceSystem googleMercator = CRS.decode("EPSG:3857"); ReferencedEnvelope mapExtent = new ReferencedEnvelope( -20037508.34, 20037508.34, -20037508.34, 20037508.34, googleMercator); Rectangle screenSize = new Rectangle(200, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 200)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer(googleMercator, mapExtent, screenSize, w2s); GridCoverage2D coverage = worldReader.read(null); RenderedImage image = renderer.renderImage( coverage, null, Interpolation.getInstance(Interpolation.INTERP_BICUBIC), Color.RED, 256, 256); File reference = new File( "src/test/resources/org/geotools/renderer/lite/gridcoverage2d/googleMercatorBicubic.png"); ImageAssert.assertEquals(reference, image, 0); }
@Test public void setBoundsWithAspectCorrection_1_2() { double h = WORLD_1_1.getHeight(); ReferencedEnvelope expected = new ReferencedEnvelope( WORLD_1_1.getMinX(), WORLD_1_1.getMaxX(), WORLD_1_1.getMinY() - h / 2, WORLD_1_1.getMaxY() + h / 2, WORLD_1_1.getCoordinateReferenceSystem()); assertAspectCorrection(SCREEN_1_2, expected); }
@Test public void testInterpolationBicubic() throws Exception { CoordinateReferenceSystem googleMercator = CRS.decode("EPSG:3857"); ReferencedEnvelope mapExtent = new ReferencedEnvelope( -20037508.34, 20037508.34, -20037508.34, 20037508.34, googleMercator); Rectangle screenSize = new Rectangle(200, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 200)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer(googleMercator, mapExtent, screenSize, w2s); RasterSymbolizer rasterSymbolizer = new StyleBuilder().createRasterSymbolizer(); GridCoverage2D coverage = worldReader.read(null); RenderedImage image = renderer.renderImage( coverage, rasterSymbolizer, Interpolation.getInstance(Interpolation.INTERP_BICUBIC), Color.RED, 256, 256); File reference = new File( "src/test/resources/org/geotools/renderer/lite/gridcoverage2d/googleMercatorBicubic.png"); ImageAssert.assertEquals(reference, image, 0); }
@Test public void testAcrossDatelineBicubic() throws Exception { ReferencedEnvelope mapExtent = new ReferencedEnvelope(10, 350, -90, 90, DefaultGeographicCRS.WGS84); Rectangle screenSize = new Rectangle(500, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 500)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer(DefaultGeographicCRS.WGS84, mapExtent, screenSize, w2s); RasterSymbolizer rasterSymbolizer = new StyleBuilder().createRasterSymbolizer(); RenderedImage image = renderer.renderImage( worldReader, null, rasterSymbolizer, Interpolation.getInstance(Interpolation.INTERP_BICUBIC), Color.RED, 256, 256); File reference = new File( "src/test/resources/org/geotools/renderer/lite/gridcoverage2d/wrapDatelineBicubic.png"); ImageAssert.assertEquals(reference, image, 0); }
@Test public void testAcrossDatelineBilinear() throws Exception { ReferencedEnvelope mapExtent = new ReferencedEnvelope(10, 350, -90, 90, DefaultGeographicCRS.WGS84); Rectangle screenSize = new Rectangle(500, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 500)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer(DefaultGeographicCRS.WGS84, mapExtent, screenSize, w2s); RasterSymbolizer rasterSymbolizer = new StyleBuilder().createRasterSymbolizer(); RenderedImage image = renderer.renderImage( worldReader, null, rasterSymbolizer, Interpolation.getInstance(Interpolation.INTERP_NEAREST), Color.RED, 256, 256); File reference = new File( "src/test/resources/org/geotools/renderer/lite/gridcoverage2d/wrapDatelineNearest.png"); ImageAssert.assertEquals(reference, image, 20); }
@Test public void testIndexedWithNoBackground() throws Exception { CoordinateReferenceSystem googleMercator = CRS.decode("EPSG:3857"); ReferencedEnvelope mapExtent = new ReferencedEnvelope( -20037508.34, 20037508.34, -20037508.34, 20037508.34, googleMercator); Rectangle screenSize = new Rectangle(200, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 200)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer(googleMercator, mapExtent, screenSize, w2s); RasterSymbolizer rasterSymbolizer = new StyleBuilder().createRasterSymbolizer(); RenderedImage image = renderer.renderImage( worldPaletteReader, null, rasterSymbolizer, Interpolation.getInstance(Interpolation.INTERP_BICUBIC), null, 256, 256); assertNotNull(image); }
@Test public void testReprojectGoogleMercator() throws Exception { CoordinateReferenceSystem googleMercator = CRS.decode("EPSG:3857"); ReferencedEnvelope mapExtent = new ReferencedEnvelope( -20037508.34, 20037508.34, -20037508.34, 20037508.34, googleMercator); Rectangle screenSize = new Rectangle(200, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 200)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer(googleMercator, mapExtent, screenSize, w2s); RasterSymbolizer rasterSymbolizer = new StyleBuilder().createRasterSymbolizer(); GridCoverage2D coverage = worldReader.read(null); RenderedImage image = renderer.renderImage( coverage, rasterSymbolizer, Interpolation.getInstance(Interpolation.INTERP_NEAREST), Color.RED, 256, 256); // always set ROI on reprojection assertThat(image.getProperty("roi"), instanceOf(ROI.class)); File reference = new File( "src/test/resources/org/geotools/renderer/lite/gridcoverage2d/googleMercator.png"); ImageAssert.assertEquals(reference, image, 0); }
@Test public void testCoverage_0_360() throws Exception { CoordinateReferenceSystem crs = CRS.decode("EPSG:4326", true); ReferencedEnvelope mapExtent = new ReferencedEnvelope(100, 260, -90, 90, crs); Rectangle screenSize = new Rectangle(400, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 400)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer( mapExtent.getCoordinateReferenceSystem(), mapExtent, screenSize, w2s); RasterSymbolizer rasterSymbolizer = new StyleBuilder().createRasterSymbolizer(); RenderedImage image = renderer.renderImage( worldReader_0_360, null, rasterSymbolizer, Interpolation.getInstance(Interpolation.INTERP_NEAREST), Color.BLACK, 256, 256); assertNotNull(image); File reference = new File( "src/test/resources/org/geotools/renderer/lite/gridcoverage2d/world_0_360.png"); ImageAssert.assertEquals(reference, image, 10); }
@Test public void addFeatureExpandsBounds() { createPointFeaturesAtCorners(WORLD); double x = WORLD.getMaxX() + WORLD.getWidth(); double y = WORLD.getMaxY() + WORLD.getHeight(); featureCollection.add(createPointFeature(x, y)); ReferencedEnvelope bounds = featureCollection.getBounds(); assertEquals(x, bounds.getMaxX(), TOL); assertEquals(y, bounds.getMaxY(), TOL); }