shp2sdo和oracle的關係及其用法

來源:互聯網
上載者:User
本文轉自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');

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.