Skip to content

Commit b3d6d22

Browse files
committed
Add a RasterTileRenderer that creates tiles from a single raster.
1 parent 0a83207 commit b3d6d22

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package geoscript.layer
2+
3+
import geoscript.geom.Bounds
4+
5+
import javax.imageio.ImageIO
6+
import java.awt.image.BufferedImage
7+
8+
/**
9+
* Just render a Raster by resampling to the desired Bounds and Size.
10+
* @author Jared Erickson
11+
*/
12+
class RasterTileRenderer implements TileRenderer {
13+
14+
private final Raster raster
15+
16+
RasterTileRenderer(Raster raster) {
17+
this.raster = raster
18+
}
19+
20+
@Override
21+
byte[] render(Map options = [:], Bounds b) {
22+
Raster tileRaster = raster.resample(bbox: b, size: [options.get("width",256),options.get("height", 256)])
23+
BufferedImage image = tileRaster.getBufferedImage()
24+
def out = new ByteArrayOutputStream()
25+
ImageIO.write(image, options.get("type", "JPEG"), out)
26+
out.close()
27+
out.toByteArray()
28+
}
29+
30+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package geoscript.layer
2+
3+
import geoscript.geom.Bounds
4+
import geoscript.proj.Projection
5+
import org.junit.Rule
6+
import org.junit.Test
7+
import org.junit.rules.TemporaryFolder
8+
9+
import javax.imageio.ImageIO
10+
import java.awt.image.BufferedImage
11+
12+
import static org.junit.Assert.*
13+
14+
class RasterTileRendererTestCase {
15+
16+
@Rule
17+
public TemporaryFolder folder = new TemporaryFolder()
18+
19+
@Test
20+
void render() {
21+
// Read a Raster which is in EPSG:4326
22+
File file = new File(getClass().getClassLoader().getResource("raster.tif").toURI())
23+
assertNotNull(file)
24+
GeoTIFF geoTIFF = new GeoTIFF(file)
25+
Raster raster = geoTIFF.read()
26+
assertNotNull(raster)
27+
28+
// Resize and Reproject Raster to Web Mercator
29+
Projection latLonProj = new Projection("EPSG:4326")
30+
Projection mercatorProj = new Projection("EPSG:3857")
31+
Bounds latLonBounds = new Bounds(-179.99, -85.0511, 179.99, 85.0511, latLonProj)
32+
Raster webMercatorRaster = raster.resample(bbox: latLonBounds).reproject(mercatorProj)
33+
34+
// Generate a Tile
35+
RasterTileRenderer tileRenderer = new RasterTileRenderer(webMercatorRaster)
36+
Pyramid pyramid = Pyramid.createGlobalMercatorPyramid()
37+
byte[] bytes = tileRenderer.render(pyramid.bounds(new Tile(0,0,0)), size: [256,256])
38+
assertTrue(bytes.length > 0)
39+
40+
// Make sure it can be read as an Image
41+
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes))
42+
File outFile = folder.newFile("raster_0_0_0.jpeg")
43+
ImageIO.write(image, "JPEG", outFile)
44+
assertTrue(outFile.exists())
45+
assertTrue(outFile.length() > 0)
46+
}
47+
48+
}

0 commit comments

Comments
 (0)