Oracle Spatial Java API 簡(jiǎn)介

本文簡(jiǎn)要介紹如何使用 Spring JDBC 進(jìn)行基本的空間查詢(xún)狐援。

數(shù)據(jù)的準(zhǔn)備

??將空間數(shù)據(jù)存入 Oracle Spatial 的方法有很多種,最基本的一種方法就是直接用 SQL 語(yǔ)句插入數(shù)據(jù)瘩将,但這種方法效率太低,而且極易出錯(cuò)现诀。我個(gè)人較為喜歡也最常使用的一種方法是借助現(xiàn)成的 GIS 軟件導(dǎo)入數(shù)據(jù)阶牍。下面簡(jiǎn)要介紹如何使用 ArcCatalog 將矢量數(shù)據(jù)導(dǎo)入 Oracle Spatial。

連接數(shù)據(jù)庫(kù)

  1. 在 ArcCatalog 的目錄樹(shù)中偏灿,找到數(shù)據(jù)庫(kù)連接丹诀,展開(kāi)后有一個(gè)添加數(shù)據(jù)庫(kù)連接,雙擊之后就會(huì)打開(kāi)如下的窗口:


    數(shù)據(jù)庫(kù)連接窗口
  2. 按照?qǐng)D中的示范填寫(xiě)相關(guān)屬性菩混,實(shí)例這一項(xiàng)的格式是 主機(jī):端口/數(shù)據(jù)庫(kù)實(shí)例名忿墅。點(diǎn)擊確定,然后就會(huì)連接到 Oracle沮峡。注意,ArcCatalog 只能連接32位的 Oracle 客戶(hù)端亿柑,我安裝的是32位的 Oracle 11g 客戶(hù)端邢疙。

導(dǎo)入數(shù)據(jù)

  1. 成功連接到 Oracle 之后在數(shù)據(jù)庫(kù)連接下就會(huì)看到一個(gè)新建的連接,右鍵,導(dǎo)入→要素類(lèi)(單個(gè))疟游,打開(kāi)如下的窗口呼畸。


    導(dǎo)入要素窗口
  2. 介紹幾個(gè)關(guān)鍵字段的含義:
  • 輸入要素:就是要導(dǎo)入的矢量數(shù)據(jù),這里選擇的是 .shp 文件(示例數(shù)據(jù)將會(huì)在文末給出)颁虐。注意文件名中不能包含中文蛮原。
  • 輸出要素類(lèi):數(shù)據(jù)將會(huì)導(dǎo)入到這個(gè)字段指定的表中。
  • 配置關(guān)鍵字:選擇 SDO_GEOMETRY另绩,這是 Oracle Spatial 提供的空間數(shù)據(jù)類(lèi)型儒陨。
  1. 點(diǎn)擊確定,右鍵連接笋籽,選擇刷新蹦漠,導(dǎo)入成功的話(huà)就會(huì)看到一個(gè)新生成的表,表名就是剛才在輸出要素類(lèi)中給的值车海。

用 Java API 進(jìn)行基本的空間查詢(xún)

實(shí)現(xiàn) Domain 類(lèi)笛园,封裝數(shù)據(jù)

??前面已經(jīng)提過(guò),Oracle Spatial 用 SDO_GEOMETRY 類(lèi)型來(lái)表示空間數(shù)據(jù),Java API 中對(duì)應(yīng)的類(lèi)是 oracle.spatial.geometry.JGeometry窜醉。根據(jù)表中的字段清钥,設(shè)計(jì)如下的 JavaBean 用來(lái)封裝數(shù)據(jù):

// 封裝鐵路信息的類(lèi)
public class RailWay {
    private int objectId;
    private JGeometry shape;
    private double fNode;
    private double tNode;
    private double lPoly;
    private double rPoly;
    private int gbCode;
    private String name;
    private String pinYin;
    private double length_m;

    public int getObjectId() {
        return objectId;
    }

    public void setObjectId(int objectId) {
        this.objectId = objectId;
    }

    public JGeometry getShape() {
        return shape;
    }

    public void setShape(JGeometry shape) {
        this.shape = shape;
    }

    public double getfNode() {
        return fNode;
    }

    public void setfNode(double fNode) {
        this.fNode = fNode;
    }

    public double gettNode() {
        return tNode;
    }

    public void settNode(double tNode) {
        this.tNode = tNode;
    }

    public double getlPoly() {
        return lPoly;
    }

    public void setlPoly(double lPoly) {
        this.lPoly = lPoly;
    }

