首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中缓冲区中多边形数据的聚合

R中缓冲区中多边形数据的聚合
EN

Stack Overflow用户
提问于 2022-03-08 17:36:19
回答 1查看 132关注 0票数 0

我有一个excel文件与加油站和另一个形状文件,有多边形(县)和相应的人口每个县。

我使用st_as_sf命令将excel文件转换为地理空间文件。县形文件包含市所有县的多边形,每个县有一列表示县内的人口。

我能够在加油站周围创建一个缓冲区,并使用地图视图将县、缓冲区和加油站划分为一起。

我的问题是,离这个加油站有多少人住在x米以内(我的缓冲区)。在图中,蓝色区域是加油站周围的缓冲区,下面的一层是用“人口”颜色表示的各县。搜索的重点是计算多边形中的点数,但我的查询有点不同。

我基本上是想从我的县形状文件中的人口列中提取,并且说400 ppl生活在加油站1等的缓冲区中,etc..for所有的加油站。

蓝色加油站和缓冲器图片

#在加油站周围建立一个1000米的缓冲区

代码语言:javascript
复制
petrol_buffer <- st_buffer(stations_geo,1000) %>% 
    rename(fuel_station_buffer=geometry) %>% 
     st_as_sf() %>% 
      mutate(buffer_id =1:29)

#创建社区的质心,这样我就可以看到哪些质心落在加油站缓冲区内。

代码语言:javascript
复制
   population_geo <- population_geo %>% 
    mutate(centroids= st_centroid(geometry))

#确定哪些质心落入加油站缓冲器

代码语言:javascript
复制
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个社区引用的是哪些加油站。

EN

回答 1

Stack Overflow用户

发布于 2022-03-09 20:06:34

在下面的例子中,我将使用tigris包来获取县的几何图形(而不是shapefile),并创建少量的缓冲区(作为加油站)。请注意,人口密度只是一个例子,而不是真实的例子。

代码语言:javascript
复制
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"])

为了简单起见,让我们创建示例缓冲区--在我们的例子中只有两个:

代码语言:javascript
复制
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对其进行汇总。

代码语言:javascript
复制
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中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71399254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档