55import org .geoscript .js .geom .Geometry ;
66import org .geoscript .js .geom .Point ;
77import org .geoscript .js .proj .Projection ;
8- import org .geotools .coverage .grid .GridCoordinates2D ;
9- import org .geotools .coverage .grid .GridCoverage2D ;
10- import org .geotools .coverage .grid .GridEnvelope2D ;
11- import org .geotools .coverage .grid .GridGeometry2D ;
8+ import org .geotools .coverage .Category ;
9+ import org .geotools .coverage .GridSampleDimension ;
10+ import org .geotools .coverage .grid .*;
1211import org .geotools .coverage .processing .CoverageProcessor ;
1312import org .geotools .geometry .DirectPosition2D ;
1413import org .geotools .geometry .jts .ReferencedEnvelope ;
1514import org .geotools .process .raster .RangeLookupProcess ;
15+ import org .geotools .util .NumberRange ;
1616import org .jaitools .numeric .Range ;
1717import org .mozilla .javascript .*;
1818import org .mozilla .javascript .annotations .JSConstructor ;
2525import org .opengis .referencing .crs .CoordinateReferenceSystem ;
2626import org .opengis .referencing .operation .TransformException ;
2727
28+ import javax .media .jai .RasterFactory ;
29+ import java .awt .*;
30+ import java .awt .image .DataBuffer ;
31+ import java .awt .image .WritableRaster ;
2832import java .util .*;
33+ import java .util .List ;
2934
3035public class Raster extends GeoObject implements Wrapper {
3136
@@ -218,6 +223,25 @@ public Object getMaxValue(int band) {
218223 return maxValue ;
219224 }
220225
226+ @ JSGetter
227+ public NativeArray getBlockSize () {
228+ int [] size = this .coverage .getOptimalDataBlockSizes ();
229+ return (NativeArray ) javaToJS (Arrays .asList (
230+ size [0 ],
231+ size [1 ]
232+ ), this .getParentScope ());
233+ }
234+
235+ @ JSGetter
236+ public NativeArray getPixelSize () {
237+ Bounds bounds = this .getBounds ();
238+ NativeArray size = this .getSize ();
239+ return (NativeArray ) javaToJS (Arrays .asList (
240+ ((double ) bounds .getWidth ()) / ((int )size .get (0 )),
241+ ((double ) bounds .getHeight ()) / ((int )size .get (1 ))
242+ ), this .getParentScope ());
243+ }
244+
221245 private int getInt (Object obj ) {
222246 if (obj instanceof Number ) {
223247 return ((Number )obj ).intValue ();
@@ -238,10 +262,44 @@ public Object unwrap() {
238262
239263 @ JSConstructor
240264 public static Object constructor (Context cx , Object [] args , Function ctorObj , boolean inNewExpr ) {
265+ NativeArray data = (NativeArray ) args [0 ];
266+ Bounds bounds = (Bounds ) args [1 ];
267+
268+ double min = Double .MAX_VALUE ;
269+ double max = Double .MIN_VALUE ;
270+ float [][] matrix = new float [(int ) data .getLength ()][ (int ) (data .getLength () > 0 ? ((NativeArray ) data .get (0 )).getLength () : 0 )];
271+ for (int i = 0 ; i <data .getLength (); i ++) {
272+ NativeArray datum = (NativeArray ) data .get (i );
273+ for (int j = 0 ; j <datum .getLength (); j ++) {
274+ float value = ((Number )datum .get (j )).floatValue ();
275+ if (!Float .isNaN (value ) && value < min ) {
276+ min = value ;
277+ }
278+ if (!Float .isNaN (value ) && value > max ) {
279+ max = value ;
280+ }
281+ matrix [i ][j ] = value ;
282+ }
283+ }
284+
285+ int width = matrix [0 ].length ;
286+ int height = matrix .length ;
287+
288+ WritableRaster writableRaster = RasterFactory .createBandedRaster (DataBuffer .TYPE_FLOAT , width , height , 1 , null );
289+ for (int i = 0 ; i <width ; i ++) {
290+ for (int j = 0 ; j <height ; j ++) {
291+ writableRaster .setSample (i , j , 0 , matrix [j ][i ]);
292+ }
293+ }
294+
295+ GridCoverageFactory gridCoverageFactory = new GridCoverageFactory ();
296+ Category category = new Category ("Raster" , Color .BLACK , NumberRange .create (min , max ));
297+ GridSampleDimension gridSampleDimension = new GridSampleDimension ("Raster" , new Category []{category }, null );
298+ GridCoverage2D coverage = gridCoverageFactory .create ("Raster" , writableRaster , bounds .unwrap (), new GridSampleDimension []{gridSampleDimension });
241299 if (inNewExpr ) {
242- return new Raster (null );
300+ return new Raster (coverage );
243301 } else {
244- return new Raster (ctorObj .getParentScope (), null );
302+ return new Raster (ctorObj .getParentScope (), coverage );
245303 }
246304 }
247305
0 commit comments