    public double getrPoly() {
        return rPoly;
    }

    public void setrPoly(double rPoly) {
        this.rPoly = rPoly;
    }

    public int getGbCode() {
        return gbCode;
    }

    public void setGbCode(int gbCode) {
        this.gbCode = gbCode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPinYin() {
        return pinYin;
    }

    public void setPinYin(String pinYin) {
        this.pinYin = pinYin;
    }

    public double getLength_m() {
        return length_m;
    }

    public void setLength_m(double length_m) {
        this.length_m = length_m;
    }

    @Override
    public String toString() {
        return this.name + ",編號(hào)" + this.gbCode + ",長(zhǎng)度為" + this.length_m + "m";
    }
}

實(shí)現(xiàn) DAO 類(lèi),提供 CRUD 接口

??這里只舉例如何進(jìn)行查詢(xún)蚜印。

// DAO 類(lèi),提供 CRUD 接口
public class RailWayDao {   
    private static NamedParameterJdbcTemplate namedTempl;
    
    // 建立數(shù)據(jù)連接
    static { 
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
        dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
        dataSource.setUsername("");
        dataSource.setPassword("");
        namedTempl =  new NamedParameterJdbcTemplate(dataSource);
    }
    
    // 查詢(xún)指定名字的鐵路留量,返回結(jié)果只有一個(gè)
    public RailWay getRailWay(String name) {
        String sql = "select * from railwayorcl where name = :name";
        Map<String,String> param = new HashMap<>();
        param.put("name", name);
        // 需要自己實(shí)現(xiàn) RowMapper
        return this.namedTempl.queryForObject(sql, param, (rs,rowNum) -> {
            RailWay r = new RailWay();
            r.setObjectId(rs.getInt("objectId"));
            r.setShape(JGeometry.load((STRUCT)rs.getObject("shape")));
            r.setfNode(rs.getDouble("fNode_"));
            r.settNode(rs.getDouble("tNode_"));
            r.setlPoly(rs.getDouble("lPoly_"));
            r.setrPoly(rs.getDouble("rPoly_"));
            r.setGbCode(rs.getInt("gbCode"));
            r.setName(rs.getString("name"));
            r.setPinYin(rs.getString("pinYin"));
            r.setLength_m(rs.getDouble("length_m"));
            return r;
        });
    }
    
    //查詢(xún)指定名字的鐵路窄赋,查詢(xún)結(jié)果不止一個(gè)
    public List<RailWay> getRailWays(String name) {
        String sql = "select * from railwayorcl where name = :name";
        Map<String,String> param = new HashMap<>();
        param.put("name", name);
        //需要自己實(shí)現(xiàn) RowMapper
        return this.namedTempl.query(sql, param, (rs,rowNum) -> {
            RailWay r = new RailWay();
            r.setObjectId(rs.getInt("objectId"));
            r.setShape(JGeometry.load((STRUCT)rs.getObject("shape")));
            r.setfNode(rs.getDouble("fNode_"));
            r.settNode(rs.getDouble("tNode_"));
            r.setlPoly(rs.getDouble("lPoly_"));
            r.setrPoly(rs.getDouble("rPoly_"));
            r.setGbCode(rs.getInt("gbCode"));
            r.setName(rs.getString("name"));
            r.setPinYin(rs.getString("pinYin"));
            r.setLength_m(rs.getDouble("length_m"));
            return r;
        });
    }
    
    // 查詢(xún)指定名字的鐵路的結(jié)點(diǎn)坐標(biāo)
    public double[] getCoords(String name) {
        double[] coords = new double[0];
        RailWay r = getRailWay(name);
        coords = r.getShape().getOrdinatesArray();
        return coords;
    }
}

??需要注意的是,從數(shù)據(jù)庫(kù)查詢(xún)到的空間數(shù)據(jù)是 oracle.sql.STRUCT 類(lèi)型的楼熄,而在前面設(shè)計(jì)的 RailWay 類(lèi)中忆绰,空間數(shù)據(jù)是 JGeometry 類(lèi)型的,所以這里需要手動(dòng)進(jìn)行轉(zhuǎn)換可岂。因此错敢,必須自己實(shí)現(xiàn)一個(gè) RowMapper :

