相当于`poly.counts`来计算落在多边形内部的纬度/长对与sf包

时间:2017-07-25 21:50:49

标签: r gis sp sf

sf包提供了一种处理地理要素的绝佳方法,但我无法找出与poly.counts包中GISTools函数的简单等价物。 {1}}对象。

sp计算poly.counts多边形中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
  )

问题

我是否可以在sfsp个对象之间进行繁琐的转换时执行此操作?

1 个答案:

答案 0 :(得分: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返回这些向量的长度向量或点数。您将看到的警告表明,虽然您有地理坐标,但基础软件假设它们是笛卡尔坐标(对于这种情况,它很可能不会有问题;如果您想要摆脱它,则移动到投影坐标正确的方式)