Given a geometry, it uses GEOS operations to make sure that it's valid according to the MVT spec and that all points are snapped into int coordinates It iterates several times if needed, if it fails, returns NULL.
1021{
1022 gridspec grid = {0, 0, 0, 0, 1, 1, 0, 0};
1024
1026 {
1027
1029 }
1030 else
1031 {
1032
1033
1034
1035
1036
1037 GEOSGeometry *geo;
1038 uint32_t iterations = 0;
1039 static const uint32_t max_iterations = 3;
1040 bool valid = false;
1041
1042
1044
1047 if (!geo)
1048 return NULL;
1049 valid = GEOSisValid(geo) == 1;
1050
1051 while (!valid && iterations < max_iterations)
1052 {
1053#if POSTGIS_GEOS_VERSION < 38
1054 GEOSGeometry *geo_valid = LWGEOM_GEOS_makeValid(geo);
1055#else
1056 GEOSGeometry *geo_valid = GEOSMakeValid(geo);
1057#endif
1058
1059 GEOSGeom_destroy(geo);
1060 if (!geo_valid)
1061 return NULL;
1062
1064 GEOSGeom_destroy(geo_valid);
1065 if (!ng)
1066 return NULL;
1067
1071 valid = GEOSisValid(geo) == 1;
1072 iterations++;
1073 }
1074 GEOSGeom_destroy(geo);
1075
1076 if (!valid)
1077 {
1078 POSTGIS_DEBUG(1, "mvt_geom: Could not transform into a valid MVT geometry");
1079 return NULL;
1080 }
1081
1082
1085 }
1086 return ng;
1087}
GEOSGeometry * LWGEOM2GEOS(const LWGEOM *lwgeom, uint8_t autofix)
LWGEOM * GEOS2LWGEOM(const GEOSGeometry *geom, uint8_t want3d)
void lwgeom_geos_error(const char *fmt,...)
void lwgeom_force_clockwise(LWGEOM *lwgeom)
Force Right-hand-rule on LWGEOM polygons.
void lwgeom_grid_in_place(LWGEOM *lwgeom, const gridspec *grid)
void lwgeom_reverse_in_place(LWGEOM *lwgeom)
Reverse vertex order of LWGEOM.
static LWGEOM * lwgeom_to_basic_type(LWGEOM *geom, uint8 original_type)
In place process a collection to find a concrete geometry object and expose that as the actual object...