36 return fmax(
tol(ic1),
tol(ic2));
41 return (-tolerance <= x) && (x <= tolerance);
48 return (-tolerance <= diff) && (diff <= tolerance);
54 return x <= (y + tolerance);
60 return (x + tolerance) >= y;
72 double x{std::numeric_limits<double>::quiet_NaN()};
73 double y{std::numeric_limits<double>::quiet_NaN()};
80 const int32_t x_index,
83 const int32_t adjusted_index = x_index + (C ==
Coords::Y);
85 auto compressed_coords =
reinterpret_cast<const int32_t*
>(data);
93 auto double_coords =
reinterpret_cast<const double*
>(data);
94 return double_coords[adjusted_index];
107 if constexpr (static_cast<bool>(C &
Coords::X)) {
110 if constexpr (static_cast<bool>(C &
Coords::Y)) {
120 if constexpr (static_cast<bool>(C &
Coords::X)) {
123 if constexpr (static_cast<bool>(C &
Coords::Y)) {
133 if constexpr (static_cast<bool>(C &
Coords::X)) {
136 if constexpr (static_cast<bool>(C &
Coords::Y)) {
150 if (isr == osr || osr == 0) {
152 }
else if (isr == 4326) {
154 return conv_4326_900913<C>(point);
155 #ifdef ENABLE_UTM_TRANSFORM
157 return conv_4326_utm<C>(point, osr);
161 return conv_utm_4326<C>(point, osr);
168 throw std::runtime_error(
"Unhandled geo transformation from " +
std::to_string(isr) +
175 #ifdef ENABLE_UTM_TRANSFORM
185 const int32_t x_index,
189 Point2D
const decompressed{decompress_coord<X>(data, x_index, ic),
190 decompress_coord<Y>(data, x_index, ic)};
191 return transform_point<XY>(decompressed, isr, osr);
198 const int32_t x_index,
202 Point2D decompressed;
205 decompressed = {decompress_coord<X>(data, x_index, ic),
206 decompress_coord<Y>(data, x_index, ic)};
209 decompressed.x = decompress_coord<X>(data, x_index, ic);
211 decompressed.y = decompress_coord<Y>(data, x_index, ic);
214 return transform_point<C>(decompressed, isr, osr);
219 const auto compressed_coords =
reinterpret_cast<const int32_t*
>(data);
220 return compressed_coords[index];
267 double dotprod = (px - l1x) * (l2x - l1x) + (py - l1y) * (l2y - l1y);
268 double k = dotprod / (length * length);
269 k = fmax(0.0, fmin(1.0, k));
270 double projx = l1x + k * (l2x - l1x);
271 double projy = l1y + k * (l2y - l1y);
294 double dotprod = (px - l1x) * (l2x - l1x) + (py - l1y) * (l2y - l1y);
295 double k = dotprod / (length * length);
296 k = fmax(0.0, fmin(1.0, k));
297 double projx = l1x + k * (l2x - l1x);
298 double projy = l1y + k * (l2y - l1y);
310 return (
tol_le(qx, fmax(px, rx)) &&
tol_ge(qx, fmin(px, rx)) &&
315 orientation(
double px,
double py,
double qx,
double qy,
double rx,
double ry) {
316 auto val = ((qy - py) * (rx - qx) - (qx - px) * (ry - qy));
336 auto o1 =
orientation(l11x, l11y, l12x, l12y, l21x, l21y);
337 auto o2 =
orientation(l11x, l11y, l12x, l12y, l22x, l22y);
338 auto o3 =
orientation(l21x, l21y, l22x, l22y, l11x, l11y);
339 auto o4 =
orientation(l21x, l21y, l22x, l22y, l12x, l12y);
342 if (o1 != o2 && o3 != o4) {
348 if (o1 == 0 &&
on_segment(l11x, l11y, l21x, l21y, l12x, l12y)) {
353 if (o2 == 0 &&
on_segment(l11x, l11y, l22x, l22y, l12x, l12y)) {
358 if (o3 == 0 &&
on_segment(l21x, l21y, l11x, l11y, l22x, l22y)) {
363 if (o4 == 0 &&
on_segment(l21x, l21y, l12x, l12y, l22x, l22y)) {
380 Point2D e1 =
get_point(l, 0, ic1, isr1, osr);
381 for (int64_t i = 2; i < lnum_coords; i += 2) {
382 Point2D e2 =
get_point(l, i, ic1, isr1, osr);
393 int32_t ring_num_coords,
401 Point2D e1 =
get_point(ring, ring_num_coords - 2, ic1, isr1, osr);
402 Point2D e2 =
get_point(ring, 0, ic1, isr1, osr);
407 ring, ring_num_coords, l1x, l1y, l2x, l2y, ic1, isr1, osr);
420 Point2D e1 =
get_point(l, 0, ic1, isr1, osr);
421 for (int64_t i = 2; i < lnum_coords; i += 2) {
422 Point2D e2 =
get_point(l, i, ic1, isr1, osr);
448 return fmin(dist12, dist21);
468 return fmin(dist12, dist21);
473 int32_t ring_num_coords,
482 double min_distance = 0.0;
484 Point2D re1 =
get_point(ring, ring_num_coords - 2, ic1, isr1, osr);
485 for (
auto i = 0; i < ring_num_coords; i += 2) {
486 Point2D re2 =
get_point(ring, i, ic1, isr1, osr);
487 Point2D le1 =
get_point(l, 0, ic2, isr2, osr);
488 for (
auto j = 2; j < lnum_coords; j += 2) {
489 Point2D le2 =
get_point(l, j, ic2, isr2, osr);
492 if ((i == 0 && j == 2) || min_distance > distance) {
493 min_distance = distance;
497 if (min_distance <= threshold) {
510 int32_t ring1_num_coords,
512 int32_t ring2_num_coords,
519 double min_distance = 0.0;
520 Point2D e11 =
get_point(ring1, ring1_num_coords - 2, ic1, isr1, osr);
521 for (
auto i = 0; i < ring1_num_coords; i += 2) {
522 Point2D e12 =
get_point(ring1, i, ic1, isr1, osr);
523 Point2D e21 =
get_point(ring2, ring2_num_coords - 2, ic2, isr2, osr);
524 for (
auto j = 0; j < ring2_num_coords; j += 2) {
525 Point2D e22 =
get_point(ring2, j, ic2, isr2, osr);
528 if ((i == 0 && j == 0) || min_distance > distance) {
529 min_distance = distance;
533 if (min_distance <= threshold) {
548 template <
typename T>
550 is_left(
const T lx0,
const T ly0,
const T lx1,
const T ly1,
const T px,
const T py) {
551 return ((lx1 - lx0) * (py - ly0) - (px - lx0) * (ly1 - ly0));
554 template <
typename T>
557 if constexpr (!std::is_floating_point<T>::value) {
560 return (-tolerance <= x) && (x <= tolerance);
578 template <
typename T, EdgeBehavior TEdgeBehavior>
580 const int32_t poly_num_coords,
588 constexpr
bool include_point_on_edge =
591 auto get_x_coord = [=](
const auto data,
const auto index) ->
T {
592 if constexpr (std::is_floating_point<T>::value) {
593 return get_point(data, index, ic1, isr1, osr).x;
600 auto get_y_coord = [=](
const auto data,
const auto index) ->
T {
601 if constexpr (std::is_floating_point<T>::value) {
602 return get_point(data, index, ic1, isr1, osr).y;
609 DEBUG_STMT(printf(
"Poly num coords: %d\n", poly_num_coords));
610 const int64_t num_edges = poly_num_coords / 2;
612 int64_t e0_index = 0;
613 T e0x = get_x_coord(poly, e0_index * 2);
614 T e0y = get_y_coord(poly, e0_index * 2);
619 for (int64_t edge = 1; edge <= num_edges; edge++) {
622 e1_index = edge % num_edges;
623 e1x = get_x_coord(poly, e1_index * 2);
624 e1y = get_y_coord(poly, e1_index * 2);
626 DEBUG_STMT(printf(
"edge 0: %ld : %f, %f\n", e0_index, (
double)e0x, (
double)e0y));
627 DEBUG_STMT(printf(
"edge 1: %ld : %f, %f\n", e1_index, (
double)e1x, (
double)e1y));
629 auto get_epsilon = [=]() ->
T {
630 if constexpr (std::is_floating_point<T>::value) {
631 const T edge_vec_magnitude =
632 (e1x - e0x) * (e1x - e0x) + (e1y - e0y) * (e1y - e0y);
633 return 0.003 * edge_vec_magnitude;
640 const T epsilon = get_epsilon();
641 DEBUG_STMT(printf(
"using epsilon value %e\n", (
double)epsilon));
643 if constexpr (include_point_on_edge) {
644 const T xp = (px - e1x) * (e0y - e1y) - (py - e1y) * (e0x - e1x);
645 const T pt_vec_magnitude = (px - e0x) * (px - e0x) + (py - e0y) * (py - e0y);
646 const T edge_vec_magnitude = (e1x - e0x) * (e1x - e0x) + (e1y - e0y) * (e1y - e0y);
647 if (
tol_zero_template(xp, epsilon) && (pt_vec_magnitude <= edge_vec_magnitude)) {
648 DEBUG_STMT(printf(
"point is on edge: %e && %e <= %e\n",
650 (
double)pt_vec_magnitude,
651 (
double)edge_vec_magnitude));
652 return include_point_on_edge;
660 const auto is_left_val =
is_left(e0x, e0y, e1x, e1y, px, py);
661 DEBUG_STMT(printf(
"Left val %f and tol zero left val %d\n",
666 return include_point_on_edge;
667 }
else if (is_left_val >
T(0)) {
673 }
else if (e1y <= py) {
676 const auto is_left_val =
is_left(e0x, e0y, e1x, e1y, px, py);
677 DEBUG_STMT(printf(
"Left val %f and tol zero left val %d\n",
682 return include_point_on_edge;
683 }
else if (is_left_val <
T(0)) {
714 const int32_t poly_num_coords,
722 bool horizontal_edge =
false;
723 bool yray_intersects =
false;
725 Point2D e1 =
get_point(poly, poly_num_coords - 2, ic1, isr1, osr);
726 for (int64_t i = 0; i < poly_num_coords; i += 2) {
727 Point2D e2 =
get_point(poly, i, ic1, isr1, osr);
741 horizontal_edge = (xray_touch != 0) &&
tol_eq(py, e1.y) &&
tol_eq(py, e2.y);
745 double xray = fmax(e2.x, e1.x) + 1.0;
760 if (xray_touch == 0) {
767 xray_touch = (e1.y > py) ? 1 : -1;
772 if (xray_touch > 0) {
798 if (!yray_intersects) {
799 double yray = fmin(e2.y, e1.y) - 1.0;
815 if (!yray_intersects) {
826 int32_t poly_num_coords,
835 Point2D l1 =
get_point(l, 0, ic2, isr2, osr);
842 for (int32_t i = 2; i < lnum_coords; i += 2) {
843 Point2D l2 =
get_point(l, i, ic2, isr2, osr);
845 poly, poly_num_coords, l1.x, l1.y, l2.x, l2.y, ic1, isr1, osr)) {
854 const int64_t bounds_size,
871 int64_t bounds1_size,
873 int64_t bounds2_size) {
877 bounds1, bounds1_size, bounds2[0], bounds2[1]) &&
879 bounds1, bounds1_size, bounds2[2], bounds2[3]));
883 int64_t bounds1_size,
885 int64_t bounds2_size) {
889 bounds1, bounds1_size, bounds2[0], bounds2[1]) ||
891 bounds1, bounds1_size, bounds2[2], bounds2[3]) ||
893 bounds1, bounds1_size, bounds2[0], bounds2[3]) ||
895 bounds1, bounds1_size, bounds2[2], bounds2[1]));
899 int64_t bounds1_size,
901 int64_t bounds2_size) {
904 if (bounds1[2] < bounds2[0] ||
905 bounds1[0] > bounds2[2] ||
906 bounds1[3] < bounds2[1] ||
907 bounds1[1] > bounds2[3]) {
918 int64_t bounds2_size,
926 Point2D p =
get_point(p1, 0, ic1, isr1, osr);
927 Point2D
const lb = transform_point<XY>({bounds2[0], bounds2[1]}, isr2, osr);
928 Point2D
const rt = transform_point<XY>({bounds2[2], bounds2[3]}, isr2, osr);
929 if (p.x < lb.x - distance ||
930 p.x > rt.x + distance ||
931 p.y < lb.y - distance ||
932 p.y > rt.y + distance) {
939 int64_t bounds1_size,
942 int64_t bounds2_size,
956 Point2D
const lb1 = transform_point<XY>({bounds1[0], bounds1[1]}, isr1, osr);
957 Point2D
const rt1 = transform_point<XY>({bounds1[2], bounds1[3]}, isr1, osr);
958 Point2D
const lb2 = transform_point<XY>({bounds2[0], bounds2[1]}, isr2, osr);
959 Point2D
const rt2 = transform_point<XY>({bounds2[2], bounds2[3]}, isr2, osr);
962 rt1.x + distance < lb2.x ||
964 lb1.x - distance > rt2.x ||
966 rt1.y + distance < lb2.y ||
968 lb1.y - distance > rt2.y) {
979 int64_t bounds2_size,
991 Point2D
const lb = transform_point<XY>({bounds2[0], bounds2[1]}, isr2, osr);
992 Point2D
const rt = transform_point<XY>({bounds2[2], bounds2[3]}, isr2, osr);
993 CoordData l1_relevant_section;
998 Point2D l11 =
get_point(l1, 0, ic1, isr1, osr);
999 for (int32_t i1 = 2; i1 < l1_num_coords; i1 += 2) {
1000 Point2D l12 =
get_point(l1, i1, ic1, isr1, osr);
1004 fmax(l11.x, l12.x) + distance < lb.x ||
1006 fmin(l11.x, l12.x) - distance > rt.x ||
1008 fmax(l11.y, l12.y) + distance < lb.y ||
1010 fmin(l11.y, l12.y) - distance > rt.y) {
1012 if (l1_relevant_section.ptr && l1_relevant_section.size == 0) {
1014 l1_relevant_section.size =
1019 if (!l1_relevant_section.ptr) {
1025 l1_relevant_section.size = 0;
1031 if (l1_relevant_section.ptr && l1_relevant_section.size == 0) {
1035 l1_relevant_section.size = l1size - (l1_relevant_section.ptr - l1);
1037 if (l1_relevant_section.ptr &&
1040 l1_relevant_section = {l1, l1size};
1043 return l1_relevant_section;
1047 double ST_X_Point(int8_t* p, int64_t psize, int32_t ic, int32_t isr, int32_t osr) {
1048 return coord<X>(p, 0, ic, isr, osr).x;
1052 double ST_Y_Point(int8_t* p, int64_t psize, int32_t ic, int32_t isr, int32_t osr) {
1053 return coord<Y>(p, 0, ic, isr, osr).y;
1057 double ST_XMin(int8_t* coords, int64_t size, int32_t ic, int32_t isr, int32_t osr) {
1060 for (int32_t i = 0; i < num_coords; i += 2) {
1061 double x = coord<X>(coords, i, ic, isr, osr).x;
1062 if (i == 0 || x < xmin) {
1070 double ST_YMin(int8_t* coords, int64_t size, int32_t ic, int32_t isr, int32_t osr) {
1073 for (int32_t i = 0; i < num_coords; i += 2) {
1074 double y = coord<Y>(coords, i, ic, isr, osr).y;
1075 if (i == 0 || y < ymin) {
1083 double ST_XMax(int8_t* coords, int64_t size, int32_t ic, int32_t isr, int32_t osr) {
1086 for (int32_t i = 0; i < num_coords; i += 2) {
1087 double x = coord<X>(coords, i, ic, isr, osr).x;
1088 if (i == 0 || x > xmax) {
1096 double ST_YMax(int8_t* coords, int64_t size, int32_t ic, int32_t isr, int32_t osr) {
1099 for (int32_t i = 0; i < num_coords; i += 2) {
1100 double y = coord<Y>(coords, i, ic, isr, osr).y;
1101 if (i == 0 || y > ymax) {
1110 return transform_point<X>({bounds[0], bounds[1]}, isr, osr).x;
1115 return transform_point<Y>({bounds[0], bounds[1]}, isr, osr).y;
1120 return transform_point<X>({bounds[2], bounds[3]}, isr, osr).x;
1125 return transform_point<Y>({bounds[2], bounds[3]}, isr, osr).y;
1138 bool check_closed) {
1141 double length = 0.0;
1143 Point2D l0 =
get_point(l, 0, ic, isr, osr);
1145 for (int32_t i = 2; i < l_num_coords; i += 2) {
1181 int8_t* linestring_sizes_in,
1182 int64_t linestring_sizes_sz,
1186 if (linestring_sizes_sz <= 0) {
1189 double mls_length = 0.0;
1191 auto next_linestring_coords = coords;
1193 for (
auto l = 0; l < linestring_sizes_sz; l++) {
1194 auto linestring_coords = next_linestring_coords;
1195 auto linestring_sizes =
reinterpret_cast<int32_t*
>(linestring_sizes_in);
1196 auto linestring_num_points = linestring_sizes[l];
1197 auto linestring_num_coords = 2 * linestring_num_points;
1199 next_linestring_coords += linestring_coords_size;
1201 linestring_coords, linestring_coords_size, ic, isr, osr,
false,
false);
1202 mls_length += ls_length;
1215 int8_t* poly_ring_sizes,
1216 int32_t poly_num_rings,
1220 if (poly_num_rings <= 0) {
1224 auto exterior_ring_num_coords = poly_ring_sizes[0] * 2;
1227 return length_linestring(poly, exterior_ring_coords_size, ic, isr, osr,
false,
true);
1233 int8_t* poly_ring_sizes_in,
1234 int32_t poly_num_rings,
1238 if (poly_num_rings <= 0) {
1242 auto poly_ring_sizes =
reinterpret_cast<int32_t*
>(poly_ring_sizes_in);
1243 auto exterior_ring_num_coords = poly_ring_sizes[0] * 2;
1246 return length_linestring(poly, exterior_ring_coords_size, ic, isr, osr,
true,
true);
1250 int32_t mpoly_coords_size,
1251 int8_t* mpoly_ring_sizes_in,
1252 int32_t mpoly_num_rings,
1253 int8_t* mpoly_poly_sizes,
1254 int32_t mpoly_num_polys,
1259 if (mpoly_num_polys <= 0 || mpoly_num_rings <= 0) {
1263 double perimeter = 0.0;
1265 auto mpoly_ring_sizes =
reinterpret_cast<int32_t*
>(mpoly_ring_sizes_in);
1268 auto next_poly_coords = mpoly_coords;
1269 auto next_poly_ring_sizes = mpoly_ring_sizes;
1271 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
1272 auto poly_coords = next_poly_coords;
1273 auto poly_ring_sizes = next_poly_ring_sizes;
1274 auto poly_num_rings =
reinterpret_cast<int32_t*
>(mpoly_poly_sizes)[poly];
1276 int32_t poly_num_coords = 0;
1277 for (
auto ring = 0; ring < poly_num_rings; ring++) {
1278 poly_num_coords += 2 * *next_poly_ring_sizes++;
1281 next_poly_coords += poly_coords_size;
1283 auto exterior_ring_num_coords = poly_ring_sizes[0] * 2;
1287 poly_coords, exterior_ring_coords_size, ic, isr, osr, geodesic,
true);
1295 int32_t mpoly_coords_size,
1296 int8_t* mpoly_ring_sizes,
1297 int32_t mpoly_num_rings,
1298 int8_t* mpoly_poly_sizes,
1299 int32_t mpoly_num_polys,
1317 int32_t mpoly_coords_size,
1318 int8_t* mpoly_ring_sizes,
1319 int32_t mpoly_num_rings,
1320 int8_t* mpoly_poly_sizes,
1321 int32_t mpoly_num_polys,
1347 return (x1 * y2 - x2 * y1 + x3 * y1 - x1 * y3 + x2 * y3 - x3 * y2) / 2.0;
1357 if (ring_num_coords < 6) {
1363 Point2D p1 =
get_point(ring, 0, ic, isr, osr);
1364 Point2D p2 =
get_point(ring, 2, ic, isr, osr);
1365 for (int32_t i = 4; i < ring_num_coords; i += 2) {
1366 Point2D p3 =
get_point(ring, i, ic, isr, osr);
1374 int32_t poly_coords_size,
1375 int8_t* poly_ring_sizes_in,
1376 int32_t poly_num_rings,
1380 if (poly_num_rings <= 0) {
1385 auto ring_coords = poly_coords;
1386 auto poly_ring_sizes =
reinterpret_cast<int32_t*
>(poly_ring_sizes_in);
1391 for (
auto r = 0; r < poly_num_rings; r++) {
1393 area +=
area_ring(ring_coords, ring_coords_size, ic, isr, osr);
1395 ring_coords += ring_coords_size;
1402 int32_t poly_coords_size,
1403 int8_t* poly_ring_sizes,
1404 int32_t poly_num_rings,
1409 poly_coords, poly_coords_size, poly_ring_sizes, poly_num_rings, ic, isr, osr);
1414 int32_t mpoly_coords_size,
1415 int8_t* mpoly_ring_sizes,
1416 int32_t mpoly_num_rings,
1417 int8_t* mpoly_poly_sizes_in,
1418 int32_t mpoly_num_polys,
1422 if (mpoly_num_rings <= 0 || mpoly_num_polys <= 0) {
1428 auto mpoly_poly_sizes =
reinterpret_cast<int32_t*
>(mpoly_poly_sizes_in);
1431 auto next_poly_coords = mpoly_coords;
1432 auto next_poly_ring_sizes =
reinterpret_cast<int32_t*
>(mpoly_ring_sizes);
1434 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
1435 auto poly_coords = next_poly_coords;
1436 auto poly_ring_sizes = next_poly_ring_sizes;
1437 auto poly_num_rings = mpoly_poly_sizes[poly];
1439 int32_t poly_num_coords = 0;
1440 for (
auto ring = 0; ring < poly_num_rings; ring++) {
1441 poly_num_coords += 2 * *next_poly_ring_sizes++;
1444 next_poly_coords += poly_coords_size;
1448 reinterpret_cast<int8_t*>(poly_ring_sizes),
1478 double* point_centroid) {
1479 Point2D
const centroid =
get_point(p, 0, ic, isr, osr);
1480 point_centroid[0] = centroid.x;
1481 point_centroid[1] = centroid.y;
1490 double* multipoint_centroid) {
1494 for (int32_t i = 0; i < mp_num_coords; i += 2) {
1495 Point2D mpp =
get_point(mp, i, ic, isr, osr);
1499 auto mp_num_points = mp_num_coords >> 1;
1500 multipoint_centroid[0] = x / mp_num_points;
1501 multipoint_centroid[1] = y / mp_num_points;
1509 double* linestring_centroid_sum) {
1512 double segment_midpoint_x = (x1 + x2) / 2.0;
1513 double segment_midpoint_y = (y1 + y2) / 2.0;
1514 linestring_centroid_sum[0] += ldist * segment_midpoint_x;
1515 linestring_centroid_sum[1] += ldist * segment_midpoint_y;
1525 double* total_length,
1526 double* linestring_centroid_sum,
1527 int64_t* num_points,
1528 double* point_centroid_sum) {
1530 double length = 0.0;
1531 Point2D
const l0 =
get_point(l, 0, ic, isr, osr);
1533 for (int32_t i = 2; i < l_num_coords; i += 2) {
1534 Point2D
const l1 = l2;
1538 if (l_num_coords > 4 && closed) {
1542 *total_length += length;
1543 if (length == 0.0 && l_num_coords > 0) {
1545 point_centroid_sum[0] += l0.x;
1546 point_centroid_sum[1] += l0.y;
1557 double* linestring_centroid) {
1558 double length = 0.0;
1559 double linestring_centroid_sum[2] = {0.0, 0.0};
1560 int64_t num_points = 0;
1561 double point_centroid_sum[2] = {0.0, 0.0};
1569 &linestring_centroid_sum[0],
1571 &point_centroid_sum[0]);
1573 linestring_centroid[0] = linestring_centroid_sum[0] / length;
1574 linestring_centroid[1] = linestring_centroid_sum[1] / length;
1575 }
else if (num_points > 0) {
1576 linestring_centroid[0] = point_centroid_sum[0] / num_points;
1577 linestring_centroid[1] = point_centroid_sum[1] / num_points;
1588 double* total_area2,
1590 double cx = x1 + x2 + x3;
1591 double cy = y1 + y2 + y3;
1592 double area2 = x1 * y2 - x2 * y1 + x3 * y1 - x1 * y3 + x2 * y3 - x3 * y2;
1593 cg3[0] += sign * area2 * cx;
1594 cg3[1] += sign * area2 * cy;
1595 *total_area2 += sign * area2;
1605 double* total_area2,
1607 double* total_length,
1608 double* linestring_centroid_sum,
1609 int64_t* num_points,
1610 double* point_centroid_sum) {
1613 if (ring_num_coords < 6) {
1617 Point2D p1 =
get_point(ring, 0, ic, isr, osr);
1618 Point2D p2 =
get_point(ring, 2, ic, isr, osr);
1619 for (int32_t i = 4; i < ring_num_coords; i += 2) {
1620 Point2D p3 =
get_point(ring, i, ic, isr, osr);
1632 linestring_centroid_sum,
1634 point_centroid_sum);
1639 int64_t poly_coords_size,
1640 int32_t* poly_ring_sizes,
1641 int64_t poly_num_rings,
1645 double* total_area2,
1647 double* total_length,
1648 double* linestring_centroid_sum,
1649 int64_t* num_points,
1650 double* point_centroid_sum) {
1651 if (poly_num_rings <= 0) {
1655 auto ring_coords = poly_coords;
1657 for (
auto r = 0; r < poly_num_rings; r++) {
1660 double sign = (r == 0) ? 1.0 : -1.0;
1670 linestring_centroid_sum,
1672 point_centroid_sum);
1674 ring_coords += ring_coords_size;
1681 int32_t poly_coords_size,
1682 int32_t* poly_ring_sizes,
1683 int32_t poly_num_rings,
1687 double* poly_centroid) {
1688 if (poly_num_rings <= 0) {
1689 poly_centroid[0] = 0.0;
1690 poly_centroid[1] = 0.0;
1692 double total_area2 = 0.0;
1693 double cg3[2] = {0.0, 0.0};
1694 double total_length = 0.0;
1695 double linestring_centroid_sum[2] = {0.0, 0.0};
1696 int64_t num_points = 0;
1697 double point_centroid_sum[2] = {0.0, 0.0};
1708 &linestring_centroid_sum[0],
1710 &point_centroid_sum[0]);
1712 if (total_area2 != 0.0) {
1713 poly_centroid[0] = cg3[0] / 3 / total_area2;
1714 poly_centroid[1] = cg3[1] / 3 / total_area2;
1715 }
else if (total_length > 0.0) {
1717 poly_centroid[0] = linestring_centroid_sum[0] / total_length;
1718 poly_centroid[1] = linestring_centroid_sum[1] / total_length;
1719 }
else if (num_points > 0) {
1721 poly_centroid[0] = point_centroid_sum[0] / num_points;
1722 poly_centroid[1] = point_centroid_sum[1] / num_points;
1724 Point2D centroid =
get_point(poly_coords, 0, ic, isr, osr);
1725 poly_centroid[0] = centroid.x;
1726 poly_centroid[1] = centroid.y;
1732 int32_t mpoly_coords_size,
1733 int32_t* mpoly_ring_sizes,
1734 int32_t mpoly_num_rings,
1735 int32_t* mpoly_poly_sizes,
1736 int32_t mpoly_num_polys,
1740 double* mpoly_centroid) {
1741 if (mpoly_num_rings <= 0 || mpoly_num_polys <= 0) {
1742 mpoly_centroid[0] = 0.0;
1743 mpoly_centroid[1] = 0.0;
1746 double total_area2 = 0.0;
1747 double cg3[2] = {0.0, 0.0};
1748 double total_length = 0.0;
1749 double linestring_centroid_sum[2] = {0.0, 0.0};
1750 int64_t num_points = 0;
1751 double point_centroid_sum[2] = {0.0, 0.0};
1754 auto next_poly_coords = mpoly_coords;
1755 auto next_poly_ring_sizes = mpoly_ring_sizes;
1757 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
1758 auto poly_coords = next_poly_coords;
1759 auto poly_ring_sizes = next_poly_ring_sizes;
1760 auto poly_num_rings = mpoly_poly_sizes[poly];
1762 int32_t poly_num_coords = 0;
1763 for (
auto ring = 0; ring < poly_num_rings; ring++) {
1764 poly_num_coords += 2 * *next_poly_ring_sizes++;
1767 next_poly_coords += poly_coords_size;
1779 &linestring_centroid_sum[0],
1781 &point_centroid_sum[0]);
1784 if (total_area2 != 0.0) {
1785 mpoly_centroid[0] = cg3[0] / 3 / total_area2;
1786 mpoly_centroid[1] = cg3[1] / 3 / total_area2;
1787 }
else if (total_length > 0.0) {
1789 mpoly_centroid[0] = linestring_centroid_sum[0] / total_length;
1790 mpoly_centroid[1] = linestring_centroid_sum[1] / total_length;
1791 }
else if (num_points > 0) {
1793 mpoly_centroid[0] = point_centroid_sum[0] / num_points;
1794 mpoly_centroid[1] = point_centroid_sum[1] / num_points;
1796 Point2D centroid =
get_point(mpoly_coords, 0, ic, isr, osr);
1797 mpoly_centroid[0] = centroid.x;
1798 mpoly_centroid[1] = centroid.y;
1816 Point2D
const pt1 =
get_point(p1, 0, ic1, isr1, osr);
1817 Point2D
const pt2 =
get_point(p2, 0, ic2, isr2, osr);
1831 Point2D
const pt1 =
get_point(p1, 0, ic1, isr1, osr);
1832 Point2D
const pt2 =
get_point(p2, 0, ic2, isr2, osr);
1846 Point2D
const pt1 =
get_point(p1, 0, ic1, 4326, 4326);
1847 Point2D
const pt2 =
get_point(p2, 0, ic2, 4326, 4326);
1862 Point2D
const pt =
get_point(p, 0, ic1, 4326, 4326);
1864 Point2D
const pl =
get_point(l, 2 * (lpoints - 1), ic2, 4326, 4326);
1880 p, psize, l, lsize, ic2, isr2, ic1, isr1, osr);
1894 Point2D pt =
get_point(p, 0, ic1, isr1, osr);
1896 Point2D mpp =
get_point(mp, 0, ic2, isr2, osr);
1898 for (int32_t i = 2; i < mp_num_coords; i += 2) {
1904 if (dist <= threshold) {
1922 Point2D pt =
get_point(p, 0, ic1, isr1, osr);
1924 Point2D mpp =
get_point(mp, 0, ic2, isr2, osr);
1926 for (int32_t i = 2; i < mp_num_coords; i += 2) {
1932 if (dist <= threshold) {
1950 Point2D pt =
get_point(p, 0, ic1, isr1, osr);
1954 Point2D l1 =
get_point(l, 0, ic2, isr2, osr);
1955 Point2D l2 =
get_point(l, 2, ic2, isr2, osr);
1958 for (int32_t i = 4; i < l_num_coords; i += 2) {
1965 if (dist <= threshold) {
1969 if (l_num_coords > 4 && check_closed) {
1992 p, psize, l, lsize, ic1, isr1, ic2, isr2, osr,
true, threshold);
2007 p, psize, l, lsize, ic1, isr1, ic2, isr2, osr,
false, threshold);
2014 int32_t* mls_ls_sizes,
2022 if (mls_ls_num <= 0) {
2025 double min_distance = 0.0;
2027 auto next_linestring_coords = mls;
2029 for (
auto l = 0; l < mls_ls_num; l++) {
2030 auto linestring_coords = next_linestring_coords;
2031 auto linestring_num_points = mls_ls_sizes[l];
2032 auto linestring_num_coords = 2 * linestring_num_points;
2034 next_linestring_coords += linestring_coords_size;
2038 linestring_coords_size,
2046 if (l == 0 || min_distance > distance) {
2047 min_distance = distance;
2052 if (min_distance <= threshold) {
2058 return min_distance;
2066 int32_t* mls_ls_sizes,
2092 int32_t* poly_ring_sizes,
2093 int64_t poly_num_rings,
2101 if (poly_num_rings > 0) {
2102 exterior_ring_num_coords = poly_ring_sizes[0] * 2;
2106 Point2D pt =
get_point(p, 0, ic1, isr1, osr);
2108 poly, exterior_ring_num_coords, pt.x, pt.y, ic2, isr2, osr)) {
2111 p, psize, poly, exterior_ring_coords_size, ic1, isr1, ic2, isr2, osr, threshold);
2115 poly += exterior_ring_coords_size;
2117 for (
auto r = 1; r < poly_num_rings; r++) {
2118 auto interior_ring_num_coords = poly_ring_sizes[r] * 2;
2119 auto interior_ring_coords_size =
2122 poly, interior_ring_num_coords, pt.x, pt.y, ic2, isr2, osr)) {
2127 interior_ring_coords_size,
2135 poly += interior_ring_coords_size;
2142 int8_t* mpoly_coords,
2143 int64_t mpoly_coords_size,
2144 int32_t* mpoly_ring_sizes,
2145 int64_t mpoly_num_rings,
2146 int32_t* mpoly_poly_sizes,
2147 int64_t mpoly_num_polys,
2154 if (mpoly_num_polys <= 0) {
2157 double min_distance = 0.0;
2160 auto next_poly_coords = mpoly_coords;
2161 auto next_poly_ring_sizes = mpoly_ring_sizes;
2163 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
2164 auto poly_coords = next_poly_coords;
2165 auto poly_ring_sizes = next_poly_ring_sizes;
2166 auto poly_num_rings = mpoly_poly_sizes[poly];
2168 int32_t poly_num_coords = 0;
2169 for (
auto ring = 0; ring < poly_num_rings; ring++) {
2170 poly_num_coords += 2 * *next_poly_ring_sizes++;
2173 next_poly_coords += poly_coords_size;
2186 if (poly == 0 || min_distance > distance) {
2187 min_distance = distance;
2192 if (min_distance <= threshold) {
2198 return min_distance;
2206 int32_t* poly_ring_sizes,
2207 int64_t poly_num_rings,
2231 int8_t* mpoly_coords,
2232 int64_t mpoly_coords_size,
2233 int32_t* mpoly_ring_sizes,
2234 int64_t mpoly_num_rings,
2235 int32_t* mpoly_poly_sizes,
2236 int64_t mpoly_num_polys,
2264 int32_t* poly_ring_sizes,
2265 int64_t poly_num_rings,
2288 for (int32_t i = 2; i < mp_num_coords; i += 2) {
2305 if (dist <= threshold) {
2315 int8_t* mpoly_coords,
2316 int64_t mpoly_coords_size,
2317 int32_t* mpoly_ring_sizes,
2318 int64_t mpoly_num_rings,
2319 int32_t* mpoly_poly_sizes,
2320 int64_t mpoly_num_polys,
2345 for (int32_t i = 2; i < mp_num_coords; i += 2) {
2364 if (dist <= threshold) {
2374 int32_t* poly_ring_sizes,
2375 int64_t poly_num_rings,
2400 int64_t mpoly_coords_size,
2401 int32_t* mpoly_ring_sizes,
2402 int64_t mpoly_num_rings,
2403 int32_t* mpoly_poly_sizes,
2404 int64_t mpoly_num_polys,
2441 p, psize, mp, mpsize, ic2, isr2, ic1, isr1, osr, threshold);
2456 p, psize, mp, mpsize, ic2, isr2, ic1, isr1, osr, threshold);
2473 for (int32_t i = 0; i < mp1_num_coords; i += 2) {
2474 Point2D mp1p =
get_point(mp1, 0, ic1, isr1, osr);
2475 for (int32_t j = 0; j < mp2_num_coords; j += 2) {
2476 Point2D mp2p =
get_point(mp2, 0, ic2, isr2, osr);
2478 if (dist > ldist || dist < 0.0) {
2481 if (dist <= threshold) {
2503 for (int32_t i = 0; i < mp1_num_coords; i += 2) {
2504 Point2D mp1p =
get_point(mp1, i, ic1, isr1, osr);
2505 for (int32_t j = 0; j < mp2_num_coords; j += 2) {
2506 Point2D mp2p =
get_point(mp2, j, ic2, isr2, osr);
2508 if (dist > ldist || dist < 0.0) {
2511 if (dist <= threshold) {
2534 p, psize, l, lsize, ic1, isr1, ic2, isr2, osr,
true, threshold);
2536 for (int32_t i = 2; i < mp_num_coords; i += 2) {
2538 p, psize, l, lsize, ic1, isr1, ic2, isr2, osr,
true, threshold);
2543 if (dist <= threshold) {
2555 int32_t* mls_ls_sizes,
2579 for (int32_t i = 2; i < mp_num_coords; i += 2) {
2596 if (dist <= threshold) {
2615 p, psize, l, lsize, ic2, isr2, ic1, isr1, osr, threshold);
2630 mp, mpsize, l, lsize, ic2, isr2, ic1, isr1, osr, threshold);
2636 int32_t* mls_ls_sizes,
2674 double threshold_squared = threshold * threshold;
2675 double dist_squared = 0.0;
2676 Point2D l11 =
get_point(l1, 0, ic1, isr1, osr);
2677 for (int32_t i1 = 2; i1 < l1_num_coords; i1 += 2) {
2678 Point2D l12 =
get_point(l1, i1, ic1, isr1, osr);
2679 Point2D l21 =
get_point(l2, 0, ic2, isr2, osr);
2680 for (int32_t i2 = 2; i2 < l2_num_coords; i2 += 2) {
2681 Point2D l22 =
get_point(l2, i2, ic2, isr2, osr);
2688 double ldist_squared = ldist * ldist;
2690 if (i1 == 2 && i2 == 2) {
2691 dist_squared = ldist_squared;
2693 }
else if (dist_squared > ldist_squared) {
2694 dist_squared = ldist_squared;
2699 if (dist_squared <= threshold_squared) {
2702 return sqrt(dist_squared);
2710 return sqrt(dist_squared);
2716 int8_t* poly_coords,
2717 int64_t poly_coords_size,
2718 int32_t* poly_ring_sizes,
2719 int64_t poly_num_rings,
2745 if (min_distance <= threshold) {
2746 return min_distance;
2752 auto poly_ring_coords = poly_coords;
2753 for (
auto r = 0; r < poly_num_rings; r++) {
2754 int64_t poly_ring_num_coords = poly_ring_sizes[r] * 2;
2757 poly_ring_num_coords,
2766 if (min_distance > distance) {
2767 min_distance = distance;
2771 if (min_distance <= threshold) {
2772 return min_distance;
2779 return min_distance;
2785 int8_t* mpoly_coords,
2786 int64_t mpoly_coords_size,
2787 int32_t* mpoly_ring_sizes,
2788 int64_t mpoly_num_rings,
2789 int32_t* mpoly_poly_sizes,
2790 int64_t mpoly_num_polys,
2798 double min_distance = 0.0;
2801 auto next_poly_coords = mpoly_coords;
2802 auto next_poly_ring_sizes = mpoly_ring_sizes;
2804 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
2805 auto poly_coords = next_poly_coords;
2806 auto poly_ring_sizes = next_poly_ring_sizes;
2807 auto poly_num_rings = mpoly_poly_sizes[poly];
2809 int32_t poly_num_coords = 0;
2810 for (
auto ring = 0; ring < poly_num_rings; ring++) {
2811 poly_num_coords += 2 * *next_poly_ring_sizes++;
2814 next_poly_coords += poly_coords_size;
2827 if (poly == 0 || min_distance > distance) {
2828 min_distance = distance;
2833 if (min_distance <= threshold) {
2834 return min_distance;
2839 return min_distance;
2845 int32_t* mls_ls_sizes,
2871 int64_t poly_coords_size,
2872 int32_t* poly_ring_sizes,
2873 int64_t poly_num_rings,
2898 int64_t poly_coords_size,
2899 int32_t* poly_ring_sizes,
2900 int64_t poly_num_rings,
2925 int64_t poly1_coords_size,
2926 int32_t* poly1_ring_sizes,
2927 int64_t poly1_num_rings,
2928 int8_t* poly2_coords,
2929 int64_t poly2_coords_size,
2930 int32_t* poly2_ring_sizes,
2931 int64_t poly2_num_rings,
2939 auto poly2_first_point_coords = poly2_coords;
2945 poly2_first_point_coords,
2946 poly2_first_point_coords_size,
2957 if (min_distance <= threshold) {
2958 return min_distance;
2971 auto poly1_ring_coords = poly1_coords;
2972 for (
auto r1 = 0; r1 < poly1_num_rings; r1++) {
2973 int64_t poly1_ring_num_coords = poly1_ring_sizes[r1] * 2;
2975 auto poly2_ring_coords = poly2_coords;
2976 for (
auto r2 = 0; r2 < poly2_num_rings; r2++) {
2977 int64_t poly2_ring_num_coords = poly2_ring_sizes[r2] * 2;
2980 poly1_ring_num_coords,
2982 poly2_ring_num_coords,
2989 if (min_distance > distance) {
2990 min_distance = distance;
2994 if (min_distance <= threshold) {
2995 return min_distance;
3005 return min_distance;
3010 int64_t poly1_coords_size,
3011 int32_t* poly1_ring_sizes,
3012 int64_t poly1_num_rings,
3013 int8_t* mpoly_coords,
3014 int64_t mpoly_coords_size,
3015 int32_t* mpoly_ring_sizes,
3016 int64_t mpoly_num_rings,
3017 int32_t* mpoly_poly_sizes,
3018 int64_t mpoly_num_polys,
3025 double min_distance = 0.0;
3028 auto next_poly_coords = mpoly_coords;
3029 auto next_poly_ring_sizes = mpoly_ring_sizes;
3031 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
3032 auto poly_coords = next_poly_coords;
3033 auto poly_ring_sizes = next_poly_ring_sizes;
3034 auto poly_num_rings = mpoly_poly_sizes[poly];
3036 int32_t poly_num_coords = 0;
3037 for (
auto ring = 0; ring < poly_num_rings; ring++) {
3038 poly_num_coords += 2 * *next_poly_ring_sizes++;
3041 next_poly_coords += poly_coords_size;
3056 if (poly == 0 || min_distance > distance) {
3057 min_distance = distance;
3062 if (min_distance <= threshold) {
3068 return min_distance;
3073 int64_t mpoly_coords_size,
3074 int32_t* mpoly_ring_sizes,
3075 int64_t mpoly_num_rings,
3076 int32_t* mpoly_poly_sizes,
3077 int64_t mpoly_num_polys,
3104 int64_t mpoly_coords_size,
3105 int32_t* mpoly_ring_sizes,
3106 int64_t mpoly_num_rings,
3107 int32_t* mpoly_poly_sizes,
3108 int64_t mpoly_num_polys,
3135 int64_t mpoly_coords_size,
3136 int32_t* mpoly_ring_sizes,
3137 int64_t mpoly_num_rings,
3138 int32_t* mpoly_poly_sizes,
3139 int64_t mpoly_num_polys,
3140 int8_t* poly1_coords,
3141 int64_t poly1_coords_size,
3142 int32_t* poly1_ring_sizes,
3143 int64_t poly1_num_rings,
3170 int64_t mpoly1_coords_size,
3171 int32_t* mpoly1_ring_sizes,
3172 int64_t mpoly1_num_rings,
3173 int32_t* mpoly1_poly_sizes,
3174 int64_t mpoly1_num_polys,
3175 int8_t* mpoly2_coords,
3176 int64_t mpoly2_coords_size,
3177 int32_t* mpoly2_ring_sizes,
3178 int64_t mpoly2_num_rings,
3179 int32_t* mpoly2_poly_sizes,
3180 int64_t mpoly2_num_polys,
3187 double min_distance = 0.0;
3191 auto next_poly_coords = mpoly1_coords;
3192 auto next_poly_ring_sizes = mpoly1_ring_sizes;
3194 for (
auto poly = 0; poly < mpoly1_num_polys; poly++) {
3195 auto poly_coords = next_poly_coords;
3196 auto poly_ring_sizes = next_poly_ring_sizes;
3197 auto poly_num_rings = mpoly1_poly_sizes[poly];
3199 int32_t poly_num_coords = 0;
3200 for (
auto ring = 0; ring < poly_num_rings; ring++) {
3201 poly_num_coords += 2 * *next_poly_ring_sizes++;
3204 next_poly_coords += poly_coords_size;
3221 if (poly == 0 || min_distance > distance) {
3222 min_distance = distance;
3227 if (min_distance <= threshold) {
3233 return min_distance;
3239 int32_t* mls1_ls_sizes,
3240 int64_t mls1_ls_num,
3243 int32_t* mls2_ls_sizes,
3244 int64_t mls2_ls_num,
3268 double distance_within) {
3270 p1, p1size, p2, p2size, ic1, isr1, ic2, isr2, osr) <=
3271 distance_within * distance_within;
3284 double distance_within) {
3287 return (dist_meters <= distance_within);
3296 int64_t l2bounds_size,
3302 double distance_within) {
3306 p1, p1size, ic1, isr1, l2bounds, l2bounds_size, isr2, osr, distance_within)) {
3312 const double threshold = distance_within;
3314 p1, p1size, l2, l2size, ic1, isr1, ic2, isr2, osr, threshold) <=
3321 int8_t* poly_coords,
3322 int64_t poly_coords_size,
3323 int32_t* poly_ring_sizes,
3324 int64_t poly_num_rings,
3325 double* poly_bounds,
3326 int64_t poly_bounds_size,
3332 double distance_within) {
3348 const double threshold = distance_within;
3360 threshold) <= distance_within;
3366 int8_t* mpoly_coords,
3367 int64_t mpoly_coords_size,
3368 int32_t* mpoly_ring_sizes,
3369 int64_t mpoly_num_rings,
3370 int32_t* mpoly_poly_sizes,
3371 int64_t mpoly_num_polys,
3372 double* mpoly_bounds,
3373 int64_t mpoly_bounds_size,
3379 double distance_within) {
3395 const double threshold = distance_within;
3409 threshold) <= distance_within;
3416 int64_t l1bounds_size,
3420 int64_t l2bounds_size,
3426 double distance_within) {
3427 if (l1bounds && l2bounds) {
3442 const double threshold = distance_within;
3444 l1, l1size, l2, l2size, ic1, isr1, ic2, isr2, osr, threshold) <=
3452 int64_t l1bounds_size,
3453 int8_t* poly_coords,
3454 int64_t poly_coords_size,
3455 int32_t* poly_ring_sizes,
3456 int64_t poly_num_rings,
3457 double* poly_bounds,
3458 int64_t poly_bounds_size,
3464 double distance_within) {
3465 if (l1bounds && poly_bounds) {
3480 CoordData l1_relevant_section{l1, l1size};
3486 l1, l1size, ic1, isr1, poly_bounds, poly_bounds_size, isr2, osr, distance_within);
3487 if (!l1_relevant_section.ptr) {
3498 const double threshold = distance_within;
3500 l1_relevant_section.size,
3510 threshold) <= distance_within;
3517 int64_t l1bounds_size,
3518 int8_t* mpoly_coords,
3519 int64_t mpoly_coords_size,
3520 int32_t* mpoly_ring_sizes,
3521 int64_t mpoly_num_rings,
3522 int32_t* mpoly_poly_sizes,
3523 int64_t mpoly_num_polys,
3524 double* mpoly_bounds,
3525 int64_t mpoly_bounds_size,
3531 double distance_within) {
3532 if (l1bounds && mpoly_bounds) {
3547 CoordData l1_relevant_section{l1, l1size};
3561 if (!l1_relevant_section.ptr) {
3573 const double threshold = distance_within;
3575 l1_relevant_section.size,
3587 threshold) <= distance_within;
3592 int64_t poly1_coords_size,
3593 int32_t* poly1_ring_sizes,
3594 int64_t poly1_num_rings,
3595 double* poly1_bounds,
3596 int64_t poly1_bounds_size,
3597 int8_t* poly2_coords,
3598 int64_t poly2_coords_size,
3599 int32_t* poly2_ring_sizes,
3600 int64_t poly2_num_rings,
3601 double* poly2_bounds,
3602 int64_t poly2_bounds_size,
3608 double distance_within) {
3609 if (poly1_bounds && poly2_bounds) {
3624 const double threshold = distance_within;
3638 threshold) <= distance_within;
3643 int64_t poly_coords_size,
3644 int32_t* poly_ring_sizes,
3645 int64_t poly_num_rings,
3646 double* poly_bounds,
3647 int64_t poly_bounds_size,
3648 int8_t* mpoly_coords,
3649 int64_t mpoly_coords_size,
3650 int32_t* mpoly_ring_sizes,
3651 int64_t mpoly_num_rings,
3652 int32_t* mpoly_poly_sizes,
3653 int64_t mpoly_num_polys,
3654 double* mpoly_bounds,
3655 int64_t mpoly_bounds_size,
3661 double distance_within) {
3662 if (poly_bounds && mpoly_bounds) {
3677 const double threshold = distance_within;
3693 threshold) <= distance_within;
3698 int64_t mpoly1_coords_size,
3699 int32_t* mpoly1_ring_sizes,
3700 int64_t mpoly1_num_rings,
3701 int32_t* mpoly1_poly_sizes,
3702 int64_t mpoly1_num_polys,
3703 double* mpoly1_bounds,
3704 int64_t mpoly1_bounds_size,
3705 int8_t* mpoly2_coords,
3706 int64_t mpoly2_coords_size,
3707 int32_t* mpoly2_ring_sizes,
3708 int64_t mpoly2_num_rings,
3709 int32_t* mpoly2_poly_sizes,
3710 int64_t mpoly2_num_polys,
3711 double* mpoly2_bounds,
3712 int64_t mpoly2_bounds_size,
3718 double distance_within) {
3719 if (mpoly1_bounds && mpoly2_bounds) {
3734 const double threshold = distance_within;
3752 threshold) <= distance_within;
3770 if (length1 > length2) {
3785 bool check_closed) {
3787 Point2D pt =
get_point(p, 0, ic1, isr1, osr);
3791 Point2D l1 =
get_point(l, 0, ic2, isr2, osr);
3792 Point2D l2 =
get_point(l, 2, ic2, isr2, osr);
3795 for (int32_t i = 4; i < l_num_coords; i += 2) {
3799 if (max_dist < ldist) {
3803 if (l_num_coords > 4 && check_closed) {
3807 if (max_dist < ldist) {
3825 p, psize, l, lsize, ic1, isr1, ic2, isr2, osr,
false);
3839 p, psize, l, lsize, ic2, isr2, ic1, isr1, osr,
false);
3858 Point2D
const pt1 =
get_point(p1, 0, ic1, isr1, osr);
3859 Point2D
const pt2 =
get_point(p2, 0, ic2, isr2, osr);
3860 double tolerance =
tol(ic1, ic2);
3861 return tol_eq(pt1.x, pt2.x, tolerance) &&
tol_eq(pt1.y, pt2.y, tolerance);
3870 int64_t lbounds_size,
3876 Point2D
const pt =
get_point(p, 0, ic1, isr1, osr);
3879 if (
tol_eq(pt.x, lbounds[0]) &&
tol_eq(pt.y, lbounds[1]) &&
3880 tol_eq(pt.x, lbounds[2]) &&
tol_eq(pt.y, lbounds[3])) {
3886 for (
int i = 0; i < l_num_coords; i += 2) {
3887 Point2D pl =
get_point(l, i, ic2, isr2, osr);
3899 int8_t* poly_coords,
3900 int64_t poly_coords_size,
3901 int32_t* poly_ring_sizes,
3902 int64_t poly_num_rings,
3903 double* poly_bounds,
3904 int64_t poly_bounds_size,
3911 if (poly_num_rings > 0) {
3912 exterior_ring_num_coords = poly_ring_sizes[0] * 2;
3919 exterior_ring_coords_size,
3933 int64_t lbounds_size,
3949 int64_t lbounds_size,
3950 int8_t* poly_coords,
3951 int64_t poly_coords_size,
3952 int32_t* poly_ring_sizes,
3953 int64_t poly_num_rings,
3954 double* poly_bounds,
3955 int64_t poly_bounds_size,
3965 template <
typename T, EdgeBehavior TEdgeBehavior>
3967 const int64_t poly_coords_size,
3968 const int32_t* poly_ring_sizes,
3969 const int64_t poly_num_rings,
3970 const double* poly_bounds,
3971 const int64_t poly_bounds_size,
3973 const int64_t psize,
3978 const int32_t osr) {
3981 Point2D
const pt =
get_point(p, 0, ic2, isr2, osr);
3983 DEBUG_STMT(printf(
"Bounding box does not contain point, exiting.\n"));
3988 auto get_x_coord = [=]() ->
T {
3989 if constexpr (std::is_floating_point<T>::value) {
3990 return get_point(p, 0, ic2, isr2, osr).x;
3997 auto get_y_coord = [=]() ->
T {
3998 if constexpr (std::is_floating_point<T>::value) {
3999 return get_point(p, 0, ic2, isr2, osr).y;
4006 const T px = get_x_coord();
4007 const T py = get_y_coord();
4008 DEBUG_STMT(printf(
"pt: %f, %f\n", (
double)px, (
double)py));
4011 auto exterior_ring_num_coords =
4012 poly_num_rings > 0 ? poly_ring_sizes[0] * 2 : poly_num_coords;
4014 auto poly = poly_coords;
4015 if (point_in_polygon_winding_number<T, TEdgeBehavior>(
4016 poly, exterior_ring_num_coords, px, py, ic1, isr1, osr)) {
4020 for (
auto r = 1; r < poly_num_rings; r++) {
4021 const int64_t interior_ring_num_coords = poly_ring_sizes[r] * 2;
4022 if (point_in_polygon_winding_number<T, TEdgeBehavior>(
4023 poly, interior_ring_num_coords, px, py, ic1, isr1, osr)) {
4034 const int64_t poly_coords_size,
4035 const int32_t* poly_ring_sizes,
4036 const int64_t poly_num_rings,
4037 const double* poly_bounds,
4038 const int64_t poly_bounds_size,
4040 const int64_t psize,
4045 const int32_t osr) {
4046 return Contains_Polygon_Point_Impl<double, EdgeBehavior::kExcludePointOnEdge>(
4063 const int64_t poly_coords_size,
4064 const int32_t* poly_ring_sizes,
4065 const int64_t poly_num_rings,
4066 const double* poly_bounds,
4067 const int64_t poly_bounds_size,
4069 const int64_t psize,
4074 const int32_t osr) {
4075 return Contains_Polygon_Point_Impl<int64_t, EdgeBehavior::kExcludePointOnEdge>(
4093 int64_t poly_coords_size,
4094 int32_t* poly_ring_sizes,
4095 int64_t poly_num_rings,
4096 double* poly_bounds,
4097 int64_t poly_bounds_size,
4101 int64_t lbounds_size,
4107 if (poly_num_rings > 1) {
4112 if (poly_bounds && lbounds) {
4113 if (!
box_contains_box(poly_bounds, poly_bounds_size, lbounds, lbounds_size)) {
4122 poly_coords, poly_num_coords, l, lnum_coords, ic1, isr1, ic2, isr2, osr);
4127 int64_t poly1_coords_size,
4128 int32_t* poly1_ring_sizes,
4129 int64_t poly1_num_rings,
4130 double* poly1_bounds,
4131 int64_t poly1_bounds_size,
4132 int8_t* poly2_coords,
4133 int64_t poly2_coords_size,
4134 int32_t* poly2_ring_sizes,
4135 int64_t poly2_num_rings,
4136 double* poly2_bounds,
4137 int64_t poly2_bounds_size,
4145 if (poly1_num_rings > 1) {
4149 if (poly1_bounds && poly2_bounds) {
4151 poly1_bounds, poly1_bounds_size, poly2_bounds, poly2_bounds_size)) {
4156 int64_t poly2_exterior_ring_coords_size = poly2_coords_size;
4157 if (poly2_num_rings > 0) {
4158 poly2_exterior_ring_coords_size =
4168 poly2_exterior_ring_coords_size,
4178 template <
typename T, EdgeBehavior TEdgeBehavior>
4180 const int8_t* mpoly_coords,
4181 const int64_t mpoly_coords_size,
4182 const int32_t* mpoly_ring_sizes,
4183 const int64_t mpoly_num_rings,
4184 const int32_t* mpoly_poly_sizes,
4185 const int64_t mpoly_num_polys,
4186 const double* mpoly_bounds,
4187 const int64_t mpoly_bounds_size,
4189 const int64_t psize,
4194 const int32_t osr) {
4195 if (mpoly_num_polys <= 0) {
4202 Point2D
const pt =
get_point(p, 0, ic2, isr2, osr);
4210 auto next_poly_coords = mpoly_coords;
4211 auto next_poly_ring_sizes = mpoly_ring_sizes;
4213 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
4214 const auto poly_coords = next_poly_coords;
4215 const auto poly_ring_sizes = next_poly_ring_sizes;
4216 const auto poly_num_rings = mpoly_poly_sizes[poly];
4218 int32_t poly_num_coords = 0;
4219 for (
auto ring = 0; ring < poly_num_rings; ring++) {
4220 poly_num_coords += 2 * *next_poly_ring_sizes++;
4223 next_poly_coords += poly_coords_size;
4225 if (Contains_Polygon_Point_Impl<T, TEdgeBehavior>(poly_coords,
4247 int64_t mpoly_coords_size,
4248 int32_t* mpoly_ring_sizes,
4249 int64_t mpoly_num_rings,
4250 int32_t* mpoly_poly_sizes,
4251 int64_t mpoly_num_polys,
4252 double* mpoly_bounds,
4253 int64_t mpoly_bounds_size,
4261 return Contains_MultiPolygon_Point_Impl<double, EdgeBehavior::kExcludePointOnEdge>(
4280 int64_t mpoly_coords_size,
4281 int32_t* mpoly_ring_sizes,
4282 int64_t mpoly_num_rings,
4283 int32_t* mpoly_poly_sizes,
4284 int64_t mpoly_num_polys,
4285 double* mpoly_bounds,
4286 int64_t mpoly_bounds_size,
4294 return Contains_MultiPolygon_Point_Impl<int64_t, EdgeBehavior::kExcludePointOnEdge>(
4314 int64_t mpoly_coords_size,
4315 int32_t* mpoly_ring_sizes,
4316 int64_t mpoly_num_rings,
4317 int32_t* mpoly_poly_sizes,
4318 int64_t mpoly_num_polys,
4319 double* mpoly_bounds,
4320 int64_t mpoly_bounds_size,
4324 int64_t lbounds_size,
4330 if (mpoly_num_polys <= 0) {
4334 if (mpoly_bounds && lbounds) {
4335 if (!
box_contains_box(mpoly_bounds, mpoly_bounds_size, lbounds, lbounds_size)) {
4341 auto next_poly_coords = mpoly_coords;
4342 auto next_poly_ring_sizes = mpoly_ring_sizes;
4344 for (
auto poly = 0; poly < mpoly_num_polys; poly++) {
4345 auto poly_coords = next_poly_coords;
4346 auto poly_ring_sizes = next_poly_ring_sizes;
4347 auto poly_num_rings = mpoly_poly_sizes[poly];
4349 int32_t poly_num_coords = 0;
4350 for (
auto ring = 0; ring < poly_num_rings; ring++) {
4351 poly_num_coords += 2 * *next_poly_ring_sizes++;
4354 next_poly_coords += poly_coords_size;
4402 int64_t lbounds_size,
4409 Point2D
const pt =
get_point(p, 0, ic1, isr1, osr);
4423 int32_t* poly_ring_sizes,
4424 int64_t poly_num_rings,
4425 double* poly_bounds,
4426 int64_t poly_bounds_size,
4432 return Contains_Polygon_Point_Impl<double, EdgeBehavior::kIncludePointOnEdge>(
4451 int8_t* mpoly_coords,
4452 int64_t mpoly_coords_size,
4453 int32_t* mpoly_ring_sizes,
4454 int64_t mpoly_num_rings,
4455 int32_t* mpoly_poly_sizes,
4456 int64_t mpoly_num_polys,
4457 double* mpoly_bounds,
4458 int64_t mpoly_bounds_size,
4464 return Contains_MultiPolygon_Point_Impl<double, EdgeBehavior::kIncludePointOnEdge>(
4486 int64_t lbounds_size,
4495 p, psize, l, lsize, lbounds, lbounds_size, ic2, isr2, ic1, isr1, osr);
4502 int64_t l1bounds_size,
4506 int64_t l2bounds_size,
4512 if (l1bounds && l2bounds) {
4519 l1, l1size, l2, l2size, ic1, isr1, ic2, isr2, osr, 0.0));
4526 int64_t lbounds_size,
4529 int32_t* poly_ring_sizes,
4530 int64_t poly_num_rings,
4531 double* poly_bounds,
4532 int64_t poly_bounds_size,
4538 if (lbounds && poly_bounds) {
4539 if (!
box_overlaps_box(lbounds, lbounds_size, poly_bounds, poly_bounds_size)) {
4569 int64_t lbounds_size,
4570 int8_t* mpoly_coords,
4571 int64_t mpoly_coords_size,
4572 int32_t* mpoly_ring_sizes,
4573 int64_t mpoly_num_rings,
4574 int32_t* mpoly_poly_sizes,
4575 int64_t mpoly_num_polys,
4576 double* mpoly_bounds,
4577 int64_t mpoly_bounds_size,
4583 if (lbounds && mpoly_bounds) {
4584 if (!
box_overlaps_box(lbounds, lbounds_size, mpoly_bounds, mpoly_bounds_size)) {
4615 int32_t* poly_ring_sizes,
4616 int64_t poly_num_rings,
4617 double* poly_bounds,
4618 int64_t poly_bounds_size,
4626 return Contains_Polygon_Point_Impl<double, EdgeBehavior::kIncludePointOnEdge>(
4645 int32_t* poly_ring_sizes,
4646 int64_t poly_num_rings,
4647 double* poly_bounds,
4648 int64_t poly_bounds_size,
4656 return Contains_Polygon_Point_Impl<int64_t, EdgeBehavior::kIncludePointOnEdge>(
4675 int32_t* poly_ring_sizes,
4676 int64_t poly_num_rings,
4677 double* poly_bounds,
4678 int64_t poly_bounds_size,
4682 int64_t lbounds_size,
4707 int64_t poly1_coords_size,
4708 int32_t* poly1_ring_sizes,
4709 int64_t poly1_num_rings,
4710 double* poly1_bounds,
4711 int64_t poly1_bounds_size,
4712 int8_t* poly2_coords,
4713 int64_t poly2_coords_size,
4714 int32_t* poly2_ring_sizes,
4715 int64_t poly2_num_rings,
4716 double* poly2_bounds,
4717 int64_t poly2_bounds_size,
4723 if (poly1_bounds && poly2_bounds) {
4725 poly1_bounds, poly1_bounds_size, poly2_bounds, poly2_bounds_size)) {
4748 int64_t poly_coords_size,
4749 int32_t* poly_ring_sizes,
4750 int64_t poly_num_rings,
4751 double* poly_bounds,
4752 int64_t poly_bounds_size,
4753 int8_t* mpoly_coords,
4754 int64_t mpoly_coords_size,
4755 int32_t* mpoly_ring_sizes,
4756 int64_t mpoly_num_rings,
4757 int32_t* mpoly_poly_sizes,
4758 int64_t mpoly_num_polys,
4759 double* mpoly_bounds,
4760 int64_t mpoly_bounds_size,
4766 if (poly_bounds && mpoly_bounds) {
4768 poly_bounds, poly_bounds_size, mpoly_bounds, mpoly_bounds_size)) {
4793 int64_t mpoly_coords_size,
4794 int32_t* mpoly_ring_sizes,
4795 int64_t mpoly_num_rings,
4796 int32_t* mpoly_poly_sizes,
4797 int64_t mpoly_num_polys,
4798 double* mpoly_bounds,
4799 int64_t mpoly_bounds_size,
4807 return Contains_MultiPolygon_Point_Impl<double, EdgeBehavior::kIncludePointOnEdge>(
4827 int64_t mpoly_coords_size,
4828 int32_t* mpoly_ring_sizes,
4829 int64_t mpoly_num_rings,
4830 int32_t* mpoly_poly_sizes,
4831 int64_t mpoly_num_polys,
4832 double* mpoly_bounds,
4833 int64_t mpoly_bounds_size,
4841 return Contains_MultiPolygon_Point_Impl<int64_t, EdgeBehavior::kIncludePointOnEdge>(
4861 int64_t mpoly_coords_size,
4862 int32_t* mpoly_ring_sizes,
4863 int64_t mpoly_num_rings,
4864 int32_t* mpoly_poly_sizes,
4865 int64_t mpoly_num_polys,
4866 double* mpoly_bounds,
4867 int64_t mpoly_bounds_size,
4871 int64_t lbounds_size,
4898 int64_t mpoly_coords_size,
4899 int32_t* mpoly_ring_sizes,
4900 int64_t mpoly_num_rings,
4901 int32_t* mpoly_poly_sizes,
4902 int64_t mpoly_num_polys,
4903 double* mpoly_bounds,
4904 int64_t mpoly_bounds_size,
4905 int8_t* poly_coords,
4906 int64_t poly_coords_size,
4907 int32_t* poly_ring_sizes,
4908 int64_t poly_num_rings,
4909 double* poly_bounds,
4910 int64_t poly_bounds_size,
4939 int64_t mpoly1_coords_size,
4940 int32_t* mpoly1_ring_sizes,
4941 int64_t mpoly1_num_rings,
4942 int32_t* mpoly1_poly_sizes,
4943 int64_t mpoly1_num_polys,
4944 double* mpoly1_bounds,
4945 int64_t mpoly1_bounds_size,
4946 int8_t* mpoly2_coords,
4947 int64_t mpoly2_coords_size,
4948 int32_t* mpoly2_ring_sizes,
4949 int64_t mpoly2_num_rings,
4950 int32_t* mpoly2_poly_sizes,
4951 int64_t mpoly2_num_polys,
4952 double* mpoly2_bounds,
4953 int64_t mpoly2_bounds_size,
4959 if (mpoly1_bounds && mpoly2_bounds) {
4961 mpoly1_bounds, mpoly1_bounds_size, mpoly2_bounds, mpoly2_bounds_size)) {
4992 return reinterpret_cast<int64_t
>(bounds);
4997 return render_group;
5002 int64_t mpoly_coords_size,
5006 double* p_coords = coords_array.
ptr;
5007 for (int64_t i = 0; i < num_coords; i += 2) {
5008 Point2D
const decompressed{decompress_coord<X>(mpoly_coords, i, ic),
5009 decompress_coord<Y>(mpoly_coords, i, ic)};
5010 *p_coords++ = decompressed.x;
5011 *p_coords++ = decompressed.y;
5013 return coords_array;
5018 int64_t mpoly_num_rings) {
5020 std::memcpy(ring_sizes_array.
ptr, mpoly_ring_sizes, mpoly_num_rings *
sizeof(int32_t));
5021 return ring_sizes_array;
5026 int64_t mpoly_num_polys) {
5028 std::memcpy(poly_rings_array.
ptr, mpoly_poly_sizes, mpoly_num_polys *
sizeof(int32_t));
5029 return poly_rings_array;
5036 const int64_t psize,
5040 const double min_lon,
5041 const double max_lon,
5042 const int32_t img_width,
5043 const double min_width) {
5044 const double const1 = 0.017453292519943295769236907684886;
5045 const double const2 = 6372797.560856;
5046 const auto lon = decompress_coord<X>(p, 0, ic);
5047 const auto lat = decompress_coord<Y>(p, 0, ic);
5048 double t1 = sinf(meters / (2.0 * const2));
5049 double t2 = cosf(const1 * lat);
5050 const double newlon = lon - (2.0 * asinf(t1 / t2)) / const1;
5051 t1 = transform_point<X>({lon, {}}, isr, osr).x;
5052 t2 = transform_point<X>({newlon, {}}, isr, osr).x;
5053 const double min_domain_x = transform_point<X>({min_lon, {}}, isr, osr).x;
5054 const double max_domain_x = transform_point<X>({max_lon, {}}, isr, osr).x;
5055 const double domain_diff = max_domain_x - min_domain_x;
5056 t1 = ((t1 - min_domain_x) / domain_diff) *
static_cast<double>(img_width);
5057 t2 = ((t2 - min_domain_x) / domain_diff) *
static_cast<double>(img_width);
5060 const double sz = fabs(t1 - t2);
5061 return (sz < min_width ? min_width : sz);
5068 const int64_t psize,
5072 const double min_lat,
5073 const double max_lat,
5074 const int32_t img_height,
5075 const double min_height) {
5076 const double const1 = 0.017453292519943295769236907684886;
5077 const double const2 = 6372797.560856;
5078 const auto lat = decompress_coord<Y>(p, 0, ic);
5079 const double latdiff = meters / (const1 * const2);
5080 const double newlat =
5081 (lat < 0) ? lat + latdiff : lat - latdiff;
5082 double t1 = transform_point<Y>({{}, lat}, isr, osr).y;
5083 double t2 = transform_point<Y>({{}, newlat}, isr, osr).y;
5084 const double min_domain_y = transform_point<Y>({{}, min_lat}, isr, osr).y;
5085 const double max_domain_y = transform_point<Y>({{}, max_lat}, isr, osr).y;
5086 const double domain_diff = max_domain_y - min_domain_y;
5087 t1 = ((t1 - min_domain_y) / domain_diff) *
static_cast<double>(img_height);
5088 t2 = ((t2 - min_domain_y) / domain_diff) *
static_cast<double>(img_height);
5091 const double sz = fabs(t1 - t2);
5092 return (sz < min_height ? min_height : sz);
5096 const int64_t psize,
5098 const double min_lon,
5099 const double max_lon,
5100 const double min_lat,
5101 const double max_lat) {
5102 const auto lon = decompress_coord<X>(p, 0, ic);
5103 const auto lat = decompress_coord<Y>(p, 0, ic);
5104 return !(lon < min_lon || lon > max_lon || lat < min_lat || lat > max_lat);
5108 const int64_t psize,
5110 const double meters,
5111 const double min_lon,
5112 const double max_lon,
5113 const double min_lat,
5114 const double max_lat) {
5115 const double const1 = 0.017453292519943295769236907684886;
5116 const double const2 = 6372797.560856;
5117 const auto lon = decompress_coord<X>(p, 0, ic);
5118 const auto lat = decompress_coord<Y>(p, 0, ic);
5119 const double latdiff = meters / (const1 * const2);
5120 const double t1 = sinf(meters / (2.0 * const2));
5121 const double t2 = cosf(const1 * lat);
5122 const double londiff = (2.0 * asinf(t1 / t2)) / const1;
5123 return !(lon + londiff < min_lon || lon - londiff > max_lon ||
5124 lat + latdiff < min_lat || lat - latdiff > max_lat);
EXTENSION_NOINLINE double ST_Perimeter_MultiPolygon(int8_t *mpoly_coords, int32_t mpoly_coords_size, int8_t *mpoly_ring_sizes, int32_t mpoly_num_rings, int8_t *mpoly_poly_sizes, int32_t mpoly_num_polys, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_NOINLINE double convert_meters_to_pixel_width(const double meters, int8_t *p, const int64_t psize, const int32_t ic, const int32_t isr, const int32_t osr, const double min_lon, const double max_lon, const int32_t img_width, const double min_width)
EXTENSION_INLINE bool ST_Intersects_Point_Polygon(int8_t *p, int64_t psize, int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_MultiPoint_MultiPoint_Squared(int8_t *mp1, int64_t mp1size, int8_t *mp2, int64_t mp2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE double ST_Distance_MultiPolygon_MultiPoint(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int8_t *mp, int64_t mpsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE ALWAYS_INLINE double distance_point_multilinestring(int8_t *p, int64_t psize, int8_t *mls, int64_t mls_size, int32_t *mls_ls_sizes, int64_t mls_ls_num, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE ALWAYS_INLINE double length_linestring(int8_t *l, int32_t lsize, int32_t ic, int32_t isr, int32_t osr, bool geodesic, bool check_closed)
EXTENSION_NOINLINE double ST_Distance_LineString_LineString(int8_t *l1, int64_t l1size, int8_t *l2, int64_t l2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_Distance_Point_Point(int8_t *p1, int64_t p1size, int8_t *p2, int64_t p2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_INLINE int64_t HeavyDB_Geo_PolyBoundsPtr(double *bounds, int64_t size)
EXTENSION_INLINE double ST_Distance_MultiPoint_Polygon(int8_t *mp, int64_t mpsize, int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE double ST_Distance_LineString_Point_Geodesic(int8_t *l, int64_t lsize, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_X_Point(int8_t *p, int64_t psize, int32_t ic, int32_t isr, int32_t osr)
DEVICE ALWAYS_INLINE bool on_segment(double px, double py, double qx, double qy, double rx, double ry)
DEVICE ALWAYS_INLINE Point2D conv_utm_4326(const Point2D point, const int32_t utm_srid)
DEVICE ALWAYS_INLINE double area_polygon(int8_t *poly_coords, int32_t poly_coords_size, int8_t *poly_ring_sizes_in, int32_t poly_num_rings, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_INLINE bool ST_DWithin_MultiPolygon_MultiPolygon(int8_t *mpoly1_coords, int64_t mpoly1_coords_size, int32_t *mpoly1_ring_sizes, int64_t mpoly1_num_rings, int32_t *mpoly1_poly_sizes, int64_t mpoly1_num_polys, double *mpoly1_bounds, int64_t mpoly1_bounds_size, int8_t *mpoly2_coords, int64_t mpoly2_coords_size, int32_t *mpoly2_ring_sizes, int64_t mpoly2_num_rings, int32_t *mpoly2_poly_sizes, int64_t mpoly2_num_polys, double *mpoly2_bounds, int64_t mpoly2_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_INLINE double ST_Distance_MultiPoint_MultiPolygon(int8_t *mp, int64_t mpsize, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE double ST_Distance_MultiPoint_Point_Squared(int8_t *mp, int64_t mpsize, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE bool ST_Intersects_MultiPolygon_Polygon(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE bool box_dwithin_box(double *bounds1, int64_t bounds1_size, int32_t isr1, double *bounds2, int64_t bounds2_size, int32_t isr2, int32_t osr, double distance)
EXTENSION_NOINLINE bool ST_Contains_Point_Point(int8_t *p1, int64_t p1size, int8_t *p2, int64_t p2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
#define EXTENSION_NOINLINE
EXTENSION_NOINLINE double ST_Distance_Point_LineString_Geodesic(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE double decompress_latitude_coord_geoint32(const int32_t compressed)
DEVICE ALWAYS_INLINE bool centroid_add_triangle(double x1, double y1, double x2, double y2, double x3, double y3, double sign, double *total_area2, double *cg3)
EXTENSION_NOINLINE double ST_XMax(int8_t *coords, int64_t size, int32_t ic, int32_t isr, int32_t osr)
DEVICE ALWAYS_INLINE double max_distance_point_linestring(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, bool check_closed)
EXTENSION_NOINLINE bool ST_Intersects_LineString_MultiPolygon(int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_Point_LineString(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE bool ST_DWithin_Point_Polygon(int8_t *p, int64_t psize, int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_NOINLINE bool ST_Intersects_LineString_Polygon(int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE double perimeter_multipolygon(int8_t *mpoly_coords, int32_t mpoly_coords_size, int8_t *mpoly_ring_sizes_in, int32_t mpoly_num_rings, int8_t *mpoly_poly_sizes, int32_t mpoly_num_polys, int32_t ic, int32_t isr, int32_t osr, bool geodesic)
EXTENSION_NOINLINE double ST_Distance_Point_MultiPolygon(int8_t *p, int64_t psize, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE bool ST_Intersects_Polygon_Polygon(int8_t *poly1_coords, int64_t poly1_coords_size, int32_t *poly1_ring_sizes, int64_t poly1_num_rings, double *poly1_bounds, int64_t poly1_bounds_size, int8_t *poly2_coords, int64_t poly2_coords_size, int32_t *poly2_ring_sizes, int64_t poly2_num_rings, double *poly2_bounds, int64_t poly2_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE bool is_point_size_in_view(int8_t *p, const int64_t psize, const int32_t ic, const double meters, const double min_lon, const double max_lon, const double min_lat, const double max_lat)
DEVICE double distance_point_line(double px, double py, double l1x, double l1y, double l2x, double l2y)
EXTENSION_NOINLINE double ST_Distance_MultiLineString_MultiLineString(int8_t *mls1, int64_t mls1size, int32_t *mls1_ls_sizes, int64_t mls1_ls_num, int8_t *mls2, int64_t mls2size, int32_t *mls2_ls_sizes, int64_t mls2_ls_num, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE double ST_YMin_Bounds(double *bounds, int64_t size, int32_t isr, int32_t osr)
EXTENSION_NOINLINE double ST_YMax(int8_t *coords, int64_t size, int32_t ic, int32_t isr, int32_t osr)
DEVICE ALWAYS_INLINE int32_t compressed_coord(const int8_t *data, const int32_t index)
EXTENSION_INLINE double ST_XMin_Bounds(double *bounds, int64_t size, int32_t isr, int32_t osr)
EXTENSION_NOINLINE bool ST_cContains_Polygon_Point(const int8_t *poly_coords, const int64_t poly_coords_size, const int32_t *poly_ring_sizes, const int64_t poly_num_rings, const double *poly_bounds, const int64_t poly_bounds_size, const int8_t *p, const int64_t psize, const int32_t ic1, const int32_t isr1, const int32_t ic2, const int32_t isr2, const int32_t osr)
DEVICE ALWAYS_INLINE T is_left(const T lx0, const T ly0, const T lx1, const T ly1, const T px, const T py)
DEVICE ALWAYS_INLINE bool Contains_MultiPolygon_Point_Impl(const int8_t *mpoly_coords, const int64_t mpoly_coords_size, const int32_t *mpoly_ring_sizes, const int64_t mpoly_num_rings, const int32_t *mpoly_poly_sizes, const int64_t mpoly_num_polys, const double *mpoly_bounds, const int64_t mpoly_bounds_size, const int8_t *p, const int64_t psize, const int32_t ic1, const int32_t isr1, const int32_t ic2, const int32_t isr2, const int32_t osr)
EXTENSION_INLINE Array< int32_t > HeavyDB_Geo_PolyRingSizesArray(int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings)
DEVICE ALWAYS_INLINE double area_triangle(double x1, double y1, double x2, double y2, double x3, double y3)
EXTENSION_INLINE bool ST_DWithin_Polygon_Polygon(int8_t *poly1_coords, int64_t poly1_coords_size, int32_t *poly1_ring_sizes, int64_t poly1_num_rings, double *poly1_bounds, int64_t poly1_bounds_size, int8_t *poly2_coords, int64_t poly2_coords_size, int32_t *poly2_ring_sizes, int64_t poly2_num_rings, double *poly2_bounds, int64_t poly2_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_NOINLINE double ST_XMin(int8_t *coords, int64_t size, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_INLINE double ST_Distance_MultiPoint_MultiLineString(int8_t *mp, int64_t mpsize, int8_t *mls, int64_t mls_size, int32_t *mls_ls_sizes, int64_t mls_ls_num, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE bool ST_Intersects_Polygon_Point(int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_Point_Polygon(int8_t *p, int64_t psize, int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_Distance_Point_Point_Squared(int8_t *p1, int64_t p1size, int8_t *p2, int64_t p2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_INLINE bool ST_DWithin_Point_Point(int8_t *p1, int64_t p1size, int8_t *p2, int64_t p2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_NOINLINE double ST_Y_Point(int8_t *p, int64_t psize, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_Point_MultiPoint_Squared(int8_t *p, int64_t psize, int8_t *mp, int64_t mpsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE ALWAYS_INLINE Point2D coord(const int8_t *data, const int32_t x_index, const int32_t ic, const int32_t isr, const int32_t osr)
EXTENSION_NOINLINE double convert_meters_to_pixel_height(const double meters, int8_t *p, const int64_t psize, const int32_t ic, const int32_t isr, const int32_t osr, const double min_lat, const double max_lat, const int32_t img_height, const double min_height)
#define TOLERANCE_GEOINT32
DEVICE ALWAYS_INLINE CoordData trim_linestring_to_buffered_box(int8_t *l1, int64_t l1size, int32_t ic1, int32_t isr1, double *bounds2, int64_t bounds2_size, int32_t isr2, int32_t osr, double distance)
DEVICE double max_distance_point_line(double px, double py, double l1x, double l1y, double l2x, double l2y)
EXTENSION_NOINLINE bool Point_Overlaps_Box(double *bounds, int64_t bounds_size, double px, double py)
EXTENSION_INLINE double ST_Distance_Polygon_MultiPoint(int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, int8_t *mp, int64_t mpsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE void ST_Centroid_MultiPoint(int8_t *mp, int32_t mpsize, int32_t ic, int32_t isr, int32_t osr, double *multipoint_centroid)
EXTENSION_INLINE double ST_Distance_MultiLineString_Point(int8_t *mls, int64_t mls_size, int32_t *mls_ls_sizes, int64_t mls_ls_num, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE bool ST_cIntersects_MultiPolygon_Point(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE Point2D conv_4326_900913(const Point2D point)
DEVICE ALWAYS_INLINE double distance_point_polygon(int8_t *p, int64_t psize, int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_Distance_Polygon_MultiPolygon(int8_t *poly1_coords, int64_t poly1_coords_size, int32_t *poly1_ring_sizes, int64_t poly1_num_rings, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE void ST_Centroid_Polygon(int8_t *poly_coords, int32_t poly_coords_size, int32_t *poly_ring_sizes, int32_t poly_num_rings, int32_t ic, int32_t isr, int32_t osr, double *poly_centroid)
EXTENSION_NOINLINE double ST_Distance_Polygon_Polygon(int8_t *poly1_coords, int64_t poly1_coords_size, int32_t *poly1_ring_sizes, int64_t poly1_num_rings, int8_t *poly2_coords, int64_t poly2_coords_size, int32_t *poly2_ring_sizes, int64_t poly2_num_rings, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE bool ST_Intersects_Point_LineString(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_INLINE double ST_Distance_MultiPolygon_Point(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_MaxDistance_Point_LineString(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE bool ST_Contains_Polygon_Point(const int8_t *poly_coords, const int64_t poly_coords_size, const int32_t *poly_ring_sizes, const int64_t poly_num_rings, const double *poly_bounds, const int64_t poly_bounds_size, const int8_t *p, const int64_t psize, const int32_t ic1, const int32_t isr1, const int32_t ic2, const int32_t isr2, const int32_t osr)
DEVICE ALWAYS_INLINE int16_t orientation(double px, double py, double qx, double qy, double rx, double ry)
DEVICE double distance_line_line_squared(double l11x, double l11y, double l12x, double l12y, double l21x, double l21y, double l22x, double l22y)
EXTENSION_INLINE double ST_Distance_MultiPolygon_LineString(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_YMin(int8_t *coords, int64_t size, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_Point_MultiPoint(int8_t *p, int64_t psize, int8_t *mp, int64_t mpsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE Array< double > HeavyDB_Geo_PolyCoordsArray(int8_t *mpoly_coords, int64_t mpoly_coords_size, const int32_t ic)
DEVICE ALWAYS_INLINE double area_ring(int8_t *ring, int64_t ringsize, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_INLINE bool ST_DWithin_Polygon_MultiPolygon(int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_INLINE double ST_Distance_LineString_Point(int8_t *l, int64_t lsize, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE bool ST_Contains_LineString_Point(int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE bool ST_cContains_MultiPolygon_Point(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE bool box_overlaps_box(double *bounds1, int64_t bounds1_size, double *bounds2, int64_t bounds2_size)
DEVICE bool is_utm_srid(unsigned const srid)
EXTENSION_NOINLINE void ST_Centroid_Point(int8_t *p, int32_t psize, int32_t ic, int32_t isr, int32_t osr, double *point_centroid)
EXTENSION_NOINLINE void ST_Centroid_MultiPolygon(int8_t *mpoly_coords, int32_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int32_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int32_t mpoly_num_polys, int32_t ic, int32_t isr, int32_t osr, double *mpoly_centroid)
EXTENSION_INLINE bool ST_Intersects_Point_MultiPolygon(int8_t *p, int64_t psize, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_INLINE double ST_Distance_MultiPolygon_Polygon(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int8_t *poly1_coords, int64_t poly1_coords_size, int32_t *poly1_ring_sizes, int64_t poly1_num_rings, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE bool linestring_intersects_line(int8_t *l, int32_t lnum_coords, double l1x, double l1y, double l2x, double l2y, int32_t ic1, int32_t isr1, int32_t osr)
#define TOLERANCE_DEFAULT
DEVICE ALWAYS_INLINE bool x_and_y_are_dependent(const int32_t isr, const int32_t osr)
EXTENSION_NOINLINE double ST_Distance_LineString_Polygon(int8_t *l, int64_t lsize, int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE bool line_intersects_line(double l11x, double l11y, double l12x, double l12y, double l21x, double l21y, double l22x, double l22y)
EXTENSION_INLINE int32_t HeavyDB_Geo_PolyRenderGroup(int32_t render_group)
EXTENSION_NOINLINE bool ST_Contains_Polygon_LineString(int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE Point2D conv_4326_utm(const Point2D point, const int32_t utm_srid)
EXTENSION_NOINLINE double ST_Length_MultiLineString(int8_t *coords, int64_t coords_sz, int8_t *linestring_sizes_in, int64_t linestring_sizes_sz, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_NOINLINE bool ST_Intersects_Polygon_MultiPolygon(int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_LineString_MultiPolygon(int8_t *l, int64_t lsize, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_MaxDistance_LineString_Point(int8_t *l, int64_t lsize, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE bool tol_zero_template(const T x, const T tolerance=TOLERANCE_DEFAULT)
EXTENSION_NOINLINE bool is_point_in_view(int8_t *p, const int64_t psize, const int32_t ic, const double min_lon, const double max_lon, const double min_lat, const double max_lat)
EXTENSION_INLINE double ST_Distance_LineString_MultiPoint(int8_t *l, int64_t lsize, int8_t *mp, int64_t mpsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE bool ST_Intersects_Polygon_LineString(int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_INLINE bool ST_DWithin_Point_LineString(int8_t *p1, int64_t p1size, int8_t *l2, int64_t l2size, double *l2bounds, int64_t l2bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_NOINLINE bool ST_Contains_MultiPolygon_LineString(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE bool centroid_add_polygon(int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, int32_t ic, int32_t isr, int32_t osr, double *total_area2, double *cg3, double *total_length, double *linestring_centroid_sum, int64_t *num_points, double *point_centroid_sum)
Convert to/from WGS84 (long,lat) and UTM (x,y) given utm zone srid.
EXTENSION_NOINLINE bool ST_Contains_Point_Polygon(int8_t *p, int64_t psize, int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_Point_Point_Geodesic(int8_t *p1, int64_t p1size, int8_t *p2, int64_t p2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE bool box_contains_point(const double *bounds, const int64_t bounds_size, const double px, const double py)
DEVICE double distance_ring_ring(int8_t *ring1, int32_t ring1_num_coords, int8_t *ring2, int32_t ring2_num_coords, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_Length_LineString(int8_t *coords, int64_t coords_sz, int32_t ic, int32_t isr, int32_t osr)
DEVICE double decompress_longitude_coord_geoint32(const int32_t compressed)
DEVICE ALWAYS_INLINE Point2D transform_point(const Point2D point, const int32_t isr, const int32_t osr)
EXTENSION_INLINE bool ST_Intersects_Point_Point(int8_t *p1, int64_t p1size, int8_t *p2, int64_t p2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Perimeter_MultiPolygon_Geodesic(int8_t *mpoly_coords, int32_t mpoly_coords_size, int8_t *mpoly_ring_sizes, int32_t mpoly_num_rings, int8_t *mpoly_poly_sizes, int32_t mpoly_num_polys, int32_t ic, int32_t isr, int32_t osr)
DEVICE ALWAYS_INLINE bool tol_le(const double x, const double y, const double tolerance=TOLERANCE_DEFAULT)
DEVICE ALWAYS_INLINE bool centroid_add_segment(double x1, double y1, double x2, double y2, double *length, double *linestring_centroid_sum)
EXTENSION_INLINE bool ST_DWithin_LineString_LineString(int8_t *l1, int64_t l1size, double *l1bounds, int64_t l1bounds_size, int8_t *l2, int64_t l2size, double *l2bounds, int64_t l2bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
DEVICE ALWAYS_INLINE bool tol_zero(const double x, const double tolerance=TOLERANCE_DEFAULT)
DEVICE ALWAYS_INLINE bool centroid_add_linestring(int8_t *l, int64_t lsize, int32_t ic, int32_t isr, int32_t osr, bool closed, double *total_length, double *linestring_centroid_sum, int64_t *num_points, double *point_centroid_sum)
EXTENSION_NOINLINE bool ST_Intersects_LineString_Linestring(int8_t *l1, int64_t l1size, double *l1bounds, int64_t l1bounds_size, int8_t *l2, int64_t l2size, double *l2bounds, int64_t l2bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE double distance_point_point_squared(double p1x, double p1y, double p2x, double p2y)
DEVICE ALWAYS_INLINE double distance_point_linestring(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, bool check_closed, double threshold)
EXTENSION_NOINLINE double ST_Area_MultiPolygon(int8_t *mpoly_coords, int32_t mpoly_coords_size, int8_t *mpoly_ring_sizes, int32_t mpoly_num_rings, int8_t *mpoly_poly_sizes_in, int32_t mpoly_num_polys, int32_t ic, int32_t isr, int32_t osr)
DEVICE bool linestring_intersects_linestring(int8_t *l, int32_t lnum_coords, double l1x, double l1y, double l2x, double l2y, int32_t ic1, int32_t isr1, int32_t osr)
EXTENSION_INLINE bool ST_Intersects_MultiPolygon_MultiPolygon(int8_t *mpoly1_coords, int64_t mpoly1_coords_size, int32_t *mpoly1_ring_sizes, int64_t mpoly1_num_rings, int32_t *mpoly1_poly_sizes, int64_t mpoly1_num_polys, double *mpoly1_bounds, int64_t mpoly1_bounds_size, int8_t *mpoly2_coords, int64_t mpoly2_coords_size, int32_t *mpoly2_ring_sizes, int64_t mpoly2_num_rings, int32_t *mpoly2_poly_sizes, int64_t mpoly2_num_polys, double *mpoly2_bounds, int64_t mpoly2_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Perimeter_Polygon(int8_t *poly, int32_t polysize, int8_t *poly_ring_sizes, int32_t poly_num_rings, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_INLINE bool ST_Intersects_MultiPolygon_LineString(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double distance_in_meters(const double fromlon, const double fromlat, const double tolon, const double tolat)
Computes the distance, in meters, between two WGS-84 positions.
EXTENSION_NOINLINE double ST_Length_LineString_Geodesic(int8_t *coords, int64_t coords_sz, int32_t ic, int32_t isr, int32_t osr)
DEVICE ALWAYS_INLINE double distance_point_multipolygon(int8_t *p, int64_t psize, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE ALWAYS_INLINE bool tol_ge(const double x, const double y, const double tolerance=TOLERANCE_DEFAULT)
DEVICE ALWAYS_INLINE bool polygon_contains_point(const int8_t *poly, const int32_t poly_num_coords, const double px, const double py, const int32_t ic1, const int32_t isr1, const int32_t osr)
DEVICE ALWAYS_INLINE int32_t compression_unit_size(const int32_t ic)
DEVICE ALWAYS_INLINE Point2D get_point(const int8_t *data, const int32_t x_index, const int32_t ic, const int32_t isr, const int32_t osr)
EXTENSION_INLINE bool ST_cIntersects_Polygon_Point(int8_t *poly, int64_t polysize, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
#define TOLERANCE_DEFAULT_SQUARED
EXTENSION_INLINE bool ST_Intersects_LineString_Point(int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_MultiPolygon_MultiPolygon(int8_t *mpoly1_coords, int64_t mpoly1_coords_size, int32_t *mpoly1_ring_sizes, int64_t mpoly1_num_rings, int32_t *mpoly1_poly_sizes, int64_t mpoly1_num_polys, int8_t *mpoly2_coords, int64_t mpoly2_coords_size, int32_t *mpoly2_ring_sizes, int64_t mpoly2_num_rings, int32_t *mpoly2_poly_sizes, int64_t mpoly2_num_polys, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double ST_Distance_Point_ClosedLineString(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE Array< int32_t > HeavyDB_Geo_PolyPolyRingsArray(int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys)
EXTENSION_NOINLINE double ST_Area_Polygon(int8_t *poly_coords, int32_t poly_coords_size, int8_t *poly_ring_sizes, int32_t poly_num_rings, int32_t ic, int32_t isr, int32_t osr)
EXTENSION_NOINLINE bool ST_Contains_Polygon_Polygon(int8_t *poly1_coords, int64_t poly1_coords_size, int32_t *poly1_ring_sizes, int64_t poly1_num_rings, double *poly1_bounds, int64_t poly1_bounds_size, int8_t *poly2_coords, int64_t poly2_coords_size, int32_t *poly2_ring_sizes, int64_t poly2_num_rings, double *poly2_bounds, int64_t poly2_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE bool point_in_polygon_winding_number(const int8_t *poly, const int32_t poly_num_coords, const T px, const T py, const int32_t ic1, const int32_t isr1, const int32_t osr)
EXTENSION_INLINE double ST_Distance_Polygon_Point(int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE double distance_point_line_squared(double px, double py, double l1x, double l1y, double l2x, double l2y)
#define COMPRESSION_GEOINT32
EXTENSION_NOINLINE double ST_Perimeter_Polygon_Geodesic(int8_t *poly, int32_t polysize, int8_t *poly_ring_sizes_in, int32_t poly_num_rings, int32_t ic, int32_t isr, int32_t osr)
DEVICE ALWAYS_INLINE double tol(int32_t ic)
EXTENSION_INLINE bool ST_DWithin_LineString_Polygon(int8_t *l1, int64_t l1size, double *l1bounds, int64_t l1bounds_size, int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
DEVICE double distance_line_line(double l11x, double l11y, double l12x, double l12y, double l21x, double l21y, double l22x, double l22y)
DEVICE bool polygon_contains_linestring(int8_t *poly, int32_t poly_num_coords, int8_t *l, int64_t lnum_coords, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE bool ST_Contains_LineString_Polygon(int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, double *poly_bounds, int64_t poly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE ALWAYS_INLINE bool Contains_Polygon_Point_Impl(const int8_t *poly_coords, const int64_t poly_coords_size, const int32_t *poly_ring_sizes, const int64_t poly_num_rings, const double *poly_bounds, const int64_t poly_bounds_size, const int8_t *p, const int64_t psize, const int32_t ic1, const int32_t isr1, const int32_t ic2, const int32_t isr2, const int32_t osr)
EXTENSION_NOINLINE bool ST_Contains_MultiPolygon_Point(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_INLINE bool ST_Intersects_MultiPolygon_Point(int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
DEVICE bool ring_intersects_line(int8_t *ring, int32_t ring_num_coords, double l1x, double l1y, double l2x, double l2y, int32_t ic1, int32_t isr1, int32_t osr)
DEVICE double distance_ring_linestring(int8_t *ring, int32_t ring_num_coords, int8_t *l, int32_t lnum_coords, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE double ST_Distance_MultiPoint_LineString(int8_t *mp, int64_t mpsize, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_NOINLINE double conv_4326_900913_y(const double y)
EXTENSION_INLINE bool ST_DWithin_Point_Point_Geodesic(int8_t *p1, int64_t p1size, int8_t *p2, int64_t p2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_NOINLINE double conv_4326_900913_x(const double x)
DEVICE ALWAYS_INLINE bool tol_eq(const double x, const double y, const double tolerance=TOLERANCE_DEFAULT)
DEVICE ALWAYS_INLINE bool box_contains_box_vertex(double *bounds1, int64_t bounds1_size, double *bounds2, int64_t bounds2_size)
EXTENSION_INLINE double ST_Distance_Polygon_LineString(int8_t *poly_coords, int64_t poly_coords_size, int32_t *poly_ring_sizes, int64_t poly_num_rings, int8_t *l, int64_t lsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE ALWAYS_INLINE bool box_contains_box(double *bounds1, int64_t bounds1_size, double *bounds2, int64_t bounds2_size)
DEVICE ALWAYS_INLINE bool point_dwithin_box(int8_t *p1, int64_t p1size, int32_t ic1, int32_t isr1, double *bounds2, int64_t bounds2_size, int32_t isr2, int32_t osr, double distance)
EXTENSION_INLINE double ST_YMax_Bounds(double *bounds, int64_t size, int32_t isr, int32_t osr)
EXTENSION_NOINLINE void ST_Centroid_LineString(int8_t *coords, int32_t coords_sz, int32_t ic, int32_t isr, int32_t osr, double *linestring_centroid)
EXTENSION_INLINE double ST_XMax_Bounds(double *bounds, int64_t size, int32_t isr, int32_t osr)
DEVICE ALWAYS_INLINE double decompress_coord(const int8_t *data, const int32_t x_index, const int32_t ic)
EXTENSION_NOINLINE double ST_Distance_Point_MultiLineString(int8_t *p, int64_t psize, int8_t *mls, int64_t mls_size, int32_t *mls_ls_sizes, int64_t mls_ls_num, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE bool ST_DWithin_LineString_MultiPolygon(int8_t *l1, int64_t l1size, double *l1bounds, int64_t l1bounds_size, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_INLINE bool ST_DWithin_Point_MultiPolygon(int8_t *p, int64_t psize, int8_t *mpoly_coords, int64_t mpoly_coords_size, int32_t *mpoly_ring_sizes, int64_t mpoly_num_rings, int32_t *mpoly_poly_sizes, int64_t mpoly_num_polys, double *mpoly_bounds, int64_t mpoly_bounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double distance_within)
EXTENSION_NOINLINE bool ST_Contains_Point_LineString(int8_t *p, int64_t psize, int8_t *l, int64_t lsize, double *lbounds, int64_t lbounds_size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr)
EXTENSION_NOINLINE double ST_Distance_MultiPoint_MultiPoint(int8_t *mp1, int64_t mp1size, int8_t *mp2, int64_t mp2size, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE double ST_Distance_MultiLineString_MultiPoint(int8_t *mls, int64_t mls_size, int32_t *mls_ls_sizes, int64_t mls_ls_num, int8_t *mp, int64_t mpsize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
EXTENSION_INLINE double ST_Distance_MultiPoint_Point(int8_t *mp, int64_t mpsize, int8_t *p, int64_t psize, int32_t ic1, int32_t isr1, int32_t ic2, int32_t isr2, int32_t osr, double threshold)
DEVICE ALWAYS_INLINE double distance_point_point(double p1x, double p1y, double p2x, double p2y)
DEVICE ALWAYS_INLINE bool centroid_add_ring(int8_t *ring, int64_t ringsize, int32_t ic, int32_t isr, int32_t osr, double sign, double *total_area2, double *cg3, double *total_length, double *linestring_centroid_sum, int64_t *num_points, double *point_centroid_sum)