【问题标题】:Testing for whether geometries include other when touching borders in R在R中触摸边界时测试几何是否包括其他
【发布时间】:2021-08-22 09:18:22
【问题描述】:

我是地理数据的新手,所以也许这是一个愚蠢的问题。 我有两个多边形,我想做的是测试每个“病房”多边形包含在哪个“选区”多边形中。基本上,查看每个选区所在的选区。

但是,我遇到了来自 sf 的函数 st_within() 的问题,因为它仅在第一个几何体完全在第二个几何体中时才返回 TRUE。当较小的单位接触较大单位的边界时,这是一个问题。这是一个例子

我有一个称为“选区”的多面体和一个称为“病房”的多面体。你可以在这里找到它们:https://www.dropbox.com/sh/xu08wm79rym00zz/AADFDpyPe0EuDSDSY-6SvqpYa?dl=0

选区中有 2 个对象:

plot(constituencies$geometry)

然后,我尝试加入他们的行列,了解选区是否选区

wards <- st_transform(wards, crs = st_crs(constituencies))
test98 <- st_join(wards, constituencies, join=st_within)

结果会在选区名称和选区所在的标签上吐出许多 NA。

    head(test98)
Simple feature collection with 6 features and 4 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 531936.6 ymin: 180569.5 xmax: 533595.1 ymax: 182082.5
projected CRS:  OSGB 1936 / British National Grid
  WD98CD       WD98NM                             name label                       geometry
1 00AAFA   Aldersgate                             <NA>  <NA> MULTIPOLYGON (((532104.9 18...
2 00AAFB      Aldgate                             <NA>  <NA> MULTIPOLYGON (((533319.2 18...
3 00AAFC    Bassishaw Cities of London and Westminster   107 MULTIPOLYGON (((532587.3 18...
4 00AAFD Billingsgate Cities of London and Westminster   107 MULTIPOLYGON (((533167.9 18...
5 00AAFE  Bishopsgate                             <NA>  <NA> MULTIPOLYGON (((533410.7 18...
6 00AAFF Bread Street Cities of London and Westminster   107 MULTIPOLYGON (((532300.3 18...

当我绘制它们以查看哪些名称中有 NA(红色)时,您可以看到它是触及选区边界的那些:

plot(constituencies_short$geometry)
plot(test98$geometry[!is.na(test98$name),], col = "green", add = T)
plot(test98$geometry[is.na(test98$name),], col = "red", add = T)

我假设正在发生以下两种情况之一:1) 接触边界不能算作完全在几何范围内,或 2) 选区和选区的边界可能不完全匹配,因此选区并不完全在几何范围内。选区。

我的问题是:有没有一种方法可以完美匹配边界,然后测试哪些选区在哪些选区之内,或者有没有一种方法可以测试哪些选区不是全部,而是选区的大部分边界?

非常感谢!

【问题讨论】:

  • 嗨,好问题!不幸的是,我无法打开您的数据集。你的一行代码突然出现在我面前:st_crs(wards) == st_crs(constituencies) 这通常是个坏主意,因为它只是覆盖了 CRS。试试st_transform(wards, st_crs(constituencies)吧!
  • 啊,非常感谢!会改正的。对链接感到羞耻,无法理解为什么会这样。你可以试试这个:drive.google.com/drive/folders/… 吗?
  • 我可以加载这些,但这里的 CRS 似乎是相同的(但几何形状略有偏差)。你已经在这里操作过 CRS 了吗?我在之前的评论中也弄错了:您的代码行不会更改 CRS,它只是测试它们是否相等。对我来说,表达式是TRUE,使用你的数据。
  • 对不起,你是对的。我运行了“wards
  • 您能提供未更改数据集的样本吗?此外,任何关于它们来自何处(使用哪个 CRS)的信息都有助于尝试正确对齐它们。

标签: r maps gis polygon sf


【解决方案1】:

您的边界不完全对齐。让我们看看当我们将第一个选区与两个选区相交时会发生什么:

> st_intersection(wards$geom[1], constituencies$geom)
Geometry set for 2 features 
geometry type:  GEOMETRY
dimension:      XY
bbox:           xmin: 531936.6 ymin: 181262.6 xmax: 532309 ymax: 182012
projected CRS:  OSGB 1936 / British National Grid
POLYGON ((532104.9 182011.9, 532126.3 181948, 5...
MULTIPOLYGON (((532022.4 181893.5, 532022.4 181...

我们得到两个输出特征,因为选区在两个选区都有一些输出特征。多少钱?让我们看看:

> st_area(st_intersection(wards$geom[1], constituencies$geom))
Units: [m^2]
[1] 1.298829e+05 9.542473e-01

所以一个是 129882m^2,另一个是 0.95m^2。您的边界错位,因此“错误”选区中有 1 平方米的病房!

一种解决方法是根据病房面积的值或比例计算完整交叉集的面积和阈值。

您可以使用st_intersects 获取所有重叠的列表:

> st_intersects(wards, constituencies)

Sparse geometry binary predicate list of length 25, where the predicate was `intersects'
first 10 elements:
 1: 1, 2
 2: 1
 3: 1
 4: 1
 5: 1, 2
 6: 1

该列表中具有一个元素的任何元素都是与一个且仅一个选区重叠的选区,否则您需要计算该选区与这些选区重叠的面积比例,以计算出该选区主要结束的选区。

【讨论】:

  • 谢谢,这真的很有帮助!但是,我又回到了同样的问题,对吧?使用 sf_intersects 给了我每个单个交叉点,而不是选区的大部分几何图形所在的选区。您能否提供一个示例代码,说明我将如何“需要计算那个选区与那些选区的重叠,以确定哪些选区主要结束”?非常感谢!
  • 对不起,有时我没有时间写完整的解决方案,我把它放在一个有一些 R 编程的人应该能够完成工作的地方。在st_intersects 的输出上循环i,计算ward ist_areai-th 交集列表元素中的选区,决定采取哪一个。
  • 很公平,对不起!我对这一切还是很陌生,不想提出任何不恰当的问题。这只是为了确保我理解并在此处为将来的其他人获得完整的答案。谢谢!
【解决方案2】:

由于我们只处理细微的差异,一种方法是在加入之前在病房几何形状周围创建一个轻微的负/插入缓冲区。

准备

library(sf)
library(tmap)

wards_transformed <- st_transform(wards, st_crs(constituencies))

无缓冲:

wards_transformed %>%
  st_join(constituencies, st_within)

带负缓冲:

wards_transformed %>%
  st_buffer(-10) %>%
  st_join(constituencies, st_within)

【讨论】:

  • 太好了,非常感谢!它在我放在这里的示例中起到了作用,但在完整的数据集中,我仍然得到很多 NA,可能是因为在某些方面差异可能更大,或者因为可能存在其他问题。
  • 如果你想分享一些边缘案例,我很乐意看看!
  • 真的吗?太感谢了!你真是太好了。你可以在这里找到两个完整的数据集:drive.google.com/drive/folders/…
  • 对于边缘情况,我的意思是一些几何示例,它们不适用于这种方法,或者可能指向另一个问题。
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2013-09-30
  • 1970-01-01
相关资源
最近更新 更多