1. 問題描述
- 有一批港口的選址方案滥壕,符合標準的選址方案是:港口(線型)的一端必須與湖岸相交纸颜,并且港口的所有其他部分都要在湖中。目前有5個選址的方案绎橘,這些方案哪些是符合標準的胁孙?
file
2. 九交模型介紹
2.1 空間要素的組成部分
-
首先,定義所有的空間要素都有
- 內(nèi)部(interior)
- 邊界(boundary)
- 外部(exterior)
-
面:
file -
線:
file -
點:
I B(為空) E
file
2.2 九交模型
兩個幾何圖形的空間關(guān)系称鳞,可以用以下矩陣表示:
file
舉例來說涮较,就是以下的表達方式,點-點冈止、點-線狂票、點-面、線-線熙暴、線-面闺属、面-面的空間關(guān)系可以依次推導:
file
2.3 一些典型的空間關(guān)系
OGC中標準的空間關(guān)系
序號 | 空間關(guān)系 | 中文名稱 | pg函數(shù) | 解釋 | 相交關(guān)系 |
---|---|---|---|---|---|
1 | Contains / Inside | 包含 | 一個幾何圖形的內(nèi)部完全包含了另一個幾何圖形 | file
|
|
2 | Croses | 交叉、穿過 | 一個幾何圖形的內(nèi)部和另一個幾何圖形的邊界和內(nèi)部相交周霉,在不同維度圖形使用掂器,如線和面 | file
|
|
3 | Disjoint | 分離 | 兩個幾何圖形的邊界和內(nèi)部不相交 | file
|
|
4 | Equal | 相等 | 兩個幾何圖形具有相同的邊界和內(nèi)部 | file
|
|
5 | Intersects | 相交 | 兩個幾何圖形沒有分離(Non-Disjoint) | 除了分離以外的所有情況 | |
6 | Overlaps | 重疊 | 兩個圖形的邊界和內(nèi)部相交(Intersect) | file
|
|
7 | Touch | 接觸 | 兩個幾何圖形的邊界相交,但是內(nèi)部不相交 | file
|
|
8 | Within | 包含于 | 一個幾何圖形的內(nèi)部和邊界完全在另一個幾何圖形的內(nèi)部 | file
|
2.4 擴展
三維空間拓撲關(guān)系
點-點空間關(guān)系2種:相離俱箱、相等唉匾;
點-線空間關(guān)系3種:相離、相接、包含于巍膘;
點-面空間關(guān)系3種:相離厂财、相接、包含于璃饱;
點-體空間關(guān)系3種:相離荚恶、相接磷支、包含于;
線-線空間關(guān)系7種:相離廓潜、相交、交疊挽霉、相等悼院、相接咒循、包含于、包含昨凡;
線-面空間關(guān)系5種:相離便脊、相接光戈、進入、穿越晌杰、包含于筷弦;
線-體空間關(guān)系5種:相離抑诸、相接蜕乡、進入层玲、穿越反症、包含于;
面-面空間關(guān)系10種:相離润绵、相接胞谈、交疊、相等悔叽、包含于爵嗅、包含笨蚁、覆蓋、被覆蓋伪很、穿越锉试、被穿越览濒;
面-體空間關(guān)系8種:相離、相接应又、交疊乏苦、進入、包含于洞就、包含奖磁、穿越、被穿越秕狰;
體-體空間關(guān)系8種:相離躁染、相接、進入我衬、相等挠羔、包含于埋嵌、包含、穿越范舀、被穿越了罪。
3. 如何在PostgreSQL中利用9交模型解決碼頭選址問題泊藕?
3.1 分析:
碼頭必須擁有以下特征:
- 碼頭一端與湖岸相接→B(a)∩B(b) = 0
- 碼頭在湖中→I(a)∩I(b) = 1
- 碼頭不在湖以外的地區(qū) → I(a)∩E(b) = F
- 碼頭的另外一端在湖中 → B(a)∩I(b) = 0
所以整理得到九交滿足的碼頭標準為:1FF00F212
file
3.2 計算過程
- 數(shù)據(jù)初始化
CREATE TABLE lakes ( id serial primary key, geom geometry ); --創(chuàng)建帶有坐標的geom表
CREATE TABLE docks ( id serial primary key, good boolean, geom geometry ); --創(chuàng)建碼頭表
INSERT INTO lakes ( geom ) VALUES ( 'POLYGON ((100 200, 140 230, 180 310, 280 310, 390 270, 400 210, 320 140, 215 141, 150 170, 100 200))'); -- 初始化數(shù)值
INSERT INTO docks ( geom, good ) VALUES ('LINESTRING (170 290, 205 272)',true),('LINESTRING (120 215, 176 197)',true),('LINESTRING (290 260, 340 250)',false),('LINESTRING (350 300, 400 320)',false),('LINESTRING (370 230, 420 240)',false),('LINESTRING (370 180, 390 160)',false); --初始化碼頭
file
- 進行相交分析
SELECT docks.* FROM docks JOIN lakes ON ST_Intersects(docks.geom, lakes.geom) WHERE ST_Relate(docks.geom, lakes.geom, '1FF00F212');--ST_Intersects先進行求交運算玫锋,判斷
4. 9交模型的運算效率如何景醇?
- 敬請期待