在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文件将不存在
好了,就到这,有什么问题,可以留言:
转载请标明出处