Как буферизовать / расширить шейп-файл переписи на 1 милю, используя rgeos :: gBuffer? - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь расширить / увеличить шейп-файл нации чероки, который я скачал из набора данных переписи здесь: 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 и представляет собой просто круг, который совсем не похож на исходную форму. Что-то мне не хватает?

1 Ответ

3 голосов
/ 07 февраля 2020

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)

Деталь графика:

enter image description here

Если вам нужен буфер в lat-long, то выполните другое преобразование буфера to "+ init = epsg: 4326".

Вы также можете сделать это с более современным пакетом sf, используйте st_read для чтения данных, st_transform для перепроектирования и st_buffer для сделать буфер. Это должно быть даже быстрее.

...