Java用GDAL读写shapefile的方法示例
程序员文章站
2024-03-11 15:30:19
gdal介绍
gdal(geospatial data abstraction library)是一个在x/mit许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来...
gdal介绍
gdal(geospatial data abstraction library)是一个在x/mit许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
gdal官方网址:,它能支持当前流行的各种地图数据格式,包括栅格和矢量地图,具体参考官方网站。该库使用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如下:
打开形状如下
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。