PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ test_lwgeom_distance_sphere()

static void test_lwgeom_distance_sphere ( void  )
static

Definition at line 1177 of file cu_geodetic.c.

1178{
1179 LWGEOM *lwg1, *lwg2;
1180 double d;
1181 SPHEROID s;
1182
1183 /* Init and force spherical */
1184 spheroid_init(&s, 6378137.0, 6356752.314245179498);
1185 s.a = s.b = s.radius;
1186
1187 /* https://trac.osgeo.org/postgis/ticket/4835 */
1188 lwg1 = lwgeom_from_wkt("POINT(45 90)", LW_PARSER_CHECK_NONE);
1189 lwg2 = lwgeom_from_wkt("LINESTRING(15.55 78.216667, -164.58 68.875)", LW_PARSER_CHECK_NONE);
1190 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1191 // printf("%12.8g\n", d);
1192 CU_ASSERT_DOUBLE_EQUAL(d, 1958.2179, 0.1);
1193 lwgeom_free(lwg1);
1194 lwgeom_free(lwg2);
1195
1196 /* https://trac.osgeo.org/postgis/ticket/4835 */
1197 lwg1 = lwgeom_from_wkt("POINT(0 90)", LW_PARSER_CHECK_NONE);
1198 lwg2 = lwgeom_from_wkt("LINESTRING(-166.11 68.875,15.55 78.216667)", LW_PARSER_CHECK_NONE);
1199 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1200 // printf("%12.8g\n", d);
1201 CU_ASSERT_DOUBLE_EQUAL(d, 25003.707, 0.1);
1202 lwgeom_free(lwg1);
1203 lwgeom_free(lwg2);
1204
1205 /* Line/line distance, 1 degree apart */
1206 lwg1 = lwgeom_from_wkt("LINESTRING(-30 10, -20 5, -10 3, 0 1)", LW_PARSER_CHECK_NONE);
1207 lwg2 = lwgeom_from_wkt("LINESTRING(-10 -5, -5 0, 5 0, 10 -5)", LW_PARSER_CHECK_NONE);
1208 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1209 CU_ASSERT_DOUBLE_EQUAL(d, s.radius * M_PI / 180.0, 0.00001);
1210 lwgeom_free(lwg1);
1211 lwgeom_free(lwg2);
1212
1213 /* Line/line distance, crossing, 0.0 apart */
1214 lwg1 = lwgeom_from_wkt("LINESTRING(-30 10, -20 5, -10 3, 0 1)", LW_PARSER_CHECK_NONE);
1215 lwg2 = lwgeom_from_wkt("LINESTRING(-10 -5, -5 20, 5 0, 10 -5)", LW_PARSER_CHECK_NONE);
1216 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1217 CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
1218 lwgeom_free(lwg1);
1219 lwgeom_free(lwg2);
1220
1221 /* Line/point distance, 1 degree apart */
1222 lwg1 = lwgeom_from_wkt("POINT(-4 1)", LW_PARSER_CHECK_NONE);
1223 lwg2 = lwgeom_from_wkt("LINESTRING(-10 -5, -5 0, 5 0, 10 -5)", LW_PARSER_CHECK_NONE);
1224 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1225 CU_ASSERT_DOUBLE_EQUAL(d, s.radius * M_PI / 180.0, 0.00001);
1226 lwgeom_free(lwg1);
1227 lwgeom_free(lwg2);
1228
1229 lwg1 = lwgeom_from_wkt("POINT(-4 1)", LW_PARSER_CHECK_NONE);
1230 lwg2 = lwgeom_from_wkt("POINT(-4 -1)", LW_PARSER_CHECK_NONE);
1231 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1232 CU_ASSERT_DOUBLE_EQUAL(d, s.radius * M_PI / 90.0, 0.00001);
1233 lwgeom_free(lwg1);
1234 lwgeom_free(lwg2);
1235
1236 /* Poly/point distance, point inside polygon, 0.0 apart */
1237 lwg1 = lwgeom_from_wkt("POLYGON((-4 1, -3 5, 1 2, 1.5 -5, -4 1))", LW_PARSER_CHECK_NONE);
1238 lwg2 = lwgeom_from_wkt("POINT(-1 -1)", LW_PARSER_CHECK_NONE);
1239 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1240 CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
1241 lwgeom_free(lwg1);
1242 lwgeom_free(lwg2);
1243
1244 /* Poly/point distance, point inside polygon hole, 1 degree apart */
1245 lwg1 = lwgeom_from_wkt("POLYGON((-4 -4, -4 4, 4 4, 4 -4, -4 -4), (-2 -2, -2 2, 2 2, 2 -2, -2 -2))", LW_PARSER_CHECK_NONE);
1246 lwg2 = lwgeom_from_wkt("POINT(-1 -1)", LW_PARSER_CHECK_NONE);
1247 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1248 CU_ASSERT_DOUBLE_EQUAL(d, 111178.142466, 0.1);
1249 lwgeom_free(lwg1);
1250 lwgeom_free(lwg2);
1251
1252 /* Poly/point distance, point on hole boundary, 0.0 apart */
1253 lwg1 = lwgeom_from_wkt("POLYGON((-4 -4, -4 4, 4 4, 4 -4, -4 -4), (-2 -2, -2 2, 2 2, 2 -2, -2 -2))", LW_PARSER_CHECK_NONE);
1254 lwg2 = lwgeom_from_wkt("POINT(2 2)", LW_PARSER_CHECK_NONE);
1255 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1256 CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
1257 lwgeom_free(lwg1);
1258 lwgeom_free(lwg2);
1259
1260 /* Medford test case #1 */
1261 lwg1 = lwgeom_from_hexwkb("0105000020E610000001000000010200000002000000EF7B8779C7BD5EC0FD20D94B852845400E539C62B9BD5EC0F0A5BE767C284540", LW_PARSER_CHECK_NONE);
1262 lwg2 = lwgeom_from_hexwkb("0106000020E61000000100000001030000000100000007000000280EC3FB8CCA5EC0A5CDC747233C45402787C8F58CCA5EC0659EA2761E3C45400CED58DF8FCA5EC0C37FAE6E1E3C4540AE97B8E08FCA5EC00346F58B1F3C4540250359FD8ECA5EC05460628E1F3C45403738F4018FCA5EC05DC84042233C4540280EC3FB8CCA5EC0A5CDC747233C4540", LW_PARSER_CHECK_NONE);
1263 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1264 CU_ASSERT_DOUBLE_EQUAL(d, 23630.8003, 0.1);
1265 lwgeom_free(lwg1);
1266 lwgeom_free(lwg2);
1267
1268 /* Ticket #2351 */
1269 lwg1 = lwgeom_from_wkt("LINESTRING(149.386990599235 -26.3567415843982,149.386990599247 -26.3567415843965)", LW_PARSER_CHECK_NONE);
1270 lwg2 = lwgeom_from_wkt("POINT(149.386990599235 -26.3567415843982)", LW_PARSER_CHECK_NONE);
1271 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1272 CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
1273 lwgeom_free(lwg1);
1274 lwgeom_free(lwg2);
1275
1276 /* Ticket #2638, no "M" */
1277 lwg1 = lwgeom_from_wkt("LINESTRING (-41.0821 50.3036,50 -41)", LW_PARSER_CHECK_NONE);
1278 lwg2 = lwgeom_from_wkt("POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))", LW_PARSER_CHECK_NONE);
1279 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1280 CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
1281 lwgeom_free(lwg1);
1282 lwgeom_free(lwg2);
1283
1284 /* Ticket #2638, with "M" */
1285 lwg1 = lwgeom_from_wkt("LINESTRING M (-41.0821 50.3036 1,50 -41 1)", LW_PARSER_CHECK_NONE);
1286 lwg2 = lwgeom_from_wkt("POLYGON M ((0 0 2,10 0 1,10 10 -2,0 10 -5,0 0 -5),(5 5 6,7 5 6,7 7 6,5 7 10,5 5 -2))", LW_PARSER_CHECK_NONE);
1287 d = lwgeom_distance_spheroid(lwg1, lwg2, &s, 0.0);
1288 CU_ASSERT_DOUBLE_EQUAL(d, 0.0, 0.00001);
1289 lwgeom_free(lwg1);
1290 lwgeom_free(lwg2);
1291}
char * s
Definition cu_in_wkt.c:23
double lwgeom_distance_spheroid(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2, const SPHEROID *spheroid, double tolerance)
Calculate the geodetic distance from lwgeom1 to lwgeom2 on the spheroid.
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2149
void spheroid_init(SPHEROID *s, double a, double b)
Initialize a spheroid object for use in geodetic functions.
Definition lwspheroid.c:39
LWGEOM * lwgeom_from_hexwkb(const char *hexwkb, const char check)
Definition lwin_wkb.c:866
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition lwin_wkt.c:940

References LW_PARSER_CHECK_NONE, lwgeom_distance_spheroid(), lwgeom_free(), lwgeom_from_hexwkb(), lwgeom_from_wkt(), s, and spheroid_init().

Referenced by geodetic_suite_setup().

Here is the call graph for this function:
Here is the caller graph for this function: