Uzamsal nokta verilerini R'deki çokgenlere birleştirin


21

Nokta verileri ve çokgen verileri arasında uzamsal birleştirme gerçekleştirmek için çalışıyorum.

Benim csv dosya A bir olayın uzamsal koordinatlarını gösteren veri var ve çokgen olarak bir alanın sınırlarını içeren başka bir dosya, şekil dosyası B var.

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>

Alanım A'da meydana gelen suç olaylarını eşlemek için suç verisi A'yı şekil dosyam B'ye katmak istiyorum code.

Birkaç öğretici ve gönderi okudum ama bir cevap bulamadım. Denedim:

joined = over(A, B)

ve overlayistediğimi yapamadım.

Bu birleşimi doğrudan yapmanın bir yolu var mı yoksa A'dan başka bir formata ara dönüşüm gerekli mi?

Kavramsal olarak A'nın codeB alanlarına giren noktalarını seçmek istiyorum ("ArcGIS'deki uzamsal konuma dayalı olarak katılmaya benzer").

Birisi bu sorunu yaşadı ve çözdü mü?


point.in.polygon()Pakete baktınız mı sp?

@ arvi1000 Bunu tekrar deneyeceğim. Benim düşünce hakkında point.in.polygonbu değişkenleri korumak etkisi olup olmadığıdır monthve crime_type. Bunu biliyor musun?
ben_aaron

Biraz daha denedim point.in.polyve nihayet ilgili çokgenlere düşen noktaları seçtim . Teşekkürler.
ben_aaron

O zaman belki kendi sorunuzu çözümünüzle cevaplamalısınız. Unutmayın, iyi yanıtlar bu sitenin tümüyle ilgilidir.
SlowLearner

Yanıtlar:


8

SpatialEco paketindeki point.in.poly işlevi, bir sp çokgen nesnesiyle kesişen noktaların bir SpatialPointsDataFrame nesnesini döndürür ve isteğe bağlı olarak çokgen niteliklerini ekler.

Önce gerekli paketleri ekleyelim ve bazı örnek veriler oluşturalım.

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)))

Şimdi verilere hızlıca göz atalım ve bunları çizelim.

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

Son olarak, noktaları çokgenlerle kesebiliriz. Sonuçlar, bu durumda, srdf çokgen verilerinde bulunan iki ekstra özniteliğe (PIDS, y) sahip bir SpatialPointsDataFrame nesnesi olacaktır.

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

Çokgen verilerinde benzersiz bir tanımlama sütunu yoksa kolayca bir tane ekleyebilirsiniz.

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

Noktalar ve çokgenler kesiştiğinde, çokgen verilerinde bir özellik olan benzersiz çokgen kimliklerini kullanarak noktaları birleştirebiliriz.

# 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, evet ama sp :: point.in.polygon bir mantık üretir. SpatialEco: point.in.poly, over için bir sarıcıdır, ancak sp SpatialPointsDataFrame öğesini döndürür ve raster: intersect'in rgeos :: gIntersect için yaptığı gibi çokgen nitelikleriyle ilgili bazı adımları kısayollar.
Jeffrey Evans

sp::point.in.polygonaslında sayısal bir değer döndürür (0 = nokta dışarıda, 1 = içeride, 2 = kenarda, 3 = tepe noktasında). Bazı durumlar için doğru şey olabilir. Bu, ilgili terimler için en iyi bir google sonucu olduğu için buraya not etmek yararlı olduğunu düşündüm
arvi1000

27

over()paketinden spbiraz kafa karıştırıcı olabilir ama iyi çalışıyor. Zaten "A" ile mekansal yaptığınızı varsayıyorum coordinates(A) <- ~longitude+latitude:

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

Bir nokta uzamsal nesne yerine, bu size aynı no ile bir veri çerçevesi verir. A olarak satırlar ve B'den kesişen her bir çokgenden tek değişkenli bir "kod"

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

Ben over()şimdiye kadar bulduğum en kolay çözüm olduğunu düşünüyorum rağmen, çokgenlerin köşelerinde noktaları ile ilgili sorunlar var.
JMT2080AD

Ne gibi sorunlar yaşadın?
Simbamangu

Dışlama. Daha fazla araştırmam gerekiyor. Bugün size daha sonra bazı veriler sunacağım ve eğer ilgilenirseniz birlikte bakabiliriz. Yanılıyor olabilirim, ancak algoritmada en azından verilerim için ilgilenilmesi gereken bazı dejenerasyonlar olduğundan eminim.
JMT2080AD

Boşver. Verilerimle ilgili bir şey olmalı. Bu deney seti iyi çalışıyor. r-fiddle.org/#/fiddle?id=m5sTjE4N&version=1
JMT2080AD

1
Bu, kabul edilen yanıttan çok daha basit bir yaklaşımdır ve rgdal dışında ek paketlerin kurulmasını gerektirmez.
Bryce Frank

0

İşte dplyr benzeri bir çözüm:

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"))

Nüfus verileri: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates

İndirilen şekil dosyalarını geoJson'a dönüştürmek zorunda kaldım: https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page=1

Bunu şu şekilde yapabilirsiniz:

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.