根据交点的个数和位置,两个几何要素之间的空间位置关系可分为相离、相切、相交和包含四种:

  • 相离是指两个几何要素没有交点,相交是指两个要素存在交点,广义上讲相切和包含是相交关系中的特殊情况;

  • 相切是指交点全部位于其中一个要素的边界上;

  • 包含关系是指一个要素位于另一个要素的内部,这里的“内部”有时也包括“边界”;

  • 面的边界和内部是有明显区别的;对于线要素来讲,它的“边界”是指其端点;而对于点要素来讲,其不存在边界和内部的分别。

1 语法规则

sf中的geos_binary_pred()系列函数用于判断两个几何对象的位置关系:

geos_binary_pred(x, y, sparse = TRUE, ...)
  • 函数返回结果只有TRUE(1)和FASLE(0)两种;

  • x和y是sf、sfc或sfg对象,对应的几何要素类型可以是点、线或面;

  • sparse参数默认为TRUE,结果以稀疏形式返回,即只返回结果为1的情况,若没有为1的情况则返回值为空;若sparse设置为FASLE会返回所有情况的结果。

2 函数功能

相离函数

  • st_disjoint():当输入的两个几何要素没有交点时为真。

相切函数

  • st_touches():主要用于判断线-面和面-面相切关系,当交点全在面的边界上时为真;也可用于判断点-线相切,此时线的“边界”是指其端点。

相交函数

  • st_intersects():当存在至少一个交点时为真,与st_disjoint()功能相反;

  • st_crosses():主要用于判断线-面交叉关系,当线的一部分在面内,一部分在面外时为真;

  • st_overlaps():主要用于判断面-面交叉关系,当两个面有部分重叠时为真;

包含函数

  • st_within():主要用于判断其他要素是否在面内或点-线、线-线包含关系,允许有交点在面的边界上,但不允许所有的交点都在边界上,即不允许点在线的端点上,线完全在面的边界上;

  • st_contains():参数顺序与st_within()颠倒,其他同st_within()

  • st_contains_properly():不允许有交点边界上(包括线的端点),其他同st_contains()

  • st_covers():适用范围最广的包含函数,即使交点全在边界上也仍然为真。

  • st_equals():当几何要素完全重合时为真;

  • st_is_within_distance():与st_within()类似,但多了dist参数,可以设置距离门槛进行模糊判断。

3 相似、相反函数功能对比

创建示例数据

library(sf)p1 <- c(0, 0)
p2 <- c(0, 2)
p3 <- c(4, 2)
p4 <- c(4, 0)
p5 <- c(1, 1)
p6 <- c(3, 1)
p7 <- c(2, 3)
p8 <- c(0, 3)pt1 <- st_point(p1)
pt2 <- st_point(p6)
pt3 <- st_point(p7)ln1 <- st_linestring(rbind(p3, p4))
ln2 <- st_linestring(rbind(p5, p6))
ln3 <- st_linestring(rbind(p1, p2, p8))
ln4 <- st_linestring(rbind(p5, p8))
ln5 <- st_linestring(rbind(p1, p4, p6, p5))pg1 <- st_polygon(list(rbind(p1, p2, p3, p4, p1)))
pg2 <- st_polygon(list(rbind(p5, p6, p7, p5)))
pg3 <- st_polygon(list(rbind(p2, p3, p7, p2)))

3.1 st_intersects()st_disjoint()

这两个函数功能相反,但在用法上也存在相似之处,如只关心有无交点,而不关心交点的位置,不考虑输入对象x和y的顺序。

# 点在线的端点上
st_intersects(pt1, ln3)
st_disjoint(pt1, ln3)# 点在面的边界上
st_intersects(pt1, pg1)
st_disjoint(pt1, pg1)# 点在面的内部
st_intersects(pt2, pg1)
st_disjoint(pt2, pg1)
# 部分输出结果
> # 点在线的端点上
> st_intersects(pt1, ln3)
Sparse geometry binary predicate list of length 1, where the predicate was `intersects'1: 1
> st_disjoint(pt1, ln3)
Sparse geometry binary predicate list of length 1, where the predicate was `disjoint'1: (empty)

