[postgis-users] PostGIS layer spatial tolerance
Chris Hermansen
chris.hermansen at timberline.ca
Fri Aug 28 08:59:09 PDT 2009
Oxenstierna Andreas wrote:
> I come from the ESRI and Oracle world. Both ArcSDE and Oracle Spatial
> have user-defined spatial tolerance for each spatially enabled layer.
> This ensures that coordinates are exact, down to the last decimal (or
> integer for ArcSDE).
> I cannot find in the documentation or in the functionality that
> PostGIS has an awareness of spatial tolerance. What I can find is:
> "All floating point comparisons within the SQL-MM implementation are
> performed to a specified tolerance, currently 1E-8"
> but nothing about actual storage.
>
> For me, the easiest solution would be to use a spatial tolerance.
> Otherwise, we may need to round all coordinates in the application
> code to e.g. 14 valid digits.
Andreas, you state that the ArcSDE fixed point representation ensures
that coordinates are exact. This is incorrect. What it ensures is that
locations are represented to a fixed precision; that is all.
By way of example, if you draw a line between points A and B, and then
try to represent the locations of points along that line, neither ArcSDE
fixed point nor Shapefile floating point will get those positions
exactly. In general, floating point will represent those locations more
accurately though that depends on the coordinate system (more precisely,
the X and Y offsets in the coordinate system) and on the number of
digits in the floating point fraction.
The same is true with points along a curve.
The use of a binary floating point number to represent a real quantity
generally involves some approximation. For example, you cannot
represent 0.1,0.2,0.3 etc exactly in binary floating point. You can
represent 0.25, 0.5, etc exactly. This is because the fractional part
in binary floating point is, well, binary, and binary fractional numbers
cannot generally represent decimal fractional numbers exactly.
Of course, rational numbers like 1/3 and irrational numbers like pi
cannot be represented exactly either.
This representational error is proportionally small; it's the unit round
off error of the representation.
So a GIS file format that uses floating point to represent location will
inevitably be off by its unit round-off error on many locations. This
is true of ESRI coverages, shape files, and I guess PostGIS.
However the absolute amount of error can be pretty large in a given
coordinate system; UTM northings in 32 bit binary floating point have a
round-off error on the order of a metre at my latitude.
Round-off error accumulates through arithmetic operations. One great
way to lose a lot of representational accuracy is to subtract two nearly
equal numbers using a fixed number of fractional digits, as does adding
two very different sized numbers; and therefore as does accumulating
inner products (calculating statistical variance, polygon areas,
eigenvalues, etc). People tend to use 64 bit binary floating point
these days to try to minimize these problems. Fixed-point number
systems are generally worse at losing representational accuracy through
computation.
Another thing to remember about fixed-point representations like ArcSDE:
numbers come from somewhere, go somewhere, and are compared to other
numbers. So conversions between external (eg ASCII), internal floating
point, and internal fixed point, are pretty common. For example, if you
do a query "where northing <= 2345678.9" how do you think the constant
is handled? Is it converted precisely into an ArcSDE back-end fixed
point representation, or is the comparison done in floating point by
converting the northing value from its back-end fixed point
representation to floating point?
See http://en.wikipedia.org/wiki/IEEE_754-2008 for more info on floating
point.
--
Regards, (please note new mobile number below)
Chris Hermansen mailto:chris.hermansen at timberline.ca
tel+1.604.714.2878 · fax+1.604.733.0631 · mob+1.778.840.4625
Timberline Natural Resource Group · http://www.timberline.ca
401 · 958 West 8th Avenue · Vancouver BC · Canada · V5Z 1E5
More information about the postgis-users
mailing list