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

◆ RASTER_convex_hull()

Datum RASTER_convex_hull ( PG_FUNCTION_ARGS  )

Definition at line 116 of file rtpg_geometry.c.

117{
118 rt_pgraster *pgraster;
120 LWGEOM *geom = NULL;
121 GSERIALIZED* gser = NULL;
122 size_t gser_size;
123 int err = ES_NONE;
124
125 bool minhull = FALSE;
126
127 if (PG_ARGISNULL(0))
128 PG_RETURN_NULL();
129
130 /* # of args */
131 if (PG_NARGS() > 1)
132 minhull = TRUE;
133
134 if (!minhull) {
135 pgraster = (rt_pgraster *) PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(0), 0, sizeof(struct rt_raster_serialized_t));
136 raster = rt_raster_deserialize(pgraster, TRUE);
137 }
138 else {
139 pgraster = (rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
141 }
142
143 if (!raster) {
144 PG_FREE_IF_COPY(pgraster, 0);
145 elog(ERROR, "RASTER_convex_hull: Could not deserialize raster");
146 PG_RETURN_NULL();
147 }
148
149 if (!minhull)
150 err = rt_raster_get_convex_hull(raster, &geom);
151 else {
152 int nband = -1;
153
154 /* get arg 1 */
155 if (!PG_ARGISNULL(1)) {
156 nband = PG_GETARG_INT32(1);
157 if (!rt_raster_has_band(raster, nband - 1)) {
158 elog(NOTICE, "Invalid band index (must use 1-based). Returning NULL");
159 rt_raster_destroy(raster);
160 PG_FREE_IF_COPY(pgraster, 0);
161 PG_RETURN_NULL();
162 }
163 nband = nband - 1;
164 }
165
166 err = rt_raster_get_perimeter(raster, nband, &geom);
167 }
168
169 rt_raster_destroy(raster);
170 PG_FREE_IF_COPY(pgraster, 0);
171
172 if (err != ES_NONE) {
173 elog(ERROR, "RASTER_convex_hull: Could not get raster's convex hull");
174 PG_RETURN_NULL();
175 }
176 else if (geom == NULL) {
177 elog(NOTICE, "Raster's convex hull is NULL");
178 PG_RETURN_NULL();
179 }
180
181 gser = gserialized_from_lwgeom(geom, &gser_size);
182 lwgeom_free(geom);
183
184 SET_VARSIZE(gser, gser_size);
185 PG_RETURN_POINTER(gser);
186}
#define TRUE
Definition dbfopen.c:169
#define FALSE
Definition dbfopen.c:168
GSERIALIZED * gserialized_from_lwgeom(LWGEOM *geom, size_t *size)
Allocate a new GSERIALIZED from an LWGEOM.
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1138
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
Definition rt_raster.c:82
int rt_raster_has_band(rt_raster raster, int nband)
Return TRUE if the raster has a band of this number.
Definition rt_raster.c:1342
@ ES_NONE
Definition librtcore.h:180
rt_errorstate rt_raster_get_convex_hull(rt_raster raster, LWGEOM **hull)
Get raster's convex hull.
rt_errorstate rt_raster_get_perimeter(rt_raster raster, int nband, LWGEOM **perimeter)
Get raster perimeter.
rt_raster rt_raster_deserialize(void *serialized, int header_only)
Return a raster from a serialized form.
nband
Definition pixval.py:53
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
Definition rtrowdump.py:121
Struct definitions.
Definition librtcore.h:2251

References ES_NONE, FALSE, gserialized_from_lwgeom(), lwgeom_free(), rt_raster_deserialize(), rt_raster_destroy(), rt_raster_get_convex_hull(), rt_raster_get_perimeter(), rt_raster_has_band(), and TRUE.

Here is the call graph for this function: