Décalage de la position des communes sur une carte de France

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Sylvain Burgaud
Messages : 5
Enregistré le : 08 Juil 2021, 15:20

Décalage de la position des communes sur une carte de France

Messagepar Sylvain Burgaud » 22 Juil 2021, 15:37

Bonjour à tous,

Je suis tout nouveau sur ce forum et c'est là mon premier message. Dans le cadre de mon travail, j'ai besoin de réaliser sous R une carte de la France métropolitaine et d'y positionner les communes que je souhaite représenter par un point rouge.

Je précise que je mes compétences en R sont assez basiques et que je suis totalement débutant en cartographie. J'espère donc que vous saurez faire preuve d'indulgence si je raconte des bêtises ou si des concepts qui vous semblent familiers et évidents m'échappent totalement. Mais je vous promets de faire des efforts pour essayer de vous suivre ! :)

Voici mon problème :

- J'ai récupéré une carte de France sur le site GADM, niveau départements, constituée de 5 fichiers (gadm36_FRA_2.cpg, gadm36_FRA_2.dbf, gadm36_FRA_2.prj, gadm36_FRA_2.shp et gadm36_FRA_2.shx).

- J'ai par ailleurs un fichier CSV contenant les codes INSEE des communes françaises qui m'intéressent avec leurs latitudes et longitudes. Dans ce fichier pour exemple, les latitudes et longitudes de Calais sont respectivement 50.95020728 et 1.875755661, celles de Cherbourg sont 49.63341216 et -1.633901602.

Lorsque j'affiche ma carte avec les communes, ces dernières n'y sont pas positionnées correctement : elles sont décalées vers le bas. Je suppose donc que la carte que j'ai téléchargée et les données de mon fichier CSV n'utilisent pas le même référentiel, mais j'ai beau chercher, je ne n'en sors pas. Je souhaiterais pouvoir joindre les fichiers que j'utilise pour vous faciliter la tâche si vous souhaitez m'aider, mais je ne trouve pas comment les joindre à mon message malheureusement.

En attendant, voici le code R que j'ai créé :

Code : Tout sélectionner

library(sf)
library(dplyr)
library(readr)
library(tidyverse)

# Déclaration de l'opérateur "not in".
'%!in%' <- Negate('%in%')

# Carte de France sans la Corse (source : gadm.org, WGS84), niveau "départements".
sf_france <- st_read(
  dsn = "data",
  layer = "gadm36_FRA_2") %>%
  filter(CC_2 %!in% c("2A", "2B")) %>%
  select(CC_2)

# Codes communes avec latitudes et longitudes en degrés décimaux.
# Communes retenues : Calais, Cherbourg, Paris, Saint-Martin-de-Ré, Niort, Nice et Marseille.
df_communes <- read_delim("./data/codes_communes_small.csv", delim = ";", col_names = TRUE, col_types = "cdd")

# Affichage de la carte.
sf_france %>%
  ggplot() +
  geom_sf(aes(fill = CC_2), show.legend = FALSE, fill = "white") +
  geom_text(data = df_communes,
            aes(x = longitude, y = latitude, label = "."), colour = "red")


Pouvez-vous me dire pourquoi les communes sont décalées vers le bas sur ma carte et comment y remédier ?

Un grand merci d'avance si vous pouvez m'aider ! :)

Bonne fin de journée.

Sylvain

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: Décalage de la position des communes sur une carte de France

Messagepar Sébastien Rochette » 22 Juil 2021, 19:23

Bonjour et bienvenue ici,

Vous ne pouvez pas afficher directement les points sur la carte comme si c'étaient des données classiques.
Vous avez des données géoréférencées, vous devez les traiter comme telles.

Pour information, j'ai rédigé un article de blog sur l'introduction à la cartographie avec R, vous entendrez parler de projections notamment. C'est la chose à maitriser avant de se lancer dans la création de cartes avec R car ça va être la source de la majorité de vos problèmes. L'article en question: https://statnmap.com/fr/2018-07-14-initiation-a-la-cartographie-avec-sf-et-compagnie/

Je ne peux pas assurer que le code ci-dessous va fonctionner directement avec vos données car vous ne les avez pas fournies. Ce n'est donc pas reproductible. Ceci dit, cela devrait ressembler à ça:

Code : Tout sélectionner

