final MathTransform2D transform = gg2D.getGridToCRS2D(PixelOrientation.CENTER);
if (!(transform instanceof AffineTransform2D)) {
throw new IllegalStateException("Invalid grid to worl provided:"
+ transform.toString());
}
final AffineTransform2D g2W = (AffineTransform2D) transform;
// Origin
// we use ULC as per our G2W transformation
final AttributesImpl pointAttr = new AttributesImpl();
pointAttr.addAttribute("", "gml:id", "gml:id", "", "p00_" + gcName);
pointAttr.addAttribute("", "srsName", "srsName", "", srsName);
start("gml:origin");
start("gml:Point", pointAttr);
element("gml:pos",
axesSwap ? g2W.getTranslateY() + " " + g2W.getTranslateX() : g2W
.getTranslateX() + " " + g2W.getTranslateY());
end("gml:Point");
end("gml:origin");
// Offsets
final AttributesImpl offsetAttr = new AttributesImpl();
offsetAttr.addAttribute("", "srsName", "srsName", "", srsName);
// notice the orientation of the transformation I create. The origin of the coordinates
// in this grid is not at UPPER LEFT like in our grid to world but at LOWER LEFT !!!
element("gml:offsetVector",
Double.valueOf(axesSwap ? g2W.getShearX() : g2W.getScaleX()) + " "
+ Double.valueOf(axesSwap ? g2W.getScaleX() : g2W.getShearX()),
offsetAttr);
element("gml:offsetVector",
Double.valueOf(axesSwap ? g2W.getScaleY() : g2W.getShearY()) + " "
+ Double.valueOf(axesSwap ? g2W.getShearY() : g2W.getScaleY()),
offsetAttr);
end("gml:RectifiedGrid");
end("gml:domainSet");
}