[GIS] Plot points by longitude and latitude on a map created by centroids

centroidsgeolocationlatitude longitudershapefile

I'm searching for a way to plot some points for which I have the longitude and latitude (using Google Maps API) on a map created with centroids. I succeeded to do it by using functions such as map_data() and functions from the package ggplot2.

Results (just to show it really works) :

points on a map

However I don't like the french departments datas given by map_data(), it's quite ambiguous but the nice thing is that their coordinates are given by longitude and latitude. (french departments are similar to counties)

What I would like to do is to use a shapefile from a site such as GEOFLA (here) that provides me datas in projection LAMBERT-93 to plot my map. However the shapefile only contains the coordinates of deparments centroids so, since I have, in one hand, coordinates given by longitude and latitude and, in the other hand, coordinates given by centroids, so I can't plot the points on my map since the coordinates are not in the same "unit".

That's what I get with summary() on the shapefile :

Object of class SpatialPolygonsDataFrame
Coordinates:
        min     max
x   99217.1 1242417
y 6049646.3 7110480
Is projected: TRUE 
proj4string :
[+proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m
+no_defs]

Summary of map_data() (I show only the coordinates) :

      long               lat     
 Min.   :-5.14209   Min.   :41.37
 1st Qu.: 0.05213   1st Qu.:44.41
 Median : 2.45500   Median :46.79
 Mean   : 2.45851   Mean   :46.47
 3rd Qu.: 4.97283   3rd Qu.:48.44
 Max.   : 9.56267   Max.   :51.10

This shows that the coordinates used are different.

I tried many things such as using proj4string(), sptransform() for example to get the same units but I didn't get what I wanted.

So how should I do to get the same units for my two differents types of coordinates ? Is there a way to get the longitude and latitude from the centroids of the shapefile or should I use a function (if it existed) that can transform my points with longitude and latitude into centroids ?

This is my first time using R for maps and polygons, projections etc. also so don't be surprised if I said some real stupid things.

Exemple of points I want to plot :

  centerid latitude longitude                                       adresse_complete
1   0121H1 46.22368  5.210819               900 Route de Paris, 01440 Viriat, France
2   0121H2 46.22368  5.210819               900 Route de Paris, 01440 Viriat, France
3   0218H3 49.37008  3.335127 46 Avenue du Général de Gaulle, 02200 Soissons, France
4   0303H1 46.34292  2.608996       18 Avenue du 8 Mai 1945, 03100 Montluçon, France
5   0303H2 46.34292  2.608996       18 Avenue du 8 Mai 1945, 03100 Montluçon, France

dput() from above :

structure(list(centerid = c("0121H1", "0121H2", "0218H3", "0303H1", 
"0303H2"), latitude = c(46.2236804, 46.2236804, 49.3700842, 46.3429172, 
46.3429172), longitude = c(5.2108193, 5.2108193, 3.335127, 2.6089958, 
2.6089958), adresse_complete = c("900 Route de Paris, 01440 Viriat, France", 
"900 Route de Paris, 01440 Viriat, France", "46 Avenue du Général de Gaulle, 02200 Soissons, France", 
"18 Avenue du 8 Mai 1945, 03100 Montluçon, France", "18 Avenue du 8 Mai 1945, 03100 Montluçon, France"
)), .Names = c("centerid", "latitude", "longitude", "adresse_complete"
), row.names = c(NA, 5L), class = "data.frame")

Best Answer

You can either reproject your polygon shapefile OR your dataset. EPSG is a short code for spatial projections. EPSG:4326 is the code for non-projected data in degrees using wgs84: http://spatialreference.org/ref/epsg/4326/

Reproject your polygon into 4326

france_wgs84 <- spTransform(france_L93, CRS("+init=epsg:4326"))

Reproject your dataset into Lambert93

data <- structure(list(centerid = c("0121H1", "0121H2", "0218H3", "0303H1", 
"0303H2"), latitude = c(46.2236804, 46.2236804, 49.3700842, 46.3429172, 
46.3429172), longitude = c(5.2108193, 5.2108193, 3.335127, 2.6089958, 
2.6089958), adresse_complete = c("900 Route de Paris, 01440 Viriat, France", 
"900 Route de Paris, 01440 Viriat, France", "46 Avenue du Général de Gaulle, 02200 Soissons, France", 
"18 Avenue du 8 Mai 1945, 03100 Montluçon, France", "18 Avenue du 8 Mai 1945, 03100 Montluçon, France"
)), .Names = c("centerid", "latitude", "longitude", "adresse_complete"
), row.names = c(NA, 5L), class = "data.frame")


coordinates(data) <- ~longitude+latitude
proj4string(data) <- "+init=epsg:4326"
data_L93 <- spTransform(data, CRS("+proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m
+no_defs"))
Related Question