PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ ARRAY2GEOS()

GEOSGeometry** ARRAY2GEOS ( ArrayType *  array,
uint32_t  nelems,
int *  is3d,
int *  srid 
)

Definition at line 2821 of file postgis/lwgeom_geos.c.

2822 {
2823  ArrayIterator iterator;
2824  Datum value;
2825  bool isnull;
2826  bool gotsrid = false;
2827  uint32_t i = 0;
2828 
2829  GEOSGeometry** geos_geoms = palloc(nelems * sizeof(GEOSGeometry*));
2830 
2831  iterator = array_create_iterator(array, 0, NULL);
2832 
2833  while(array_iterate(iterator, &value, &isnull))
2834  {
2835  GSERIALIZED *geom = (GSERIALIZED*) DatumGetPointer(value);
2836 
2837  if (isnull)
2838  continue;
2839 
2840  *is3d = *is3d || gserialized_has_z(geom);
2841 
2842  geos_geoms[i] = POSTGIS2GEOS(geom);
2843  if (!geos_geoms[i])
2844  {
2845  uint32_t j;
2846  lwpgerror("Geometry could not be converted to GEOS");
2847 
2848  for (j = 0; j < i; j++) {
2849  GEOSGeom_destroy(geos_geoms[j]);
2850  }
2851  return NULL;
2852  }
2853 
2854  if (!gotsrid)
2855  {
2856  *srid = gserialized_get_srid(geom);
2857  gotsrid = true;
2858  }
2859  else if (*srid != gserialized_get_srid(geom))
2860  {
2861  uint32_t j;
2862  for (j = 0; j <= i; j++) {
2863  GEOSGeom_destroy(geos_geoms[j]);
2864  }
2865  gserialized_error_if_srid_mismatch_reference(geom, *srid, __func__);
2866  return NULL;
2867  }
2868 
2869  i++;
2870  }
2871 
2872  array_free_iterator(iterator);
2873  return geos_geoms;
2874 }
void gserialized_error_if_srid_mismatch_reference(const GSERIALIZED *g1, const int32_t srid2, const char *funcname)
Definition: gserialized.c:418
int32_t gserialized_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
Definition: gserialized.c:126
int gserialized_has_z(const GSERIALIZED *g)
Check if a GSERIALIZED has a Z ordinate.
Definition: gserialized.c:174
int value
Definition: genraster.py:62
GEOSGeometry * POSTGIS2GEOS(const GSERIALIZED *pglwgeom)

References gserialized_error_if_srid_mismatch_reference(), gserialized_get_srid(), gserialized_has_z(), POSTGIS2GEOS(), and genraster::value.

Referenced by clusterintersecting_garray(), and polygonize_garray().

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