Verbinden Sie räumliche Punktdaten mit mehreren Polygondaten mit R.

8

Ich möchte eine räumliche Verknüpfung mit SpatialPolygonsDataFrame und SpatialPointsDataFrame herstellen.

Erhalten Sie nur Einpunktdaten innerhalb mehrerer Polygone unter dem Code.

sp::over(meuse, srdf)

Einige Punktdaten in mehrere Polygone. Ich möchte Punktedaten erhalten, alle Polygondaten behalten.

Zum Beispiel: Punkt A innerhalb des Polygons a und b.

jetzt kann bekommen:

| point | polygon |
-------------------
| A     | a       |

Ich werde so:

| point | polygon |
-------------------
| A     | a       |
| A     | b       |

Daten verwenden:

    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')
    sr5=Polygons(list(Polygon(cbind(c(179500, 180000, 180000, 179500),
                                    c(331000, 331000, 331500, 331500)))), '5')
    sr=SpatialPolygons(list(sr1,sr2,sr3,sr4, sr5))
    srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4', '5'), PIDS=1:5, y=runif(5)))
ogw
quelle

Antworten:

5

Die st_joinFunktion im sfPaket ( Entwicklungsversion ) bietet eine einfache und intuitive Lösung. Der räumliche Join wird als zurückgegeben data.frame, und Sie können ihn problemlos wieder konvertieren Spatial*.

# Convert to sf-objects
srdf.sf <- st_as_sf(srdf)
meuse.sf <- st_as_sf(meuse)

# Keep all "meuse.sf", sort by row.names(meuse.sf). Default overlay is "intersects".
meuse_srdf <- st_join(meuse.sf, srdf.sf) 

# Keeps all "srdf.sf", sort by row.names(srdf.sf)
srdf_meuse <- st_join(srdf.sf, meuse.sf)

# Convert back to Spatial*
meuse_srdf <- as(meuse_srdf, "Spatial")
srdf_meuse <- as(srdf_meuse, "Spatial")

BEARBEITEN:

st_joinist jetzt in der CRAN- Version von sf, wie bereits von SymbolixAU hervorgehoben.

eivindhammers
quelle
1
st_joinist jetzt in der veröffentlichten CRAN-Version
SymbolixAU
4

Verwenden over(meuse, srdf, returnList=TRUE)

 if ‘returnList’ is TRUE, a list of length
 ‘length(x), with list element ‘i’ the vector of all indices of
 the geometries in ‘y’ that correspond to the $i$-th geometry in
 ‘x’.

Der erste Punkt überlagert ein Polygon, der 135. Punkt überlagert zwei:

> rr = over(meuse,srdf,returnList=TRUE)
> rr[[1]]
  PIDS         y
1    1 0.2069365
> rr[[135]]
  PIDS          y
2    2 0.34809708
5    5 0.08942346

Hinweis: Wenn Sie nur die überlagerten Polygonindizes und nicht alle Attribute möchten, konvertieren Sie einfach die Polygone in SpatialPolygons und Sie erhalten eine Liste mit Indexnummern anstelle von Datenrahmen mit allen Attributen in:

> rr = over(meuse,as(srdf,"SpatialPolygons"),returnList=TRUE)
> rr[[1]]
[1] 1
> rr[[135]]
[1] 2 5
Spacedman
quelle
0

Ich kann data.frame unter dem Code erhalten:

library(tidyverse)
sp::over(meuse, srdf, returnList=TRUE) %>%
plyr::ldply(., data.frame) -> tmp

Es ist eine automatisch hinzugefügte .idSpalte.
Wenn Sie gefilterte oder bearbeitete Maissdaten erhalten, gehen Sie unter dem Code vor.

use_id <- 
  tmp %>% select(`.id`) %>% unlist(., use.names = F)
rownames(meuse) %in% use_id
ogw
quelle