如何使用 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
进行缓冲.它甚至应该更快。
我正在尝试 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
进行缓冲.它甚至应该更快。