3.2 st_touches()

相切函数也不区分输入对象的顺序。

当其中一个要素是面要素时,相切是指交点全在面的边界上

# 以下返回值皆为真
# 点在面的边界上
st_touches(pt1, pg1)
# 线完全在面的边界上
st_touches(ln1, pg1)
# 线的一部分在面的边界上,另一部分在面外
st_touches(ln3, pg1)
# 面和面共边
st_touches(pg1, pg3)

当输入对象只有点或线要素且至少有一个为线要素时,相切是指交点在线的端点上

# 以下返回值皆为真
# 点在线的端点上
st_touches(pt1, ln3)
# 线与线的交点是其中一个线的端点
st_touches(ln3, ln4)# 以下返回值皆为假
# 两个对象全为点且重合
st_touches(pt1, pt1)
# 点在线上但不在端点上
st_touches(pt2, ln5)
# 线和线存在交点不是端点
st_touches(ln2, ln5)

3.3 st_crosses()st_overlaps()

相同点:

  • 不区分输入对象的顺序;

  • 判断的都是狭义的相交关系,即不包括相切和包含关系,判断广义的相交关系可以使用st_intersects()函数。

不同点:

  • st_crosses()用于判断线-线或线-面相交关系,面面关系一律返回FASLE;

  • st_overlaps()则用于判断面-面相交关系,线面关系一律返回FASLE。

# 以下皆返回为真
# 线的一部分在面内,一部分在面外
st_crosses(ln4, pg1)
# 面与面有重合部分也有不重合部分
st_overlaps(pg2, pg3)# 以下皆返回为假
# 线-面相切
st_crosses(ln3, pg1)
# 线-线“相切”
st_crosses(ln3, ln4)
# 面-面相切
st_overlaps(pg1, pg3)

3.4 st_within()st_contains()st_covers()

相同点:

  • 都是判断包含关系的函数,区分输入对象的顺序;

不同点:

  • st_within()的逻辑关系是“x包含于y”,st_contains()st_covers()是“x包含y”;

  • st_contains_properly()是最狭义的包含关系,不允许在边界有交点;

  • st_within()st_contains()允许部分交点在边界上;

  • st_covers()是最广义的包含关系,允许所有交点均落在边界上的情况。

比较以下几种情况的输出结果:

# 以下除特殊注释外返回皆为真
# 线完全在面内
st_within(ln2, pg1)
st_contains(pg1, ln2)
st_contains_properly(pg1, ln2)
st_covers(pg1, ln2)# 线的一部分在面的边界上,另一部分在面内
st_contains(pg1, ln5)
st_contains_properly(pg1, ln5) # 返回假
st_covers(pg1, ln5)# 线完全在面的边界上
st_contains(pg1, ln1) # 返回假
st_contains_properly(pg1, ln1) # 返回假
st_covers(pg1, ln1)

4 判断多要素对象的位置关系

以上均是以单要素几何对象为例,即sfg对象,而对于sf对象或sfc对象来说,它的每一行都代表了一个几何要素。上述函数在处理多要素对象的空间位置关系时,会逐个判断x中的每个要素和y中的每个要素之间的位置关系,结果以矩阵或列表形式输出。

library(sf)
nc <- st_read(system.file("shape/nc.shp", package = "sf"))
sf1 <- filter(nc, AREA > 0.2)
dim(sf1)
sf2 <- filter(nc, SID74 > 5)
dim(sf2)# 结果以稀疏形式展示
a <- st_intersects(sf1, sf2)
class(a)
# 结果以矩阵形式展示
b <- st_intersects(sf1, sf2, sparse = F)
class(b)
dim(b)
# 部分输出结果
> dim(sf1)
[1] 11 15
> dim(sf2)
[1] 38 15> class(a)
[1] "sgbp" "list"
> class(b)
[1] "matrix"
> dim(b)
[1] 11 38

