[PostGIS] #5671: Bug in ST_Area function with use_spheroid=false

PostGIS trac at osgeo.org
Mon Feb 19 05:10:41 PST 2024


#5671: Bug in ST_Area function with use_spheroid=false
-----------------------------------+---------------------
 Reporter:  azakh                  |      Owner:  pramsey
     Type:  defect                 |     Status:  new
 Priority:  medium                 |  Milestone:
Component:  postgis                |    Version:  3.3.x
 Keywords:  ST_Area, use_spheroid  |
-----------------------------------+---------------------
 ST_Area fails to calculate the area of the geography polygon with one
 inner ring, with `use_spheroid=false`:

 {{{
 SELECT ST_Area(
 'POLYGON(
   (
     -111.772 33.307,
     -111.772 33.304,
     -111.783 33.304,
     -111.783 33.307,
     -111.772 33.307
   ),
   (
     -111.781442 33.304825,
     -111.776964 33.3048,
     -111.773047 33.304778,
     -111.773177 33.306408,
     -111.781442 33.304825
   )
 )
 '::geography, false);
 }}}

 The result is:
 {{{
 ERROR:  lwgeom_area_spher(oid) returned area < 0.0
 }}}

 `use_spheroid=true` version works and gives `270218.45392724127`, but I
 would expect the on-the-sphere version also to work.

 The polygon seems to be correct, though it has almost flat angle at the
 `(-111.776964 33.3048)` vertex. Let's call the vertex **X**.

 If **X** is removed then `ST_Area` is `270337.25718276866`.

 If we retain **X** but make a cyclic shift of the inner ring: **AXBCA** =>
 **XBCAX**, then the function succeeds but gives `91737.85992092389` which
 is quite different from the correct value.

 Let's give small amends to the **X** latitude with **AXBCA** vertex order:
 \\ **X** => `(-111.776964 (33.3048 + amend))`.

 {{{
   Amend    |        ST_Area
 -------------------------------
 -1.0e-05   |   269904.2853637372
 -1.0e-06   |   270298.26808849035
 -1.0e-07   |   270628.6930016738
 -1.0e-08   |   269541.18027120724
 -1.0e-09   |   315257.7589488026
 -1.0e-10   |   ERROR:  lwgeom_area_spher(oid) returned area < 0.0
 -1.0e-11   |   262120.12981526955
 -1.0e-12   |    41142.8857341336
 -1.0e-13   |   144916.06439020386
 -1.0e-14   |    41142.8857341336
 -1.0e-15   |   ERROR:  lwgeom_area_spher(oid) returned area < 0.0
  1.0e-15   |   ERROR:  lwgeom_area_spher(oid) returned area < 0.0
  1.0e-14   |   159848.6351422007
  1.5e-14   |   113982.3188750676
  5.0e-14   |   243067.1526449226
  7.5e-14   |    95027.49039558775
  1.0e-13   |    41142.8857341336
  5.0e-13   |   159848.59909125822
  7.5e-13   |   320241.96397413884
  1.0e-10   |   131857.65595877985
  2.5e-10   |   185479.48530059034
  1.0e-12   |    91867.01242231275
  2.5e-12   |   165036.9786292576
  5.0e-12   |   204984.361034764
  7.5e-12   |    35520.7773073109
  1.0e-11   |   116531.9857301203
  2.5e-11   |    64257.524312080175
  5.0e-11   |   253059.59064874944
  5.0e-10   |   261657.84858001219
  7.5e-10   |   260622.88009819158
  1.0e-09   |   265687.2263686325
  1.0e-08   |   270029.18385391496
  1.0e-07   |   270240.35224941676
  1.0e-06   |   270325.2882698695
  1.0e-05   |   270771.5448612002
 }}}

 Monotonous area growth is expected but oscillating behaviour alternating
 with ERRORs is observed.
-- 
Ticket URL: <https://trac.osgeo.org/postgis/ticket/5671>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.


More information about the postgis-tickets mailing list