Java用GDAL讀寫shapefile的方法示例
GDAL介紹
GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協(xié)議下的開源柵格空間數(shù)據(jù)轉(zhuǎn)換庫。它利用抽象數(shù)據(jù)模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數(shù)據(jù)轉(zhuǎn)換和處理。
GDAL官方網(wǎng)址:http://www.gdal.org/,它能支持當(dāng)前流行的各種地圖數(shù)據(jù)格式,包括柵格和矢量地圖,具體參考官方網(wǎng)站。該庫使用C/C++開發(fā),在Java中使用需要自己編譯,具體編譯過程這里就不說了,下面來看看本文的主要內(nèi)容吧。
Java使用GDAL讀寫shapefile的方法示例
讀取shp文件,并把它轉(zhuǎn)化為json
import org.gdal.ogr.*; import org.gdal.ogr.Driver; import org.gdal.gdal.*; public class GdalShpTest { public static void main(String[] args) { // 注冊所有的驅(qū)動 ogr.RegisterAll(); // 為了支持中文路徑,請?zhí)砑酉旅孢@句代碼 gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES"); // 為了使屬性表字段支持中文,請?zhí)砑酉旅孢@句 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("打開驅(qū)動失??!" ); return; } System.out.println("打開驅(qū)動成功!" ); dv.CopyDataSource(ds, "D:\\test\\node.json"); System.out.println("轉(zhuǎn)換成功!" ); } }
寫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 + " 驅(qū)動不可用!\n"); return; } DataSource oDS = oDriver.CreateDataSource(strVectorFile, null); if (oDS == null) { System.out.println("創(chuàng)建矢量文件【" + strVectorFile + "】失敗!\n"); return; } Layer oLayer = oDS.CreateLayer("TestPolygon", null, ogr.wkbPolygon, null); if (oLayer == null) { System.out.println("圖層創(chuàng)建失敗!\n"); return; } // 下面創(chuàng)建屬性表 // 先創(chuàng)建一個叫FieldID的整型屬性 FieldDefn oFieldID = new FieldDefn("FieldID", ogr.OFTInteger); oLayer.CreateField(oFieldID); // 再創(chuàng)建一個叫FeatureName的字符型屬性,字符長度為50 FieldDefn oFieldName = new FieldDefn("FieldName", ogr.OFTString); oFieldName.SetWidth(100); oLayer.CreateField(oFieldName); FeatureDefn oDefn = oLayer.GetLayerDefn(); // 創(chuàng)建三角形要素 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); // 創(chuàng)建矩形要素 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); // 創(chuàng)建五角形要素 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數(shù)據(jù)集創(chuàng)建完成!\n"); } }
得到test.dbf, test.shp, test.shx。
test.dbf如下:
打開形狀如下
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
Java之MultipartFile和File類型互轉(zhuǎn)方式
這篇文章主要介紹了Java之MultipartFile和File類型互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09深入了解Java中的過濾器Filter和監(jiān)聽器Listener
這篇文章主要為大家詳細介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細,需要的可以參考一下2022-06-06簡單捋捋@RequestParam 和 @RequestBody的使用
這篇文章主要介紹了簡單捋捋@RequestParam 和 @RequestBody的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12使用Java實現(xiàn)簡單搭建內(nèi)網(wǎng)穿透
內(nèi)網(wǎng)穿透是一種網(wǎng)絡(luò)技術(shù),適用于需要遠程訪問本地部署服務(wù)的場景,本文主要為大家介紹了如何使用Java實現(xiàn)簡單搭建內(nèi)網(wǎng)穿透,感興趣的可以了解下2024-02-02java 內(nèi)部類(匿名類,匿名對象,靜態(tài)內(nèi)部類)詳解及實例
這篇文章主要介紹了java 內(nèi)部類詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12在Java中使用ModelMapper簡化Shapefile屬性轉(zhuǎn)JavaBean實戰(zhàn)過程
本文介紹了在Java中使用ModelMapper庫簡化Shapefile屬性轉(zhuǎn)JavaBean的過程,對比了原始的set方法和構(gòu)造方法,展示了如何使用ModelMapper進行動態(tài)屬性映射,從而減少手動編寫轉(zhuǎn)換代碼的工作量,通過示例代碼,展示了如何使用GeoTools讀取Shapefile屬性并將其轉(zhuǎn)換為JavaBean對象2025-02-02Java與Spring?boot后端項目Bug超全總結(jié)
Spring Boot是一個開源的 Java 開發(fā)框架,它的目的是簡化Spring應(yīng)用程序的開發(fā)和部署,下面這篇文章主要給大家介紹了關(guān)于Java與Spring?boot后端項目Bug的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06Spring?Security?OAuth?Client配置加載源碼解析
這篇文章主要為大家介紹了Spring?Security?OAuth?Client配置加載源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07