概述
将数据库中的地理数据导出为Shp格式是常见的应用场景。本文利用Java的Geotools地理工具包将MySQL数据库的地理数据表导出为shp文件并压缩保存,通过Spring Boot框架提供一个REST api接口下载。
技术栈:Java、Spring Boot、Mybatis、Geotools、JTS、MySQL等。
导出结果:
关键代码
数据库表
数据库中geo字段是geometry类型,可以存储POINT、LINESTRING、POLYGON格式的空间数据。在实体类中,先用字符串类型存储查询到的WKT格式的数据,在代码中再将WKT转换为Geometry实例对象。当然,你也可以通过handleType的方式实现自动转换。
package org.example.demo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.locationtech.jts.geom.Geometry;
@Data
@TableName("geometries")
public class GeoModel {
@TableId
private Long id;
private String name;
private String geo;
private Geometry geometry;
}
依赖
- 添加仓库地址
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
<repository>
<id>osgeo-snapshot</id>
<name>OSGeo Snapshot Repository</name>
<url>https://repo.osgeo.org/repository/snapshot/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
- gt-main、gt-shapefile、jts-core等关键依赖
注意:gt-shapefile等包中依赖了jts-core的包,如果两个包版本不兼容则程序会报错,提示确实某些图斑处理的方法。本文通过试验,使用了如下版本,并排除gt-shapefile等内部依赖包jts-core,实现解决兼容性问题。
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>25.2</version>
<!-- 排除旧版 JTS -->
<exclusions>
<exclusion>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>25.2</version>
<!-- 排除旧版 JTS -->
<exclusions>
<exclusion>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
<version>1.20.0</version