【GIS】矢量文件管理

讀取

public static void readVectorFile() {
        String strVectorFile = "D:\\Java\\Projects\\dx\\poly.shp";
        //注冊所有的驅(qū)動
        ogr.RegisterAll();
        //支持中文路徑名
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        //屬性表字段支持中文
        gdal.SetConfigOption("SHAPE_ENCODING", "");

        //打開數(shù)據(jù)
        DataSource ds = ogr.Open(strVectorFile, 0);
        if (null == ds) {
            System.out.println("Open [" + strVectorFile + "] failed!");
            return;
        }
        System.out.println("Open [" + strVectorFile + "] success!");

        //獲取該數(shù)據(jù)源中的圖層數(shù)(一般shp數(shù)據(jù)的圖層只有一個赃泡,mdb粟害、dxf等圖層會有多個)
        int layerCount = ds.GetLayerCount();

        //獲取第一個圖層
        Layer layer = ds.GetLayerByIndex(0);
        if (null == layer) {
            System.out.println("獲取第0個圖層失敗潦俺!");
            return;
        }

        //對圖層進行初始化(如果對圖層進行了過濾操作曼玩,執(zhí)行此句后僧凰,之前過濾全部清空)
        layer.ResetReading();
        //通過屬性表的SQL語句對圖層中的要素進行篩選
//        layer.SetAttributeFilter("")
        //通過指定的幾何對象對圖層中的要素進行篩選
//        layer.SetSpatialFilter();
        //通過指定的四至范圍對圖層中的要素進行篩選
//        layer.SetSpatialFilterRect();

        //獲取圖層中的屬性表表頭并輸出
        System.out.println("屬性表結(jié)構(gòu)信息:");
        FeatureDefn defn = layer.GetLayerDefn();

        //獲取字段數(shù)量
        int field = defn.GetFieldCount();
        for (int attr = 0; attr < field; attr++) {
            FieldDefn fieldDefn = defn.GetFieldDefn(attr);
            System.out.println(fieldDefn.GetNameRef() + ": " +
                    fieldDefn.GetFieldTypeName(fieldDefn.GetFieldType()) + "(" + fieldDefn.GetWidth() + "." + fieldDefn.GetPrecision() + ")");
        }
        //輸出圖層中的要素個數(shù)
        System.out.println("要素個數(shù):" + layer.GetFeatureCount(0));

        Feature feature = null;
        //獲取要素中的屬性表內(nèi)容
        while ((feature = layer.GetNextFeature()) != null) {
            for (int i = 0; i < field; i++) {
                FieldDefn fieldDefn = defn.GetFieldDefn(i);
                int type = fieldDefn.GetFieldType();
                switch (type) {
                    case ogr.OFTString:
                        System.out.println(feature.GetFieldAsString(i) + "\t");
                        break;
                    case ogr.OFTReal:
                        System.out.println(feature.GetFieldAsDouble(i) + "\t");
                        break;
                    case ogr.OFTInteger:
                        System.out.println(feature.GetFieldAsInteger(i) + "\t");
                        break;
                    default:
                        System.out.println(feature.GetFieldAsString(i) + "\t");
                        break;
                }
            }

            //獲取要素中的幾何體
            Geometry geometry = feature.GetGeometryRef();
            break;
        }
        System.out.println("數(shù)據(jù)集關(guān)閉!");
    }

輸出:

Open [D:\Java\Projects\dx\poly.shp] success!
屬性表結(jié)構(gòu)信息:
AREA: Real(12.3)
EAS_ID: Integer64(11.0)
PRFEDEA: String(16.0)
要素個數(shù):10
215229.266  
168 
35043411    
數(shù)據(jù)集關(guān)閉继效!

寫入

示例(創(chuàng)建ESRI的SHP文件)

