Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当接触R中的边界时,测试几何图形是否包括其他几何图形_R_Maps_Gis_Polygon_Sf - Fatal编程技术网

当接触R中的边界时,测试几何图形是否包括其他几何图形

当接触R中的边界时,测试几何图形是否包括其他几何图形,r,maps,gis,polygon,sf,R,Maps,Gis,Polygon,Sf,我是地理数据新手,所以这可能是个愚蠢的问题。 我有两个多面体,我想做的是测试“选区”的多边形中,每个“选区”的多边形包含在哪个多边形中。基本上,看看每个病房的一致性 但是,我遇到了来自sf的函数st_within()的问题,因为只有当第一个几何体完全位于第二个几何体中时,它才会返回TRUE。当较小的单位接触较大单位的边界时,这是一个问题。这里有一个例子 我有一个多义词叫做“consituencies”,还有一个叫做“wards”。你可以在这里找到它们: 选区中有两个目标: plot(consti

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

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

我有一个多义词叫做“consituencies”,还有一个叫做“wards”。你可以在这里找到它们:

选区中有两个目标:

plot(constituencies$geometry)
> 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...
然后,我尝试与他们一起讨论这些病房是否在选区内

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

我假设发生了两件事中的一件:1)触摸边界不算完全在一个几何体内,或2)病房和选区的边界可能不完全匹配,因此病房不完全在选区内

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


非常感谢你

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

plot(constituencies$geometry)
> 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...
我们得到两个输出特性,因为ward在两个选区都有一些输出特性。多少钱?让我们看看:

> st_area(st_intersection(wards$geom[1], constituencies$geom))
Units: [m^2]
[1] 1.298829e+05 9.542473e-01
一个是129882m^2,另一个是0.95m2。你的选区边界不对,以至于有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

该列表中包含一个元素的任何元素都是与一个且仅与一个选区重叠的病房,否则,您需要计算该病房与这些选区重叠的面积比例,以确定该病房主要位于哪些选区。

您的边界没有精确对齐。让我们看看当第一个选区与两个选区相交时会发生什么:

plot(constituencies$geometry)
> 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...
我们得到两个输出特性,因为ward在两个选区都有一些输出特性。多少钱?让我们看看:

> st_area(st_intersection(wards$geom[1], constituencies$geom))
Units: [m^2]
[1] 1.298829e+05 9.542473e-01
一个是129882m^2,另一个是0.95m2。你的选区边界不对,以至于有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

该列表中任何包含一个元素的元素都是与一个且仅与一个选区重叠的病房,否则您需要计算该病房与这些选区重叠的面积比例,以计算出该病房主要覆盖哪些选区。

因为我们只处理细微的差异,一种方法是在连接之前在wards几何体周围创建一个轻微的负片/插入缓冲区

把…准备好

带负缓冲区:

由于我们只处理微小的差异,一种方法是在连接之前在wards几何体周围创建一个轻微的负片/插入缓冲区

把…准备好

带负缓冲区:

你好,问得好!很遗憾,我无法打开您的数据集。你的一行代码跳出来告诉我:
st\U crs(病房)==st\U crs(选区)
这通常是个坏主意,因为它只是覆盖了crs。尝试
st_transform(wards,st_crs(Consultments)
!啊,非常感谢!会纠正它的。对链接感到羞耻,我不明白为什么会这样。你可以试试这个吗:?我可以加载这些,但这里的crs看起来是一样的(但几何结构有点不一致)。您已经在这里操作了CRS吗?我在前面的评论中也错了:您的代码行不会更改CRS,它只是测试它们是否相等。使用您的数据集,我的表达式为
TRUE
。对不起,您是对的。我运行了“wards您能提供未更改数据集的样本吗?此外,关于它们来自何处(使用了哪个CRS)的任何信息都有助于尝试正确对齐它们。嗨,问得好!不幸的是,我无法打开您的数据集。您的一行代码跳到我面前:
st_CRS(wards)==st_CRS(选区)
这通常是一个坏主意,因为它只是覆盖了CRS。请尝试
st_transform(沃兹,st_CRS(选区)
!啊,非常感谢!会纠正它的。链接太可惜了,我不明白为什么会这样。你可以尝试一下吗:?我可以加载这些,但这里的CRS看起来是一样的(但是几何结构有点偏离)。你已经在这里操纵了CRS吗?我在之前的评论中也错了:你的代码行不会改变CRS,它只是测试它们是否相等。对于我来说,使用你的数据集,表达式是
TRUE
。对不起,你是对的。我运行了“您能提供未更改数据集的样本吗?以及它们来自何处的任何信息(使用了哪种CRS)尝试将它们正确对齐会很有用。谢谢,这真的很有帮助!但是,我又回到了同一个问题上,对吗?使用sf_相交给了我每个单独的相交点,而不是病房几何结构中较大部分所在的选区。你能提供一个示例代码,说明我将如何使用sf_相交点吗“需要计算该病房与那些选区重叠的面积比例,以计算出该病房主要覆盖哪些选区”?非常感谢!抱歉,有时我没有时间写完整的解决方案,而我把它放在了一个有R编程的人应该能够完成工作的地方。Loop
I