From e7ffe92c6e1411c687c14a16e454669d4fd7b029 Mon Sep 17 00:00:00 2001 From: Daniel Baston Date: Mon, 14 Dec 2015 12:52:58 +0000 Subject: [PATCH] #3393, ST_Area NaN on some polygons git-svn-id: http://svn.osgeo.org/postgis/trunk@14485 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/cunit/cu_geodetic.c | 20 ++++++++++++++++++-- liblwgeom/lwgeodetic.c | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/liblwgeom/cunit/cu_geodetic.c b/liblwgeom/cunit/cu_geodetic.c index fa0436f62..f666c1ccf 100644 --- a/liblwgeom/cunit/cu_geodetic.c +++ b/liblwgeom/cunit/cu_geodetic.c @@ -1556,8 +1556,24 @@ static void test_lwgeom_area_sphere(void) area = lwgeom_area_sphere(lwg, &s); CU_ASSERT_DOUBLE_EQUAL(area, 12360265021.3561, 1.0); - lwgeom_free(lwg); - return; + lwgeom_free(lwg); + + /* Robustness tests, from ticket #3393 */ + lwg = lwgeom_from_wkt("POLYGON((0 78.703946026663,0 0,179.999997913235 0,179.999997913235 -33.0888306884702,0 78.703946026663))", LW_PARSER_CHECK_NONE); + area = lwgeom_area_sphere(lwg, &s); + CU_ASSERT_DOUBLE_EQUAL(area, 127516467322130, 1.0); + lwgeom_free(lwg); + + lwg = lwgeom_from_wkt("POLYGON((0 78.703946026662,0 0,179.999997913235 0,179.999997913235 -33.0888306884702,0 78.703946026662))", LW_PARSER_CHECK_NONE); + area = lwgeom_area_sphere(lwg, &s); + CU_ASSERT_DOUBLE_EQUAL(area, 127516467322130, 1.0); + lwgeom_free(lwg); + + lwg = lwgeom_from_wkt("POLYGON((0 78.703946026664,0 0,179.999997913235 0,179.999997913235 -33.0888306884702,0 78.703946026664))", LW_PARSER_CHECK_NONE); + area = lwgeom_area_sphere(lwg, &s); + CU_ASSERT_DOUBLE_EQUAL(area, 127516467322130, 1.0); + lwgeom_free(lwg); + /* end #3393 */ } /* diff --git a/liblwgeom/lwgeodetic.c b/liblwgeom/lwgeodetic.c index f1a6460b6..33a7f14c9 100644 --- a/liblwgeom/lwgeodetic.c +++ b/liblwgeom/lwgeodetic.c @@ -931,7 +931,7 @@ double sphere_distance(const GEOGRAPHIC_POINT *s, const GEOGRAPHIC_POINT *e) */ double sphere_distance_cartesian(const POINT3D *s, const POINT3D *e) { - return acos(dot_product(s, e)); + return acos(FP_MIN(1.0, dot_product(s, e))); } /** -- 2.40.0