Java geotools 如何创建覆盖网格

Java geotools how to create coverage grid

每个单元格为5M时如何创建网格覆盖? 我发现了这个:

    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);

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

我没有找到很多关于如何在 geotools 上创建网格覆盖的教程...

要创建空覆盖,您需要使用 GridCoverageFactorycreate 方法之一。由于您不是从现有图像构建,因此您需要为要存储的栅格提供一些内存(这也可以保存您想要的任何初始值)。为此,您的选择是 float[][]WritableRaster。最后,你需要一个 Envelope 来说明覆盖范围在哪里以及它的分辨率是多少(否则它只是一个数字数组),我喜欢使用 ReferencedEnvelope 这样我就知道单位是什么等等,所以在下面的示例中,我使用了 EPSG:27700,这是 OSGB 国家网格,所以我知道它以米为单位,我可以在 South Downs 的某个地方定义原点。通过将左下角的 X 和 Y 坐标以及右上角的 X 和 Y 指定为 resolution 乘以宽度和高度(加上左下角),所有数学运算都可以确保我的像素大小为 resolution.

因此,暂时保持简单,您可以执行以下操作:

    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);

如果您想要覆盖更多波段,则需要使用 WriteableRaster 作为覆盖范围的基础。

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));
        }
}