998 uint32_t max_run = 1;
1004 double _gt[6] = {0};
1005 double _igt[6] = {0};
1006 int _d[2] = {1, -1};
1011 double _xy[2] = {0};
1018 GEOSGeometry *sgeom = NULL;
1019 GEOSGeometry *ngeom = NULL;
1027 else if (tolerance > 1.)
1030 dbl_run = tolerance;
1031 while (dbl_run < 10) {
1039 for (i = 0; i < 2; i++) {
1040 if (
FLT_EQ(scale[i], 0.0))
1042 rterror(
"rt_raster_compute_skewed_raster: Scale cannot be zero");
1047 _gt[1] = fabs(scale[i] * tolerance);
1049 _gt[5] = fabs(scale[i] * tolerance);
1055 if ((skew == NULL) || (
FLT_EQ(skew[0], 0.0) &&
FLT_EQ(skew[1], 0.0)))
1058 (int) fmax((fabs(extent.
MaxX - extent.
MinX) + (fabs(scale[0]) / 2.)) / fabs(scale[0]), 1),
1059 (
int) fmax((fabs(extent.
MaxY - extent.
MinY) + (fabs(scale[1]) / 2.)) / fabs(scale[1]), 1)
1064 rterror(
"rt_raster_compute_skewed_raster: Could not create output raster");
1083 _gt[2] = skew[0] * tolerance;
1085 _gt[4] = skew[1] * tolerance;
1087 RASTER_DEBUGF(4,
"Initial geotransform: %f, %f, %f, %f, %f, %f",
1088 _gt[0], _gt[1], _gt[2], _gt[3], _gt[4], _gt[5]
1094 rterror(
"rt_raster_compute_skewed_raster: Out of memory allocating extent raster");
1100 if (!GDALInvGeoTransform(_gt, _igt)) {
1101 rterror(
"rt_raster_compute_skewed_raster: Could not compute inverse geotransform matrix");
1105 RASTER_DEBUGF(4,
"Inverse geotransform: %f, %f, %f, %f, %f, %f",
1106 _igt[0], _igt[1], _igt[2], _igt[3], _igt[4], _igt[5]
1110 for (i = 0; i < 2; i++) {
1114 RASTER_DEBUGF(3,
"Shifting along %s axis", i < 1 ?
"X" :
"Y");
1119 if (run > max_run) {
1120 rterror(
"rt_raster_compute_skewed_raster: Could not compute skewed extent due to check preventing infinite loop");
1129 for (j = 0; j < 4; j++) {
1133 _xy[0] = extent.
MinX;
1134 _xy[1] = extent.
MaxY;
1138 _xy[0] = extent.
MinX;
1139 _xy[1] = extent.
MinY;
1143 _xy[0] = extent.
MaxX;
1144 _xy[1] = extent.
MinY;
1148 _xy[0] = extent.
MaxX;
1149 _xy[1] = extent.
MaxY;
1160 rterror(
"rt_raster_compute_skewed_raster: Could not compute raster pixel for spatial coordinates");
1165 RASTER_DEBUGF(4,
"Point %d at cell %d x %d", j, (
int) _r[0], (
int) _r[1]);
1168 if ((
int) _r[i] < 0) {
1172 if (_dlastpos != j) {
1173 _dlast = (int) _r[i];
1176 else if ((
int) _r[i] < _dlast) {
1177 RASTER_DEBUG(4,
"Point going in wrong direction. Reversing direction");
1193 x = _d[i] * fabs(_r[i]);
1195 y = _d[i] * fabs(_r[i]);
1204 rterror(
"rt_raster_compute_skewed_raster: Could not compute spatial coordinates for raster pixel");
1215 RASTER_DEBUGF(4,
"Shifted geotransform: %f, %f, %f, %f, %f, %f",
1216 _gt[0], _gt[1], _gt[2], _gt[3], _gt[4], _gt[5]
1220 if (!GDALInvGeoTransform(_gt, _igt)) {
1221 rterror(
"rt_raster_compute_skewed_raster: Could not compute inverse geotransform matrix");
1225 RASTER_DEBUGF(4,
"Inverse geotransform: %f, %f, %f, %f, %f, %f",
1226 _igt[0], _igt[1], _igt[2], _igt[3], _igt[4], _igt[5]
1243 rterror(
"rt_raster_compute_skewed_raster: Could not compute raster pixel for spatial coordinates");
1248 RASTER_DEBUGF(4,
"geopoint %f x %f at cell %d x %d", extent.
MaxX, extent.
MinY, (
int) _r[0], (
int) _r[1]);
1259 if (npoly == NULL) {
1260 rterror(
"rt_raster_compute_skewed_raster: Could not build extent's geometry for covers test");
1274 rterror(
"rt_raster_compute_skewed_raster: Could not build skewed extent's geometry for covers test");
1275 GEOSGeom_destroy(ngeom);
1283 covers = GEOSRelatePattern(sgeom, ngeom,
"******FF*");
1284 GEOSGeom_destroy(sgeom);
1287 rterror(
"rt_raster_compute_skewed_raster: Could not run covers test");
1288 GEOSGeom_destroy(ngeom);
1303 raster->width = (int) ((((
double)
raster->width) * fabs(_gt[1]) + fabs(scale[0] / 2.)) / fabs(scale[0]));
1304 raster->height = (int) ((((
double)
raster->height) * fabs(_gt[5]) + fabs(scale[1] / 2.)) / fabs(scale[1]));
1305 _gt[1] = fabs(scale[0]);
1306 _gt[5] = -1 * fabs(scale[1]);
1312 for (i = 0; i < 2; i++) {
1322 rterror(
"rt_raster_compute_skewed_raster: Could not build skewed extent's geometry for minimizing dimensions");
1323 GEOSGeom_destroy(ngeom);
1331 covers = GEOSRelatePattern(sgeom, ngeom,
"******FF*");
1332 GEOSGeom_destroy(sgeom);
1335 rterror(
"rt_raster_compute_skewed_raster: Could not run covers test for minimizing dimensions");
1336 GEOSGeom_destroy(ngeom);
1349 GEOSGeom_destroy(ngeom);
GEOSGeometry * LWGEOM2GEOS(const LWGEOM *lwgeom, uint8_t autofix)
void lwgeom_geos_error(const char *fmt,...)
void lwgeom_free(LWGEOM *geom)
LWGEOM * lwpoly_as_lwgeom(const LWPOLY *obj)
void lwpoly_free(LWPOLY *poly)
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
#define RASTER_DEBUG(level, msg)
#define RASTER_DEBUGF(level, msg,...)
void rtinfo(const char *fmt,...)
rt_errorstate rt_raster_get_convex_hull(rt_raster raster, LWGEOM **hull)
Get raster's convex hull.
LWPOLY * rt_util_envelope_to_lwpoly(rt_envelope ext)
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
Datum covers(PG_FUNCTION_ARGS)
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 rt_raster_set_geotransform_matrix(rt_raster raster, double *gt)
Set raster's geotransform using 6-element array.
void rt_raster_set_scale(rt_raster raster, double scaleX, double scaleY)
Set scale in projection units.
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 cell coordinate.
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
void rt_raster_set_skews(rt_raster raster, double skewX, double skewY)
Set skews about the X and Y axis.
rt_raster rt_raster_new(uint32_t width, uint32_t height)
Construct a raster with given dimensions.
void rt_raster_set_offsets(rt_raster raster, double x, double y)
Set insertion points in projection units.