Java Geotools:GridCoverage值为x的总面积

Java Geotools:GridCoverage值为x的总面积,java,geotools,Java,Geotools,我在使用Java的Geotools中工作。 到目前为止,我有一个GridCoverage 2D和一个几何体列表。 GridCoverage 2D是一个数字高程模型,源自geotiff。 在这之前一切都很顺利 现在我想得到每个多边形的面积,其中高程有一定的值。 例如,对于该几何体,我想知道高程为27 m的总面积。 我怎样才能做到这一点 我不知道如何开始:( 我有两个选择: 将几何图形拆分为小部分(我如何做到这一点),为每个点获取中心点(我可以做到这一点)然后评估这个GridCoverage 2D

我在使用Java的Geotools中工作。 到目前为止,我有一个GridCoverage 2D和一个几何体列表。 GridCoverage 2D是一个数字高程模型,源自geotiff。 在这之前一切都很顺利

现在我想得到每个多边形的面积,其中高程有一定的值。 例如,对于该几何体,我想知道高程为27 m的总面积。 我怎样才能做到这一点

我不知道如何开始:(

我有两个选择:

  • 将几何图形拆分为小部分(我如何做到这一点),为每个点获取中心点(我可以做到这一点)然后评估这个GridCoverage 2D。这样我就有了一个包含非常小的几何体的列表,以及每个几何体对应的高程。进一步需要一些数组魔法。这是一个好的计划吗?我如何快速地将几何体拆分成小部分
  • 使用过滤器/查询。但我不知道它是如何工作的,教程也没有帮助。甚至可以用过滤器实现我想要的吗

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

因此,假设您已经阅读或创建了一个覆盖范围:

 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;
}
private double selectCells(gridcoverage二维cov,int值){
GridGeometry2D geom=cov.getGridGeometry();
//cov.show();
最终操作JAI op=新操作JAI(“直方图”);
ParameterValueGroup params=op.getParameters();
网格覆盖2D覆盖;
参数参数(“源”).setValue(cov);
覆盖率=(GridCoverage2D)op.doOperation(参数,null);
javax.media.jai.hist=(直方图)覆盖率
.getProperty(“直方图”);
int total=hist.getSubTotal(0,value,value);
双面积=钙质电池(geom);
单位单位=cov.getCoordinateReferenceSystem().getCoordinateSystem()
.getAxis(0.getUnit();
System.out.println(“它给出了”+(面积*总面积)+“”+单位
+“^2有值的区域”+值);
返回区*总面积;
}
专用双计算单元(GridGeometry2D geom){
GridEnvelope gridRange=geom.getGridRange();
int width=gridRange.getHigh(0)-gridRange.getLow(0)+1;//允许
int height=gridRange.getHigh(1)-gridRange.getLow(1)+1;//0行/col
信封信封=geom.getEnvelope();
double dWidth=信封.getMaximum(0)-信封.getMinimum(0);
double dHeight=信封.getMaximum(1)-信封.getMinimum(1);
双单元格宽度=宽度/宽度;
双格高度=dHeight/高度;
返回单元格宽度*单元格高度;
}
显然,如果你打算多次调用它,你可以缓存直方图和单元格大小。

再见, 另一个选择是使用分区统计操作,或者更好地使用该过程

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

该进程位于不受支持的进程中:


我希望这能有所帮助。

先生,您是一位真正的英雄!