Monday, February 13, 2012

建立 Oracle Spatial WFS Part II

Oracle Web Feature Service 架構
如上圖,要特別指出的是,在Application Server上提供WFS Server API,資料是儲存在資料庫上的"Spatial Tables",所以要透過"Feature Mapping"或稱為Publish (發佈)提供原"Spatial Tables"額外的資訊以滿足WFS的要求,但是原"Spatial Tables"並不需要再多一份複製(所以是用"Feature Mapping"這個字眼)。
設定Oracle WFS 的步驟,如下圖
在這些設定步驟,我們會使用SDO_WFS_PROCESS與SDO_WFS_LOCK packages
1. Set capabilities info
設定 Server Capabilities 的方法有(任選一種方法就可以)
I. 將外部"WFScapabilitiesTemplate.xml" 載入資料庫
以SYSTEM登入資料庫,執行下列SQL (WFScapabilitiesTemplate.xml 放在'/u01/oracle/db/product/11.2.0.3/dbhome_1' 目錄下
create or replace directory WFS_XML
  as '/u01/oracle/db/product/11.2.0.3/dbhome_1';
begin
  SDO_WFS_PROCESS.insertCapabilitiesInfo(
    xmltype(
      bfilename('WFS_XML', 'WFScapabilitiesTemplate.xml'),
      nls_charset_id('AL32UTF8')
    )
  );
end;
/
commit;
II. 直接使用PL/SQL載入WFScapabilitiesTemplate.xml 的內容
範例
WFS GetCapabilities 測試URL:
http://localhost:7001/SpatialWS-SpatialWS-context-root/xmlwfsservlet?request=GetCapabilities&service=WFS&version=1.0.0
正確的設定應該會出下面的結果
2. Enable the schema
這個步驟相對簡單,只要透過MDSYS, SYSTEM或SYS執行"SDO_WFS_PROCESS.GrantMDAccessToUser"
SQL> execute SDO_WFS_PROCESS.GrantMDAccessToUser('MVDEMO')

3. Publish Table
必須要用SYSTEM或SYS來執行(但不包括MDSYS)Publish Tables的預儲程序(stored procedure)
範例:
declare
  featureDescriptorXML CLOB :=
    '<?xml version="1.0" ?>
       <FeatureType xmlns:mvdemons="http://www.myserver.com/mvdemo" 
         xmlns="http://www.opengis.net/wfs">
         <Name> mvdemons:Cities</Name>
         <Title>Cities</Title>
         <SRS>SDO:8307</SRS>
     </FeatureType>';
begin
  SDO_WFS_PROCESS.publishFeatureType(
    dataSrc           => 'MVDEMO.CITIES',
    ftNsUrl           => 'http://www.myserver.com/mvdemo',
    ftName            => 'Cities',
    ftNsAlias         => 'mvdemons' ,
    featureDesc       => xmltype(featureDescriptorXML),
    schemaLocation    => null,
    pkeyCol           => 'CITY',
    columnInfo        => MDSYS.StringList('PointMemberType'),
    pSpatialCol       => 'LOCATION',
    featureMemberNs   => null,
    featureMemberName => null,
    srsNs             => null,
    srsNsAlias        => null
  );
end;
/
其中 MVDEMO.CITIES
SQL> desc cities
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 LOCATION                                           MDSYS.SDO_GEOMETRY
 CITY                                               VARCHAR2(42)
 STATE_ABRV                                         VARCHAR2(2)
 POP90                                              NUMBER
 RANK90                                             NUMBER

說明
featureDescriptorXML為當收到 GetCapabilities要求時,所回傳XML的內容
dataSrc => 'MVDEMO.CITIES' 表示所對應旳Schema與Table名稱
ftName => 'Cities' 表示WFS的Feature Name
pkeyCol => 'CITY' 表示該表的的 Primary Key
columnInfo => MDSYS.StringList('PointMemberType') 表示所對應GML 圖徵)feature)的型態
pSpatialCol => 'LOCATION' 表示表格為SDO_GEOMETRY欄位型態的欄位名稱

4. Register table for updates
Oracle Spatial WFS 支援 WFS-T。要能支援WFS-T需要將能提供此項功能的資料表格進行註冊。透過該表格的擁有者(Owner)執行SDO_WFS_LOCK.registerFeatureTable
範例:
SQL> execute SDO_WFS_LOCK.registerFeatureTable('MVDEMO','CITIES')

5. Notify WFS server
新增的異動並不動自動送到WFS server,透過MDSYS, SYSTEM或SYS執行SDO_WFS_PROCESS. insertFtMDUpdated來通知WFS有新的更新異動;WFS 則會每10秒(預設)(定義在<wfs_cache_sync_interval>10000</wfs_cache_sync_interval>)來檢查更新的時間,如果有變動,則會載入新的WFS定義
範例:
SQL> execute SDO_WFS_PROCESS.InsertFtMDUpdated('http://www.myserver.com/mvdemo','Cities', sysdate)

6. Grant access rights
給予"匿名使用者"對資料表格適當的存取權限。以本範來說,MVDEMO.CITIES需要給予SELECT、INSERT、UPDATE、DELETE(為滿足WFS-T的功能)。
SQL> grant SELECT, INSERT, UPDATE, DELETE on cities to SpatialWsXmlUser;

7. Set Configuration params
主要是修改 WEB-INF/conf/wsconfig.xml 的設定內容(基本上使用預設就可以了)

<wfs_cache_sync_interval>10000</wfs_cache_sync_interval>
設定WFS檢查異動同步的時間間隔
<wfs_query_timeout>10</wfs_query_timeout>
預設查詢鎖定時間(單位是分鐘)
<wfs_lock_expiry>4</wfs_lock_expiry>
預設異動鎖定時間(單位是秒)
<cached_feature_types>
  <feature_type ns="http://www.myserver.com/mvdemo" name="Cities" />
  <feature_type ns="http://www.myserver.com/mvdemo" name="Counties" />
</cached_feature_types>
設定需要放置於WFS memory cache 的Features

No comments: