springboot中使用gdal将表中的空间数据转shapefile文件

springboot中使用gdal将表中的空间数据转shapefile文件

代码:

java 复制代码
// 样本导出-将样本表导出为shapefile,复制样本shp文件到临时目录下  sampleDir是文件夹path
    public void setYbShapeFile(Yb yb, File sampleDir) {
        // 创建 前时项 和 后时项 文件夹
        File ybDir = new File(sampleDir, "样本");
        ybDir.mkdirs();
        String tableName = yb.getLabelLayerName();
        boolean isYbLabelName = tableName != null && !tableName.equals("");
        String shapefileName = new File(ybDir, tableName + ".shp").getAbsolutePath();

        if (isYbLabelName) {
            // 查询数据
            SqlRowSet resultSet = jdbcTemplate.queryForRowSet("SELECT objectid, ST_AsText(shape) AS shape FROM " + tableName);

            // 使用GDAL库将查询到的数据转换为Shapefile
            ogr.RegisterAll();
            Driver driver = ogr.GetDriverByName("ESRI Shapefile");
            if (driver == null) {
                throw new RuntimeException("GDAL 驱动加载失败: ESRI Shapefile");
            }

            DataSource ds = null;
            Layer layer = null;
            try {
                ds = driver.CreateDataSource(shapefileName);
                if (ds == null) {
                    throw new RuntimeException("无法创建 Shapefile 数据源: " + shapefileName);
                }

                // 定义坐标参考系统(以 WGS 84 为例)
                SpatialReference srs = new SpatialReference();
                srs.ImportFromEPSG(4326);

                // 创建图层并指定参考系统
                layer = ds.CreateLayer(tableName, srs, ogr.wkbUnknown);
                if (layer == null) {
                    throw new RuntimeException("无法创建图层: " + tableName);
                }

                // 定义字段,根据实际数据库字段调整
                layer.CreateField(new FieldDefn("objectid", ogr.OFTInteger));

                // 遍历结果集,添加要素到图层
                while (resultSet.next()) {
                    Feature feature = new Feature(layer.GetLayerDefn());
                    feature.SetField("objectid", resultSet.getInt("objectid"));

                    // 获取几何数据并设置
                    String wktGeometry = resultSet.getString("shape");
                    if (wktGeometry != null && !wktGeometry.isEmpty()) {
                        Geometry geom = ogr.CreateGeometryFromWkt(wktGeometry);
                        if (geom == null) {
                            throw new RuntimeException("无效的WKT几何: " + wktGeometry);
                        }
                        feature.SetGeometry(geom);
                    }

                    // 添加Feature到图层
                    if (layer.CreateFeature(feature) != 0) {
                        throw new RuntimeException("无法创建要素");
                    }

                    feature.delete(); // 释放资源
                }

                // 同步数据到磁盘
                layer.SyncToDisk();
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("导出Shapefile时发生错误: " + e.getMessage(), e);
            } finally {
                if (ds != null) {
                    ds.delete(); // 确保数据源关闭
                }

                if (layer != null) {
                    layer.delete(); // 显式释放图层资源
                }
            }
        }
    }

示例表:

转为shp文件后:

相关推荐
ZYJCSZKJ1 小时前
基于地理位置围栏的短视频POI团购系统:LBS空间索引与流量分发实践
java·服务器·数据库
mldong6 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾17 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
zhanghe6878 小时前
es的密码带有特殊字符,导出
java
pnoker8 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
my_realmy8 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
天远数科8 小时前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
步行cgn9 小时前
YAML 的语法规则
spring boot·后端
骇客野人9 小时前
SpringBoot电商系统用户注册、登录、留存及数据埋点设计与落地实施方案
java·spring boot·后端
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记