gdal代码生成shape带索引

最近做项目需要程序自动生成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();

猜你喜欢

转载自zhy584520.iteye.com/blog/2407353
今日推荐