From 539aff33f3d75b2bed0cf47578737bf86248b0c3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Grelot?= <frederic.grelot@irstea.fr>
Date: Thu, 20 Apr 2023 17:03:11 +0200
Subject: [PATCH] =?UTF-8?q?Pr=C3=A9paration=20de=20so-ii=201.0.25.0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 dev/package.development.R    |  8 ++++----
 dev/tag-message              | 14 ++++++++------
 so.ii/DESCRIPTION            |  5 ++---
 so.ii/R/adjust_terra_scale.R | 36 ++++++++++++++++++++++++++++++++++++
 so.ii/R/map_so_ii.r          | 28 ++++++++++++++++++----------
 5 files changed, 68 insertions(+), 23 deletions(-)
 create mode 100644 so.ii/R/adjust_terra_scale.R

diff --git a/dev/package.development.R b/dev/package.development.R
index 3043176..76538e6 100644
--- a/dev/package.development.R
+++ b/dev/package.development.R
@@ -10,11 +10,11 @@ devtools::build_vignettes(package)
 ### Checks
 if (FALSE) {
     {
-        system("rm so.ii/data-raw/data-common")
-        system("mv ~/.Rprofile ~/.Rprofile-temp")
+        # system("rm so.ii/data-raw/data-common")
+        # system("mv ~/.Rprofile ~/.Rprofile-temp")
         devtools::check(package)
-        system("mv ~/.Rprofile-temp ~/.Rprofile")
-        system("cp -r data-common so.ii/data-raw")
+        # system("mv ~/.Rprofile-temp ~/.Rprofile")
+        # system("cp -r data-common so.ii/data-raw")
     }
 }
 
diff --git a/dev/tag-message b/dev/tag-message
index da25973..2e0bd93 100644
--- a/dev/tag-message
+++ b/dev/tag-message
@@ -1,16 +1,18 @@
-so.ii Version: 1.0.24.0
+so.ii Version: 1.0.25.0
 
 0 errors ✔ | 0 warnings ✔ | 0 notes ✔
 
 **Note de version**
     * modification de map_so_ii
+    * nouvelle fonction interne adjust_terra_scale
 
 **Détails**
-    * map_so_ii charge dorénavant sf si besoin, modifie le parmètre sf_use_s2 à
-    FALSE (de façon momentanée). Il gère aussi le format de dataset. Il cherche
-    à le transformer en objet de classe sfc, s'il n'y arrive pas il renvoie un
-    warning et n'affiche pas dataset.
+    * La librairie terra a changé sa façon de faire la barre d'échelle avec
+    sbar à partir de la version 1.7, de façon incompatible avec l'usage interne.
+    Une nouvelle fonction non exportée adjust_terra_scale est créé pour ne plus
+    dépendre des fonctionnalités de terra::sbar qui posent problème, lorsque
+    les cartes sont en "lonlat".
 
-# git tag -a v1.0.24.0 -F dev/tag-message
+# git tag -a v1.0.25.0 -F dev/tag-message
 # git push --tags
 
diff --git a/so.ii/DESCRIPTION b/so.ii/DESCRIPTION
index aee78c7..cf26285 100644
--- a/so.ii/DESCRIPTION
+++ b/so.ii/DESCRIPTION
@@ -1,6 +1,6 @@
 Package: so.ii
 Title: Utilities very useful to share within so_ii team
-Version: 1.0.24.0
+Version: 1.0.25.0
 Authors@R:
     c(
         person(given = "Frédéric",
@@ -28,8 +28,7 @@ Imports:
     rio,
     scales,
     sf,
-    terra,
-    units
+    terra
 Suggests: 
     rmarkdown,
     testthat
diff --git a/so.ii/R/adjust_terra_scale.R b/so.ii/R/adjust_terra_scale.R
new file mode 100644
index 0000000..a749b0e
--- /dev/null
+++ b/so.ii/R/adjust_terra_scale.R
@@ -0,0 +1,36 @@
+adjust_terra_scale = function(d = NULL, lonlat = TRUE) {
+    destpoint = function (p, d, b = 90, r = 6378137) {
+        toRad = pi/180
+        lon1 = p[, 1] * toRad
+        lat1 = p[, 2] * toRad
+        b = b * toRad
+        lat2 = asin(sin(lat1) * cos(d/r) + cos(lat1) * sin(d/r) * 
+            cos(b))
+        lon2 = lon1 + atan2(sin(b) * sin(d/r) * cos(lat1), cos(d/r) - 
+            sin(lat1) * sin(lat2))
+        lon2 = (lon2 + pi)%%(2 * pi) - pi
+        cbind(lon2, lat2)/toRad
+    }
+
+    graph_box = graphics::par()$usr
+    if (lonlat) {
+        lat = mean(graph_box[3:4])
+        if (is.null(d)) {
+            dx = (graph_box[2] - graph_box[1])/6
+            d = as.vector(terra::distance(cbind(0, lat), cbind(dx, 
+                lat), TRUE))
+            d = max(1, 5 * round(d/5000))
+        }
+        p = cbind(0, lat)
+        dd = destpoint(p, d * 1000)[1, 1]
+    }
+    else {
+        if (is.null(d)) {
+            d = (graph_box[2] - graph_box[1])/6
+            digits = floor(log10(d)) + 1
+            d = round(d, -(digits - 1))
+        }
+        dd = d
+    }
+    return(c(dd, d))
+}
diff --git a/so.ii/R/map_so_ii.r b/so.ii/R/map_so_ii.r
index 656fc2f..f0d1c11 100644
--- a/so.ii/R/map_so_ii.r
+++ b/so.ii/R/map_so_ii.r
@@ -289,23 +289,31 @@ map_so_ii = function(
     ## Plot bar
     if (bar == TRUE) {
         if (identical(scope, so.ii::so_ii_limit)) {
-            d = 10
+            # d = 10
+            d = adjust_terra_scale(10)
             xy = c(3.55, 43.47)
-            below = "km"
-            label = c(0, 5, 10)
+            adj = c(0.5, -1)
         } else {
-            area = sf::st_area(sf::st_as_sfc(sf::st_bbox(scope)))
-            d = max(pretty(units::set_units(sqrt(area) / 5, "km"))) 
+            # area = sf::st_area(sf::st_as_sfc(sf::st_bbox(scope)))
+            # d = max(pretty(units::set_units(sqrt(area) / 5, "km")))
+            d = adjust_terra_scale()
             xy = "bottomleft"
-            below = "km"
-            label = c(0, d/2, d)
+            # Magical adjustment when scope vary to have text readable
+            # 0.4788987 should correspond to longitude range for so.ii scope
+            adj = diff(graphics::par()$usr[3:4])
+            adj = c(
+                0.5,
+                -1 * exp(0.4788987 / adj - 1)^.024
+            )
         }
         terra::sbar(
-            d = d,
+            d = d[1],
             xy = xy,
             type = "bar",
-            below = below,
-            label = label,
+            below = "km",
+            label = c(0, d[2]/2, d[2]),
+            lonlat = FALSE,
+            adj = adj,
             cex = .8
         )
     }
-- 
GitLab