Hi,
sorry for the cross post, but we’re close to RC1 and a user just reported
an issue of some gravity.
The current OGC scale computation code is:
public static double calculateOGCScale(ReferencedEnvelope envelope, int imageWidth, Map hints) {
// if it’s geodetic, we’re dealing with lat/lon unit measures
if(envelope.getCoordinateReferenceSystem() instanceof GeographicCRS) {
return (envelope.getWidth() * OGC_DEGREE_TO_METERS) / (imageWidth / getDpi(hints) * 0.0254);
} else {
return envelope.getWidth() / (imageWidth / getDpi(hints) * 0.0254);
}
}
Now, the geographic crs case is using a fixed conversion ratio that is given by OGC,
and that ends up dividing:
(envelope.getWidth() * OGC_DEGREE_TO_METERS) → meters
with:
imageWidth / getDpi(hints) * 0.0254 → meters
However, in the case of projected CRS, we end up with:
envelope.getWidth() → meters, feet, whatever the unit of measure of the rendering is
over
(imageWidth / getDpi(hints) * 0.0254) → meters
Which means, when computing the scale on projected CRS using anything but meters,
we get a wrong value (e.g., if it’s feet, 3 times off…)
Now, the fix is somehow obvious (we just ask Unit to provide the conversion factor),
but the consequences are not: every SLD and every scale dependent code in general
will end up being affected, and quite a bit so, but this fix.
I propose that we add a system variable to control the unit conversion, and
leave it on by default on trunk (that is, in RC1 too), and leave it dormant on
the stable series. People will still be able to switch it on and off manually
using the system variable, e.g.
-Dorg.geotoools.render.lite.scale.unitCompensation=true
What do you think?
Cheers
Andrea
–
==
GeoServer Professional Services from the experts! Visit
http://goo.gl/NWWaa2 for more information.
==
Ing. Andrea Aime
@geowolf
Technical Lead
GeoSolutions S.A.S.
Via Poggio alle Viti 1187
55054 Massarosa (LU)
Italy
phone: +39 0584 962313
fax: +39 0584 1660272
mob: +39 339 8844549
http://www.geo-solutions.it
http://twitter.com/geosolutions_it