关于 r: 等效于 `poly.counts` 以使用 sf 包计算落在多边形内的纬度/经度对

Equivalent of `poly.counts` to count lat/long pairs falling inside of polygons with the sf package

sf 包提供了一种处理地理特征的好方法,但我无法找到与 GISTools 包中需要 sp 对象的 poly.counts 函数等效的简单方法。

poly.counts 计算来自 SpatialPointsDataFrame 的点的数量落在 SpatialPolygonsDataFrame 的多边形内,可以按如下方式使用:

数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## Libraries
library("GISTools")
library("tidyverse")
library("sf")
library("sp")
library("rgdal")
## Obtain shapefiles
download.file(url ="https://www2.census.gov/geo/tiger/TIGER2016/STATE/tl_2016_us_state.zip", destfile ="data-raw/states.zip")
unzip(zipfile ="data-raw/states.zip", exdir ="data-raw/states")
sf_us_states <- read_sf("data-raw/states")

## Our observations:
observations_tibble <- tribble(
  ~lat, ~long,
31.968599,  -99.901813,
35.263266,  -80.854385,
35.149534,  -90.04898,
41.897547,  -84.037166,
34.596759,  -86.965563,
42.652579,  -73.756232,
43.670406,  -93.575858
)

计算每个多边形的点

我生成了两个 sp 对象:

1
2
3
4
5
6
7
sp_us_states <- as(sf_us_states,"Spatial")

observations_spdf <- observations_tibble %>%
  select(long, lat) %>% # SPDF want long, lat pairs
  SpatialPointsDataFrame(coords = .,
                         data = .,
                         proj4string = sp_us_states@proj4string)

现在我可以使用 poly.counts

1
2
points_in_states <-
  poly.counts(pts = observations_spdf, polys = sp_us_states)

将此添加到 sp 对象中:

1
sp_us_states$points.in.state <- points_in_states

现在我已经完成了,我将转换回 sf 对象并可以如下所示进行可视化:

1
2
3
4
5
6
7
8
9
library("leaflet")
updated_sf <- st_as_sf(sp_us_states)
updated_sf %>%
  filter(points.in.state > 0) %>%
  leaflet() %>%
  addPolygons() %>%
  addCircleMarkers(
    data = observations_tibble
  )

问题

我可以在不进行 sfsp 对象之间繁琐的转换的情况下执行此操作吗?


尝试以下方法:

1
2
3
4
5
sf_obs = st_as_sf(observations_tibble, coords = c("long","lat"),
    crs = st_crs(sf_us_states))
lengths(st_covers(sf_us_states, sf_obs))
# check:
summary(points_in_states - lengths(st_covers(sf_us_states, sf_obs)))

st_covers 返回一个列表,其中包含每个状态覆盖的点的索引; lengths 返回这些向量长度的向量,或点数。您将看到的警告表明,尽管您有地理坐标,但底层软件假定它们是笛卡尔坐标(在这种情况下,这很可能没有问题;如果您想正确摆脱它,请移至投影坐标方式)