GDAL介紹
GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。
GDAL官方網址:http://www.gdal.org/,它能支持當前流行的各種地圖數據格式,包括柵格和矢量地圖,具體參考官方網站。該庫使用C/C++開發,在Java中使用需要自己編譯,具體編譯過程這里就不說了,下面來看看本文的主要內容吧。
Java使用GDAL讀寫shapefile的方法示例
讀取shp文件,并把它轉化為json
import org.gdal.ogr.*;import org.gdal.ogr.Driver;import org.gdal.gdal.*;public class GdalShpTest { public static void main(String[] args) { // 注冊所有的驅動 ogr.RegisterAll(); // 為了支持中文路徑,請添加下面這句代碼 gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES"); // 為了使屬性表字段支持中文,請添加下面這句 gdal.SetConfigOption("SHAPE_ENCODING",""); String strVectorFile = "D://test//NODE.shp"; //打開文件 DataSource ds = ogr.Open(strVectorFile,0); if (ds == null) { System.out.println("打開文件失??!" ); return; } System.out.println("打開文件成功!" ); Driver dv = ogr.GetDriverByName("GeoJSON"); if (dv == null) { System.out.println("打開驅動失??!" ); return; } System.out.println("打開驅動成功!" ); dv.CopyDataSource(ds, "D://test//node.json"); System.out.println("轉換成功!" ); }}寫shp文件
import org.gdal.ogr.*;import org.gdal.gdal.*;class writeShp2 { public static void main(String[] args) { writeShp2 readshpObj = new writeShp2(); readshpObj.WriteVectorFile(); } static void WriteVectorFile() { String strVectorFile = "D://test//test.shp"; ogr.RegisterAll(); gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); gdal.SetConfigOption("SHAPE_ENCODING", "CP936"); String strDriverName = "ESRI Shapefile"; org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName); if (oDriver == null) { System.out.println(strVectorFile + " 驅動不可用!/n"); return; } DataSource oDS = oDriver.CreateDataSource(strVectorFile, null); if (oDS == null) { System.out.println("創建矢量文件【" + strVectorFile + "】失敗!/n"); return; } Layer oLayer = oDS.CreateLayer("TestPolygon", null, ogr.wkbPolygon, null); if (oLayer == null) { System.out.println("圖層創建失??!/n"); return; } // 下面創建屬性表 // 先創建一個叫FieldID的整型屬性 FieldDefn oFieldID = new FieldDefn("FieldID", ogr.OFTInteger); oLayer.CreateField(oFieldID); // 再創建一個叫FeatureName的字符型屬性,字符長度為50 FieldDefn oFieldName = new FieldDefn("FieldName", ogr.OFTString); oFieldName.SetWidth(100); oLayer.CreateField(oFieldName); FeatureDefn oDefn = oLayer.GetLayerDefn(); // 創建三角形要素 Feature oFeatureTriangle = new Feature(oDefn); oFeatureTriangle.SetField(0, 0); oFeatureTriangle.SetField(1, "三角形"); Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))"); oFeatureTriangle.SetGeometry(geomTriangle); oLayer.CreateFeature(oFeatureTriangle); // 創建矩形要素 Feature oFeatureRectangle = new Feature(oDefn); oFeatureRectangle.SetField(0, 1); oFeatureRectangle.SetField(1, "矩形"); Geometry geomRectangle = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))"); oFeatureRectangle.SetGeometry(geomRectangle); oLayer.CreateFeature(oFeatureRectangle); // 創建五角形要素 Feature oFeaturePentagon = new Feature(oDefn); oFeaturePentagon.SetField(0, 2); oFeaturePentagon.SetField(1, "五角形"); Geometry geomPentagon = Geometry.CreateFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,70 0))"); oFeaturePentagon.SetGeometry(geomPentagon); oLayer.CreateFeature(oFeaturePentagon); oDS.SyncToDisk(); System.out.println("/n數據集創建完成!/n"); }}得到test.dbf, test.shp, test.shx。
test.dbf如下:

打開形狀如下

總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
新聞熱點
疑難解答