2017-05-23 3 views
0

J'ai des problèmes en combinant une carte de Google Map Api, avec une carte construite avec geom_polygon de ggplot2. Quand je trace chaque carte par elle-même, rien d'étrange n'apparaît, mais quand je les combine, quelques lignes (droites) apparaissent, bousillant les limites que j'ai l'intention de mettre en évidence.Polygones en désordre lors de la combinaison google map avec Spatial Polygons

enter image description here

1) Le Im de données en utilisant pour construire les polygos avec les bordures noires provient de ce link. L'URL exacte du fichier est dans mon code ci-dessous. Parfois, il est nécessaire de décompresser le fichier manuellement, donc le code ci-dessous pour télécharger les données peuvent ne pas fonctionner:

path <- getwd() 
fileName <- "R05.zip" 
if (!file.exists(fileName)) { 
    urlFile = "http://www.censo2017.cl/wp-content/uploads/2016/12/R05.zip" 
      download(urlFile, dest = "./R05.zip", mode ="wb") 
} 
if (!dir.exists("./R05")) { 
    unzip("R05.zip") 
} 

2) Ensuite, je charge le fichier de forme avec laquelle construire les polygones je vais.

distritos <- readOGR(dsn= paste(getwd(), "/R05", sep = ""), 
        layer="Distritos_Censales", 
        encoding = "UTF-8", stringsAsFactors = FALSE) 

3) et sélectionnez la division administrative je suis intéressé par

distritos <- distritos[[email protected]$DESC_COMUN=="QUILPUÉ", ] 

4) Et puis les districts (polygones) je suis intéressé par:

distritos <- distritos[[email protected]$DESC_DISTR=="EL RETIRO" | 
          [email protected]$DESC_DISTR=="BELLOTO NORTE" | 
          [email protected]$DESC_DISTR=="VALENCIA" | 
          [email protected]$DESC_DISTR=="MENA" | 
          [email protected]$DESC_DISTR=="BELLOTO SUR" | 
          [email protected]$DESC_DISTR=="ALTO QUILPUÉ" | 
          [email protected]$DESC_DISTR=="EL SAUCE", ] 

5) Construire la carte de base à partir des limites de distritos. Pour cela, utiliser la fonction pour obtenir le centre d'une carte de this StackOverflow question

bbox(distritos) 
MapCenter <- function(x1, y1, x2, y2){ 
    center.x <- x1 + ((x2 - x1)/2) 
    center.y <- y1 + ((y2 - y1)/2) 
    center <- c(center.x, center.y) 
    center 
} 
mcdistritos <- MapCenter(bbox(distritos)[1,1], bbox(distritos)[2,1], 
bbox(distritos)[1,2], bbox(distritos)[2,2]) 
basemap <- get_googlemap(mcdistritos, zoom = 13, 
          maptype = "roadmap", 
          color = "bw", 
          style = "feature:administrative|element:labels|visibility:off") 
basemap <- ggmap(basemap , extent = "device") 

6) préparer les données shapefile à elle tracer avec ggplot2

distritos.fort <- fortify(distritos, region = "DESC_DISTR") 

7) Plot ensemble les deux cartes

basemap + 
geom_polygon(data = distritos.fort, 
        aes(x = long, y = lat), 
         colour = "black", 
          fill = NA) + coord_map() 

J'ai essayé en effectuant un zoom sur la carte de base, dans le cas où les limites du polygone ont été foiré parce qu'ils n'allez pas en forme dans la base carte, mais j'ai obtenu le même résultat, juste une carte plus petite. Est-ce que quelqu'un sait comment le réparer?

+1

Juste une suggestion, vous pouvez remplacer 'distritos @ données $ DESC_DISTR ==" EL RETIRO "| distritos @ données $ DESC_DISTR == "BELLOTO NORTE" | distritos @ données $ DESC_DISTR == "VALENCIA" | distritos @ data $ DESC_DISTR == "MENA" | ... 'avec quelque chose de beaucoup plus court, comme' disitros @ données $ DESC_DISTR% in% c ("EL RETIRO", "BELLOTO NORTE", "VALENCIA", "MENA" , ...) ' – Gregor

Répondre

2

Vous devez ajouter un mappage de groupe à votre esthétique. par exemple.

geom_polygon(data = distritos.fort, 
        aes(x = long, y = lat, group = group), 
         colour = "black", 
          fill = NA) + coord_map() 

Au moment où vous avez un chemin continu. L'esthétique du groupe sépare vos données en différents polygones.

Je n'ai pas pu extraire vos données, donc je ne connais pas le mappage exact dont vous avez besoin pour le groupe. Mais en regardant l'autre fortifier exemples & documentation, je crois que c'est group = group

+0

Merci Jeremy !, bien que l'argument de groupe devrait être dans le' aes'parenthesis;) 'basemap + geom_polygon (données = distritos.fort, aes (x = long, y = lat, groupe = groupe) , color = "noir", fill = NA) + coord_map() 'fonctionne comme un charme. – csmontt

+0

Vous avez raison, c'était mon intention! Ma faute. - Corrigée –