我有一个excel文件与加油站和另一个形状文件,有多边形(县)和相应的人口每个县。
我使用st_as_sf命令将excel文件转换为地理空间文件。县形文件包含市所有县的多边形,每个县有一列表示县内的人口。
我能够在加油站周围创建一个缓冲区,并使用地图视图将县、缓冲区和加油站划分为一起。
我的问题是,离这个加油站有多少人住在x米以内(我的缓冲区)。在图中,蓝色区域是加油站周围的缓冲区,下面的一层是用“人口”颜色表示的各县。搜索的重点是计算多边形中的点数,但我的查询有点不同。
我基本上是想从我的县形状文件中的人口列中提取,并且说400 ppl生活在加油站1等的缓冲区中,etc..for所有的加油站。
#在加油站周围建立一个1000米的缓冲区
petrol_buffer <- st_buffer(stations_geo,1000) %>%
rename(fuel_station_buffer=geometry) %>%
st_as_sf() %>%
mutate(buffer_id =1:29)#创建社区的质心,这样我就可以看到哪些质心落在加油站缓冲区内。
population_geo <- population_geo %>%
mutate(centroids= st_centroid(geometry))#确定哪些质心落入加油站缓冲器
in_buffer<- st_intersection(population_geo$centroids, petrol_buffer$fuel_station_buffer) %>%
as_tibble() %>%
rename(in_buffer_geo=geometry) %>%
st_as_sf( crs = 4326)
in_buffer <- in_buffer %>%
st_join(population_geo, by='centroids')#这就是我陷入困境的地方,我需要找到一种方法把这个链接回我的加油站文件,这样我就可以知道196个社区引用的是哪些加油站。
发布于 2022-03-09 20:06:34
在下面的例子中,我将使用tigris包来获取县的几何图形(而不是shapefile),并创建少量的缓冲区(作为加油站)。请注意,人口密度只是一个例子,而不是真实的例子。
library(tigris)
library(sf)
LA <- counties(state = "LA", cb = TRUE)
LA <- LA |>
mutate(area = as.double(st_area(geometry)/10^6)) |>
mutate(density = 200000/area) |>
st_as_sf()
plot(LA["density"])

为了简单起见,让我们创建示例缓冲区--在我们的例子中只有两个:
buffers <- st_sample(LA, 2) |>
st_buffer(dist = 50000) |>
st_as_sf() |>
mutate(ID = 1:2)
plot(buffers$x, lwd = 3, add = TRUE)

现在,我们必须找到那些县(和他们的部分)与我们的缓冲区相交。最简单的方法就是调用st_intersection()函数,在这种情况下,它像过滤器一样工作,并返回几何图形列表,然后我们必须计算面积/人数,然后用缓冲区ID对其进行汇总。
LA |>
st_intersection(buffers) |>
mutate(aa = as.double(st_area(geometry)/10^6)) |>
mutate(how_many_peple = aa * density) |>
group_by(ID) |>
summarise(sum(how_many_peple))
Simple feature collection with 2 features and 2 fields
[...]
# A tibble: 2 × 3
ID `sum(how_many_peple)` geometry
<int> <dbl> <POLYGON [°]>
1 1 823361. ((-91.95035 30.28296, -91.94902 30.28298, -91.94413 30.28305, -91.94413 30.28882, -91.939...
2 2 292827. ((-93.29358 30.05181, -93.29358 30.05433, -93.28855 30.05446, -93.28855 30.05734, -93.286...请注意区域在km^2中,密度在number of people/km^2中。
https://stackoverflow.com/questions/71399254
复制相似问题