要判斷兩個多邊形的關係,實際上屬於幾何圖形空間關係判斷。幾何圖形並不只有多邊形一種,它包括點、線、面構成的任何圖形,兩兩之間相互關係也有很多種,因此空間關係非常複雜。根據前人的研究,總結出了de-9im模型,作為一種空間關係判斷的標準。
de-9im,全稱是dimensionally extended nine-intersection model (de-9im),是一種拓撲模型,用於描述兩個幾何圖形空間關係的一種標準。在專業領域,通常將每個幾何圖形分為三部分:外部(exterior),邊界(boundary)和內部(interior)。相像一下,乙個矩形的三個部分分別是指哪些地方?兩個圖形的關係判斷,實際上就是三個部分的分別判斷,因此就會有乙個3*3交叉矩陣,這個矩陣就是de-9im模型,如下圖:
其中,a,b分別代表兩個面,i,b,e分別表示它的三個部分。dim()函式表示相交部分的維度。如果相交部分是乙個面,則是二維,即dim()=2;如果相交部分是一條線,則為一維,dim()=1;如果相交部分是一些點,則為0維,dim()=0;如果不相交,則dim()=-1;從上往下,從左往右讀取這個矩陣,就會有乙個字串,如"212101212",即將相互關係轉換成了乙個字串,最終對字串進行判斷就可以了。上面的圖只是許多關係中的一種,畫的是相交的情形,所以並沒有出現-1的情況。
如果換一種寫法,我們將(0,1,2)認為是相交,寫為t,-1認為不相交,寫為f。則"212101212"變為"ttttttttt"。 實際上這9個值,我們只需要知道其中幾個值就能作出判斷了,不需要全部知道。比如我們只要知道第一位是t,就能判斷兩者相交,而後面8位是什麼並不關心。不關心是什麼值,我們就用*來代替,因此,我們只要看到"t********",就知道兩個圖形相交。
將關係用專業術語來表達,我們就叫謂詞,比如相交、接觸、重疊、包含等。關係比較多,定義也是非常精細。我們這裡只考慮兩個面(兩個多邊形)的關係,因此,只需要掌握幾種關係就可以了。如果需要判斷點、線關係的,建議去 仔細看看,介紹得非常詳細。
面之間的關係,主要兩種:相交和脫離(不相交),相交又分為接觸、重疊、覆蓋和相等。
謂詞返回值
描述相等(equals)
t*f**fff*
邊界上的點和內部的點全部重合。屬於相交的一種
脫離(disjoint)
ff*ff****
不相交,與相交相反
接觸(touches)
ft*******\f**t*****\f***t****
只有邊界上有共同點,內部沒有。屬於相交的一種
覆蓋(covers)
t*****ff*\*t****ff*\***t**ff*\****t*ff*
b上的每個點都在a上(邊界和內部),且所有點都不在a外部。屬於相交的一種
重疊(overlaps)
t*t***t**\1*t***t**
a和b相交,且具有一部分共同點,但不是全部內部點。屬於相交的一種
上圖分別表示:覆蓋、接觸和重疊
在geos中, 這五種關係,分別有對應的函式,返回乙個bool值
a->equals(b) //另外,如果ab脫離,還可以用判斷ab是否相等,返回
a->disjoint(b) //
判斷ab是否脫離
a->touches(b) //
判斷ab是否接觸
a->covers(b) //
判斷ab是否覆蓋,注意和contains的區別
a->overlaps(b) //
判斷兩者是否有重疊部分
a->distance(b) 計算兩者間的最短距離。
如果ab重疊,還可以用
a->intersection(b) 返回相交部分的幾何圖形。
如果不知道兩者之間是什麼關係 ,可以使用
a->relate(b) 來返回一串字串,然後去匹配字串,看屬於哪一種關係。
具體**練習後續
Geos庫學習之(三) 幾何物件空間關係
目錄 一.基礎介紹 二.geos裡面空間幾何關係判斷的用法 三.總結 常見的基礎幾何物件主要包括點 線 面所構成的圖形。在進行幾何物件空間關係判斷的時候,我們在geos裡面主要使用的是de 9im dimensionally extended nine intersection model de 9...
GEOS庫學習之四 幾何關係判斷
include geos.h geometryfactory factory 建立一條環線,與線的區別就是環線是閉合的。即第乙個點和最後一點重合 linearring creategeosring double x,double y,double offset 建立乙個多邊形,如果多邊形內部沒有孔洞...
資料庫學習之三
decode的使用 多表,intersect交集 minus減集 union並集 union all 並集不去重 在表中將每一條資料看成乙個元素,元素的段必須相同 求薪水排名前6 10的人 採用decode函式 count計數函式 group by分組函式 掌握兩個表的連線方式 第乙個表的每一條資料...