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, то выполните другое преобразование буфера to "+ init = epsg: 4326".
Вы также можете сделать это с более современным пакетом sf
, используйте st_read
для чтения данных, st_transform
для перепроектирования и st_buffer
для сделать буфер. Это должно быть даже быстрее.