【java 调用gdal,mdb文件转shape】

该代码段展示了如何利用GDAL库将Mdb(Access数据库)中的数据转换为ESRIShapefile格式。它首先注册GDAL库,设置配置选项以支持中文,然后打开Mdb文件并获取图层。接着,它创建一个新的Shapefile,复制图层内容,并最终释放相关资源。
摘要由CSDN通过智能技术生成

在这里插入图片描述

private static R turn() {

        gdal.AllRegister();
        //        配置GDAL_DATA路径
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        //        属性表字段支持中文
        gdal.SetConfigOption("SHAPE_ENCODING", "");
        Driver mdDriver = null;
        DataSource mdbDataSource = null;
        Driver shapeDriver = null;
        DataSource shapeDataSource = null;
        try {
            //Mdb文件路径
            String path = "D:\\shp\\test.mdb";
            //获取Mdb驱动
            mdDriver = ogr.GetDriverByName("PGeo");
            //获取数据
            mdbDataSource = mdDriver.Open(path, 0);
            if (mdbDataSource == null) {
                log.info("数据库获取失败");
                return R.error("获取图层失败!");
            }
            Layer layer = mdbDataSource.GetLayer(0);
            if (layer == null) {
                return R.error("获取图层失败!");
            }
            Vector<String> vector = new Vector();
            vector.add("ENCODING=UTF-8");
            //获取shp驱动
             shapeDriver = ogr.GetDriverByName("ESRI Shapefile");
            //创建文件
            shapeDataSource = shapeDriver.CreateDataSource("D:\\shp\\" + "shp");
            //写入图层
            shapeDataSource.CopyLayer(layer, "test", vector);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //释放资源
            if (mdbDataSource != null){
                mdbDataSource.delete();
                mdDriver.delete();
            }
            if (shapeDataSource != null){
                shapeDataSource.delete();
                shapeDriver.delete();
            }
        }
        return R.ok();
    }
以下是一个示例代码,用于将dem换为矢量,并将海拔值存储在矢量文件的属性中。 ```java import org.gdal.gdal.Dataset; import org.gdal.gdal.gdal; import org.gdal.ogr.DataSource; import org.gdal.ogr.Driver; import org.gdal.ogr.Feature; import org.gdal.ogr.FieldDefn; import org.gdal.ogr.Geometry; import org.gdal.ogr.Layer; import org.gdal.ogr.ogr; public class DEMtoVector { public static void main(String[] args) { // 加载GDALgdal.AllRegister(); // 打开DEM数据集 String demFilePath = "path/to/dem.tif"; Dataset demDataset = gdal.Open(demFilePath, gdalconstConstants.GA_ReadOnly); // 获取DEM数据集的投影信息 String projection = demDataset.GetProjectionRef(); // 创建矢量数据集 String vectorFilePath = "path/to/vector.shp"; Driver vectorDriver = ogr.GetDriverByName("ESRI Shapefile"); DataSource vectorDataSource = vectorDriver.CreateDataSource(vectorFilePath); // 创建矢量图层 String vectorLayerName = "elevation"; Layer vectorLayer = vectorDataSource.CreateLayer(vectorLayerName, null, ogr.wkbPoint); // 添加海拔值属性 FieldDefn elevationField = new FieldDefn("elevation", ogr.OFTReal); vectorLayer.CreateField(elevationField); // 将DEM数据集换为矢量 int width = demDataset.getRasterXSize(); int height = demDataset.getRasterYSize(); double[] geotransform = demDataset.GetGeoTransform(); double xOrigin = geotransform[0]; double yOrigin = geotransform[3]; double pixelWidth = geotransform[1]; double pixelHeight = geotransform[5]; double[] elevationData = new double[1]; Geometry point = ogr.CreateGeometry(ogr.wkbPoint); for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { double x = xOrigin + (col + 0.5) * pixelWidth; double y = yOrigin + (row + 0.5) * pixelHeight; demDataset.GetRasterBand(1).RasterIO(gdalconstConstants.GF_Read, col, row, 1, 1, elevationData, 1, 1, gdalconstConstants.GDT_Float64, 0, 0); point.SetPoint_2D(0, x, y); Feature feature = new Feature(vectorLayer.GetLayerDefn()); feature.SetGeometry(point); feature.SetFieldDouble("elevation", elevationData[0]); vectorLayer.CreateFeature(feature); feature.delete(); } } // 释放资源 vectorDataSource.delete(); demDataset.delete(); ogr.RegisterAll(); } } ``` 注:以上代码仅供参考,具体实现方式可能因数据集格式、数据结构等因素而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值