1

我正在尝试扩展/放大我从人口普查数据集下载的切罗基民族的 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 的数据框,并且几乎只是一个与原始形状完全不同的圆圈。有什么我想念的吗?

4

1 回答 1

3

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)

剧情详情:

在此处输入图像描述

如果您需要 lat-long 的缓冲区,则将缓冲区再次转换为“+init=epsg:4326”。

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

于 2020-02-06T22:14:07.057 回答