使用 sf 在 R 中多边形的交集

Intersection of polygons in R using sf

我想通过查看 400m(步行 5 分钟)内其他点的数量来评估每个点与其他等效点的空间接近程度。

我在地图上有一些点。 我可以在它们周围画一个简单的 400 米缓冲区。 我想确定哪些缓冲区重叠,然后计算重叠的数量。 这个重叠数应该与原始点相关,这样我就可以看到哪个点的重叠数最多,因此如果我从那个点步行 400 米,我可以确定我可以到达多少个其他点。

我在 GIS overflow 中问过这个问题,但我不确定 ArcGIS 是否会回答这个问题,我想我更愿意在 R 中完成这项工作。

这就是我的目标 https://www.newham.gov.uk/Documents/Environment%20and%20planning/EB01.%20Evidence%20Base%20-%20Cumulative%20Impact%20V2.pdf

为了简化这里有一些代码

# load packages
library(easypackages)
needed<-c("sf","raster","dplyr","spData","rgdal",
          "tmap","leaflet","mapview","tmaptools","wesanderson","DataExplorer","readxl",
          "sp" ,"rgisws","viridis","ggthemes","scales","tidyverse","lubridate","phecharts","stringr")
easypackages::libraries(needed)

## read in csv data; first column is assumed to be Easting and second Northing
polls<-st_as_sf(read.csv(url("https://www.caerphilly.gov.uk/CaerphillyDocs/FOI/Datasets_polling_stations_csv.aspx")),
                coords = c("Easting","Northing"),crs = 27700)
polls_buffer_400<-st_buffer(plls,400)
polls_intersection<-st_intersection(x=polls_buffer_400,y=polls_buffer_400)
plot(polls_intersection$geometry)

这应该显示投票站周围重叠的缓冲区。 我想做的是计算重叠的数量,这是在这里完成的:

polls_intersection_grouped<-polls_intersection%>%group_by(Ballot.Box.Polling.Station)%>%count()

这是我不确定的一点,要获得我想要的输出(在这种情况下将显示 "Hotspots" 个投票站)我该如何给东西上色?我怎么能够 : 通过查看 400 米(步行 5 分钟)内其他点的数量来评估每个点与其他等效点的空间接近程度。

这可能是非常糟糕的形式,但这是我最初的 GIS 问题 https://gis.stackexchange.com/questions/328577/buffer-analysis-of-points-counting-intersects-of-resulting-polygons

编辑: 这给了交叉点不同的颜色,这很棒。 plot(polls_intersection$geometry,col = sf.colors(categorical = TRUE, alpha = .5))

summary(lengths(st_intersects(polls_intersection)))

我在这里涂什么?我的意思是它看起来不错,但我真的不知道我在做什么。

How can I : asess the degree of spatial proximity of each point to other equivalent points by looking at the number of others within 400m (5 minute walk).

以下是如何向初始 sfc 投票站添加一列,告诉您在该 sfc 中的每个要素 400 米范围内有多少个投票站。

请注意,最小值为 1,因为投票站始终在 400 米以内。

# n_neighbors shows how many polling stations are within 400m
polls %>% 
  mutate(n_neighbors = lengths(st_is_within_distance(polls, dist = 400)))

同样,对于您的 sfc 相交多边形集合,您可以添加一个列来计算包含每个相交多边形的缓冲区多边形的数量:

polls_intersection %>% 
  mutate(n_overlaps = lengths(st_within(geometry, polls_buffer_400)))

And this is the bit I'm not sure about, to get to the output I want (which will show "Hotspots" of polling stations in this case) how do I colour things?

如果你想绘制这些东西,我强烈推荐使用 ggplot2。它非常清楚如何将颜色等属性与特定变量相关联。

例如,这是一个将每个多边形的 alpha(透明度)映射到 n_overlaps 列的缩放版本的示例:

library(ggplot2)
polls_intersection %>% 
  mutate(n_overlaps = lengths(st_covered_by(geometry, polls_buffer_400))) %>% 
  ggplot() + 
  geom_sf(aes(alpha = 0.2*n_overlaps), fill = "red") 

最后,应该有更好的方法来生成已经计算重叠的相交多边形。这是内置于 st_intersection 函数中的,用于查找 sfc 对象与其自身的交集。

但是,当您尝试这样做时,您的数据尤其会产生错误:

st_intersection(polls_buffer_400)

# > Error in CPL_nary_intersection(x) : 
#>  Evaluation error: TopologyException: side location conflict at 315321.69159061194 199694.6971799387.

我不知道 "side location conflict" 是什么。也许@edzer 可以帮助解决这个问题。但是,您数据的大多数子集不包含该冲突。例如:

# this version adds an n.overlaps column automatically:
st_intersection(polls_buffer_400[1:10,]) %>% 
  ggplot() + geom_sf(aes(alpha = 0.2*n.overlaps), fill = "red")