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

◆ rt_raster_get_convex_hull()

rt_errorstate rt_raster_get_convex_hull ( rt_raster  raster,
LWGEOM **  hull 
)

Get raster's convex hull.

The convex hull is typically a 4 vertices (5 to be closed) single ring polygon bearing the raster's rotation and using projection coordinates.

Parameters
raster: the raster to get info from
**hull: pointer to convex hull
Returns
ES_NONE if success, ES_ERROR if error

Definition at line 803 of file rt_geometry.c.

803 {
804 double gt[6] = {0.0};
805 int32_t srid = SRID_UNKNOWN;
806
807 POINTARRAY *pts = NULL;
808 POINT4D p4d;
809
810 assert(hull != NULL);
811 *hull = NULL;
812
813 /* raster is NULL, convex hull is NULL */
814 if (raster == NULL)
815 return ES_NONE;
816
817 /* raster metadata */
818 srid = rt_raster_get_srid(raster);
820
821 RASTER_DEBUGF(3, "rt_raster_get_convex_hull: raster is %dx%d", raster->width, raster->height);
822
823 /* return point or line since at least one of the two dimensions is 0 */
824 if ((!raster->width) || (!raster->height)) {
825 p4d.x = gt[0];
826 p4d.y = gt[3];
827
828 /* return point */
829 if (!raster->width && !raster->height) {
830 LWPOINT *point = lwpoint_make2d(srid, p4d.x, p4d.y);
831 *hull = lwpoint_as_lwgeom(point);
832 }
833 /* return linestring */
834 else {
835 LWLINE *line = NULL;
836 pts = ptarray_construct_empty(0, 0, 2);
837
838 /* first point of line */
839 ptarray_append_point(pts, &p4d, LW_TRUE);
840
841 /* second point of line */
843 raster,
845 &p4d.x, &p4d.y,
846 gt
847 ) != ES_NONE) {
848 rterror("rt_raster_get_convex_hull: Could not get second point for linestring");
849 return ES_ERROR;
850 }
851 ptarray_append_point(pts, &p4d, LW_TRUE);
852 line = lwline_construct(srid, NULL, pts);
853
854 *hull = lwline_as_lwgeom(line);
855 }
856
857 return ES_NONE;
858 }
859 else {
860 POINTARRAY **rings = NULL;
861 LWPOLY* poly = NULL;
862
863 /* only one ring */
864 rings = (POINTARRAY **) rtalloc(sizeof (POINTARRAY*));
865 if (!rings) {
866 rterror("rt_raster_get_convex_hull: Could not allocate memory for polygon ring");
867 return ES_ERROR;
868 }
869 rings[0] = ptarray_construct(0, 0, 5);
870 /* TODO: handle error on ptarray construction */
871 /* XXX jorgearevalo: the error conditions aren't managed in ptarray_construct */
872 if (!rings[0]) {
873 rterror("rt_raster_get_convex_hull: Could not construct point array");
874 return ES_ERROR;
875 }
876 pts = rings[0];
877
878 /* Upper-left corner (first and last points) */
879 p4d.x = gt[0];
880 p4d.y = gt[3];
881 ptarray_set_point4d(pts, 0, &p4d);
882 ptarray_set_point4d(pts, 4, &p4d);
883
884 /* Upper-right corner (we go clockwise) */
886 raster,
887 raster->width, 0,
888 &p4d.x, &p4d.y,
889 gt
890 );
891 ptarray_set_point4d(pts, 1, &p4d);
892
893 /* Lower-right corner */
895 raster,
896 raster->width, raster->height,
897 &p4d.x, &p4d.y,
898 gt
899 );
900 ptarray_set_point4d(pts, 2, &p4d);
901
902 /* Lower-left corner */
904 raster,
905 0, raster->height,
906 &p4d.x, &p4d.y,
907 gt
908 );
909 ptarray_set_point4d(pts, 3, &p4d);
910
911 poly = lwpoly_construct(srid, 0, 1, rings);
912 *hull = lwpoly_as_lwgeom(poly);
913 }
914
915 return ES_NONE;
916}
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition lwgeom.c:326
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition ptarray.c:59
LWLINE * lwline_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
Definition lwline.c:42
LWPOINT * lwpoint_make2d(int32_t srid, double x, double y)
Definition lwpoint.c:163
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition lwgeom.c:321
LWPOLY * lwpoly_construct(int32_t srid, GBOX *bbox, uint32_t nrings, POINTARRAY **points)
Definition lwpoly.c:43
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int allow_duplicates)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE,...
Definition ptarray.c:147
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
#define SRID_UNKNOWN
Unknown SRID value.
Definition liblwgeom.h:229
void ptarray_set_point4d(POINTARRAY *pa, uint32_t n, const POINT4D *p4d)
Definition lwgeom_api.c:376
LWGEOM * lwpoly_as_lwgeom(const LWPOLY *obj)
Definition lwgeom.c:311
POINTARRAY * ptarray_construct(char hasz, char hasm, uint32_t npoints)
Construct an empty pointarray, allocating storage and setting the npoints, but not filling in any inf...
Definition ptarray.c:51
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
Definition rt_context.c:199
void * rtalloc(size_t size)
Wrappers used for managing memory.
Definition rt_context.c:171
rt_errorstate rt_raster_cell_to_geopoint(rt_raster raster, double xr, double yr, double *xw, double *yw, double *gt)
Convert an xr, yr raster point to an xw, yw point on map.
Definition rt_raster.c:755
int32_t rt_raster_get_srid(rt_raster raster)
Get raster's SRID.
Definition rt_raster.c:356
#define RASTER_DEBUGF(level, msg,...)
Definition librtcore.h:299
@ ES_NONE
Definition librtcore.h:180
@ ES_ERROR
Definition librtcore.h:181
uint16_t rt_raster_get_height(rt_raster raster)
Definition rt_raster.c:129
uint16_t rt_raster_get_width(rt_raster raster)
Definition rt_raster.c:121
void rt_raster_get_geotransform_matrix(rt_raster raster, double *gt)
Get 6-element array of raster geotransform matrix.
Definition rt_raster.c:706
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
Definition rtrowdump.py:121
double x
Definition liblwgeom.h:400
double y
Definition liblwgeom.h:400

References ES_ERROR, ES_NONE, LW_TRUE, lwline_as_lwgeom(), lwline_construct(), lwpoint_as_lwgeom(), lwpoint_make2d(), lwpoly_as_lwgeom(), lwpoly_construct(), ptarray_append_point(), ptarray_construct(), ptarray_construct_empty(), ptarray_set_point4d(), RASTER_DEBUGF, rt_raster_cell_to_geopoint(), rt_raster_get_geotransform_matrix(), rt_raster_get_height(), rt_raster_get_srid(), rt_raster_get_width(), rtalloc(), rterror(), SRID_UNKNOWN, POINT4D::x, and POINT4D::y.

Referenced by RASTER_clip(), RASTER_convex_hull(), rt_raster_compute_skewed_raster(), rt_raster_intersects(), rt_raster_surface(), and test_raster_convex_hull().

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