private static Rectangle2D createMapBoundary(final Product product, CoordinateReferenceSystem targetCrs) {
try {
final CoordinateReferenceSystem sourceCrs = product.getGeoCoding().getImageCRS();
final int sourceW = product.getSceneRasterWidth();
final int sourceH = product.getSceneRasterHeight();
final Rectangle2D rect = XRectangle2D.createFromExtremums(0.5, 0.5, sourceW - 0.5, sourceH - 0.5);
int pointsPerSide = Math.max(sourceH, sourceW) / 10;
pointsPerSide = Math.max(9, pointsPerSide);
final ReferencedEnvelope sourceEnvelope = new ReferencedEnvelope(rect, sourceCrs);
final ReferencedEnvelope targetEnvelope = sourceEnvelope.transform(targetCrs, true, pointsPerSide);
double minX = targetEnvelope.getMinX();
double width = targetEnvelope.getWidth();
if (product.getGeoCoding().isCrossingMeridianAt180()) {
minX = -180.0;
width = 360;
}
return new Rectangle2D.Double(minX, targetEnvelope.getMinY(), width, targetEnvelope.getHeight());
} catch (Exception e) {
throw new IllegalStateException(e);
}
}