4 votes

Décalage de la longitude d'un objet sf

J'ai une carte des pays (objet sf) et je voudrais décaler la longitude de la partie orientale de la Russie pour qu'elle ne soit pas isolée du reste de la Russie. Voir image

J'ai trouvé le code du backend pour st_shift_longitude https://github.com/r-spatial/sf/blob/master/R/shift_longitude.R qui décale toutes les coordonnées de 180 degrés, de sorte que la carte résultante se présente comme suit : lien

Comment puis-je modifier ce bloc de code pour déplacer la partie orientale de la Russie uniquement ?

shift_lon <- function(x){
  xcrs = st_crs(x)
  g = (x + c(360, 90)) %% c(360) - c(0, 90)
  st_wrap_dateline(st_set_crs(g - c(180, 0), xcrs)) + c(180, 0)
  st_set_crs(g, xcrs)
}

st_geometry(countries) <- shift_lon(st_geometry(countries))

Les solutions alternatives sont également les bienvenues.

6voto

Jindra Lacko Points 763

Vous devrez décomposer votre world en deux parties - l'une contenant la Russie, l'autre le reste du monde.

Puis appliquer la vue pacifique / sf::st_shift_longitude() sur la partie Russie, et la fusionner à nouveau avec l'ensemble de données "reste du monde".

Dans cet exemple, j'utilise le jeu de données mondial de giscoR paquet. C'est mon préféré, mais ce n'est pas le seul disponible ; et il a une caractéristique (ou un bogue, selon les circonstances) d'appliquer une fine interruption à l'antiméridien ; cela entraîne un artefact autour de Chukotka dans ma carte. Se débarrasser de ce problème est une question distincte, et je ne suis pas certain que vous y serez confronté avec votre version de l'ensemble de données mondiales (il peut donc s'agir d'un problème pertinent ou non).

Quoi qu'il en soit, voici un code d'implémentation possible :

library(sf)

world <- giscoR::gisco_get_countries() # or your own world dataset

rossiya <- subset(world, ISO3_CODE == "RUS")

# shift Russia to a more Pacific centric worldview
pacified_rossiya <- st_shift_longitude(rossiya)

rest_of_world <- subset(world, ISO3_CODE != "RUS")

# this is the important section: bind together the shifted and unshifted parts
world2 <- rbind(pacified_rossiya,
                rest_of_world)

plot(st_geometry(world2))

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X