本文轉自http://www.blogjava.net/reeve/archive/2007/08/01/133759.html
最近因為工作的關係,開始接觸GIS,採用開源的Geoserver、Geotools、Mapbuilder來開發,資料庫使用oracle spataral,剛開始是一直在看別人已經做好的一個半成品系統,自己模仿著來改,GIS採用的資料格式比較特殊,不能使用一般的導表方式來導,而且地圖檔案的格式也比較特殊,一般是shp、或者是tab,這裡主要是用的shp檔案,因此需要將shp檔案進行處理,轉換成oracle資料格式,其實也沒什麼難的,只是如果不熟悉的話,可能也需要浪費一點時間來看一下。
首先我們要把shp檔案轉換分割成oracle可以匯入的資料庫檔案,這個轉換可以使用oracle提供的一個現成的工具shp2sdo(很小),可以到官方網站去找(不過可能不是很好找,需要的可以留下郵箱),下載後把此檔案複製到PATH變數包含的目錄下,如我的oracle用戶端安裝後自動註冊的環境變數是 path C:\Oracle\product\10.1.0\Client_1\bin;,我們可以把此檔案拷貝到該目錄下,然後在dos下運行該工具,定位到我們的shp檔案的位置,例如我們的shp檔案名稱是state.shp(shapefile包括至少三個檔案state.shp state.dbf state.idx)在D:\data\目錄下,我們在dos命令視窗下就應該這樣操作
shp2sdo state statearea -i gid -s 8307 -g -d
其中state即為本地的shp檔案名稱(不加shp尾碼),statearea為產生的檔案名稱(同時也是將來導進資料庫的表名),-d代表含義是將分解後的ctl檔案(控制檔案)和data檔案(資料存放區檔案)分別產生,如果沒有該選項,則不會有單獨的data檔案產生,資料存放區和控制都在ctl一個檔案中, 經常用到的還有選項 -i id_colum指定id序列列,預設是id,即作為產生資料的唯一性標誌,此列是不可能重複的,一般作為索引列,-s **指定產生srid,預設是null,目前一般是8307吧,-g geometry column指定sdo_geometry,預設是GEOM,此選項一般使用預設即可,命令執行後,會產生三個檔案,statearea.sql、statearea.ctl、stateare.data。
分解完成後就是匯入,這裡仍然使用命令列的方式
D:\data\>sqlplus pgg/pgg@orcl
SQL>@statearea.sql
SQL>quit
匯入ctl檔案
D:\data\>sqlldr pgg/pgg@orcl statearea
建立空間索引
D:\data\>sqlplus pgg/pgg@orcl
SQL>CREATE Index STATEAREA_idx ON STATEAREA (GEOM) INDEXTYPE is MDSYS.SPATIAL_INDEX;
至此空間資料匯入完畢。
另外還需要建立一個視圖,具體作用說不大清楚,但在啟動程式發布地圖的時候會用到,如果沒有此視圖檔案會出現圖層無法map的錯誤,建立過程如下:
SQL> CREATE OR REPLACE VIEW CS_SRS AS
2 SELECT "CS_NAME","SRID","AUTH_SRID","AUTH_NAME","WKTEXT","CS_BOUNDS"
3 FROM MDSYS.CS_SRS
4 /
另外如果自己手工建立圖層的話,過程如下:
DROP TABLE BZXX;
CREATE TABLE BZXX(
GID VARCHAR2(32) NOT NULL,
NAME VARCHAR2(20),
BZNR VARCHAR2(400),
BEIZ VARCHAR2(600),
COOR MDSYS.SDO_GEOMETRY
);
ALTER TABLE BZXX
ADD CONSTRAINT PK_BZXX PRIMARY KEY (GID);
DELETE FROM USER_SDO_GEOM_METADATA
WHERE TABLE_NAME = 'BZXX' AND COLUMN_NAME = 'COOR' ;
INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)
VALUES ('BZXX', 'COOR',
MDSYS.SDO_DIM_ARRAY
(MDSYS.SDO_DIM_ELEMENT('X', -180.000000000, 180.000000000, 0.500000000),
MDSYS.SDO_DIM_ELEMENT('Y', -90.000000000, 90.000000000, 0.500000000)
),
8307);
COMMIT;
CREATE INDEX BZXX_GEOM_INDEX ON BZXX(COOR)
INDEXTYPE IS MDSYS.SPATIAL_INDEX
PARAMETERS('SDO_INDX_DIMS=2, LAYER_GTYPE=POINT');
最近因為工作的關係,開始接觸GIS,採用開源的Geoserver、Geotools、Mapbuilder來開發,資料庫使用oracle spataral,剛開始是一直在看別人已經做好的一個半成品系統,自己模仿著來改,GIS採用的資料格式比較特殊,不能使用一般的導表方式來導,而且地圖檔案的格式也比較特殊,一般是shp、或者是tab,這裡主要是用的shp檔案,因此需要將shp檔案進行處理,轉換成oracle資料格式,其實也沒什麼難的,只是如果不熟悉的話,可能也需要浪費一點時間來看一下。
首先我們要把shp檔案轉換分割成oracle可以匯入的資料庫檔案,這個轉換可以使用oracle提供的一個現成的工具shp2sdo(很小),可以到官方網站去找(不過可能不是很好找,需要的可以留下郵箱),下載後把此檔案複製到PATH變數包含的目錄下,如我的oracle用戶端安裝後自動註冊的環境變數是 path C:\Oracle\product\10.1.0\Client_1\bin;,我們可以把此檔案拷貝到該目錄下,然後在dos下運行該工具,定位到我們的shp檔案的位置,例如我們的shp檔案名稱是state.shp(shapefile包括至少三個檔案state.shp state.dbf state.idx)在D:\data\目錄下,我們在dos命令視窗下就應該這樣操作
shp2sdo state statearea -i gid -s 8307 -g -d
其中state即為本地的shp檔案名稱(不加shp尾碼),statearea為產生的檔案名稱(同時也是將來導進資料庫的表名),-d代表含義是將分解後的ctl檔案(控制檔案)和data檔案(資料存放區檔案)分別產生,如果沒有該選項,則不會有單獨的data檔案產生,資料存放區和控制都在ctl一個檔案中, 經常用到的還有選項 -i id_colum指定id序列列,預設是id,即作為產生資料的唯一性標誌,此列是不可能重複的,一般作為索引列,-s **指定產生srid,預設是null,目前一般是8307吧,-g geometry column指定sdo_geometry,預設是GEOM,此選項一般使用預設即可,命令執行後,會產生三個檔案,statearea.sql、statearea.ctl、stateare.data。
分解完成後就是匯入,這裡仍然使用命令列的方式
D:\data\>sqlplus pgg/pgg@orcl
SQL>@statearea.sql
SQL>quit
匯入ctl檔案
D:\data\>sqlldr pgg/pgg@orcl statearea
建立空間索引
D:\data\>sqlplus pgg/pgg@orcl
SQL>CREATE Index STATEAREA_idx ON STATEAREA (GEOM) INDEXTYPE is MDSYS.SPATIAL_INDEX;
至此空間資料匯入完畢。
另外還需要建立一個視圖,具體作用說不大清楚,但在啟動程式發布地圖的時候會用到,如果沒有此視圖檔案會出現圖層無法map的錯誤,建立過程如下:
SQL> CREATE OR REPLACE VIEW CS_SRS AS
2 SELECT "CS_NAME","SRID","AUTH_SRID","AUTH_NAME","WKTEXT","CS_BOUNDS"
3 FROM MDSYS.CS_SRS
4 /
另外如果自己手工建立圖層的話,過程如下:
DROP TABLE BZXX;
CREATE TABLE BZXX(
GID VARCHAR2(32) NOT NULL,
NAME VARCHAR2(20),
BZNR VARCHAR2(400),
BEIZ VARCHAR2(600),
COOR MDSYS.SDO_GEOMETRY
);
ALTER TABLE BZXX
ADD CONSTRAINT PK_BZXX PRIMARY KEY (GID);
DELETE FROM USER_SDO_GEOM_METADATA
WHERE TABLE_NAME = 'BZXX' AND COLUMN_NAME = 'COOR' ;
INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)
VALUES ('BZXX', 'COOR',
MDSYS.SDO_DIM_ARRAY
(MDSYS.SDO_DIM_ELEMENT('X', -180.000000000, 180.000000000, 0.500000000),
MDSYS.SDO_DIM_ELEMENT('Y', -90.000000000, 90.000000000, 0.500000000)
),
8307);
COMMIT;
CREATE INDEX BZXX_GEOM_INDEX ON BZXX(COOR)
INDEXTYPE IS MDSYS.SPATIAL_INDEX
PARAMETERS('SDO_INDX_DIMS=2, LAYER_GTYPE=POINT');