Próbuję wykonać połączenie przestrzenne między danymi punktów i danymi wielokąta.
Mam dane wskazujące współrzędne przestrzenne zdarzenia w moim pliku csv A i mam inny plik, plik kształtu B, który zawiera granice obszaru jako wielokąty.
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>
Chcę dołączyć dane przestępstwa A do mojego pliku kształtu B, aby zmapować zdarzenia przestępcze, które mają miejsce w mojej okolicy A. Niestety nie mogę wykonać łączenia atrybutów, code
ponieważ kod w A odnosi się do innych jednostek niż kod w B.
Przeczytałem wiele samouczków i postów, ale nie mogłem znaleźć odpowiedzi. Próbowałem:
joined = over(A, B)
i overlay
, ale nie osiągnąłem tego, co chciałem.
Czy istnieje sposób na wykonanie tego połączenia bezpośrednio, czy też potrzebna byłaby przejściowa transformacja z A do innego formatu?
Koncepcyjnie chcę wybrać te punkty A, które mieszczą się w code
obszarach B (podobne do „łączenia na podstawie położenia przestrzennego w ArcGIS”).
Czy ktoś miał ten problem i go rozwiązał?
źródło
point.in.polygon()
w paczcesp
?point.in.polygon
tym, czy to pozwoli zachować zmiennemonth
icrime_type
. Czy wiesz o tym?point.in.poly
i ostatecznie wybrałem te punkty, które pasują do odpowiednich wielokątów. Dzięki.Odpowiedzi:
Funkcja point.in.poly w pakiecie spatialEco zwraca obiekt SpatialPointsDataFrame punktów, które przecinają obiekt wielokąta sp i opcjonalnie dodaje atrybuty wielokąta.
Najpierw dodajmy wymagane pakiety i utwórz przykładowe dane.
Teraz rzućmy okiem na dane i wykreślmy je.
Na koniec możemy przecinać punkty wielokątami. Wynikiem będzie obiekt SpatialPointsDataFrame z dwoma dodatkowymi atrybutami (PIDS, y) zawartymi w danych wielokąta srdf.
Jeśli w danych wielokąta nie ma unikalnej kolumny identyfikacyjnej, można ją łatwo dodać.
Po przecięciu punktów i wielokątów możemy agregować punkty przy użyciu unikalnych identyfikatorów wielokątów, które były atrybutem w danych wielokąta.
źródło
sp::point.in.polygon
faktycznie zwraca wartość liczbową (0 = punkt jest na zewnątrz, 1 = wewnątrz, 2 = na krawędzi, 3 = na wierzchołku). Może być właściwa w niektórych okolicznościach. Pomyślałem, że warto tutaj odnotować, ponieważ jest to najlepszy wynik w Google dla pokrewnych terminówover()
z pakietusp
może być trochę mylące, ale działa dobrze. Zakładam, że masz już przestrzenne „A” zcoordinates(A) <- ~longitude+latitude
:Zamiast punktowego obiektu przestrzennego daje to po prostu ramkę danych o tym samym numerze. wiersze jako A i pojedynczy zmienny „kod” z każdego przecinającego się wielokąta z B.
źródło
over()
mam problemy z punktami na wierzchołkach wielokątów, chociaż myślę, że jest to najłatwiejsze rozwiązanie, jakie do tej pory znalazłem.Oto rozwiązanie podobne do dplyr:
Dane dotyczące populacji pochodzą z: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates
Musiałem przekonwertować pliki kształtów pobrane z geoJson: https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies- grudnia 2018-uk-bgc/data?page=1
Możesz to zrobić przez:
źródło