Geotools:GridCoverage 具有值 x 的总面积

Geotools: Total area where GridCoverage has value x

我正在与 Java 一起使用 Geotools。 到目前为止,我有一个 GridCoverage2D 和一个几何图形列表。 GridCoverage2D 是一个数字高程模型,源自 geotiff。 到这里为止一切正常。

现在我想获取具有特定高程值的每个多边形的面积。 例如,对于此几何图形,我想知道高程为 27 m 的总面积。 我怎样才能做到这一点?

我不知道如何开始:(

我有两个选择:

事实证明这比我预期的要难,这可能意味着我错过了一些明显的东西。您可以通过创建覆盖率直方图然后选择包含您的值的 bin 来解决问题。您需要做的就是将单元格总数乘以单元格面积。

所以假设您已经阅读或创建了报道:

 private double selectCells(GridCoverage2D cov, int value) {
    GridGeometry2D geom = cov.getGridGeometry();
    // cov.show();
    final OperationJAI op = new OperationJAI("Histogram");
    ParameterValueGroup params = op.getParameters();
    GridCoverage2D coverage;
    params.parameter("Source").setValue(cov);
    coverage = (GridCoverage2D) op.doOperation(params, null);
    javax.media.jai.Histogram hist = (Histogram) coverage
            .getProperty("histogram");

    int total = hist.getSubTotal(0, value, value);
    double area = calcAreaOfCell(geom);
    Unit<?> unit = cov.getCoordinateReferenceSystem().getCoordinateSystem()
            .getAxis(0).getUnit();
    System.out.println("which gives " + (area * total) + " " + unit
            + "^2 area with value " + value);
    return area * total;
}

private double calcAreaOfCell(GridGeometry2D geom) {
    GridEnvelope gridRange = geom.getGridRange();
    int width = gridRange.getHigh(0) - gridRange.getLow(0) + 1; // allow for the
    int height = gridRange.getHigh(1) - gridRange.getLow(1) + 1;// 0th row/col
    Envelope envelope = geom.getEnvelope();
    double dWidth = envelope.getMaximum(0) - envelope.getMinimum(0);
    double dHeight = envelope.getMaximum(1) - envelope.getMinimum(1);
    double cellWidth = dWidth / width;
    double cellHeight = dHeight / height;

    return cellWidth * cellHeight;
}

显然,如果您计划多次调用它,您可以缓存直方图和像元大小。

再见, 另一种选择是使用区域统计操作或更好的过程。

操作是覆盖模块的一部分:

https://github.com/geotools/geotools/blob/12.x/modules/library/coverage/src/main/java/org/geotools/coverage/processing/operation/ZonalStats.java https://github.com/geotools/geotools/blob/12.x/modules/library/coverage/src/test/java/org/geotools/coverage/processing/ZonalStasTest.java

进程在不受支持的进程光栅中: https://github.com/geotools/geotools/blob/12.x/modules/unsupported/process-raster/src/main/java/org/geotools/process/raster/RasterZonalStatistics.java https://github.com/geotools/geotools/blob/12.x/modules/unsupported/process-raster/src/test/java/org/geotools/process/raster/ZonalStatsProcessTest.java

希望对您有所帮助。