PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ LWGEOM_makeline_garray()

Datum LWGEOM_makeline_garray ( PG_FUNCTION_ARGS  )

Definition at line 1417 of file lwgeom_functions_basic.c.

1418 {
1419  ArrayType *array;
1420  int nelems;
1421  GSERIALIZED *result = NULL;
1422  LWGEOM **geoms;
1423  LWGEOM *outlwg;
1424  uint32 ngeoms;
1425  int32_t srid = SRID_UNKNOWN;
1426 
1427  ArrayIterator iterator;
1428  Datum value;
1429  bool isnull;
1430 
1431  POSTGIS_DEBUGF(2, "%s called", __func__);
1432 
1433  /* Return null on null input */
1434  if (PG_ARGISNULL(0))
1435  PG_RETURN_NULL();
1436 
1437  /* Get actual ArrayType */
1438  array = PG_GETARG_ARRAYTYPE_P(0);
1439 
1440  /* Get number of geometries in array */
1441  nelems = ArrayGetNItems(ARR_NDIM(array), ARR_DIMS(array));
1442 
1443  POSTGIS_DEBUGF(3, "%s: array has %d elements", __func__, nelems);
1444 
1445  /* Return null on 0-elements input array */
1446  if (nelems == 0)
1447  PG_RETURN_NULL();
1448 
1449  /*
1450  * Deserialize all point geometries in array into the
1451  * geoms pointers array.
1452  * Count actual number of points.
1453  */
1454 
1455  /* possibly more then required */
1456  geoms = palloc(sizeof(LWGEOM *) * nelems);
1457  ngeoms = 0;
1458 
1459  iterator = array_create_iterator(array, 0, NULL);
1460 
1461  while (array_iterate(iterator, &value, &isnull))
1462  {
1463  GSERIALIZED *geom;
1464 
1465  if (isnull)
1466  continue;
1467 
1468  geom = (GSERIALIZED *)DatumGetPointer(value);
1469 
1470  if (gserialized_get_type(geom) != POINTTYPE && gserialized_get_type(geom) != LINETYPE &&
1472  {
1473  continue;
1474  }
1475 
1476  geoms[ngeoms++] = lwgeom_from_gserialized(geom);
1477 
1478  /* Check SRID homogeneity */
1479  if (ngeoms == 1)
1480  {
1481  /* Get first geometry SRID */
1482  srid = geoms[ngeoms - 1]->srid;
1483  /* TODO: also get ZMflags */
1484  }
1485  else
1486  gserialized_error_if_srid_mismatch_reference(geom, srid, __func__);
1487 
1488  POSTGIS_DEBUGF(3, "%s: element %d deserialized", __func__, ngeoms);
1489  }
1490  array_free_iterator(iterator);
1491 
1492  /* Return null on 0-points input array */
1493  if (ngeoms == 0)
1494  {
1495  /* TODO: should we return LINESTRING EMPTY here ? */
1496  elog(NOTICE, "No points or linestrings in input array");
1497  PG_RETURN_NULL();
1498  }
1499 
1500  POSTGIS_DEBUGF(3, "LWGEOM_makeline_garray: elements: %d", ngeoms);
1501 
1502  outlwg = (LWGEOM *)lwline_from_lwgeom_array(srid, ngeoms, geoms);
1503 
1504  result = geometry_serialize(outlwg);
1505 
1506  PG_RETURN_POINTER(result);
1507 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
void gserialized_error_if_srid_mismatch_reference(const GSERIALIZED *g1, const int32_t srid2, const char *funcname)
Definition: gserialized.c:447
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:268
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
Definition: gserialized.c:118
#define LINETYPE
Definition: liblwgeom.h:103
#define MULTIPOINTTYPE
Definition: liblwgeom.h:105
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:102
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:215
LWLINE * lwline_from_lwgeom_array(int32_t srid, uint32_t ngeoms, LWGEOM **geoms)
Definition: lwline.c:151
int value
Definition: genraster.py:62
int32_t srid
Definition: liblwgeom.h:460

References gserialized_error_if_srid_mismatch_reference(), gserialized_get_type(), LINETYPE, lwgeom_from_gserialized(), lwline_from_lwgeom_array(), MULTIPOINTTYPE, POINTTYPE, result, LWGEOM::srid, SRID_UNKNOWN, and genraster::value.

Referenced by pgis_geometry_makeline_finalfn().

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