    public RailWay getRailWay(String name) {
        String sql = "select * from railwayorcl where name = :name";
        Map<String,String> param = new HashMap<>();
        param.put("name", name);
        // RowMapper 接口只有一個(gè) mapRow 方法,所以使用了 lambda 表達(dá)式
        return this.namedTempl.queryForObject(sql, param, (rs,rowNum) -> {
            RailWay r = new RailWay();
            r.setObjectId(rs.getInt("objectId"));
            //將 STRUCT 轉(zhuǎn)換成 JGeometry
            r.setShape(JGeometry.load((STRUCT)rs.getObject("shape"))); 
            r.setfNode(rs.getDouble("fNode_"));
            r.settNode(rs.getDouble("tNode_"));
            r.setlPoly(rs.getDouble("lPoly_"));
            r.setrPoly(rs.getDouble("rPoly_"));
            r.setGbCode(rs.getInt("gbCode"));
            r.setName(rs.getString("name"));
            r.setPinYin(rs.getString("pinYin"));
            r.setLength_m(rs.getDouble("length_m"));
            return r;
        });
    }

示例數(shù)據(jù) 密碼:9b1u
Oracle Spatial Java API 的各種 jar 包在 %ORACLE_HOME%\md\jlib 目錄下缕粹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稚茅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子平斩,更是在濱河造成了極大的恐慌亚享,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘面,死亡現(xiàn)場(chǎng)離奇詭異欺税,居然都是意外死亡侈沪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)晚凿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亭罪,“玉大人,你說(shuō)我怎么就攤上這事歼秽∮σ郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵燥筷,是天一觀的道長(zhǎng)箩祥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)荆责,這世上最難降的妖魔是什么滥比? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮做院,結(jié)果婚禮上盲泛,老公的妹妹穿的比我還像新娘。我一直安慰自己键耕,他們只是感情好寺滚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著屈雄,像睡著了一般村视。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酒奶,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天蚁孔,我揣著相機(jī)與錄音,去河邊找鬼惋嚎。 笑死杠氢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的另伍。 我是一名探鬼主播鼻百,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摆尝!你這毒婦竟也來(lái)了温艇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堕汞,失蹤者是張志新(化名)和其女友劉穎勺爱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體臼朗,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邻寿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蝎土,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了视哑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绣否。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挡毅,靈堂內(nèi)的尸體忽然破棺而出蒜撮,到底是詐尸還是另有隱情,我是刑警寧澤跪呈,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布段磨,位于F島的核電站,受9級(jí)特大地震影響耗绿,放射性物質(zhì)發(fā)生泄漏苹支。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一误阻、第九天 我趴在偏房一處隱蔽的房頂上張望债蜜。 院中可真熱鬧,春花似錦究反、人聲如沸寻定。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狼速。三九已至,卻和暖如春卦停,著一層夾襖步出監(jiān)牢的瞬間向胡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工惊完, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僵芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓专执,卻偏偏與公主長(zhǎng)得像淮捆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子本股,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • ORA-13000: 維數(shù)超出范圍 ORA-13001: 維數(shù)不匹配錯(cuò)誤 ORA-13002: 指定的級(jí)別超出范圍...
    thinkact閱讀 19,286評(píng)論 1 5
  • 動(dòng)與靜切換自如 人在特累的時(shí)候攀痊,反而是應(yīng)該停下來(lái)的時(shí)候,靜靜思考拄显,休養(yǎng)生息苟径,一定會(huì)有更大的智慧迸發(fā)。 多聽(tīng)聽(tīng)生活的...
    landi說(shuō)閱讀 432評(píng)論 0 1
  • 一躬审、現(xiàn)如今我了解到的有這三種基于網(wǎng)絡(luò)應(yīng)用的架構(gòu)風(fēng)格: 1棘街、RPC架構(gòu)風(fēng)格:SOAP就是RPC風(fēng)格的一種架構(gòu)蟆盐。過(guò)程是...
    我的馬兒有些瘦閱讀 444評(píng)論 0 0
  • 為什么你的朋友圈設(shè)置只能看最近三天石挂?因?yàn)檫@樣大家就不知道我多久沒(méi)發(fā)朋友圈啦! 不知道你有沒(méi)有注意到一個(gè)現(xiàn)象险污,大家發(fā)...
    生生y閱讀 5,983評(píng)論 0 3
  • 星期一就要考試?yán)脖杂蓿∥覝?zhǔn)備早點(diǎn)睡覺(jué),養(yǎng)足精神蛔糯,迎接星期一的考試拯腮。 星期一早上,我迷迷糊糊的醒來(lái)蚁飒。剛起...
    LXY李星毅閱讀 185評(píng)論 0 2