Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

New syntax to translate geometry N by values N? #2499

Open
ThomasSoeiro opened this issue Jan 22, 2025 · 0 comments
Open

New syntax to translate geometry N by values N? #2499

ThomasSoeiro opened this issue Jan 22, 2025 · 0 comments
Labels
feature a feature request or enhancement

Comments

@ThomasSoeiro
Copy link

ThomasSoeiro commented Jan 22, 2025

As previously discussed in #903 (comment), the behavior of affine transformations is not homogeneous depending on the operation:

  • translating with a vector of length two translate all geometries with these two values
  • scaling with a vector of length N scales geometry N by value N

Would it be possible to add another syntax, e.g. st_geometry(*) + list(<vector>, <vector>) that would translate geometry N by values N? This would make more straightforward to translate geometries in a data frame using data from other columns. One additional question is how vectors of length one should be treated (i.e. recycle or throw an error).

To Reproduce

library(sf)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))
ncg <- st_geometry(nc)
plot(ncg, border = "grey")

# scale
cntrd <- st_centroid(ncg)
ncg2 <- (ncg - cntrd) * nc$AREA + cntrd
plot(ncg2, col = "blue", add = TRUE)

# translate
nc$move_east <- ifelse(nc$AREA > median(nc$AREA), 1, -1)
nc$move_north <- ifelse(nc$AREA > median(nc$AREA), 2, -2)
ncg[] <- Map(\(obj, x, y) obj + c(x, y), ncg, nc$move_east, nc$move_north)
# or with the new syntax proposed here:
# ncg <- ncg + list(nc$move_east, nc$move_north)

plot(ncg, col = "red", add = TRUE)

Image

Paste the output of your `sessionInfo()` and `sf::sf_extSoftVersion()`
sessionInfo()
# R version 4.4.0 (2024-04-24 ucrt)
# Platform: x86_64-w64-mingw32/x64
# Running under: Windows 10 x64 (build 19045)
# 
# Matrix products: default
# 
# 
# locale:
# [1] LC_COLLATE=French_France.utf8  LC_CTYPE=French_France.utf8    LC_MONETARY=French_France.utf8 LC_NUMERIC=C                  
# [5] LC_TIME=French_France.utf8    
# 
# time zone: Europe/Paris
# tzcode source: internal
# 
# attached base packages:
# [1] stats     graphics  grDevices utils     datasets  methods   base     
# 
# other attached packages:
# [1] sf_1.0-19
# 
# loaded via a namespace (and not attached):
#  [1] compiler_4.4.0     magrittr_2.0.3     class_7.3-22       s2_1.1.7           DBI_1.2.2          tools_4.4.0       
#  [7] units_0.8-5        proxy_0.4-27       rstudioapi_0.17.1  wk_0.9.4           Rcpp_1.0.12        KernSmooth_2.23-24
# [13] grid_4.4.0         e1071_1.7-14       classInt_0.4-11   

sf::sf_extSoftVersion()
      #     GEOS           GDAL         proj.4 GDAL_with_GEOS     USE_PROJ_H           PROJ 
      # "3.12.2"        "3.9.3"        "9.4.1"         "true"         "true"        "9.4.1" 
@edzer edzer added the feature a feature request or enhancement label Jan 22, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
feature a feature request or enhancement
Projects
None yet
Development

No branches or pull requests

2 participants