Rethink Shape.getArea(ctx)
Shape: double getArea(SpatialContext ctx); -- kinda kludgy in hindsight now. The fact that the semantics vary depending on ctx being null or not is the big issue. A shape always has a ctx now so it's odd to pass one in.
Perhaps a separate AreaCalculator class could know how to calculate the area for most/all classes, and wether geo or not. I've somewhat tried to keep non-trivial mathematical operations (e.g trigonometry) out of the shapes and into the distance-calculator class / DistanceUtils. The tricky thing is that the non-geo area is needed for JtsGeometry (geo) when it estimates its area against the area of the bounding box.
A possible solution is having static getArea(shape) methods on various classes, in addition to the instance method declared on Shape. The instance method will usually do a simple one-liner to the appropriate static method.