package org.geotools.tile.nasa; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.IOException; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridCoverageFactory; import org.geotools.geometry.DirectPosition2D; import org.geotools.geometry.Envelope2D; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.tile.TileDraw; import org.geotools.tile.TileMap; import org.geotools.tile.TileMapInfo; import org.geotools.tile.TileSet; import org.geotools.tile.ZoomLevel; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.Envelope; public class WorldWindTileDraw extends TileDraw { int tile=0; private TileSet tileset; private Accessor accessor; static GridCoverageFactory factory = new GridCoverageFactory(); WorldWindTileDraw( TileSet tileset, Accessor accessor ){ this.tileset = tileset; this.accessor = accessor; } @Override public String name( int row, int col ) { String name = tileset.getTileMap().getInfo().getName(); name += tileset.getZoomLevel().getScaleDenominator(); name += "grid"+col+"x"+row; return name; } @Override public GridCoverage2D drawPlaceholder( int row, int col ) { Envelope2D rectangle = createRectangle( row, col ); RenderedImage image=createEmpty( row, col ); return factory.create( name(row,col), image, rectangle ); } @Override public GridCoverage2D drawTile( int row, int col ) { Envelope2D rectangle = createRectangle( row, col ); try { RenderedImage image = accessor.tileImage(tileset, row, col ); if (image == null ) { image=createEmpty( row, col ); } return factory.create( name(row,col), image, rectangle ); } catch (IOException error){ RenderedImage image=createImage( error ); return factory.create( error.getMessage(), image, rectangle ); } } private RenderedImage createImage( Throwable e ) { BufferedImage image = new BufferedImage( 90, 90, BufferedImage.TYPE_INT_ARGB ); Graphics2D g = (Graphics2D) image.getGraphics(); g.setColor( Color.RED ); String message = e.getMessage(); g.drawString( message, 30, 45 ); return image; } private Envelope2D createRectangle( int row, int col ){ ZoomLevel level = tileset.getZoomLevel(); TileMap tileMap = tileset.getTileMap(); TileMapInfo tileMapInfo = tileMap.getInfo(); CoordinateReferenceSystem crs = tileMapInfo.getCRS(); Envelope bounds = tileMapInfo.getBounds(); DirectPosition2D p1 = location(bounds, level, row, col); DirectPosition2D p2 = location(bounds , level, row + 1, col + 1); double w = p2.x - p1.x; double h = p2.y - p1.y; return new Envelope2D( tileMapInfo.getCRS(), p1.x, p1.y, w, h ); } /** Position in the provided ZoomLevel */ private DirectPosition2D location( Envelope bbox, ZoomLevel level, int row, int col ) { double dx = bbox.getWidth() * level.getColRatio(col); double dy = bbox.getHeight() * level.getRowRatio(row); double x = bbox.getMinX() + dx; double y = bbox.getMinY() + dy; return new DirectPosition2D(DefaultGeographicCRS.WGS84, x, y); } BufferedImage empty; RenderedImage createEmpty( int row, int col ){ if( empty != null ) return empty; empty = new BufferedImage( 45, 45, BufferedImage.TYPE_INT_ARGB ); Graphics2D g = (Graphics2D) empty.getGraphics(); g.setColor( Color.BLACK ); String message = "x"; g.drawString( message, 30, 45 ); return empty; } RenderedImage createImage( int row, int col ){ BufferedImage image = new BufferedImage( 45, 45, BufferedImage.TYPE_INT_ARGB ); Graphics2D g = (Graphics2D) image.getGraphics(); g.setColor( Color.BLACK ); String message = row+"x"+col; g.drawString( message, 30, 45 ); return image; } }