android 平台下通过GDAL创建SHP(ShapeFile)文件至SD卡

本文介绍如何在Android平台上使用GDAL库创建Shapefile文件。文章详细解释了配置GDAL库的方法,包括所需so库的导入,并展示了如何通过Java代码注册GDAL驱动以及创建带有属性表的Shapefile文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android 平台下通过ARCGIS可以通过FeatureLayer 来渲染一个SHP文件,但是无法直接通过ARCGIS生成SHP文件,要在android平台下生成SHP文件就要通过GDAL或着其他方式,我只了解GDAL创建方式,下面各大家介绍一下如何通过GDAL在android中创建Shapefile文件。

开发环境说明:Android studio2.1

第一步,配置:

首先下载GDAL的jar包以及所必需的so库(四个so1库)并导入,如下图:


注意:下载的so库如果只支持armiear-v7a的话,那就在jnilib目录下只创建armiear-v7a目录,然后将so库导入,如果已经使用的其他的SO库(这个so库支持多个ABI),那么将其它的ABI删除(例如:x84 x86_64此类目录存在删除即可,在测试是用手机测试,手机支持的ABI基本都包括armiear-v7a,如果用虚拟机测试,那就必须创建ABI为armiear-v7a的虚拟机,这样可以测试,但是很慢)

第二步,简单测试:


   ***********************************************************************************

注册驱动

public DataSource regesiterGdal(){
    ogr.RegisterAll();
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
    gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8");

    String strDriverName = "ESRI Shapefile";
    org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
    if (oDriver == null) {
        System.out.println(strDriverName + " 驱动不可用!\n");
        return null;
    }
    String shpPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator+"SoilFile";
    DataSource oDS = oDriver.CreateDataSource(shpPath, null);
    if (oDS == null) {
        System.out.println("创建矢量文件【" + shpPath + "】失败!\n");
        return null;
    }
    return oDS;
}

注意: 如果so库那一块没设置好,将会注册失败,ogr.RegisterAll(); 这个方法会一直报错


*************************************************************************************************************

写入数据,创建shapefile文件

  public void saveShapeFileToSD(String newShapeFileName, int type) throws UnsupportedEncodingException {

        DataSource oDS = new GdalUtil().regesiterGdal();
        //设置空间参考,空间参考不一致,图层无法叠加(叠加后不会显示)

        String strwkt = "空间参考";//所对应shapefile的.prj文件
        SpatialReference srs = new SpatialReference(strwkt);//srs可以为null
        Layer oLayer = oDS.CreateLayer(newShapeFileName, srs, type, null);//type指的是创建要素的类型点、多点、线、面等
        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);

  

        // 创建三角形要素
        //    Feature oFeatureTriangle = new Feature(oDefn);
//        oFeatureTriangle.SetField(0, 0);
//        oFeatureTriangle.SetField(1, Base64Utils.encodeStr("三角形11"));
//        oFeatureTriangle.SetField(1, new String("三角形11".getBytes(), "UTF-8"));
//        Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))");
//        oFeatureTriangle.SetGeometry(geomTriangle);
//        oLayer.CreateFeature(oFeatureTriangle);

        try {
            oLayer.SyncToDisk();
            oDS.SyncToDisk();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("\n数据集创建完成!\n");
    }
第三步,结果:(由于手机有点问题,故将文件导出在电脑上),亲测没问题,如果上面的srs设置为NULL的话,那么。prj文件将不存在


好了,就到这,有什么问题,可以留言:

转载请标明出处


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值