Return zero if error occurred in function.
Return ES_ERROR if error occurred in function.
1000 GEOSGeometry *ghull[2] = {NULL};
1012 uint16_t *widthS = NULL;
1013 uint16_t *heightS = NULL;
1014 uint16_t *widthL = NULL;
1015 uint16_t *heightL = NULL;
1020 int hasnodataS =
FALSE;
1021 int hasnodataL =
FALSE;
1026 double gtS[6] = {0};
1027 double igtL[6] = {0};
1034 enum line_points {X1, Y1, X2, Y2};
1035 enum point {pX, pY};
1043 assert(NULL != rast1);
1044 assert(NULL != rast2);
1047 if (nband1 < 0 && nband2 < 0) {
1058 rterror(
"rt_raster_intersects: The two rasters provided have different SRIDs");
1070 for (i = 0; i < 2; i++) {
1072 for (j = 0; j < i; j++) {
1073 GEOSGeom_destroy(ghull[j]);
1079 ghull[i] = (GEOSGeometry *)
LWGEOM2GEOS(hull[i], 0);
1080 if (NULL == ghull[i]) {
1081 for (j = 0; j < i; j++) {
1082 GEOSGeom_destroy(ghull[j]);
1094 if (GEOSWithin(ghull[0], ghull[1]) == 1)
1096 else if (GEOSWithin(ghull[1], ghull[0]) == 1)
1102 rtn = GEOSIntersects(ghull[0], ghull[1]);
1104 for (i = 0; i < 2; i++) {
1105 GEOSGeom_destroy(ghull[i]);
1110 RASTER_DEBUGF(4,
"convex hulls of rasters do %sintersect", rtn != 1 ?
"NOT " :
"");
1116 else if (nband1 < 0) {
1134 area1 = fabs(width1 * height1 * pixarea1);
1135 area2 = fabs(width2 * height2 * pixarea2);
1136 RASTER_DEBUGF(4,
"pixarea1, pixarea2, area1, area2 = %f, %f, %f, %f",
1137 pixarea1, pixarea2, area1, area2);
1142 (area1 < pixarea2) ||
1180 if (NULL == bandS) {
1181 rterror(
"rt_raster_intersects: Could not get band %d of the first raster", nbandS);
1187 if (hasnodataS !=
FALSE)
1192 if (NULL == bandL) {
1193 rterror(
"rt_raster_intersects: Could not get band %d of the first raster", nbandL);
1199 if (hasnodataL !=
FALSE)
1213 RASTER_DEBUG(3,
"One of the two raster bands is NODATA. The two rasters do not intersect");
1219 if (within != 0 && ((pixarea1 > area2) || (pixarea2 > area1))) {
1220 RASTER_DEBUG(4,
"Using special case of raster fitting into another raster's pixel");
1222 for (coloffset = 0; coloffset < 3; coloffset++) {
1223 for (rowoffset = 0; rowoffset < 3; rowoffset++) {
1224 for (col = coloffset; col < *widthS; col += 3) {
1225 for (row = rowoffset; row < *heightS; row += 3) {
1226 if (hasnodataS ==
FALSE)
1231 if ((hasnodataS ==
FALSE) || !isnodataS) {
1235 &(lineS[X1]), &(lineS[Y1]),
1241 lineS[X1], lineS[Y1],
1242 &(Qr[pX]), &(Qr[pY]),
1249 (Qr[pX] < 0 || Qr[pX] > *widthL ||
FLT_EQ(Qr[pX], *widthL)) ||
1250 (Qr[pY] < 0 || Qr[pY] > *heightL ||
FLT_EQ(Qr[pY], *heightL))
1255 if (hasnodataS ==
FALSE)
1260 if ((hasnodataL ==
FALSE) || !isnodataL) {
1270 RASTER_DEBUG(4,
"Smaller raster not in the other raster's pixel. Continuing");
1273 RASTER_DEBUG(4,
"Testing smaller raster vs larger raster");
1277 hasnodataS, hasnodataL,
1283 RASTER_DEBUG(4,
"Testing larger raster vs smaller raster");
1287 hasnodataL, hasnodataS,
int rt_raster_get_num_bands(rt_raster raster)
void lwgeom_free(LWGEOM *geom)
static int rt_raster_intersects_algorithm(rt_raster rast1, rt_raster rast2, rt_band band1, rt_band band2, int hasnodata1, int hasnodata2, double nodata1, double nodata2)
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
rt_errorstate rt_raster_get_convex_hull(rt_raster raster, LWGEOM **hull)
Get raster's convex hull.
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.
void lwgeom_geos_error(const char *fmt,...)
Datum intersects(PG_FUNCTION_ARGS)
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
rt_band rt_raster_get_band(rt_raster raster, int bandNum)
Return Nth band, or NULL if unavailable.
void rtinfo(const char *fmt,...)
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
double rt_raster_get_x_scale(rt_raster raster)
Get scale X in projection units.
#define RASTER_DEBUGF(level, msg,...)
int32_t rt_raster_get_srid(rt_raster raster)
Get raster's SRID.
rt_errorstate rt_raster_geopoint_to_cell(rt_raster raster, double xw, double yw, double *xr, double *yr, double *igt)
Convert an xw, yw map point to a xr, yr raster point.
GEOSGeometry * LWGEOM2GEOS(const LWGEOM *lwgeom, int autofix)
double rt_raster_get_y_scale(rt_raster raster)
Get scale Y in projection units.
uint16_t rt_raster_get_width(rt_raster raster)
#define RASTER_DEBUG(level, msg)
int rt_band_get_isnodata_flag(rt_band band)
Get isnodata flag value.
uint16_t rt_raster_get_height(rt_raster raster)