Skip to content

Commit

Permalink
fixes #1564
Browse files Browse the repository at this point in the history
  • Loading branch information
rhijmans committed Jul 21, 2024
1 parent ee6696f commit ab5bd4a
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 13 deletions.
2 changes: 1 addition & 1 deletion R/tiles.R
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ setMethod("getTileExtents", signature(x="SpatRaster"),
error("getTileExtents", "y must be numeric or a SpatRaster or SpatVector")
}
messages(x, "getTileExtents")
e <- matrix(e, ncol=4, byrow=TRUE)
e <- matrix(e, ncol=4, byrow=FALSE)
colnames(e) <- c("xmin", "xmax", "ymin", "ymax")
e
}
Expand Down
52 changes: 40 additions & 12 deletions src/raster_methods.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,6 @@ SpatExtent SpatRaster::ext_from_cell( double cell) {

std::vector<double> SpatRaster::get_tiles_extent(SpatRaster x, bool expand, std::vector<int> buffer) {

std::vector<double> ee;

x = x.geometry(1, false, false, false);
SpatExtent e = getExtent();
Expand All @@ -134,25 +133,54 @@ std::vector<double> SpatRaster::get_tiles_extent(SpatRaster x, bool expand, std:
std::vector<size_t> d(x.ncell());
std::iota(d.begin(), d.end(), 1);

ee.reserve(d.size()*4);

std::vector<std::vector<double>> ee(4);
for (size_t i=0; i<4; i++) {
ee[i].reserve(d.size());
}

SpatRaster y = geometry(1, false, false, false);

for (size_t i=0; i<d.size(); i++) {
SpatExtent exi = x.ext_from_cell(i);
exi.xmin = exi.xmin - ebuf[0];
exi.xmax = exi.xmax + ebuf[0];
exi.ymin = exi.ymin - ebuf[1];
exi.ymax = exi.ymax + ebuf[1];
SpatRaster out = y.crop(exi, "near", false, opt);
SpatExtent ye = out.getExtent();
ee[0].push_back(ye.xmin);
ee[1].push_back(ye.xmax);
ee[2].push_back(ye.ymin);
ee[3].push_back(ye.ymax);
}

size_t nc = x.ncol();
size_t nr = x.nrow();

//avoid under- and overshoots introduced by rounding, #1564
for (size_t i=0; i<nr; i++) {
for (size_t j=0; j<nc; j++) {
size_t k = (i*nc) + j;
if (j > 0) {
ee[0][k] = ee[1][k-1];
}
if (i > 0) {
ee[3][k] = ee[2][k-nc];
}
}
}

ee.push_back(ye.xmin);
ee.push_back(ye.xmax);
ee.push_back(ye.ymin);
ee.push_back(ye.ymax);
for (size_t i=0; i<ee[0].size(); i++) {
ee[0][i] = ee[0][i] - ebuf[0];
ee[1][i] = ee[1][i] + ebuf[0];
ee[2][i] = ee[2][i] - ebuf[1];
ee[3][i] = ee[3][i] + ebuf[1];
}
return ee;

std::vector<double> out;
out.reserve(ee[0].size() * 4);

for (size_t i=0; i<4; i++) {
out.insert(out.end(), ee[i].begin(), ee[i].end());
}

return out;
}


Expand Down

0 comments on commit ab5bd4a

Please sign in to comment.