2017-08-14 2 views
1

Ich habe versucht, eine Karte erstellen zeigen, wie viele municipals sind Sie weg von Krakau: How many municipals away are you from KrakowR: Zählen, wie viele Polygone zwischen zwei

und die Stadt von Krakau nach Breslau zu ändern. Die Karte wurde in GIMP getan.

bekam ich eine Shape-Datei (hier erhältlich: http://www.gis-support.pl/downloads/powiaty.zip). Ich las die Shape-Datei Dokumentationspakete wie maptools, rgdal oder sf, aber ich konnte nicht eine automatische Funktion, die sie zählen, weil ich das nicht manuell tun möchte.

Gibt es eine Funktion, das zu tun?

Credits: Diese Karte wird von Hubert Szotek auf https://www.facebook.com/groups/mapawka/permalink/1850973851886654/

Antwort

4

Ich bin nicht, dass bei der Netzwerkanalyse erfahren, so muß ich gestehen, nicht jede einzelne Zeile Code zu verstehen, wie folgt durchgeführt wurde. Aber es funktioniert! Eine Menge des Materials wurde von hier angepasst: https://cran.r-project.org/web/packages/spdep/vignettes/nb_igraph.html

Das sind die endgültigen Ergebnisse ist:

enter image description here

-Code

# Load packages 
library(raster) # loads shapefile 
library(igraph) # build network 
library(spdep) # builds network 
library(RColorBrewer) # for plot colour palette 
library(ggplot2) # plots results 

# Load Data 
powiaty <- shapefile("powiaty/powiaty") 

Zunächst wird die poly2nb Funktion wird verwendet, den Nachbarregionen zu berechnen:

# Find neighbouring areas 
nb_q <- poly2nb(powiaty) 

Dies schafft unser räumliches Gitter, die wir hier sehen können:

# Plot original results 
coords <- coordinates(powiaty) 
plot(powiaty) 
plot(nb_q, coords, col="grey", add = TRUE) 

enter image description here

Dies ist das Bit, wo ich nicht 100% sicher bin, was geschieht. Grundsätzlich ist es Ausarbeiten den kürzesten Abstand zwischen allen Shape-Dateien in dem Netzwerk, und liefert eine Matrix dieser Paare.

# Sparse matrix 
nb_B <- nb2listw(nb_q, style="B", zero.policy=TRUE) 
B <- as(nb_B, "symmetricMatrix") 

# Calculate shortest distance 
g1 <- graph.adjacency(B, mode="undirected") 
dg1 <- diameter(g1) 
sp_mat <- shortest.paths(g1) 

Nachdem die Berechnungen können die Daten nun in Plotten Format zu bekommen gemacht werden formatiert, so ist die kürzeste Weg Matrix mit dem räumlichen Datenrahmen verschmolzen.

Ich war nicht sicher, was am besten als ID für die Bezugnahme auf Datensätze verwenden würde, also wählte ich die Variable.

# Name used to identify data 
referenceCol <- powiaty$jpt_kod_je 

# Rename spatial matrix 
sp_mat2 <- as.data.frame(sp_mat) 
sp_mat2$id <- rownames([email protected]) 
names(sp_mat2) <- paste0("Ref", referenceCol) 

# Add distance to shapefile data 
[email protected] <- cbind([email protected], sp_mat2) 
[email protected]$id <- rownames([email protected]) 

Die Daten sind jetzt in einem geeigneten Format zur Anzeige. die Grundfunktion spplot verwenden, können wir ganz schnell eine Grafik erhalten:

displaylayer <- "Ref1261" # id for Krakow 

# Plot the results as a basic spplot 
spplot(powiaty, displaylayer) 

Ich ziehe ggplot zum Plotten komplexes Diagramme, wie Sie das Styling leichter kontrollieren können. Allerdings ist es ein bisschen wählerisch, wie die Daten in sie eingespeist wird, so müssen wir die Daten für sie neu zu formatieren, bevor wir die Graphen bauen:

# Or if you want to do it in ggplot 

filtered <- data.frame(id = sp_mat2[,ncol(sp_mat2)], dist = sp_mat2[[displaylayer]]) 
ggplot_powiaty$dist == 0 

ggplot_powiaty <- powiaty %>% fortify() 
ggplot_powiaty <- merge(x = ggplot_powiaty, y = filtered, by = "id") 
names(ggplot_powiaty) 

und die Handlung. Ich habe es ein wenig angepasst, indem ich nicht benötigte Elemente entfernt und einen Hintergrund hinzugefügt habe.Um die Region in der Mitte der Suche schwarz zu machen, unterteile ich die Daten mit ggplot_powiaty[ggplot_powiaty$dist == 0, ] und zeichne sie dann als ein anderes Polygon.

ggplot(ggplot_powiaty, aes(x = long, y = lat, group = group, fill = dist)) + 
    geom_polygon(colour = "black") + 
    geom_polygon(data =ggplot_powiaty[ggplot_powiaty$dist == 0, ], 
       fill = "grey60") + 
    labs(title = "Distance of Counties from Krakow", caption = "Mikey Harper") + 
    scale_fill_gradient2(low = "#d73027", mid = "#fee08b", high = "#1a9850", midpoint = 10) + 
    theme(
    axis.line = element_blank(), 
    axis.text.x = element_blank(), 
    axis.text.y = element_blank(), 
    axis.ticks = element_blank(), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(), 
    panel.grid.minor = element_blank(), 
    panel.grid.major = element_blank(), 
    plot.background = element_rect(fill = "#f5f5f2", color = NA), 
    panel.background = element_rect(fill = "#f5f5f2", color = NA), 
    legend.background = element_rect(fill = "#f5f5f2", color = NA), 
    panel.border = element_blank()) 

enter image description here

für Wrocław zu zeichnen, wie an der Spitze der Post gezeigt, nur displaylayer <- "Ref0264" ändern und den Titel aktualisieren.

+0

WOW! das ist super Arbeit! Ich werde es analysieren und hoffentlich verstehen! –

Verwandte Themen