Search code examples
javageotools

Java geotools how to create coverage grid


How to create grid coverage when each cell is 5M ? I found this :

    GridCoverage2D coverage = reader.read(null);

    // direct access
    DirectPosition position = new DirectPosition2D(crs, x, y);

    double[] sample = (double[]) coverage.evaluate(position); // assume double

    // resample with the same array
    sample = coverage.evaluate(position, sample);

Source : https://docs.geotools.org/latest/userguide/library/coverage/grid.html

I didn't found a lot of tutorial about how to create grid coverage on geotools...


Solution

  • To create an empty coverage you need to use the GridCoverageFactory and one of the create methods. Since you are not constructing from an existing image you need to provide some memory for your raster to be stored in (this can also hold any initial values you want). For this your choices are a float[][] or a WritableRaster. Finally, you need a Envelope to say where the coverage is and what it's resolution is (otherwise it is just an array of numbers), I favour using a ReferencedEnvelope so that I know what the units are etc, so in the example below I have used EPSG:27700 which is the OSGB national grid so I know that it is in metres and I can define the origin somewhere in the South Downs. By specifying the lower left X and Y coordinates and the upper right X and Y as resolution times the width and height (plus the lower left corner) the maths all works out to make sure that the size of my pixels is resolution.

    So keeping it simple for now you could do something like:

        float[][] data;
        int width = 100;
        int height = 200;
        data = new float[width][height];
        int resolution = 5;
        for(int i=0;i<width;i++){
            for(int j=0;j<height;j++ ){
                data[i][j] = 0.0f;
            }
        }
        GridCoverageFactory gcf = new GridCoverageFactory();
        CoordinateReferenceSystem crs = CRS.decode("EPSG:27700");
        int llx = 500000;
        int lly = 105000;
    
        ReferencedEnvelope referencedEnvelope = new ReferencedEnvelope(llx, llx + (width * resolution), lly, lly + (height * resolution),
                crs);
        GridCoverage2D gc = gcf.create("name", data, referencedEnvelope);
    

    If you want more bands in your coverage then you need to use a WriteableRaster as the base for your coverage.

    WritableRaster raster2 = RasterFactory.createBandedRaster(java.awt.image.DataBuffer.TYPE_INT, width,
        height, 3, null);
    for (int i = 0; i < width; i++) {//width...
    
            for (int j = 0; j < height; j++) {
                    raster2.setSample(i, j, 0, rn.nextInt(200));
                    raster2.setSample(i, j, 1, rn.nextInt(200));
                    raster2.setSample(i, j, 2, rn.nextInt(200));
            }
    }