当前位置: 移动技术网 > IT编程>开发语言>Java > Java用GDAL读写shapefile的方法示例

Java用GDAL读写shapefile的方法示例

2019年07月22日  | 移动技术网IT编程  | 我要评论
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如下:

打开形状如下

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网