]> granicus.if.org Git - postgis/commitdiff
#3393, ST_Area NaN on some polygons
authorDaniel Baston <dbaston@gmail.com>
Mon, 14 Dec 2015 12:52:58 +0000 (12:52 +0000)
committerDaniel Baston <dbaston@gmail.com>
Mon, 14 Dec 2015 12:52:58 +0000 (12:52 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@14485 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/cunit/cu_geodetic.c
liblwgeom/lwgeodetic.c

index fa0436f626235e5df39a5143b5b222b16c74ead7..f666c1ccf437e66b7b044d941c6067a369fc1d01 100644 (file)
@@ -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 */
 }
 
 /*
index f1a6460b6a63dce52a2008e4b803efe0b8795d14..33a7f14c9d9f855c8490f155064f4002a507e335 100644 (file)
@@ -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)));
 }
 
 /**