Ich habe ein Shapefile von der Ordnance Survey heruntergeladen, das die Grenzen der Wahlbezirke (Abteilungen) für eine Grafschaft des Vereinigten Königreichs angibt. Ich habe erfolgreich R verwendet, um das Shapefile zu laden, und verschiedene Maps mit ggplot2
der in dieser Frage beschriebenen Methode gezeichnet . Es funktioniert alles ziemlich gut.
Jetzt möchte ich ein neues Polygon mit einer beliebigen Form erstellen, es der Karte hinzufügen und dann die Bevölkerung in dem Bereich berechnen, der unter der Form liegt und möglicherweise mehrere Bereiche abdeckt oder teilweise abdeckt. Ich habe die Bevölkerung für jede Wahlabteilung und kann vereinfachend davon ausgehen, dass die Bevölkerung in jeder Gemeinde gleichmäßig verteilt ist. Das legt die folgenden Schritte nahe.
1) Überlagern Sie eine neue Form auf der Karte, die teilweise mehrere Wahlkreise abdeckt. Nehmen wir an, es gibt 3 Abteilungen, um das Argument zu verdeutlichen. Es würde ungefähr so aussehen. [Bearbeiten: außer dass im Bild unter der Form 5 Unterteilungen statt 3 überspannt]
2) Berechnen Sie den Prozentsatz der Fläche jeder dieser drei Unterteilungen, die sich mit dem überlagerten Polygon schneidet.
3) Schätzen Sie die Bevölkerung, indem Sie den Prozentsatz der Fläche jeder Abteilung ermitteln, die von der überlagerten Form bedeckt ist, und diesen Prozentsatz mit der Bevölkerung jeder Abteilung multiplizieren.
Ich denke, ich kann wahrscheinlich herausfinden, wie das Polygon erstellt und auf der Karte überlagert wird, dh es wird dem vorhandenen Datenrahmen hinzugefügt, wobei die nützliche Antwort auf diese und andere Fragen verwendet wird. Das bisschen, das mich beunruhigt, ist die Aufgabe, den Prozentsatz jeder Abteilung zu berechnen, die von der überlagerten Form abgedeckt wird. Die Spalten lat
und long
im Datenrahmen sind die seltsamen OpenData-Zahlen von Ordnance Survey (Eastings und Northings oder so).
Meine erste Frage lautet also: Wie würde ich den Bereich (oder eine Teilmenge des Bereichs) der Polygone, die die Grenzen einer Wahldivision definieren, anhand dieser Daten ermitteln? Da selbst eine bedeutende Teilmenge dieses dput
Datenrahmens groß ist, habe ich eine 500-KB-Datei erstellt ( die hier kopiert und eingefügt oder heruntergeladen werden kann ), anstatt sie in dieser Frage zu veröffentlichen. Die Karte, die die Basis für das obige Bild bildet, wurde wie folgt erstellt:
require(ggplot2)
ggplot(smalldf, aes(x = long, y = lat, group = group)) +
geom_polygon(colour = "grey50", size = 1, aes(fill = smalldf$bin))
Meine zweite Frage ist: verwende ich die richtigen Werkzeuge? Derzeit benutze ich readShapePoly
aus dem maptools
Paket, um das Shapefile zu lesen. Anschließend fortify
erstelle ich einen Datenrahmen mit ca. 130.000 Zeilen, der für die Verwendung in geeignet ist ggplot
. Vielleicht sollte ich ein anderes Paket verwenden, wenn es eines mit nützlichen Werkzeugen für solche Prozesse gibt?
library(scales)
muss hinzugefügt werden, damit die Transparenz funktioniert.require(scales)
Anruf, der den Trick macht.Verwenden Sie nicht readShapePoly - es ignoriert die Projektionsspezifikation. Verwenden Sie readOGR aus dem sp-Paket.
Überprüfen Sie für geografische Operationen wie Ihre Polygonüberlagerung das Rgeos-Paket.
Buchstäblich das Letzte, was Sie tun sollten, ist mit Festung und Verschwörung zu spielen. Bewahren Sie Ihre Daten in sp-class-Objekten auf, zeichnen Sie sie mit Basisgrafiken und lassen Sie den ggplot-Zucker bis zum Ende eines Projekts, und Sie benötigen einige hübsche Plots.
quelle
rgeos
. Ich habe anhand Ihres Beispiels in der verknüpften Antwort eine Zusammenstellung von Polygonen erstellt, kann jedoch nicht herausfinden, wie einem vorhandenen räumlichen Datenrahmen ein neues Polygon hinzugefügt werden kann. Ich habe ein bisschen an der@data
Syntax herumgespielt, aber nichts erreicht. Hast du irgendwelche Tipps?cbind(part1,part2)
wenn sie eindeutige Polygon-IDs aufweisen. Andernfalls erhalten Sie eine Warnung und müssen diese verwendenspChFIDs
, um eindeutige Polygon-Feature-IDs zuzuweisen.