Thursday, November 10, 2011

移除Oracle Spatial 中不需要的點

在使用Mapviewer來顯示Spatial的屬性, 如果發現無法顯示(已經使用了Stick Text), 應該要如何處理呢?
首先, 要檢查該 Spatial content 的SDO_GTYPE是否為 2003 或是2007. 若不是, Label 是無法正常顯二的. 因此, 最常發生的是spatial content內含有 "點" 或者是"點集合".透過檢查sdo_elem_info, 來了解 spatial content, 是否包含了非多邊型(polygons)的元件.
接下來要處理的問題就是將這些不要的點移除. 以下為移除點的函數(Provided by Siva Ravada)


create or replace function remove_points(g IN sdo_geometry)
return sdo_geometry deterministic as
els number;
g1 sdo_geometry;
g2 sdo_geometry;
idx number;
begin

   g2 := null;
   els := sdo_util.getnumelem(g);
   FOR idx in 1 .. els LOOP
     g1 := sdo_util.extract(g, idx);
     if ( (g1.sdo_gtype <> 2001) AND (g1.sdo_gtype <> 2005) ) then
      g2 := sdo_util.append(g2, g1);
     end if;
   END LOOP;
    return g2;
end;
/
舉例來說, Table M_ADMIN_AREA0 (from Naviteq world sample data sets)中的 'North America' spatial content 的 SDO_GTYPE 是 2004 (elements collections), 是無法正常顯示 Label, 檢查內容, 發現有多餘的"點". 因此可以透過 remove_points function 來移除點.


update M_Admin_Area0  set geometry = remove_points(geometry)
where name = 'North America';