Приєднайте дані просторових точок до полігонів у R


21

Я намагаюся виконати просторове з'єднання між точковими даними та даними багатокутника.

У мене є дані, які вказують на просторові координати події у моєму файлі csv A і мають ще один файл, форм-файл B, який містить межі області у вигляді полігонів.

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>

Я хочу приєднати дані злочину A до мого формату B, щоб відобразити події злочину, які трапляються в моїй місцевості А. На жаль, я не можу виконати приєднання атрибутів, заснований на codeтому, що код у А відноситься до інших одиниць, ніж код у Б.

Я прочитав ряд навчальних посібників і дописів, але не зміг знайти відповіді. Я намагався:

joined = over(A, B)

і overlay, але не здійснив того, чого я хотів.

Чи є спосіб зробити це з'єднання безпосередньо або потрібне проміжне перетворення з формату A в інший формат?

Концептуально я хочу виділити ті точки А, які потрапляють в codeобласті B (подібно до "з'єднання на основі просторового розташування в ArcGIS").

Хтось мав це питання і вирішив його?


Ви дивились point.in.polygon()у пакеті sp?

@ arvi1000 У мене є, і я спробую це ще раз. Моя думка про point.in.polygonте, чи збереже це змінні monthта crime_type. Ви знаєте про це?
ben_aaron

Я спробував трохи більше point.in.polyі, нарешті, вибрав ті точки, які потрапляють у відповідні багатокутники. Спасибі.
ben_aaron

Тоді, можливо, вам слід відповісти на власне питання своїм рішенням. Пам'ятайте, хороші відповіді - про що йдеться на цьому сайті.
SlowLearner

Відповіді:


8

Функція point.in.poly в пакеті prostEco повертає об'єкт SpatialPointsDataFrame з точок, які перетинають об'єкт багатокутника sp, і необов'язково додає атрибути полігона.

Спочатку давайте додавати необхідні пакети та створювати деякі приклади даних.

require(spatialEco)
require(sp)
data(meuse)
coordinates(meuse) = ~x+y
sr1=Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409,
  180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676,
  332618, 332413, 332349)))),'1')
sr2=Polygons(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437,
  179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683,
  331133, 331623, 332152, 332357, 332373)))),'2')
sr3=Polygons(list(Polygon(cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875,
  179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110),
  c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004,
  329783, 329665, 329720, 329933, 330478, 331062, 331086)))),'3')
sr4=Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304),
  c(332791, 333204, 333635, 333058, 332791)))),'4')
sr=SpatialPolygons(list(sr1,sr2,sr3,sr4))
srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4'), PIDS=1:4, y=runif(4)))

Тепер давайте швидко оглянемо дані та побудуємо їх.

head(srdf@data)  # polygons
head(meuse@data) # points
plot(srdf)
points(meuse, pch=20)

Нарешті, ми можемо перетинати точки з багатокутниками. Результати стануть об’єктом SpatialPointsDataFrame з, у цьому випадку, двома додатковими атрибутами (PIDS, y), які містилися в даних полігону srdf.

  pts.poly <- point.in.poly(meuse, srdf)
    head(pts.poly@data)

Якщо в даних багатокутника немає унікального стовпчика ідентифікації, ви можете легко додати його.

srdf@data$poly.ids <- 1:nrow(srdf) 

Після того, як точки та полігони перетинаються, ми можемо об’єднати точки, використовуючи унікальні ідентифікатори багатокутника, які були атрибутом у даних полігона.

# Number of points in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=length)

# Mean lead in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=mean)

@ arvi1000, так, але sp :: point.in.polygon створює логіку. SpaceEco: point.in.poly є обгорткою для понад, але повертає sp SpatialPointsDataFrame та ярлики деяких кроків у відношенні атрибутів полігону, подібно до растрових: intersect робить для rgeos :: gIntersect.
Джефрі Еванс

sp::point.in.polygonнасправді повертає числове значення (0 = точка знаходиться зовні, 1 = всередині, 2 = на краю, 3 = на вершині). Може бути правильним для деяких обставин. Думаю, що це було б корисно зазначити, оскільки це найкращий результат google для відповідних термінів
arvi1000

27

over()від пакета spможе бути трохи заплутаним, але працює добре. Я припускаю, що ви вже зробили просторовий "А" за допомогою coordinates(A) <- ~longitude+latitude:

# Overlay points and extract just the code column: 
a.data <- over(A, B[,"code"])

Замість точкового просторового об’єкта, це просто дає вам кадр даних, з тим самим "ні". рядки як A, і єдиний змінний "код" з кожного пересічного багатокутника від B.

# Add that data back to A:
A$bcode <- a.data$code

У мене було виявлено over()проблеми з точками у вершинах багатокутників, хоча я вважаю, що це найпростіше рішення, яке я знайшов поки що.
JMT2080AD

Які проблеми у вас виникли?
Simbamangu

Виключення. Мені потрібно це дослідити далі. Пізніше сьогодні я вам ознайомлюсь із деякими даними, і ми зможемо переглянути їх разом, якщо зацікавлено. Я можу помилятися, але я впевнений, що в алгоритмі є деякі породження, про які потрібно подбати, принаймні для моїх даних.
JMT2080AD

Не зважай. Це має бути щось із моїми даними. Цей експериментальний набір чудово працює. r-fiddle.org/#/fiddle?id=m5sTjE4N&version=1
JMT2080AD

1
Це набагато простіший підхід, ніж прийнята відповідь, і не вимагає встановлення додаткових пакетів, крім rgdal.
Брайс Френк

0

Ось таке рішення, як dplyr:

library(spdplyr)

ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
pop <- read_excel("data/SAPE20DT7-mid-2017-parlicon-syoa-estimates-unformatted.xls",sheet = "data")
pop <- janitor::clean_names(pop)

ukcounties_pop <- ukcounties %>% inner_join(pop, by = c("pcon18nm" = "pcon11nm"))

Дані про населення походять з: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/par парламентарноїконституціїmidyearpopulationenestimates

Мені довелося конвертувати файли форм, завантажені з geoJson: https://geoportal.statistics.gov.uk/datasets/westminster-par парламентарних конституцій- декабря-2018-uk-bgc/data?page=1

Це можна зробити:

uk_constituencies <- readOGR("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC.shp")
uk_constituencies # this is in tmerc format. we need to convert it to WGS84 required by geoJson format.

# First Convert to Longitude / Latitude with WGS84 Coordinate System
wgs84 = '+proj=longlat +datum=WGS84'
uk_constituencies_trans <- spTransform(uk_constituencies, CRS(wgs84))

# Convert from Spatial Dataframe to GeoJSON
uk_constituencies_json <- geojson_json(uk_constituencies_trans)

# Save as GeoJSON file on the file system.
geojson_write(uk_constituencies_json, file = "data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson")

#read back in:
ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.