捋了下大致流程:

  • 設(shè)置文件類型 > 創(chuàng)建數(shù)據(jù)源 > 創(chuàng)建圖層 > 創(chuàng)建要素 > 在圖層上創(chuàng)建屬性表(各個字段) > 獲取添加屬性表的圖層的要素定義 > 依照該要素定義生成新的要素 > 設(shè)置要素對象的參數(shù)值 > 在圖層上創(chuàng)建該要素
/**
     * 寫入矢量
     *
     * @param strVectorFile
     */
    public static void writeVectorFile(String strVectorFile) {
        //注冊所有的驅(qū)動
        ogr.RegisterAll();
        //支持中文路徑
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        //屬性表支持中文
        gdal.SetConfigOption("SHAPE_ENCODING", "CP936");

        String strDriverName = "ESRI Shapefile";
        //指定驅(qū)動
        Driver driver = ogr.GetDriverByName(strDriverName);
        if (null == driver) {
            System.out.println(strDriverName + " 驅(qū)動不可用症杏!");
            return;
        }

        //創(chuàng)建數(shù)據(jù)源
        DataSource dataSource = driver.CreateDataSource(strVectorFile, null);
        if (null == dataSource) {
            System.out.println("創(chuàng)建矢量文件【" + strVectorFile + "】失敗瑞信!");
            return;
        }

        //創(chuàng)建圖層厉颤,創(chuàng)建一個多邊形圖層(此處未指定空間參考,如需要需在這里進行指定)
        Layer layer = dataSource.CreateLayer("TestPolygon", null, ogr.wkbPolygon, null);
        //指定空間參考的話長這個樣子(以WGS84示例):
//        SpatialReference spatialReference=new SpatialReference("");
//        spatialReference.SetWellKnownGeogCS("WGS84");  
//        Layer layer = dataSource.CreateLayer("TestPolygon", spatialReference, ogr.wkbPolygon, null);
        if (null == layer) {
            System.out.println("圖層【" + layer + "】創(chuàng)建失敺布颉逼友!");
            return;
        }

        //創(chuàng)建屬性表
        //創(chuàng)建第一個字段(整型)
        FieldDefn fieldIDDefn = new FieldDefn("FieldID", ogr.OFTInteger);
        layer.CreateField(fieldIDDefn, 1);

        //創(chuàng)建第二個字段(字符,長度50)
        FieldDefn fieldNameDefn = new FieldDefn("FieldName", ogr.OFTString);
        fieldNameDefn.SetWidth(100);
        layer.CreateField(fieldNameDefn, 1);

        //創(chuàng)建第三個字段(字符)
        FieldDefn fieldDefnArea = new FieldDefn("FieldArea", ogr.OFTString);
        fieldDefnArea.SetWidth(50);
        layer.CreateField(fieldDefnArea);

        FeatureDefn featureDefn = layer.GetLayerDefn();

        //創(chuàng)建要素:三角形
        Feature featureTriangle = new Feature(featureDefn);//個人覺得有點Bean工廠跟BeanDefinition的感覺
        featureTriangle.SetField(0, 0);
        featureTriangle.SetField(1, "三角形");
        Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((0 0,35 0,10 15,0 0))");
        featureTriangle.SetGeometry(geomTriangle);
        featureTriangle.SetField(2, geomTriangle.Area());
        layer.CreateFeature(featureTriangle);

        //創(chuàng)建要素:矩形
        Feature featureRectangle = new Feature(featureDefn);
        featureRectangle.SetField(0, 1);
        featureRectangle.SetField(1, "矩形");
        Geometry geomRectangle = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))");
        featureRectangle.SetGeometry(geomRectangle);
        featureRectangle.SetField(2, geomRectangle.Area());
        layer.CreateFeature(featureRectangle);

        //創(chuàng)建要素:相交部分
        Feature featureIntersection = new Feature(featureDefn);
        featureIntersection.SetField(0, 2);
        featureIntersection.SetField(1, "intersection");
        Geometry intersection = geomTriangle.Intersection(geomRectangle);
        featureIntersection.SetGeometry(intersection);
        featureIntersection.SetField(2, intersection.GetArea());
        layer.CreateFeature(featureIntersection);

        System.out.println("Finish!");
    }

