Ich versuche, eine räumliche Verknüpfung zwischen Punktdaten und Polygondaten durchzuführen.
Ich habe Daten, die die räumlichen Koordinaten eines Ereignisses in meiner CSV-Datei A angeben, und eine andere Datei, Shapefile B, die die Grenzen eines Bereichs als Polygone enthält.
head(A)
month longitude latitude lsoa_code crime_type
1 2014-09 -1.550626 53.59740 E01007359 Anti-social behaviour
2 2014-09 -1.550626 53.59740 E01007359 Public order
3 2014-09 -1.865236 53.93678 E01010646 Anti-social behaviour
head(B@data)
code name altname
0 E05004934 Longfield, New Barn and Southfleet <NA>
1 E05000448 Lewisham Central <NA>
2 E05003149 Hawcoat <NA>
Ich möchte die Verbrechensdaten A mit meinem Shapefile B verknüpfen, um die in meinem Bereich A aufgetretenen Verbrechensereignisse abzubilden. Leider kann ich keine Attributverknüpfung durchführen, code
da sich der Code in A auf andere Einheiten als der Code in B bezieht.
Ich habe eine Reihe von Tutorials und Beiträgen gelesen, konnte aber keine Antwort finden. Ich habe es versucht:
joined = over(A, B)
und overlay
, aber habe nicht erreicht, was ich wollte.
Gibt es eine Möglichkeit, diesen Join direkt auszuführen, oder wäre eine Zwischentransformation von A in ein anderes Format erforderlich?
Konzeptionell möchte ich die Punkte von A auswählen, die in die code
Bereiche von B fallen (ähnlich wie "Verbinden basierend auf der räumlichen Position in ArcGIS").
Hatte jemand dieses Problem und löste es?
quelle
point.in.polygon()
im Paket angeschautsp
?point.in.polygon
nach, ob dies die Variablenmonth
und erhalten würdecrime_type
. Wissen Sie darüber Bescheid?point.in.poly
und schließlich diejenigen Punkte ausgewählt, die in die relevanten Polygone fallen. Vielen Dank.Antworten:
Die point.in.poly-Funktion im spaciousEco-Paket gibt ein SpatialPointsDataFrame-Objekt der Punkte zurück, die ein sp-Polygonobjekt schneiden, und fügt optional die Polygonattribute hinzu.
Fügen Sie zunächst die erforderlichen Pakete hinzu und erstellen Sie einige Beispieldaten.
Lassen Sie uns nun einen kurzen Blick auf die Daten werfen und sie plotten.
Schließlich können wir die Punkte mit den Polygonen schneiden. Das Ergebnis ist ein SpatialPointsDataFrame-Objekt mit in diesem Fall zwei zusätzlichen Attributen (PIDS, y), die in den srdf-Polygondaten enthalten waren.
Wenn die Polygondaten keine eindeutige Identifizierungsspalte enthalten, können Sie problemlos eine hinzufügen.
Sobald wir die Schnittpunkte und Polygone haben, können wir die Punkte unter Verwendung der eindeutigen Polygon-IDs aggregieren, die ein Attribut in den Polygondaten waren.
quelle
sp::point.in.polygon
Gibt tatsächlich einen numerischen Wert zurück (0 = Punkt liegt außerhalb, 1 = innerhalb, 2 = an der Kante, 3 = am Scheitelpunkt). Könnte unter bestimmten Umständen das Richtige sein. Dachte, es war hilfreich, hier zu beachten, da dies ein Top-Google-Ergebnis für verwandte Begriffe istover()
from packagesp
kann etwas verwirrend sein, funktioniert aber gut. Ich gehe davon aus, dass Sie "A" bereits räumlich gemacht haben mitcoordinates(A) <- ~longitude+latitude
:Anstelle eines Punkt-Raumobjekts erhalten Sie einfach einen Datenrahmen mit derselben Nummer. Zeilen als A und eine einzelne Variable "Code" von jedem sich überschneidenden Polygon von B.
quelle
over()
Probleme mit Punkten an den Eckpunkten der Polygone festgestellt, obwohl ich denke, dass dies die einfachste Lösung ist, die ich bisher gefunden habe.Hier ist eine Dplyr-ähnliche Lösung:
Die Bevölkerungsdaten stammen von: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates
Ich musste die Formdateien, die von heruntergeladen wurden, in geoJson konvertieren: https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page=1
Sie können dies tun, indem Sie:
quelle