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.
- Ou je fais une projection de Mercator pour que mes longitudes/latitudes soient compatibles avec la carte (par défaut Mercator)
- 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)