如何使用 rgeos::gBuffer buffer/expand 1 英里的人口普查 shapefile?

How to buffer/expand a census shapefile by 1 mile using rgeos::gBuffer?

我正在尝试 expand/enlarge 我从这里的人口普查数据集下载的切诺基民族的 shapefile:https://www2.census.gov/geo/tiger/TIGER2019/AIANNH/ 使用 rgeos 包。我目前拥有的代码是:

library(rgeos)
library(dplyr)

tribe_shp <- readOGR("/location of file/", layer = "tl_2019_us_aiannh")
tribe_shp <- tribe_shp %>% filter(GEOID == "5550R") #filter to cherokee nation

expand_obj <- gBuffer(tribe_shp, byid = F, width = 1000)

>Warning message:
In gBuffer(tribe_shp, byid = F, width = 1000) :
  Spatial object is not projected; GEOS expects planar coordinates

plot(expand_obj)

生成的对象丢失了原始 SPDF 的数据框,几乎只是一个与原始形状完全不同的圆。有什么我想念的吗?

gBuffer 使用数据的单位。在这种情况下,数据以经纬度为单位,因此缓冲区的宽度为 1000 度。使以米为单位的缓冲区转换为以米为单位的另一个坐标系。

坐标系有很多,您确实应该找到一个适合您所在位置的坐标系。我认为美国有许多按州设计的系统,所以这可能是最好的。但现在我将使用 EPSG:3857,这是 Google 用于地图的,并不是那么准确。

读取数据:

tribe_shp <- readOGR("./", layer = "tl_2019_us_aiannh")

使用选择的子集 - dplyr::filter 在这里对我不起作用,但这将:

tribe_shp = tribe_shp[tribe_shp$GEOID=="5550R",]

现在变换到另一个坐标系:

tribe_shp_trans = spTransform(tribe_shp, "+init=epsg:3857")

并做一个1公里的缓冲区。如果你想要一个 1 英里的缓冲区,那么一英里使用多少米 - 一千六百多米?

tribe_shp_buf = gBuffer(tribe_shp_trans, width=1000)

如果绘制它们,您几乎可以看到缓冲区大于原始区域:

plot(tribe_shp_trans)
plot(tribe_shp_buf,lty=3,add=TRUE)

剧情详情:

如果您需要经纬度的缓冲区,请将缓冲区再次转换为“+init=epsg:4326”。

您也可以使用更现代的 sf 包来执行此操作,使用 st_read 读取数据,使用 st_transform 重新投影,使用 st_buffer 进行缓冲.它甚至应该更快。