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

在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文件将不存在


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

转载请标明出处


  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,你需要安装GDAL库并在Python中导入它。然后,你可以使用以下代码创建一个圆形的Shapefile: ```python from osgeo import ogr def create_circle_shp(output_path, center_x, center_y, radius): # 创建Shapefile文件 driver = ogr.GetDriverByName('ESRI Shapefile') data_source = driver.CreateDataSource(output_path) layer = data_source.CreateLayer(output_path.split(".")[0], None, ogr.wkbPoint) # 添加字段 layer.CreateField(ogr.FieldDefn("id", ogr.OFTInteger)) layer.CreateField(ogr.FieldDefn("name", ogr.OFTString)) # 创建圆形 circle = ogr.Geometry(ogr.wkbLinearRing) for i in range(0, 361): angle_in_radians = i * (math.pi / 180.0) x = center_x + radius * math.cos(angle_in_radians) y = center_y + radius * math.sin(angle_in_radians) circle.AddPoint(x, y) circle.CloseRings() # 添加圆形到图层中 feature = ogr.Feature(layer.GetLayerDefn()) feature.SetField("id", 1) feature.SetField("name", "circle") point = ogr.Geometry(ogr.wkbPoint) point.AddPoint(center_x, center_y) feature.SetGeometry(point) feature.SetGeometry(circle) layer.CreateFeature(feature) feature = None # 清理并关闭数据源 data_source.SyncToDisk() data_source = None ``` 这个函数需要四个参数: - `output_path`:输出Shapefile文件的路径。 - `center_x`:圆心的X坐标。 - `center_y`:圆心的Y坐标。 - `radius`:圆的半径。 你可以根据需要更改字段名称和类型,以及更改图层类型(例如,使用`ogr.wkbPolygon`创建多边形)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值