版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、7.2 在 Java 中操作幾何體如你所見,空間對象以SDO_GEOMETRY類型存儲(chǔ)在數(shù)據(jù)庫表中。要在Java中對其 進(jìn)行處理,必須首先使用JDBC從數(shù)據(jù)庫中讀取它們,然后把它們映射為Java 類。把SDO_GEOMETRY類型映射為Java類是比較簡單的,這都?xì)w功于Oracle Spatial 提供的API接口。API本身是比較簡單的:它有一個(gè)主要的包(oracle.spatial.geometry),該包中包含兩個(gè)主要的 類(JGeometry和 J3D_Geome try)。這個(gè)API在Oracle Dat abase 11g中被顯著地加強(qiáng)了。它現(xiàn)在 包含許多幾何體的處理函數(shù),同時(shí)也包
2、含可以在一些標(biāo)準(zhǔn)格式(GML、WKT和ESRI 等格式)間進(jìn)行幾何體格式轉(zhuǎn)換的工具函數(shù)。這些工具都位于oracle, spatial. util 包中。Oracle Spatial 的 Java API 由位于 Oracle 安裝目錄($ORACLE_HOME/md/jlib ) 下的兩個(gè)JAR文件(sdoapi.jar和sdoutl.jar)組成。要在應(yīng)用中使用API,須 記得要在類路徑(classpath)中包含上述目錄。你也需要JDBC驅(qū)動(dòng)和XML解析 器(僅用于處理GML)。下面是在Windows環(huán)境中你的類路徑的設(shè)置:C:set classpath=.;%ORACLE_HOME%jd
3、bclibojdbc14.jar;%ORACLE_HOME%mdjlibsdoapi.jar;%ORACLE_HOME%mdjlibsdoutl.jar;%ORACLE_HOME%libxmlparserv2.jar;Oracle Spatial Java API的文檔(Javadoc)在Oracle文檔全集中有,也可以 在你的Oracle安裝目錄中的兩個(gè)文檔$ORACLE_HOME/md/doc/sdoapi.zip和 sdoutl.zip 中找到。在Apress站點(diǎn)中可以找到大量的關(guān)于如何讀、寫和處理幾何體的Java完整示例。 表7-1中列出了這些程序。表7-1 程序示例程序返回信息Sdo
4、Print. java打印出任意表中幾何體的結(jié)構(gòu)SdoExport. java把表中一部分或全部的幾何體導(dǎo) 出到格式為WKT、WKB、GML或其他的文件SdoImport. java把先前導(dǎo)出的幾何體導(dǎo)入到表中7.2.1 使用 JGeometry 類Java中操作幾何體的主要工具就是JGeometry類。它使你可以對數(shù)據(jù)庫中的幾 何體進(jìn)行讀寫,同時(shí)也可以對幾何體進(jìn)行檢查,創(chuàng)建新的幾何體和對這些幾何體 進(jìn)行一系列的轉(zhuǎn)換。幾何體的讀寫當(dāng)你用SQL的SELECT語句讀取對象類型(如SD0_GE0METRY類型)時(shí),JDBC返回 一個(gè)Java結(jié)構(gòu)-更精確地說,是oracle.sql.STRUCT對象。
5、在寫一個(gè)對象的時(shí) 候(用INSERT或UPDATE語句),你仍需要通過oracle.sql.STRUCT對象來傳遞。 對STRUCT的解碼和構(gòu)造都是相當(dāng)復(fù)雜的,而Oracle Spatial Java API(JGeometry類)的主要目標(biāo)就是使得這種操作變得簡單。JGeometry類提供了兩種把STRUCT轉(zhuǎn)換成JGeometry對象的方法:load ()方法用于讀入STRUCT,返回JGeometry對象。當(dāng)你對由SELECT語句返回 的幾何體進(jìn)行轉(zhuǎn)換的時(shí)候,用該方法。store()方法與load ()方法相反。它把JGeometry對象轉(zhuǎn)換成可以通過INSERT 或UPDATE語句寫回
6、數(shù)據(jù)庫中的STRUCT對象。為幾何體對象而優(yōu)化的序列化(pickling)及反序列化(unpickling)方法。因此 它們應(yīng)當(dāng)執(zhí)行得更好。對于讀取一個(gè)幾何體,首先要把這個(gè)對象以字節(jié)數(shù)組的形 式讀入,然后把這個(gè)數(shù)組傳遞給load()方法。圖7-4展示了這個(gè)過程。loadO oracle, spatial-java oracle.spatial.util.SampleShapefile ToJGeomFeature -h -p 1521-s orcl111 -u spatial -d spatial -t us_cities -f shp_c ities -r 8307hos
7、t: port: 1521sid: orcl111db_username: spatialdb_password: spatialdb_tablename: us_citiesshapefile_name: shp_cities10.SRID: 830711.Connecting to Oracle10g using. .1,1521,orcl111, spatial, spatial, us_cities, shp_cities, null, 8307Dropping old table.Creating new table.15.Convertingr
8、ecord#10of19516.Convertingrecord#20of19517.Convertingrecord#30of19518.Convertingrecord#40of19519.Convertingrecord#50of19520.Convertingrecord#60of19521.Convertingrecord#70of19522.Convertingrecord#80of19523.Convertingrecord#90of19524.Convertingrecord#100of19525.Convertingrecord#110of19526.Convertingre
9、cord#120of19527.Convertingrecord#130of19528.Convertingrecord#140of19529.Convertingrecord#150of19530.Convertingrecord#160of19531.Convertingrecord#170of19532.Convertingrecord#180of19533.Convertingrecord#190of19534.195 record(s) converted.35.Done.該類將創(chuàng)建表、加載該表并在USER_SDO_GEOM_METADATA中插入合適的元數(shù)據(jù)。對shape file
10、的簡單說明shapef訂e名字會(huì)讓人產(chǎn)生誤解。每個(gè)shapef訂e至少由3個(gè)文件構(gòu)成,它們的 文件名都相同,只是擴(kuò)展名互不相同。例如,在前面例子中的shp_cities shape file實(shí)際上是下面文件的集合:shp_ci ti es.shp:這個(gè)文件中保存了對實(shí)際幾何體的定義。shp_ci ti es.shx :在形狀上的空間索引。shp_cities.dbf: 一個(gè)dBASE W文件,包含每個(gè)幾何體的屬性。有些 shapefile 中也帶有其他一些文件,如 shp_cities.prj 或 shp_cities.sbn。 這些都會(huì)被Oracle Spatial Java類所忽略。在為s
11、hapefile命名的時(shí)候不要包含.shp擴(kuò)展名。所有組成同一個(gè)shapefile 的文件都應(yīng)該被存儲(chǔ)在同一個(gè)目錄下。在程序中加載shapefileoracle.spatial.util包中包含了 3個(gè)可以用來在你的程序中讀取和加載 shape file的類。表7-11是對它們的總結(jié)。表 7-11Shapefile 處理類類名稱目的ShapefileReaderJGeom提供函數(shù),用來從shapefile中讀取形狀 (幾何體)并把它們轉(zhuǎn)換成JGeometry對象DBFReaderJGeom提供函數(shù),用來從DBF文件中讀取 屬性并獲取該屬性的名稱和類型ShapefileFeaturejGeom使
12、用兩個(gè)讀取類提供高端函數(shù),用來 創(chuàng)建數(shù)據(jù)庫表并從shapefile中對其進(jìn)行 加載下面的例子展示了怎樣用shapef ile處理類把shape file加載器簡單地合并到你 的應(yīng)用中。首先是打開輸入文件并設(shè)置輔助類。要注意的是,shapeFileName中 包含的是沒有擴(kuò)展名的shapefile名稱。/ Open SHP and DBF filesShapefileReaderJGeom shpr = new ShapefileReaderJGeom(shapeF ileName);DBFReaderJGeom dbfr = new DBFReaderJGeom(shapeFileName);
13、ShapefileFeatureJGeom sf = new ShapefileFeatureJGeom();然后提取shapefile的維度,也就是在文件中的所有維度上的所有幾何體坐標(biāo)的 最大值和最小值。1. / Get shapefile bounds and dimension2. doubleminX=shpr.getMinX();3. doublemaxX=shpr.getMaxX();4. doubleminY=shpr.getMinY();5. doublemaxY=shpr.getMaxY();6. doubleminZ=shpr.getMinZ();7. doublemaxZ
14、=shpr.getMaxZ();8. doubleminM=shpr.getMinMeasure();9. doublemaxM=shpr.getMaxMeasure();10.int shpDims=shpr.getShpDims(shpFileType,maxM);現(xiàn)在可以構(gòu)建空間元數(shù)據(jù)了。getDimArray()方法將根據(jù)shapefile中數(shù)據(jù)的限 制和維度來生成合適的元數(shù)據(jù)定義。注意,在使用該方法時(shí)的一個(gè)特殊現(xiàn)象:X 和Y維上的最大值和最小值必須以字符串的形式傳遞;Z和M維上的最大值和最 小值以數(shù)字的形式傳遞。/ Construct the spatial metadataStri
15、ng dimArray = sf.getDimArray(shpDims, String.valueOf(tolerance),String.valueOf(minX), String.valueOf(maxX),String.valueOf(minY), String.valueOf(maxY),minZ, maxZ, minM, maxM);接下來可以在數(shù)據(jù)庫中創(chuàng)建表了。該方法會(huì)先刪除已經(jīng)存在的表,然后用合適的 Oracle數(shù)據(jù)類型(與DBF文件中的屬性類型相匹配)創(chuàng)建一個(gè)新表。它也會(huì)向 USER_SDO_ GEOM_METADATA中插入空間元數(shù)據(jù)。指定SDO_GEOMETRY列的名稱
16、(geoColumn)。你也可以有選擇地指定某個(gè)標(biāo)識(shí)列(idColumn)的名稱。該列將在 加載的過程中被自動(dòng)填充序列號(hào)。/ Create table before loadingsf.prepareTableForData(dbConnection, dbfr, tableName, geoColumn, idColumn,srid, dimArray);現(xiàn)在你可以從shape file中把數(shù)據(jù)加載到剛剛創(chuàng)建的數(shù)據(jù)庫表中了。insertFeatures方法有很多參數(shù):標(biāo)識(shí)列名(idColumn)、起始數(shù)據(jù)值(firstld)、 提交的頻率(commi tFrequency)和載入期間打印進(jìn)度
17、消息的頻率 (printFrequency)。/ Load the featuressf.insertFeatures(dbConnection, dbfr, shpr, tableName,idColumn, firstId,commitFrequency, printFrequency, srid,dimArray);最后,記得關(guān)閉輸入文件:/ Close input fileshpr.closeShapefile();dbfr.closeDBF();構(gòu)建你自己的加載器如果想要更大的靈活性,如選擇要加載的屬性、對其重命名或在加載前對幾何體 進(jìn)行一些處理,就可以使用ShapefileRead
18、erJGeom和DBFReaderJGeom類中較低 層次的方法。表7-12和表7-13對其作了總結(jié)。表 7-12 ShapefileReaderJGeom 方法方法目的get MinX()為x維返回最小值get MaxX()為x維返回最大值get MinY()為y維返回最小值get MaxY()為y維返回最大值get MinZ()為z維返回最小值get MaxZ()為z維返回最大值getMi nMeasure()為m維返回最小值getM axMeasure()為m維返回最大值getShpFileType()返回該shapefile中包含的幾何體的類型:點(diǎn)為1,線為3,多邊形為5get Shp
19、Dims()返回幾何體的維度numRecords()返回shapefile中記錄的數(shù)目getGeometryBytes(int nt h)從shapefile中以字節(jié)數(shù)組的 形式提取第n個(gè)幾何體get Geome tr y(by te recBuffer, int srid) ()把一個(gè)幾何體從形狀二進(jìn)制 編碼轉(zhuǎn)換為JGeometry對象closeShapefile()關(guān)閉 shapefile表 7-13 DBFReaderJGeom 方法方法目的numRecords()返回DBF文件中記錄的數(shù)目。這應(yīng)該與shapefile中的記錄數(shù)相匹配numFields()返回DBF文件中屬性的個(gè)數(shù)(與列
20、數(shù)相等)getFieldName(int nth)以字符串的形式返回第n個(gè)域的名稱getFieldType(int nth)以單獨(dú)字符編碼的形式返回第n個(gè)域的類 型getFieldLength(int nth)返回第n個(gè)域的長度(在文件中占據(jù)的字 節(jié)數(shù))getRecord(int nth)以字節(jié)數(shù)組的形式返回文件中的第n個(gè)記 錄getFieldData(int nth, byte rec)從二進(jìn)制記錄中提取第n個(gè)域的值closeDBF()關(guān)閉DBF文件使用這些方法你可以從DBF文件中提取屬性的名稱、類型和屬性大小。根據(jù)獲得 的信息,你在創(chuàng)建數(shù)據(jù)表時(shí)就有了充分的靈活性。以下展示了如何把DBF數(shù)據(jù)
21、類 型等價(jià)地映射到Oracle中。int numFields = dbfr.numFields();StringnumFields;= new byten= new intnumFields;String fieldName= newbyte fieldType umFields;int fieldLengthString oracleType= new StringnumFields;for (int i=0; inumFields; i+) fieldNamei = dbfr.getFieldName(i);fieldTypei = dbfr.getFieldType(i);fieldLe
22、ngthi = dbfr.getFieldLength(i);switch (fieldTypei) case C: / Character+ fieldLengthi+ )12.oracleTypei = VARCHAR2(break;case L: / Logical15.oracleTypei = CHAR(1)break;case D: / Date 18.oracleTypei = DATE;19.break;20.caseI:/Integer21.caseF:/Float22.caseN:/Numeric23.oracleTypei = NUMBER;break;default:t
23、hrow new RuntimeException(Unsupported DBF field type + fieldTypei); 你可以很容易地創(chuàng)建相應(yīng)的表。僅向CREATE TABLE語句添加屬性名稱就可以實(shí) 現(xiàn)。String createTableSql = CREATE TABLE + tableName (;for (int i=0; inumFields; i+)createTableSqlcreateTableSql = createTableSql + fieldNamei + + oracleTypei + ,;createTableSqlcreateTableSql = createTableSql + geoColumn + SDO_GEOMETRY);最后,通過循環(huán)向數(shù)據(jù)庫中讀取和插入數(shù)據(jù),以便對SHP和DBF記錄逐
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新媒體運(yùn)營活動(dòng)策劃方案
- 內(nèi)部控制成果培訓(xùn)
- 腹部外科術(shù)后早期活動(dòng)
- 食藥局餐飲監(jiān)管培訓(xùn)
- 數(shù)控車削加工技術(shù) 課件 項(xiàng)目八 內(nèi)孔切削工藝及編程
- 山東省青島第十九中學(xué)2024-2025學(xué)年高一上學(xué)期10月月考地理試題(含答案)
- 河北省保定市唐縣2024-2025學(xué)年一年級(jí)上學(xué)期期中數(shù)學(xué)試題
- 2024-2025學(xué)年黑龍江省哈爾濱市道里區(qū)松南學(xué)校九年級(jí)(上)月考物理試卷(10月份)(含答案)
- 高中語文第2單元良知與悲憫群文閱讀二良知與悲憫課件新人教版必修下冊
- 高中語文第1單元論語蚜第7課好仁不好學(xué)其蔽也愚課件新人教版選修先秦諸子蚜
- 飛機(jī)儀電與飛控系統(tǒng)原理智慧樹知到期末考試答案章節(jié)答案2024年中國人民解放軍海軍航空大學(xué)
- 酒店數(shù)字化運(yùn)營概論 課件 1.2 網(wǎng)絡(luò)營銷與電子商務(wù)
- 鋼結(jié)構(gòu)工程施工(第五版) 課件 2項(xiàng)目二 焊接
- 電信營業(yè)廳運(yùn)營方案策劃書(2篇)
- 2024屆高考語文復(fù)習(xí):教考銜接背景下的詩歌比較閱讀+課件
- 小兒推拿的課件
- (高清版)WST 359-2024 血栓與止血檢驗(yàn)常用項(xiàng)目的標(biāo)本采集與處理
- -人教版數(shù)學(xué)九年級(jí)上冊第二十三章《-中心對稱圖形》課件
- 護(hù)理敏感質(zhì)量指標(biāo)的管理和運(yùn)用(最終版)
- 腸梗阻的業(yè)務(wù)查房
- 學(xué)習(xí)科學(xué)與技術(shù)智慧樹知到期末考試答案2024年
評論
0/150
提交評論