该sf软件包提供了一个很好的方式与地理特征的工作,但我不能想出一个简单的等同于poly.counts从功能GISTools包里面的欲望sp对象.
poly.counts计算a SpatialPointsDataFrame的多边形内的落点数SpatialPolygonsDataFrame,可以按如下方式使用:
## 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对象:
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
points_in_states <-
  poly.counts(pts = observations_spdf, polys = sp_us_states)
将其添加到sp对象中:
sp_us_states$points.in.state <- points_in_states
现在我已经完成了我将转换回sf对象并可以如下可视化:
library("leaflet")
updated_sf <- st_as_sf(sp_us_states)
updated_sf %>%
  filter(points.in.state > 0) %>%
  leaflet() %>%
  addPolygons() %>%
  addCircleMarkers(
    data = observations_tibble
  )
我可以毫不繁琐之间转换执行此操作sf和sp对象?
请尝试以下方法:
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返回这些向量的长度向量或点数.你会看到的警告表明,虽然你有地理坐标,底层软件假定他们是笛卡尔(其中,对于这种情况,将最有可能没有问题;如果你想摆脱它适当的方式移动到投影坐标)