【问题标题】:Intersection of polygons in R using sfR中多边形的交集使用sf
【发布时间】:2019-11-22 09:49:58
【问题描述】:

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

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

我在 GIS 溢出中提出了这个问题,但我不确定它是否会在 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()

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

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

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

summary(lengths(st_intersects(polls_intersection)))

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

【问题讨论】:

  • lengths(st_intersects()) 你在追求什么?
  • 其实我也不知道。我得试一试。这会计算重叠的数量吗?如何将其显示为地图,并适当着色交叉路口?
  • 它会给你一个向量,其中包含每个缓冲区的重叠数。关于绘制按数字着色的重叠部分,其中一个 sf 小插曲中有一个解决方案。
  • 关于如何绘制重叠数量的解决方案可以在这里找到r-spatial.github.io/sf/reference/geos_binary_ops.html
  • plot(polls_intersection$geometry,col = sf.colors(categorical = TRUE, alpha = .5)) 这会给我圆圈中的颜色。这很有帮助!然后我得到这个摘要(长度(st_intersects(polls_intersection)))分钟。第一曲。中位数平均第三曲。最大限度。 1.0 7.0 9.0 14.3 17.0 77.0

标签: r gis sf spatial-data


【解决方案1】:

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

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

请注意,最小值为1,因为投票站始终位于其自身 400m 范围内。

# 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)))

这是我不确定的一点,要获得我想要的输出(在这种情况下将显示投票站的“热点”)我该如何着色?

如果你想绘制这些东西,我强烈推荐使用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.

我不知道什么是“侧面位置冲突”。也许@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") 

【讨论】:

  • 当然,我需要添加重叠列!如果我过滤掉以使 n_overlaps >1,那么我也会消除自连接。
  • 谢谢jmw。真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2021-11-12
  • 1970-01-01
  • 2020-12-29
  • 2019-03-10
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多