摘要:Spatial Join打算分两篇来讲,第一篇白话一些简单理论,第二篇主要结合官方文档介绍实践应用,此为理论篇。
理论篇
空间关系也是空间数据区别于非空间数据一个非常重要的特点。比如我们最为熟知的关系数据库(RDBMS),他这里的“关系”的核心是基于二维表的,即笛卡尔积的集合理论,相对抽象的很多,记得以前学数据库概论的时候,老师堆一堆数学抽象概念定义之类的。
我们空间数据也有“关系”,即空间关系,这是可以看得见摸得着的,比如我们描述“这条公路穿过五个省”,就隐含了“线穿过面的空间关系”的空间拓扑关系,再比如"武汉在广州的北边",这句话也隐含了一个空间方向的关系,这些都很直观形象的,这也是我们学习空间数据相对不枯燥的一点,总的来说空间关系包括度量关系、方向关系、和拓扑关系。一般默认指空间拓扑关系。
虽说空间关系看起来直观形象,但是由于空间问题固有的复杂性和不确定性,“关系”本身很难去定量描述,为了定性的去描述空间关系,大牛们就整出一套套的理论去定义它,这样我们就能进行数字化、量化,进而进行计算机的表达,再去做运算。
其中最为广泛的是九交模型理论(DE-9IM),该模型把空间几何要素划分为内,外,边界三个部分,通过对几何要素这三个部分的关系判断,来定义空间要素的空间关系,有兴趣的同学,想深挖的可以查相关资料。先定义E,I,B:

看下图来个直观认识:

再来一张九交模型的经典图,文氏图的可在网上找到一堆,这里不放了:
Arcgis spatial join工具提供了18个空间关系,PostGIS提供了17个空间拓扑关系函数,这么多的空间拓扑关系,看起来很凌乱又记不住,其实根据实际的使用情况,空间拓扑关系又可分三大类:
包含:contains,within 等
相交:intersect,3DIntersects ,Crosses 等
邻近:Touches ,WITHIN_A_DISTANCE 等

首先我们看Arcgis中如何实现Spatial Join,工具箱里查找该工具。一个Target 图层参数,一个Join图层参数,然后是关系判断,这里Target认为在操作符左边,称作输入图层,Join在操作符右边,称作操作图层(可以参考这一篇文章GIS:谈谈叠加分析),这里的操作符就是空间关系的判断,可以列个公式:
TargetLayer (Spatial Relationships ) JoinLayer
复制
比如A contins B,A 是Target Layer,B是Join Layer,操作符是Contains,如果A中的某要素Contains B中的某要素,这条记录返回为真,然后取相应字段。可选的空间关系列出了18个,具体可以在右边查看对应的解释,英文的容易理解

PostGIS提供的空间拓扑关系函数,可以实现Arcgis中的Spatial Join操作,具体的要能够灵活使用以满足需求

注意一点这些函数只是空间关系的判断,也就是说我们可以放在where子句中作为条件的,他并不生产空间要素,用户可以随便怎么组合应用在自己的项目中,基于某种空间关系的判断去实现自己需求,最简单的例子,想要计算所有穿过河南省的高速公路的长度,那首先要坐的就是判断哪些高速公路穿过了河南省,这就是线面的空间关系的判断。使用时注意参数类型,一般为geometry或者geography。
相对比的话,Postgis函数的第一个参数相当于TargetLayer,第二个参数相当于JoinLayer,切勿生搬硬套,一定要掌握PostGIS各种空间关系函数的含义,就可以摈弃Arcgis的各种难受限制,在具体场景中灵活使用。
有些表达可能欠妥或不准确,有不明白的地方欢迎交流。下一篇直接介绍常用函数的使用以及注意点。

◆
