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); } }
private boolean isNotEmpty(ReferencedEnvelope envelope) { return !envelope.isEmpty() && !envelope.isNull() && envelope.getWidth() > 0 && envelope.getHeight() > 0; }
/** * 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; }
/** * This method performs the computation using the methods suggested by the OGC SLD * specification, page 26. * * <p>In GeoTools 12 this method started to take into account units of measure, if this is not * desirable in your application you can set the system variable * "org.geotoools.render.lite.scale.unitCompensation" to false. * * @param envelope * @param imageWidth * @return */ public static double calculateOGCScale(ReferencedEnvelope envelope, int imageWidth, Map hints) { // if it's geodetic, we're dealing with lat/lon unit measures CoordinateReferenceSystem crs = envelope.getCoordinateReferenceSystem(); double width = envelope.getWidth(); double widthMeters = toMeters(width, crs); return widthMeters / (imageWidth / getDpi(hints) * 0.0254); }
@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); }
/** * 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_2_1() { double w = WORLD_1_1.getWidth(); ReferencedEnvelope expected = new ReferencedEnvelope( WORLD_1_1.getMinX() - w / 2, WORLD_1_1.getMaxX() + w / 2, WORLD_1_1.getMinY(), WORLD_1_1.getMaxY(), WORLD_1_1.getCoordinateReferenceSystem()); assertAspectCorrection(SCREEN_2_1, expected); }
@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 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 testQueryWrappingMercatorSeparate() throws Exception { ReferencedEnvelope world = new ReferencedEnvelope(160, 180, -40, 40, WGS84); ReferencedEnvelope mercatorEnvelope = world.transform(MERCATOR, true); // move it so that it crosses the dateline mercatorEnvelope.translate(mercatorEnvelope.getWidth() / 2, 0); // get query area, we expect two separate query envelopes ProjectionHandler handler = ProjectionHandlerFinder.getHandler(mercatorEnvelope, WGS84, true); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(2, envelopes.size()); ReferencedEnvelope reOrig = envelopes.get(0); // original assertEquals(170.0, reOrig.getMinX(), EPS); assertEquals(180.0, reOrig.getMaxX(), EPS); ReferencedEnvelope reAdded = envelopes.get(1); // added assertEquals(-180.0, reAdded.getMinX(), EPS); assertEquals(-170.0, reAdded.getMaxX(), EPS); }
@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 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); }