2017-09-10 9 views
0

J'essaie actuellement de créer une carte de flux dans la brochure de R pour mapper le mouvement de quelque chose d'une zone (polygone) à une autre.Lignes spatiales dérivées pointant vers des polygones incorrects

library(sp) 
library(rgdal) 
library(tidyverse) 
library(leaflet) 

J'utilise this shapefile des collectivités locales (LA) en Angleterre pour les polygones, et je dériver les lignes coordonnées de celles-ci.

Map <- readOGR(dsn = "Map", layer = "LEA_Boundaries") 
Map <- Map[!is.na(Map$lad16cd),] 

Je suis désireux de créer des lignes du centre d'un polygone à un autre, donc j'utilisé les polygones d'origine et de destination latitude et la longitude (s) afin d'obtenir le point de départ et à la fin de ma ligne. Je l'ai fait en échantillonnant les noms LA à partir de la fente de données de la carte, puis en les échantillonnant à nouveau pour créer mes LA de début et de fin, puis en fusionnant les coordonnées du LA de départ, suivies par les coordonnées de la LA de fin:

StartingLA <- sample([email protected]$lad16nm, 100000, replace = TRUE) 
NextLA <- sample(StartingLA, 100000, replace = TRUE) 
Movement <- data.frame(StartingLA, NextLA) 
LD <- merge(Movement, [email protected][,c("lad16nm", "long", "lat")], by.x = "StartingLA", by.y = "lad16nm") %>% 
     merge([email protected][,c("lad16nm", "long", "lat")], by.x = "NextLA", by.y = "lad16nm", suffixes = c("",".y")) 

Après cela, je l'ai essayé deux façons différentes de créer des lignes spatiales, on était une fonction personnalisée pour ajouter une ligne de Bézier, et l'autre était gcIntermediate(), que je vais utiliser ici un il est plus accessible et des règles sur la programmation erreurs dans la fonction.

flow <- gcIntermediate(LD[,c("long", "lat")], LD[,c("long.y", "lat.y")], sp = TRUE, addStartEnd = TRUE) 

Et maintenant pour la carte elle-même; nous allons ajouter des étiquettes popup aux polygones afin que nous puissions voir quelles sont les LA qui sont.

leaflet() %>% 
    addProviderTiles(providers$CartoDB.PositronNoLabels) %>% 
    addPolygons(data = Map, weight = 1, col = "#000000", fillOpacity = 0, popup = [email protected]$lad16nm) %>% 
    addPolylines(data = flow) 

Et nous allons jeter un coup d'œil les données qui a été utilisé pour créer la ligne.

LD 

Sur ma carte, j'ai maintenant une ligne bleue reliant un polygone à l'autre. Cependant pour le StartingLA en LD, j'ai 'Sussex de l'Est', et le NextLA est 'Hillingdon', mais la ligne pointe de/vers Birmingham et Wandsworth. Cela a également été vrai en utilisant ma fonction personnalisée pour ajuster les lignes de Bézier, ce qui me fait penser que cela pourrait être quelque chose qui est arrivé avant, mais toutes les données sont correctes jusqu'à ce que les lignes soient faites en lignes Spatial, et après cela tout va mal.

Est-ce que quelqu'un a un aperçu de l'endroit où je me trompe ici?

Merci.

Répondre

1

Les coordonnées de l'objet Map @ Data ne sont pas adaptées à votre cas d'utilisation. Par exemple, Greenwich, par exemple, a les coordonnées -1.108940, 53.52697, qui est fermement située à Doncaster. Peut-être qu'au cours d'une étape de traitement antérieure, les coordonnées et les identifiants ont-ils été inégalés?

Dans tous les cas, il est probablement plus rapide/plus facile maintenant de recalculer les coordonnées à l'aide à l'aide rgeos::gCentroid sur l'objet de la carte, puis remplacer les colonnes incriminées dans le fichier de données:

rgeos::gCentroid(Map,byid = T)