Details

Type: Bug

Status: Closed

Priority: Minor

Resolution: Fixed

Affects Version/s: 4.0

Component/s: modules/spatial

Labels:None

Lucene Fields:New
Description
When a shape is given to a PrefixTreeStrategy (index or query time), it needs to know how many levels down the prefix tree to go for a target precision (distErrPct). distErrPct is basically a fraction of the radius of the shape, defaulting to 2.5% (0.0025).
If the shape presented is extremely wide, > 180 degrees, then the internal calculations in SpatialArgs.calcDistanceFromErrPct(...) will wrongly measure the shape's size as having width < 180 degrees, yielding more accuracy than intended. Given that this happens for unrealistic shape sizes and results in more accuracy, I am flagging this as "minor", but a bug nonetheless. Indeed, this was discovered as a result of someone using lucenespatial incorrectly, not for an actual shape they have. But in the extreme [erroneous] case they had, they had 566k terms generated, when it should have been ~1k tops.
A solution is to calculate the distance from a bbox corner to its center, instead of the current algorithm which takes half of the distance from opposite corners. The only small issue to consider is that the distance from a bbox corner to its center will vary up to ~4x (worse case) depending on wether you take a top corner or bottom corner, so I could do both and take the shorter (resulting in a little more accuracy than taking the longer).