sf | 判断点线面等几何对象的空间位置关系相关推荐

  1. Geometry(几何对象定义空间位置和关联几何形状)

    Geometry 描述 几何对象定义空间位置和关联几何形状. 讨论 在许多地理处理工作流中,您可能需要使用坐标和几何信息运行特定操作,但不一定想经历创建新(临时)要素类.使用光标填充要素类.使用要素类 ...

  2. 五.几何对象和空间参考

    几何对象是ArcGIS Engine中最基本的也是最常用的对象,我们所说的空间对象(点,线,面)都是几何 对象,我们在删除,创建和进行地理分析的时候,就是处理一个包含几个对象的矢量图形. Geomet ...

  3. 收藏:用DE-9IM判断二维空间位置关系

    很有用的一篇资料,经常用,经常找,不如搬过来.感谢原作者! 来源:Classicning Daily Log http://www.classicning.com/blog/post/388.html ...

  4. PostGIS之路——几何对象编辑(二)

    1.ST_Reverse 返回几何对象顶点顺序相反的几何对象. geometry ST_Reverse(geometry g1); 示例SQL: SELECT ST_AsText(the_geom) ...

  5. 判断是否存在此对象_JVM的垃圾回收机制,判断对象是否死亡

    这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制 ...

  6. mysql 几何对象,几何(geometry)对象类型

    OGC的WKB和WKT格式 OGC定义了两种描述几何对象的格式,分别是WKB(Well-Known Binary)和WKT(Well-Known Text). 在SQL语句中,用以下的方式可以使用WK ...

  7. 金仓数据库 KingbaseGIS 使用手册(6.8. 几何对象输入函数)

    6.8. 几何对象输入函数 6.8.1. ST_BdPolyFromText ST_BdPolyFromText - 根据一个任意的封闭的WKT描述的MultiLineString几何类型对象创建一个 ...

  8. Direct2D (23) : 复合几何对象之 ID2D1GeometryGroup

    为什么80%的码农都做不了架构师?>>>    uses Direct2D, D2D1;procedure TForm1.FormPaint(Sender: TObject); va ...

  9. ggplot2设置坐标轴范围_R可视化03|ggplot2图层-几何对象图层(geom layer)

    前面简单介绍ggplot2是基于图层图形语法(the Grammar of Graphics),一张完整图由不同图层叠加而成,本文介绍几何对象图层(geom layer),续前篇: R可视化01|gg ...

最新文章

  1. python十二:字符串格式化
  2. spring源码分析之cache注解
  3. android 调用本地第三方应用软件,如qq、微信、微博和视频播放器等
  4. PDF下载!提高代码质量的一本书
  5. python打卡记录去重_Python笔记记录
  6. Docker存储驱动devicemapper介绍和配置
  7. 同時啟動多個Tomcat服務器
  8. 删除用户账号的命令 mysql_【Mysql】常用指令之——用户操作(创建,授权,修改,删除)...
  9. 人间故事馆话题:聊聊那些被骗经历,让其他人不再被骗
  10. 计算机不显示固态硬盘,电脑重启后读不到固态硬盘怎么办
  11. PS教程:利用灰度蒙版实现无级调节
  12. 强大的矢量绘图软件Sketch
  13. 优盘插计算机上成快捷方式,u盘一插就变成快捷方式打不开怎么办 u盘变成快捷方式怎么办...
  14. Visio 导出图片时字符间距错乱
  15. 【评测】肠道微生物核酸提取试剂盒
  16. 原创 | 大数据学习思维导图
  17. mac 小程序开发者工具。 tunneling socket could not be established
  18. 82.Hive SQL插入动态分区的异常分析
  19. 如何使用OpenCV测量图像中物体之间的距离
  20. 富文本编辑器 CKeditor 配置使用+上传图片

热门文章

  1. Linux学习总结(81)—— Linux 权限详解
  2. Linux学习总结(76)—— Shell 脚本日志技巧
  3. Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
  4. 常州网站服务器_常州服务器
  5. springboot忽略证书_SpringBoot中通过java代码实现忽略SSL证书
  6. 库查询所有表的权限_JSW 基于WEB的MSSQL数据库查询平台
  7. php fetch mode,odbc_fetch_into
  8. java实体类实现抽象类_java接口、抽象类、实体类关系介绍
  9. npm、webpack、vue-cli
  10. 如何使用 Python 实现微信消息防撤回