library(sf)
df_communes_wgs84 <- df_communes %>%
  st_as_sf(coords = c("longitude", "latitude", crs = 4326)

# graph
ggplot() +
  geom_sf(data = sf_france) +
  # ce sont des points, geom_sf va le reconnaitre comme tel
  geom_sf(data = df_communes_wgs84) +
  # On repasse à un affichage avec une projection Lambert car c'est la bonne façon de représenter la carte de France en 2D
  coord_sf(crs = 2154)
Sébastien
Dev, Consult, Formateur
ThinkR

Sylvain Burgaud
Messages : 5
Enregistré le : 08 Juil 2021, 15:20

Re: Décalage de la position des communes sur une carte de France

Messagepar Sylvain Burgaud » 22 Juil 2021, 20:38

Bonsoir Sébastien,

Et merci pour votre réponse. C'est rigolo que ce soit vous qui me répondiez parce que c'est vous qui m'avez formé à R il y a quelques années à Chauray chez Manutan Collectivités, à côté de Niort. Je ne sais pas si vous vous souviendrez de moi mais nous avions parlé de ma fille qui souhaitait devenir biologiste marin, un domaine que vous connaissez bien me semble-t-il. ;-)

Je vais évidemment lire votre article et essayer votre code dès demain matin.

Pour ce qui est de fournir mes données, je l'aurais bien fait mais je n'ai pas trouvé comment joindre les fichiers que j'utilise. Comment dois-je procéder pour cela ?

Encore merci pour votre aide, je vous dirai si je m'en sors.

Bonne fin de soirée.

Cordialement,

Sylvain

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: Décalage de la position des communes sur une carte de France

Messagepar Sébastien Rochette » 23 Juil 2021, 06:41

En répondant, je me demandais pourquoi ce nom me disait quelque chose :-)
On fait trop de formations chez ThinkR ! J'ai du mal à me souvenir des noms et des visages...


Pour le côté partage des données, tu peux mettre la sortie d'un `dput()` sur une partie des données.

Code : Tout sélectionner

mtcars_small <- head(mtcars)
dput(mtcars_small)


Code : Tout sélectionner

structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1), cyl = c(6,
6, 4, 6, 8, 6), disp = c(160, 160, 108, 258, 360, 225), hp = c(110,
110, 93, 110, 175, 105), drat = c(3.9, 3.9, 3.85, 3.08, 3.15,
2.76), wt = c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46), qsec = c(16.46,
17.02, 18.61, 19.44, 17.02, 20.22), vs = c(0, 0, 1, 1, 0, 1),
    am = c(1, 1, 1, 0, 0, 0), gear = c(4, 4, 4, 3, 3, 3), carb = c(4,
    4, 1, 1, 2, 1)), row.names = c("Mazda RX4", "Mazda RX4 Wag",
"Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Valiant"
), class = "data.frame")


Pour les données géo, ça risque d'être un peu plus lourd. Mieux vaut partager la source et comment la télécharger.
Les données GADM, je sais qu'on peut les télécharger avec le package {raster} par exemple:

Code : Tout sélectionner

raster::getData('GADM', country='FRA', level = 2)


=> C'était le chapitre "Comment demander de l'aide?" :-p Mais c'était il y a longtemps ! Mais je ne t'en veux pas car ton partage de code était propre et ça me plaît :-)
Sébastien
Dev, Consult, Formateur
ThinkR

Sylvain Burgaud
Messages : 5
Enregistré le : 08 Juil 2021, 15:20

Re: Décalage de la position des communes sur une carte de France

Messagepar Sylvain Burgaud » 26 Juil 2021, 09:22

Bonjour Sébastien,

Ma carte de France présente effectivement à présent ses communes bien positionnées : les marseillais et niçois ne sont plus en train de flotter dans la Méditerranée et les dunkerquois ne sont plus 20 km dans les terres. Je suis sûr qu'ils apprécieront ! ;-)

Bonne journée et encore un grand merci pour ton aide.

Sylvain

Sylvain Burgaud
Messages : 5
Enregistré le : 08 Juil 2021, 15:20

Re: Décalage de la position des communes sur une carte de France

Messagepar Sylvain Burgaud » 27 Juil 2021, 10:18

Bonjour Sébastien, bonjour à tous,

J'ai une autre question : tu m'as indiqué le code suivant pour afficher l'emplacement des communes sur ma carte de France avec des points :

Code : Tout sélectionner

geom_sf(data = df_communes_wgs84)


Mais même en ajoutant une taille faible comme suit... :

Code : Tout sélectionner

geom_sf(data = df_communes_wgs84, size = 0.1)


...les points sont trop gros et ils se chevauchent (j'affiche environ 9000 communes)

Y-a-t-il une solution pour en réduire la taille encore plus ?

Merci pour ton aide et bonne journée.

Sylvain Burgaud
Messages : 5
Enregistré le : 08 Juil 2021, 15:20

Re: Décalage de la position des communes sur une carte de France

Messagepar Sylvain Burgaud » 27 Juil 2021, 12:36

Re-bonjour,

J'ai finalement trouvé : il suffit d'indiquer un width et un height dans le ggsave suffisamment grand pour que la taille relative des points diminue ! :-)

Code : Tout sélectionner

ggsave(paste0(chemin_sortie, "carte.pdf"), width = 40, height = 40, units = "cm")


Désolé du dérangement.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité