ArcSDE vs. Oracle Spatial 11

來源:互聯網
上載者:User
1. 格網索引的建立和調整

ArcSDE提供了最多3級的空間索引,如何選擇空間索引的層級、格網的網格大小設定多少合適等都關係到空間資料的效能。這裡我們通過一個簡單的Polygon圖層入手,探討一些格網空間索引的效能影響因素。

首先我們在ArcSDE中準備一個WGS84的面層,名為“TESTGRID”。在這個面層上我們添加2個要素,一個較小,一個較大, 10所示。為了提供一些參考資訊,圖中還將WGS84座標範圍按照30度的尺寸進行了分割,顯示在這2個要素之下。


10 ArcSDE中有2個要素的面層

上述的資料如果我們建立3級索引,為了直觀起見,我們可以把最小的網格尺寸定位30,也就是圖 10中方格的大小。因此網格最大的第3級可以選擇尺寸為270×270,那麼第2級可以設定為90×90,第1級設定為30×30。我們如下建立空間索引:

SQL> CREATE INDEX A141_IX1 on TESTGRID(shape)

INDEXTYPE is ST_SPATIAL_INDEX

PARAMETERS ('ST_GRIDS=30,90,270 ST_SRID=2');

odciindexcreate

CREATE TABLE SDE.S141_IDX$ (gx integer, gy integer, minx integer,miny integer, maxx integer, maxy integer, sp_id

rowid,constraint S141$_IX1 primary key(gx,gy,maxx,maxy,minx,miny,sp_id)) organization index pctthreshold 5 pctfree 0

initrans 4

索引已建立。

讓我們看看這個資料集中的2個要素是如何被索引的:

SQL> select * from S141_IDX$;

GX GY MINX MINY MAXX MAXY SP_ID

---------- ---------- ---------- ---------- ---------- ---------- ------------------

33554432 33554433 2.3376E+11 3.3580E+11 3.8784E+11 4.8211E+11 AAATb9AAFAAAEJIAAA

33554433 33554433 2.3376E+11 3.3580E+11 3.8784E+11 4.8211E+11 AAATb9AAFAAAEJIAAA

15 14 4.6386E+11 4.3176E+11 4.7062E+11 4.3886E+11 AAATb9AAFAAAEJIAAB

SQL> select * from testgrid where rowid='AAATb9AAFAAAEJIAAA';

OBJECTID

----------

SHAPE(ENTITY, NUMPTS, MINX, MINY, MAXX, MAXY, MINZ, MAXZ, MINM, MAXM, AREA, LEN, SRID, POINTS)

------------------------------------------------------------------------------------------------------------------------

1

ST_GEOMETRY(8, 8, -166.23891, -64.197952, -12.163823, 82.105802, NULL, NULL, NULL, NULL, 12078.8885, 439.10602, 2, 'A001

000001000000BEE79CA1B50FB1D3C6A0C819C89FA3CDE701DA85E8C8E2019FEDA487A902F8E9B481920185D4FDCDB002F9EFC4E08D03A8A697A4A204

99F1A8D8CC03E683F0859701BDBDB2CFC203C4BDF6ED9C0384D1B5DEB201DA88B0B8E002CFA1AFDBBF02')

SQL> select * from testgrid where rowid='AAATb9AAFAAAEJIAAB';

OBJECTID

----------

SHAPE(ENTITY, NUMPTS, MINX, MINY, MAXX, MAXY, MINZ, MAXZ, MINM, MAXM, AREA, LEN, SRID, POINTS)

------------------------------------------------------------------------------------------------------------------------

2

ST_GEOMETRY(8, 4, 63.8600683, 31.7610922, 70.6177474, 38.8566553, NULL, NULL, NULL, NULL, 22.6047828, 21.6768769, 2, '2A

00000001000000B0BF87B0B21BBA86A9DEC519CD81D0AC32F8E6EC9114A89AF7E52ACCE780DD20A5E6D8C60784CEEDEE34')

從節點數目可以判斷,'AAATb9AAFAAAEJIAAA'對應的是大的多邊形,'AAATb9AAFAAAEJIAAB'對應的是小的多邊形。先看小的多邊形,GX、GY分別為15、14,可見小多邊形是在網格尺寸為30的第1級上被索引的;而大多邊形被索引了2次,應該是在其它層級上被索引的,但是GX、GY的值卻不能用前面的簡單的演算法來解釋,這是為什麼呢?

事實上,這個大的多邊形是在第3級上進行的索引,也就是說ArcSDE自己會判斷一個幾何對象到底應該在第幾級上進行索引,關於這個演算法,可以從ArcSDE的SPX_UTIL包裡找到:

Procedure compute_feat_grid_envp (gsize1 IN integer,

gsize2 IN integer,

gsize3 IN integer,

e_minx IN integer,

e_miny IN integer,

e_maxx IN integer,

e_maxy IN integer,

g_minx Out integer,

g_miny Out integer,

g_maxx Out integer,

g_maxy Out integer)

IS

Begin

g_minx := trunc(e_minx / gsize1);

g_miny := trunc(e_miny / gsize1);

g_maxx := trunc(e_maxx / gsize1);

g_maxy := trunc(e_maxy / gsize1);

If ((g_maxx - g_minx + 1) * (g_maxy - g_miny + 1) > max_grids_per_level

AND gsize2 > 0) THEN

g_minx := trunc(e_minx / gsize2);

g_miny := trunc(e_miny / gsize2);

g_maxx := trunc(e_maxx / gsize2);

g_maxy := trunc(e_maxy / gsize2);

If ((g_maxx - g_minx + 1) * (g_maxy - g_miny + 1) > max_grids_per_level

AND gsize3 > 0) THEN

g_minx := trunc(e_minx / gsize3);

g_miny := trunc(e_miny / gsize3);

g_maxx := trunc(e_maxx / gsize3);

g_maxy := trunc(e_maxy / gsize3);

g_minx := g_minx + grid_level_mask_2;

g_miny := g_miny + grid_level_mask_2;

g_maxx := g_maxx + grid_level_mask_2;

g_maxy := g_maxy + grid_level_mask_2;

ELSE

g_minx := g_minx + grid_level_mask_1;

g_miny := g_miny + grid_level_mask_1;

g_maxx := g_maxx + grid_level_mask_1;

g_maxy := g_maxy + grid_level_mask_1;

End If;

End If;

End compute_feat_grid_envp;

其中有幾個常量,在SPX_UTIL的包頭裡可以找到:

max_grids_per_level Constant pls_integer := 4;

grid_level_mask_1 Constant pls_integer := 16777216;

grid_level_mask_2 Constant pls_integer := 33554432;

也就是說ArcSDE索引一個幾何對象的時候是從第1級格網開始判斷,如果某個幾何對象跨越的網格數大於1個(或者說1個網格不能包含某個幾何對象)、同時第2級的網格尺寸大於0的時候, ArcSDE就會在第2級網格上再進行類似的計算;同理,如果還有第3級網格可用,ArcSDE還有可能把該幾何對象索引到第3級網格上去。總的來說,ArcSDE試圖用最少的網格來索引幾何對象。

另外,為了區分不同層級的網格,這裡還有grid_level_mask_1=16777216和grid_level_mask_2=33554432兩個常量,分別用於第2級和第3級網格序號的標識,不同層級的網格會根據當前格網的等級分別加上0(第1級)或grid_level_mask_1(第2級)或grid_level_mask_2(第3級)。由此可見,上面那個大的多邊形被索引的兩個網格的GX、GY應該減去33554432,也就是分別是GX=0,GY=1和GX=1,GY=1,這是個第3級的索引。

基於上面的原則,我們可以對如何選取空間索引的網格尺寸應該有一些原則性的判斷:

l 如果沒有特別的需要,可以使用一級索引的話用一級索引會比較好,因為如果有多級索引,查詢的時候會掃描所有的索引層級

l 對於幾何對象大小變化較大,並且各個量級的對象數量相當的資料才可能需要設定多級索引

l 對於點資料,只需要設定一級索引(幾何對象大小沒有變化),並且設定網格到較大的尺寸(避免一個網格中只有幾個點的情況)

l 如果資料量有了很大的變化以後,可能需要重新計算並調整網格的尺寸

對於網格的尺寸,可以通過資料的範圍平均值進行一個估算,一般可以取該值的3~4倍,比如對於剛才的那個面層,通過這樣的命令可以進行一個大概的估算:

SQL> select 4*( avg(t.shape.maxx-t.shape.minx) + avg(t.shape.maxy-t.shape.maxy) )/2 from testgrid t;

4*(AVG(T.SHAPE.MAXX-T.SHAPE.MINX)+AVG(T.SHAPE.MAXY-T.SHAPE.MAXY))/2

-------------------------------------------------------------------

160.832765

當然,更簡單的方法就是通過ArcCatalog來計算, 11。


11 通過ArcCatalog來重新計算適合的網格尺寸

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.