2015-01-04 4 views
1

Java로 Geotools에서 작업하고 있습니다. 지금까지 GridCoverage2D와 List of Geometries가 있습니다. GridCoverage2D는 지오 티프 (geotiff)에서 비롯된 디지털 고도 모델입니다. 모든 것이 여기까지 잘 작동합니다.Geotools : GridCoverage의 값이 x 인 총 영역

이제 표고에 특정 값이있는 각 다각형의 영역을 가져 오려고합니다. 예를 들어,이 기하학의 경우 표고가 27m 인 총 면적을 알고 싶습니다. 어떻게해야합니까? 작은 부품에서

  • 분할 지오메트리 (나는이 작업을 수행 할 방법), 각 포인트에 대한 중심을 얻을 :

    어떻게 시작하는 :(내가 가진

    두 가지 옵션을 염두에 단서가 없다 포인트 (내가 할 수있는) GridCoverage2D를 평가하면 아주 작은 지오메트리와 각 지오메트리에 해당하는 표고가있는 목록이 있습니다. 일부 배열 마법은 모두 더 필요한 것입니다. 좋은 계획입니까? 작은 부품으로 지오메트리를 빠르게 분할 했습니까?

  • 필터/쿼리를 사용합니다. ks와 튜토리얼은 도움이되지 않습니다. 필터로 원하는 것을 얻을 수 있습니까?

답변

0

이것은 내가 예상했던 것보다 힘들 것으로 판명되었는데, 이는 분명히 뭔가를 놓쳤다는 것을 의미합니다. 범위의 히스토그램을 작성하고 값을 포함하는 저장소를 선택하여 문제를 해결할 수 있습니다. 총 셀 수를 셀 영역으로 곱하면됩니다.

그래서 당신이 읽거나 범위를 만든 가정 :

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

을 분명히 당신은 히스토그램과 cellsize을 캐시 할 수 있습니다 번 이상을 호출 계획합니다.

+0

당신은 진정한 영웅입니다! – jeanke

+0

솔직히 말해서 나는 그것에 만족하지 않습니다. 그러나 그것은 효과적이다. –

1