Niveau 4 - Charger des images satellites pour des applications de cartographique avec R

Google Maps, Bing, OpenStreetMap

Lorsqu'on réalise des cartes, il est intéressant de récupérer les riches données satellitaires mis à notre porté par des géants comme Google maps. Cela permet d'illustrer avec une plus grande précision ses propres données géolocalisées.

L'essentiel de cette page !

La première règle lorsqu'on utilise des librairies de chargements de données de Google est de ne pas en abuser sinon votre IP sera bloqué par Google !

Si vous avez ce message d'erreur : HTTP status was '403 Forbidden', c'est qu'il est trop tard. Dans ce cas, il faut se référer à la rubrique en bas de page.

Que faire quand Google m'a bloqué ?

install.packages("ggmap")
library(ggmap) #https://cran.r-project.org/web/packages/ggmap/ggmap.pdf

Chargement d'une image google maps via un point de coordonnées (librairie RgoogleMaps)

# Chargement de la librairie RgoogleMaps
install.packages(c("png","ReadImages","RgoogleMaps"))
library(RgoogleMaps)
setwd("C:/Users/MesDocuments");getwd()
# Bordeaux via le centre
library(RgoogleMaps)
# Chargement (zoom donne le niveau d'altitude d'où "prise" l'image)
bdx_center <- GetMap(center=c(44.850050, -0.574829), zoom=12, destfile="bdx_center_mobile.png", size=c(640,640), maptype="relief") # existe en terrain
# Afficher l'image sauvegardée dans le répertoire courant
PlotOnStaticMap(bdx_center)

satellite


terrain


roadmap


Chargement à partir d'une boîte dont on indique les coordonnées des angles (RgoogleMaps)

library(RgoogleMaps) # A faire avant : install.packages(c("png","ReadImages","RgoogleMaps"))
mymarkers <- cbind.data.frame(lat =c(36.4269776,36.495480),
lon=c(23.059337,23.201548));
mymarkers
bb <- qbbox(lat = mymarkers[,"lat"], lon = mymarkers[,"lon"]);bb
MyMap <- GetMap.bbox(bb$lonR, bb$latR, 
destfile = "DC.png",markers = mymarkers,
zoom=12,
maptype="satellite")
PlotOnStaticMap(MyMap)

Superposer des points par dessus une carte RgoogleMaps

vatikacenter <- GetMap(center=c(36.457028, 23.178611),
zoom=14,
destfile="vatika_center_18.png",
size=c(640,640),
maptype="terrain"
) # API_console_key=apikey si code API nécessaire
i=0.001
PlotOnStaticMap(vatikacenter,
lat=c((36.457028+i),(36.457028+i),(36.457028-i),(36.457028-i)),
lon=c((23.178611+i),(23.178611-i),(23.178611+i),(23.178611-i)),
cex=4,pch=20,col="orange")

J'utilise R pour charger des données de google maps mais une erreur s'affiche ! "Error 403 forbidden".

Pas de panique, vous avez dû trop charger de données (et pourtant vous aviez droit à 25000/jours !) et Google vous a interdit... pour longtemps.

N'espérer pas réutiliser R couplé à Google maps avant longtemps.

Toutefois, il y a moyen d'y avoir accès, pour un temps : c'est de se faire un abonnement Google Cloud. En obtennant un code API et en le signalant avec le paramètre API_console_key=apikey (RGoogleMaps) ou key (ggmap), ça peut fonctionner.

On arrive aux même résultats avec la librairie ggmap

# Chargement des données
perigueux = get_googlemap(center = c(lon = 0.714539, lat =  45.186369), 
zoom = 13,size = c(640,640), scale = 2, format = c("png8"), 
maptype = "satellite", filename = "ggmapTemp" )
# Affichage de l'image satellite
x11();ggmap(perigueux ,extent="device") # extent normal : donne des axes.
# Sauvegarde au format png
dev.new();png("perigueux_ggmap.png");ggmap(perigueux,extent="device");
dev.off()

Réaliser des cartes à partir des données OpenStreetMap

Il existe plusieurs librairies dédiées aux données d'OpenStreetMap :

  • osmar, OpenStreetMap, osmdata
  • Voici comment faire une carte simple avec OpenStreetMap
  • Installer OpenStreetMap sous R : attention, il faut bien avoir installé Java sur votre ordinateur sinon vous aurez un message d'erreur RJava au lancement
install.packages("OpenStreetMap"); # Il faut installer Java
  • Lancement de OpenstreetMap
library("OpenStreetMap")
  • Deux librairies sont requises pour le tracé des cartes : maps et ggplot2 (à installer aussi)
require(maps) ; require(ggplot2)
  • Chargement du cadre nécessaire au tracé de la carte
    • 17 indique ici le niveau de zoom : 17 : on est proche du sol, 1 on est dans l'espace
    • "osm" indique le type de carte , ici une carte OpenStreetMap - il existe d'autres types de données (terrain, image satellite...) à tester en allant voir leurs noms en tapant ?openmap dans R
# Point haut-gauche 45.197734, 0.717331
# Point Bas-droite 45.195488, 0.720223
mp <- openmap(c(45.197734, 0.717331),c(45.195488, 0.720223),17,'osm')
  • Afficher la carte
    • Mode simple, écriture avec plot
plot(mp)
    • Mode complexe, écriture avec ggplot2
p <- autoplot(mp,expand=T) + theme_bw()
print(p)

Et si on veut ajouter des points : il va falloir se mettre à ggplot2 : un excellent outil graphique pour la visualisation de données (dataviz)

Deux options se présentent à moi pour ajouter un point.

  1. Ou je fais une projection de Mercator pour que mes longitudes/latitudes soient compatibles avec la carte (par défaut Mercator)
  2. Ou je convertis ma carte pour qu'elle respecte les coordonnées longitude/latitude

OPTION 1 - projection de mercator de tout point que je veux ajouter

  • Je dois d'abord convertir mes coordonnées longitude/latitude pour que ce soit dans la même projection que ma carte
mon_pt <- projectMercator(45.196040, 0.718700)
  • Je peux ensuite tracé ma carte en ajoutant mes points
    • Mode simple, écriture avec plot
plot(mp) ; points(mon_pt[1],mon_pt[2])
    • Mode complexe, écriture avec ggplot2
p <- autoplot(mp,expand=T) + geom_point(aes(mon_pt[1],mon_pt[2]),color="red") +theme_bw()
print(p)

De la même façon je pouvait ajouter un grand nombre de points en faisant appel à un tableau, il suffit de remplacer la syntaxe de ggplot2

OPTION 2 - je convertis mon fond de carte : c'est de loin la méthode la plus simple !!!

# Je récupère les coordonnées de ma carte
mp <- openmap(c(45.197734, 0.717331),c(45.195488, 0.720223),17,'osm')
# Je la convertis
map_longlat <- openproj(mp)
# Je trace
plot(map_longlat)
# J'ajoute mon point
points(0.718700,45.196040,cex=3,col="red")

A voir, comment charger les contours administratifs de la France et les superposer à une image satellite avec OpenStreetMap et maps

map <- openmap(c(70,-179),
c(-70,179),zoom=1,type='bing')
plot(map)
map_longlat <- openproj(map)
plot(map_longlat)
map("world",col="red",add=TRUE)
map("france",col="orange",add=TRUE,lwd=2)