PostGIS教程二十一 3 D

2021-09-22 17:55:25 字數 4249 閱讀 2320

目錄

一、3-d幾何圖形

二、3-d函式

三、n-d索引

注意:本節介紹許多postgis2.0及更高版本才支援的功能。

到目前為止,我們一直在處理2-d幾何圖形(二維幾何圖形),只有x和y座標。但是postgis支援所有幾何圖形型別額外的維度,對於每個座標,另外還能支援用於表示高度資訊的"z"維度以及用於新增額外附加資訊的"m"維度(通常為時間、道路英里或距離資訊)。

對於3-d和4-d幾何圖形,額外的維度將作為幾何圖形中每個頂點的額外座標新增,並且幾何圖形型別將得到增強,以指示如何解譯額外的維度。新增額外維度會為每個基本幾何圖形額外新增三種幾何圖形型別:

對於well-known text(wkt)的表示,高維幾何圖形由iso sql/mm規範提供。附加維度資訊僅新增到型別名稱後的文字字串中,額外座標新增在x/y資訊之後,例如:

在處理3-d和4-d幾何圖形時,st_astext()函式將返回上述表示。

對於well-known binary(wkb)表示,高維幾何圖形的格式由iso sql/mm規範提供。該格式的bnf錶可在 查詢。

除了標準型別的高維形式外,postgis還包括一些在三維空間中有意義的新型別:

由於這兩種型別都用於對三維物件建模,因此使用z變數才是真正有意義的。polyhedralsu***ce z的乙個示例是1單位立方體:

polyhedralsu***ce z (((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),((0 0 0, 0 1 0, 0 1 1, 0 0 1, 0 0 0)),((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),((1 1 1, 1 0 1, 0 0 1, 0 1 1, 1 1 1)),

((1 1 1, 1 0 1, 1 0 0, 1 1 0, 1 1 1)),

((1 1 1, 1 1 0, 0 1 0, 0 1 1, 1 1 1))

)

有許多函式可用於計算三維物件之間的關係:

例如,我們可以使用st_3ddistance函式計算單位立方體與點之間的距離:

-- this is really the distance between the top corner-- and the point.select st_3ddistance('polyhedralsu***ce z (((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),

((0 0 0, 0 1 0, 0 1 1, 0 0 1, 0 0 0)),

((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),

((1 1 1, 1 0 1, 0 0 1, 0 1 1, 1 1 1)),

((1 1 1, 1 0 1, 1 0 0, 1 1 0, 1 1 1)),

((1 1 1, 1 1 0, 0 1 0, 0 1 1, 1 1 1))

)'::geometry,

'point z (2 2 2)'::geometry

);

-- so here's a shorter form.

select st_3ddistance(

'point z (1 1 1)'::geometry,

'point z (2 2 2)'::geometry

);

-- both return 1.73205080756888 == sqrt(3) as expected

一旦有了更高維度的資料,對其進行索引可能是有意義的。但是,在應用多維索引(multi-dimensional index)之前,應該仔細考慮資料在所有維度中的分布情況。

索引僅在允許資料庫中where條件查詢中大幅減少返回行數時才有用。要使更高維度的索引有用,資料必須分布在該維度的廣泛範圍中(相對於你正在構造的查詢)

你可以為任何維度(甚至混合維度)的資料建立多維索引。例如,要在nyc_streets表上建立多維索引。

gist_geometry_ops_nd引數告訴postgis使用n-d索引而不是標準的2-d索引

構建索引後,可以在查詢中使用&&&索引操作符,&&&和&&是相同的語義——邊界框相交——區別在於,&&&使用幾何圖形的所有維度來應用這個語義。維數不匹配的幾何圖形不會相交。

-- returns true (both 3-d on the zero plane)select 'point z (1 1 0)'::geometry &&&'polygon ((0 0 0, 0 2 0, 2 2 0, 2 0 0, 0 0 0))'::geometry;-- returns false (one 2-d one 3-d)select 'point z (1 1 1)'::geometry &&&

'polygon ((0 0, 0 2, 2 2, 2 0, 0 0))'::geometry;

-- returns true (the volume around the linestring interacts with the point)

select 'linestring z(0 0 0, 1 1 1)'::geometry &&&

'point(0 1 1)'::geometry;

要使用n-d索引搜尋nyc_streets表,只需將&&2-d索引運算子替換為&&&3-d索引運算子。

-- n-d index operatorselect gid, namefrom nyc_streetswhere geom &&&st_setsrid('linestring(586785 4492901,587561 4493037)' :: geometry,26918);

-- 2-d index operator

select gid, name

from nyc_streets

where geom &&

st_setsrid('linestring(586785 4492901,587561 4493037)' :: geometry,26918);

結果應該是一樣的。一般來說,n-d索引只比2-d索引執行速度稍慢一些,所以只使用n-d索引,因為n-d查詢將提高查詢的多維度選擇性。

大資料之Java基礎(二十一) IO流 3

一 轉換流 1.outputstreamwriter類 outputstreamwriter是字元流通向位元組流的橋梁,可以將字串按照指定的編碼轉成位元組 流,然後可以使用fileoutputstream將位元組流寫入到檔案。使用outputstreamwriter 將位元組轉成指定編碼的字元,並寫...

OpenGL教程之向3D進軍

在上節課的內容上作些擴充套件,我們現在開始生成真正的3d物件,而不是象前兩節課中那樣3d世界中的2d物件。我們給三角形增加乙個左側面,乙個右側面,乙個後側面來生成乙個金字塔 四稜錐 給正方形增加左 右 上 下及背面生成乙個立方體。我們混合金字塔上的顏色,建立乙個平滑著色的物件。給立方體的每一面則來個...

OpenGL教程之漫遊3D世界

10.1 資料結構 當您想要使用一系列的數字來完美的表達3d環境時,隨著環境複雜度的上公升,這個工作的難度也會隨之上公升。出於這個原因,我們必須將資料歸類,使其具有更多的可操作性風格。在程式清單頭部出現了sector 區段 的定義。每個3d世界基本上可以看作是sector 區段 的集合。乙個sect...