生成的.shp文件

image.png

刪除

/**
     * 矢量數(shù)據(jù)管理:刪除
     *
     * @param strVerctorFile
     */
    public static void vectorDelete(String strVerctorFile) {
        // TODO: 2021/8/2 生成的三個文件 shp shx dbf只能刪除 shx
        try {
            //注冊所有的驅(qū)動
            ogr.RegisterAll();
            File file = new File(strVerctorFile);
            Driver driver = null;
            {
                //打開矢量
                DataSource dataSource = ogr.Open(strVerctorFile, 0);
                if (null == dataSource) {
                    file.delete();
                    System.out.println("null == dataSource");
                    return;
                }
                driver = dataSource.GetDriver();
                if (null == driver) {
                    file.delete();
                    System.out.println("null == driver");
                    return;
                }
            }
            if (driver.DeleteDataSource(strVerctorFile) == ogr.OGRERR_NONE) {
                System.out.println("driver.DeleteDataSource(strVerctorFile) == ogr.OGRERR_NONE");
                file.delete();
                return;
            } else {
                file.delete();
            }
            System.out.println("Finish!");

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

重命名

額秤涩,貌似就是先復(fù)置舊的給新的帜乞,然后再刪除舊的。筐眷。黎烈。

/**
     * 矢量數(shù)據(jù)管理:重命名
     * 
     * @param strOldName
     * @param strNewName
     */
    static public void vectorRename(String strOldName, String strNewName) {
        //注冊所有驅(qū)動
        ogr.RegisterAll();
        File file = new File(strOldName);
        Driver driver = null;
        {
            //打開矢量
            DataSource dataSource = ogr.Open(strOldName, 0);
            if (null == dataSource) {
                file.renameTo(new File(strNewName));
                return;
            }
            driver = dataSource.GetDriver();
            if (null == driver) {
                file.renameTo(new File(strNewName));
                return;
            }
            DataSource dataSourceNew = driver.CopyDataSource(dataSource, strNewName, null);
            if (null == dataSourceNew) {
                file.renameTo(new File(strNewName));
                return;
            }
        }
        if(driver.DeleteDataSource(strOldName) == ogr.OGRERR_NONE){
            return;
        }else{
            file.renameTo(new File(strNewName));
        }

    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匀谣,隨后出現(xiàn)的幾起案子照棋,更是在濱河造成了極大的恐慌,老刑警劉巖武翎,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烈炭,死亡現(xiàn)場離奇詭異,居然都是意外死亡宝恶,警方通過查閱死者的電腦和手機符隙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卑惜,“玉大人膏执,你說我怎么就攤上這事驻售÷毒茫” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵欺栗,是天一觀的道長毫痕。 經(jīng)常有香客問我征峦,道長,這世上最難降的妖魔是什么消请? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任栏笆,我火速辦了婚禮,結(jié)果婚禮上臊泰,老公的妹妹穿的比我還像新娘蛉加。我一直安慰自己,他們只是感情好缸逃,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布针饥。 她就那樣靜靜地躺著,像睡著了一般需频。 火紅的嫁衣襯著肌膚如雪丁眼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天昭殉,我揣著相機與錄音苞七,去河邊找鬼。 笑死挪丢,一個胖子當(dāng)著我的面吹牛蹂风,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吃靠,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼硫眨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巢块?” 一聲冷哼從身側(cè)響起礁阁,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎族奢,沒想到半個月后姥闭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡越走,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年棚品,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廊敌。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡铜跑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骡澈,到底是詐尸還是另有隱情锅纺,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布肋殴,位于F島的核電站囤锉,受9級特大地震影響坦弟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜官地,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一酿傍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驱入,春花似錦赤炒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宴杀,卻和暖如春癣朗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旺罢。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工旷余, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扁达。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓正卧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跪解。 傳聞我的和親對象是個殘疾皇子炉旷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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