static void do_test_mindistance2d_tolerance(char *in1, char *in2, double expected_res) { LWGEOM *lw1; LWGEOM *lw2; double distance; lw1 = lwgeom_from_wkt(in1, LW_PARSER_CHECK_NONE); lw2 = lwgeom_from_wkt(in2, LW_PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(lw1, lw2, 0.0); CU_ASSERT_EQUAL(distance, expected_res); lwgeom_free(lw1); lwgeom_free(lw2); }
/** Function handling 3d min distance calculations and dwithin calculations. The difference is just the tolerance. */ double lwgeom_mindistance3d_tolerance(const LWGEOM *lw1, const LWGEOM *lw2, double tolerance) { if(!lwgeom_has_z(lw1) || !lwgeom_has_z(lw2)) { lwnotice("One or both of the geometries is missing z-value. The unknown z-value will be regarded as \"any value\""); return lwgeom_mindistance2d_tolerance(lw1, lw2, tolerance); } DISTPTS3D thedl; LWDEBUG(2, "lwgeom_mindistance3d_tolerance is called"); thedl.mode = DIST_MIN; thedl.distance= FLT_MAX; thedl.tolerance = tolerance; if (lw_dist3d_recursive(lw1, lw2, &thedl)) { return thedl.distance; } /*should never get here. all cases ought to be error handled earlier*/ lwerror("Some unspecified error."); return FLT_MAX; }
void test_mindistance2d_tolerance(void) { LWGEOM_PARSER_RESULT gp1; LWGEOM_PARSER_RESULT gp2; double distance; int result1, result2; /* ** Simple case. */ result1 = serialized_lwgeom_from_ewkt(&gp1, "POINT(0 0)", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "MULTIPOINT(0 1.5,0 2,0 2.5)", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("\ndistance #1 = %g\n",distance); CU_ASSERT_EQUAL(distance, 1.5); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); /* ** Point vs Geometry Collection. */ result1 = serialized_lwgeom_from_ewkt(&gp1, "POINT(0 0)", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "GEOMETRYCOLLECTION(POINT(3 4))", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("distance #2 = %g\n",distance); CU_ASSERT_EQUAL(distance, 5.0); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); /* ** Point vs Geometry Collection Collection. */ result1 = serialized_lwgeom_from_ewkt(&gp1, "POINT(0 0)", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("distance #3 = %g\n",distance); CU_ASSERT_EQUAL(distance, 5.0); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); /* ** Point vs Geometry Collection Collection Collection. */ result1 = serialized_lwgeom_from_ewkt(&gp1, "POINT(0 0)", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4))))", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("distance #4 = %g\n",distance); CU_ASSERT_EQUAL(distance, 5.0); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); /* ** Point vs Geometry Collection Collection Collection Multipoint. */ result1 = serialized_lwgeom_from_ewkt(&gp1, "POINT(0 0)", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("distance #5 = %g\n",distance); CU_ASSERT_EQUAL(distance, 5.0); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); /* ** Geometry Collection vs Geometry Collection */ result1 = serialized_lwgeom_from_ewkt(&gp1, "GEOMETRYCOLLECTION(POINT(0 0))", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "GEOMETRYCOLLECTION(POINT(3 4))", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("distance #6 = %g\n",distance); CU_ASSERT_EQUAL(distance, 5.0); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); /* ** Geometry Collection Collection vs Geometry Collection Collection */ result1 = serialized_lwgeom_from_ewkt(&gp1, "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("distance #7 = %g\n",distance); CU_ASSERT_EQUAL(distance, 5.0); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); /* ** Geometry Collection Collection Multipoint vs Geometry Collection Collection Multipoint */ result1 = serialized_lwgeom_from_ewkt(&gp1, "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(0 0)))", PARSER_CHECK_NONE); result2 = serialized_lwgeom_from_ewkt(&gp2, "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4)))", PARSER_CHECK_NONE); distance = lwgeom_mindistance2d_tolerance(gp1.serialized_lwgeom, gp2.serialized_lwgeom, 0.0); //printf("distance #8 = %g\n",distance); CU_ASSERT_EQUAL(distance, 5.0); free(gp1.serialized_lwgeom); free(gp2.serialized_lwgeom); }
/** Function initialazing min distance calculation */ double lwgeom_mindistance2d(LWGEOM *lw1, LWGEOM *lw2) { LWDEBUG(2, "lwgeom_mindistance2d is called"); return lwgeom_mindistance2d_tolerance( lw1, lw2, 0.0 ); }