ggmap: tracé d'un polygone à partir d'un fichier de formes

9

En utilisant ggmap, je veux inclure les frontières de la municipalité (polygone) à partir d'un fichier de formes sur une carte contenant des points d'emplacement. Ce script fait tout sauf tracer le polygone:

library(rgdal)
library(ggmap)

# Get shapefile with Drammen municipality borders
tmpzip<-tempfile()
tmpdir<-tempfile()
dir.create(tmpdir)
download.file("http://www.kartverket.no/Documents/Kart/N50-N5000%20Kartdata/33_N5000_shape.zip",tmpzip)
unzip(tmpzip, exdir=tmpdir)
kommune <- readOGR(dsn=tmpdir, layer="NO_AdminOmrader_pol")
kommune<-kommune[kommune$NAVN=="Drammen",]
kommune<-spTransform(kommune, CRS("+init=epsg:4326"))

# Get location point data 
subscr<-data.frame(lon=c(10.1237,10.2161,10.2993),lat=c(59.7567,59.7527,59.6863), pop=c(58,12,150))
coordinates(subscr)<-~lon+lat
proj4string(subscr)<-CRS("+init=epsg:4326")

lon <- c(10.0937,10.3293)
lat <- c(59.7916,59.6563)
map <- get_map(location = c(lon[1], lat[2], lon[2], lat[1]),
               maptype = "roadmap", source = "osm", zoom = 11)
p <- ggmap(map) +
  geom_point(data = as.data.frame(subscr), aes(x = lon, y = lat, size=pop),
             colour = "darkgreen") +
  theme_bw()
print(p)

Comment puis-je tracer le polygone à partir du fichier de formes? J'ai essayé de remplacer l'avant-dernière ligne par ce qui suit:

p <- ggmap(map) +
  geom_point(data = as.data.frame(subscr), aes(x = lon, y = lat, size=pop),
             colour = "darkgreen") +
  geom_polygon(data = as.data.frame(kommune)) +
  theme_bw()

Mais alors j'obtiens l'erreur suivante:

Error: Aesthetics must be either length 1 or the same as the data (1): x, y
matthiash
la source

Réponses:

9

as.data.frame()ne fonctionne pas pour SpatialPolgonsin geom_polygon, car la géométrie est perdue. Vous devez utiliser ggplot2::fortify(peut être obsolète à l'avenir, voir ?fortify). La manière recommandée est maintenant d'utiliser broom::tidy:

R> library("broom")
R> head(tidy(kommune))
Regions defined for each Polygons
   long   lat order  hole piece group  id
1 10.29 59.72     1 FALSE     1 153.1 153
2 10.32 59.70     2 FALSE     1 153.1 153
3 10.32 59.69     3 FALSE     1 153.1 153
4 10.31 59.68     4 FALSE     1 153.1 153
5 10.30 59.67     5 FALSE     1 153.1 153
6 10.28 59.67     6 FALSE     1 153.1 153

Mais un autre problème se pose avec votre exemple. Étant donné que le polygone est plus grand que l'étendue de la carte, il ggmapn'écrase pas correctement le polygone. ggmapdéfinit les limites de l'échelle, cela supprimera toutes les données qui ne sont pas dans ces limites.

Voici une version modifiée de votre code:

p <- ggmap(map, extent = "normal", maprange = FALSE) +
     geom_point(data = as.data.frame(subscr),
                aes(x = lon, y = lat, size=pop),
                colour = "darkgreen") +
     geom_polygon(data = fortify(kommune),
                  aes(long, lat, group = group),
                  fill = "orange", colour = "red", alpha = 0.2) +
     theme_bw() +
     coord_map(projection="mercator",
               xlim=c(attr(map, "bb")$ll.lon, attr(map, "bb")$ur.lon),
               ylim=c(attr(map, "bb")$ll.lat, attr(map, "bb")$ur.lat))

print(p)

ggmap

rcs
la source
Vous avez encore sauvé ma journée!
matthiash
2

Pour ajouter à la réponse ci-dessus: Pour ceux qui suivent leur excellent tutoriel / réponse et se demandent comment résoudre le prochain problème de découpage polygonal (comme je l'ai été!)

Voici la réponse, gracieuseté de l'utilisateur 'streamlinedmethod' sur /programming/13982773/crop-for-spatialpolygonsdataframe

library(maptools)
library(raster)   ## To convert an "Extent" object to a "SpatialPolygons" object.
library(raster)   ## To convert an "Extent" object to a "SpatialPolygons" object.
library(rgeos)
data(wrld_simpl)

# Create the clipping polygon
CP <- as(extent(130, 180, 40, 70), "SpatialPolygons")
proj4string(CP) <- CRS(proj4string(wrld_simpl))

# Clip the map
out <- gIntersection(wrld_simpl, CP, byid=TRUE)

puis lorsque vous complotez, vous n'aurez pas le problème de détourage étrange.

Kal
la source