(NULL == CU_add_test(pSuite, "test_clairaut()", test_clairaut)) ||
(NULL == CU_add_test(pSuite, "test_edge_intersection()", test_edge_intersection)) ||
(NULL == CU_add_test(pSuite, "test_edge_distance_to_point()", test_edge_distance_to_point)) ||
- (NULL == CU_add_test(pSuite, "test_ptarray_point_in_ring_winding()", test_ptarray_point_in_ring_winding)) ||
(NULL == CU_add_test(pSuite, "test_edge_distance_to_edge()", test_edge_distance_to_edge)) ||
(NULL == CU_add_test(pSuite, "test_lwgeom_distance_sphere()", test_lwgeom_distance_sphere)) ||
(NULL == CU_add_test(pSuite, "test_ptarray_point_in_ring()", test_ptarray_point_in_ring))
/* Line/line distance, 1 degree apart */
lwg1 = lwgeom_from_ewkt("LINESTRING(-30 10, -20 5, -10 3, 0 1)", PARSER_CHECK_NONE);
lwg2 = lwgeom_from_ewkt("LINESTRING(-10 -5, -5 0, 5 0, 10 -5)", PARSER_CHECK_NONE);
- d = lwgeom_distance_sphere(lwg1, lwg2, NULL, NULL, 0.0);
+ lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
+ lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d, M_PI / 180.0, 0.00001);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
/* Line/line distance, crossing, 0.0 apart */
lwg1 = lwgeom_from_ewkt("LINESTRING(-30 10, -20 5, -10 3, 0 1)", PARSER_CHECK_NONE);
lwg2 = lwgeom_from_ewkt("LINESTRING(-10 -5, -5 20, 5 0, 10 -5)", PARSER_CHECK_NONE);
- d = lwgeom_distance_sphere(lwg1, lwg2, NULL, NULL, 0.0);
+ lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
+ lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
/* Line/point distance, 1 degree apart */
lwg1 = lwgeom_from_ewkt("POINT(-4 1)", PARSER_CHECK_NONE);
lwg2 = lwgeom_from_ewkt("LINESTRING(-10 -5, -5 0, 5 0, 10 -5)", PARSER_CHECK_NONE);
- d = lwgeom_distance_sphere(lwg1, lwg2, NULL, NULL, 0.0);
+ lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
+ lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d, M_PI / 180.0, 0.00001);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
lwg1 = lwgeom_from_ewkt("POINT(-4 1)", PARSER_CHECK_NONE);
lwg2 = lwgeom_from_ewkt("POINT(-4 -1)", PARSER_CHECK_NONE);
- d = lwgeom_distance_sphere(lwg1, lwg2, NULL, NULL, 0.0);
+ lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
+ lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d, M_PI / 90.0, 0.00001);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
lwg2 = lwgeom_from_ewkt("POINT(-1 -1)", PARSER_CHECK_NONE);
lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
- d = lwgeom_distance_sphere(lwg1, lwg2, &gbox1, &gbox2, 0.0);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
lwg2 = lwgeom_from_ewkt("POINT(-1 -1)", PARSER_CHECK_NONE);
lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
- d = lwgeom_distance_sphere(lwg1, lwg2, &gbox1, &gbox2, 0.0);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d, M_PI / 180.0, 0.00001);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
lwg2 = lwgeom_from_ewkt("POINT(2 2)", PARSER_CHECK_NONE);
lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
- d = lwgeom_distance_sphere(lwg1, lwg2, &gbox1, &gbox2, 0.0);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
lwg2 = lwgeom_from_ewkt("0106000020E61000000100000001030000000100000007000000280EC3FB8CCA5EC0A5CDC747233C45402787C8F58CCA5EC0659EA2761E3C45400CED58DF8FCA5EC0C37FAE6E1E3C4540AE97B8E08FCA5EC00346F58B1F3C4540250359FD8ECA5EC05460628E1F3C45403738F4018FCA5EC05DC84042233C4540280EC3FB8CCA5EC0A5CDC747233C4540", PARSER_CHECK_NONE);
lwgeom_calculate_gbox_geodetic(lwg1, &gbox1);
lwgeom_calculate_gbox_geodetic(lwg2, &gbox2);
- d = lwgeom_distance_sphere(lwg1, lwg2, &gbox1, &gbox2, 0.0);
+ d = lwgeom_distance_sphere(lwg1, lwg2, gbox1, gbox2, 0.0);
CU_ASSERT_DOUBLE_EQUAL(d * 6371009.0, 23630.8003, 0.1);
lwgeom_free(lwg1);
lwgeom_free(lwg2);
* longitude and latitude. Return immediately when the calulated distance drops
* below the tolerance (useful for dwithin calculations).
*/
-double lwgeom_distance_sphere(LWGEOM *lwgeom1, LWGEOM *lwgeom2, GBOX *gbox1, GBOX *gbox2, double tolerance)
+double lwgeom_distance_sphere(LWGEOM *lwgeom1, LWGEOM *lwgeom2, GBOX gbox1, GBOX gbox2, double tolerance)
{
int type1, type2;
return ptarray_distance_sphere(pa1, pa2, tolerance);
}
- if( ! gbox1 || ! gbox2 )
- {
- lwerror("gboxes are required to calculate distances from spherical lwgeoms");
- return -1.0;
- }
-
/* Point/Polygon cases, if point-in-poly, return zero, else return distance. */
if( ( type1 == POLYGONTYPE && type2 == POINTTYPE ) ||
( type2 == POLYGONTYPE && type1 == POINTTYPE ) )
POINT2D p;
LWPOLY *lwpoly;
LWPOINT *lwpt;
- GBOX *gbox;
+ GBOX gbox;
double distance = MAXFLOAT;
int i;
POINT2D p;
LWPOLY *lwpoly;
LWLINE *lwline;
- GBOX *gbox;
+ GBOX gbox;
double distance = MAXFLOAT;
int i;
* a guaranteed outside point (lon/lat decimal degrees) (calculate with gbox_pt_outside())
* return LW_TRUE if point is inside or on edge of polygon.
*/
-int lwpoly_covers_point2d(const LWPOLY *poly, GBOX *gbox, POINT2D pt_to_test)
+int lwpoly_covers_point2d(const LWPOLY *poly, GBOX gbox, POINT2D pt_to_test)
{
int i;
int in_hole_count = 0;
- POINT3D p;
- GEOGRAPHIC_POINT g;
+ POINT3D p, q;
+ GEOGRAPHIC_POINT g, gpt_to_test;
POINT2D pt_outside;
-
- if( ! gbox )
- {
- lwerror("gbox is required to calculate spherical point-in-poly with lwgeom");
- return LW_FALSE;
- }
/* Nulls and empties don't contain anything! */
if( ! poly || lwgeom_is_empty((LWGEOM*)poly) )
return LW_FALSE;
}
+ /* Point not in box? Done! */
+ geographic_point_init(pt_to_test.x, pt_to_test.y, &gpt_to_test);
+ geog2cart(gpt_to_test, &q);
+ if( ! gbox_contains_point3d(gbox, q) )
+ return LW_FALSE;
+
/* Calculate our outside point from the gbox */
- gbox_pt_outside(*gbox, &p);
+ gbox_pt_outside(gbox, &p);
cart2geog(p, &g);
pt_outside.x = rad2deg(g.lon);
pt_outside.y = rad2deg(g.lat);