最近做项目需要程序自动生成shapfile,生成shapefile的方案比较多有arcgis engine、gdal、geotools,推荐使用arcgis engine、gdal。
本文采用GDAL,国内JAVA方面的GDAL资料比较少,在这里分享出来方便他人。
备注:我使用的GDAL版本是2.0.0,大家尽量使用2.0+版本,因为2.0后才支持索引,如果数据比较大,没有索引那性能相差不是一星半点。
准备工作:
一、配置gdal库,下载地址:http://www.gisinternals.com/release.php,一定要对应相应版本哦,下载好了配置GDAL环境变量,配置方法如下:
1、右键计算机——》属性——》高级系统设置——》环境变量——》新建系统变量:
新建两个系统变量GDAL32_DLL
变量名:GDAL32_DLL
变量值:C:\GDAL\release-1600-win32-dev\release-1600\bin;C:\GDAL\release-1600-win32-dev\release-1600\bin\gdal\java
名字可以自己定义,指定GDAL DLL路径位置,和GDAL java版编译出路径。
注意:以上路径需要根据gdal库真实存放目录调整。
2、在Path前面增加(如果没有Path系统变量,则新建)"%GDAL32_DLL%;",即path变为
%GDAL32_DLL%;
二、JAVA代码生成shapefile
1、注册
ogr.RegisterAll();
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
gdal.SetConfigOption("SHAPE_ENCODING", "CP936");
2、加载驱动
String strDriverName = "ESRI Shapefile";
org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
if (oDriver == null) {
System.out.println("驱动不可用");
return -1;
}
3、创建数据源
DataSource oDS = oDriver.CreateDataSource(shapeFilePath, null);
if (oDS == null) {
System.out.println("创建矢量文件失败");
return -1;
}
4、创建图层
Vector vector = new Vector<>();
vector.add("SPATIAL_INDEX=YES");
//这里需要注意,默认gdal是不会创建索引的,需要设置:可参考API:http://gdal.org/java/org/gdal/ogr/DataSource.html#CopyLayer-org.gdal.ogr.Layer-java.lang.String-java.util.Vector-
参数说明文档:http://www.gdal.org/ogr_formats.html
Layer oLayer = oDS.CreateLayer(SatArea.SHAPLEFILE_PROVINCE_NAME, webMercatro, ogr.wkbPolygon, vector);
if (oLayer == null) {
System.out.println("图层创建失败!\n");
return -1;
}
5、为图层创建字段
FieldDefn oFieldNo = new FieldDefn("No", ogr.OFTString);
oFieldNo.SetWidth(10);
oLayer.CreateField(oFieldNo);
6、设置字段值
FeatureDefn oDefn = oLayer.GetLayerDefn();
Feature oFeatureTriangle = new Feature(oDefn);
oFeatureTriangle.SetField(0, "no");
oFeatureTriangle.SetGeometry(shape);
oLayer.CreateFeature(oFeatureTriangle);
7、释放资源
oDS.SyncToDisk();
oDefn.delete();
oLayer.delete();
oDS.delete();