Springboot + mybatis + postgis实现增删改查

由于项目需要,用到了Geometry类型的字段,但是Java中没有提供相应的数据类型与空间数据库进行映射,经过长达两三天的踩坑,终于找到了解决方案~~

参考代码

https://github.com/lonelyleaf/postgis-java-demo
上面代码用的 gradle(不太会),因为 gradle 版本问题,一直无法编译通过,因此在上面代码基础上用 maven 写了一个示范程序,供参考。
https://gitee.com/fyhcug/springboot_mybatis_postgis

话不多说,直接上代码

1、引入依赖

       
       <dependency>
           <groupId>org.postgresqlgroupId>
           <artifactId>postgresqlartifactId>
       dependency>
       
       <dependency>
           <groupId>net.postgisgroupId>
           <artifactId>postgis-jdbcartifactId>
           <version>2.5.0version>
       dependency>
       
       <dependency>
           <groupId>org.locationtech.jtsgroupId>
           <artifactId>jts-coreartifactId>
           <version>1.16.1version>
       dependency>
       <dependency>
           <groupId>org.locationtech.spatial4jgroupId>
           <artifactId>spatial4jartifactId>
           <version>0.7version>
       dependency>
       
       <dependency>
           <groupId>com.graphhopper.externalgroupId>
           <artifactId>jackson-datatype-jtsartifactId>
           <version>1.0-2.7version>
        dependency>

2、数据库的创建

来自 参考代码
https://github.com/lonelyleaf/postgis-java-demo

Springboot + mybatis + postgis实现增删改查_第1张图片

3、数据源配置

需要修改 urldriver-class-name
需要修改 urldriver-class-name
需要修改 urldriver-class-name
url 改为:jdbc:postgres_jts://xxx:5432/db
driver-class-name 需要根据自己的项目进行配置(如下下图所示)

spring:
  datasource:
    url: jdbc:postgres_jts://localhost:5432/jtstest?characterEncoding=utf8
    driver-class-name: com.jtstest.demo.config.wrapper.JtsWrapper
    
mybatis-plus:
  type-handlers-package: "com.jtstest.demo.config.jts"

Springboot + mybatis + postgis实现增删改查_第2张图片
Springboot + mybatis + postgis实现增删改查_第3张图片

左右两个白色图中的代码,来自上面提到的 参考代码

Springboot + mybatis + postgis实现增删改查_第4张图片

4、利用Mybatis-plus自动生成各种代码,然后测试

测试之前需要修改一个字段的类型,修改为 Point 类型,来自: org.locationtech.jts.geom.Point

Springboot + mybatis + postgis实现增删改查_第5张图片
Springboot + mybatis + postgis实现增删改查_第6张图片Springboot + mybatis + postgis实现增删改查_第7张图片

测试代码

@Test
void contextLoads() {
    QueryWrapper<TGps> wrapper = new QueryWrapper<>();
    wrapper.orderByAsc("time");
    wrapper.last("limit 10");
    List<TGps> list = tGpsDao.selectList(wrapper);
    for (TGps entity : list) {
        System.out.println(entity);
    }
}

Springboot + mybatis + postgis实现增删改查_第8张图片

运行结果

Springboot + mybatis + postgis实现增删改查_第9张图片

5、增删改查

5.1 插入数据测试

@Test
void insertTest(){
    TGps tGps = new TGps();
    tGps.setTime(new Date());
    tGps.setDevId("abcdef");
    tGps.setLocation(JtsUtil.newPoint(113.0,34.0));
    tGps.setGpsNum(17);
    tGps.setGpsType("差分定位");
    tGps.setAzimuth(300.93);
    tGps.setGndRate(0.0);
    int insert = tGpsDao.insert(tGps);
    System.out.println("插入成功--> " + insert);
}

插入后查询是否插入成功

    @Test
    void selectTest(){
        QueryWrapper<TGps> wrapper = new QueryWrapper<>();
        wrapper.eq("dev_id","abcdef");
        List<TGps> list = tGpsDao.selectList(wrapper);
        for (TGps entity : list) {
            System.out.println(entity);
        }
    }

Springboot + mybatis + postgis实现增删改查_第10张图片

5.2 删除数据测试

@Test
void deleteTest() {
    QueryWrapper<TGps> wrapper = new QueryWrapper<>();
    wrapper.eq("dev_id","abcdef");
    int delete = tGpsDao.delete(wrapper);
    System.out.println("删除成功--> " + delete);
}

5.2 更新数据测试

@Test
void updateTest() {
    TGps tGps = new TGps();
    tGps.setTime(new Date());
    tGps.setDevId("abcdef");
    tGps.setLocation(JtsUtil.newPoint(113.0,34.0));
    tGps.setGpsNum(17);
    tGps.setGpsType("GPS定位");
    tGps.setAzimuth(300.93);
    tGps.setGndRate(0.0);
    QueryWrapper<TGps> wrapper = new QueryWrapper<>();
    wrapper.eq("dev_id","abcdef");
    int update = tGpsDao.update(tGps, wrapper);
    System.out.println("更新成功--> " + update);
}

查询是否更新成功

Springboot + mybatis + postgis实现增删改查_第11张图片
Springboot + mybatis + postgis实现增删改查_第12张图片

6、点线面的创建

 @Test
    void createGeometry() throws JsonProcessingException {
    	ObjectMapper objectMapper = new ObjectMapper().registerModule(new JtsModule());
        /*
         * 创建点
         */
//        Point point = JtsUtil.newPoint(113.0,34.0);
//        System.out.println(point);
//        objectMapper.registerModule(new JtsModule());
//        System.out.println(objectMapper.writeValueAsString(point));

        /*
         * 创建线
         */
//        Point[] points = new Point[10];
//        for(int i = 0; i < 10; i ++){
//            points[i] = JtsUtil.newPoint(106.87+i, 27.53+i);
//        }
//        LineString lineString = JtsUtil.newLineString(points);
//        System.out.println(lineString);
//        System.out.println(objectMapper.writeValueAsString(lineString));

        /*
         * 根据查询结果创建线,数据库查询结果放在 points 中
         */
//        List points = new ArrayList<>();
//        for(int i = 0; i < 10; i ++){
//            points.add(JtsUtil.newPoint(106.87+i, 27.53+i));
//        }
//        points.add(JtsUtil.newPoint(106.87, 27.53));
//        Coordinate[] points1 = points.stream()
//                .map(Point::getCoordinate)
//                .toArray(Coordinate[]::new);
//        System.out.println(JtsUtil.geometryFactory4326.createLineString(points1));

        /*
         * 点创建面
         */
        List<Point> points = new ArrayList<>();
        for(int i = 0; i < 10; i ++){
            points.add(JtsUtil.newPoint(106.87+i, 27.53+i));
        }
        points.add(JtsUtil.newPoint(106.87, 27.53));
        Coordinate[] points1 = points.stream()
                .map(Point::getCoordinate)
                .toArray(Coordinate[]::new);
        Polygon polygon = JtsUtil.geometryFactory4326.createPolygon(points1);
        System.out.println(polygon);
        System.out.println(objectMapper.writeValueAsString(polygon));
    }
/**
 * @Description: Geometry 工具类
 * @date: 2021/3/14$ 19:15$
 */
public class JtsUtil {

    /**
     * srid 为 4326
     */
    public static final GeometryFactory geometryFactory4326 = new GeometryFactory(new PrecisionModel(), 4326);

    public static Point newPoint(double x, double y) {
        return geometryFactory4326.createPoint(new CoordinateXY(x, y));
    }
    public static LineString newLineString(Point[] points) {
        int length = points.length;
        CoordinateXY[] coordinate = new CoordinateXY[length];
        for(int i = 0; i < length; i ++){
            coordinate[i] = new CoordinateXY(points[i].getX(), points[i].getY());
        }
        return geometryFactory4326.createLineString(coordinate);
    }
}

你可能感兴趣的:(java,postgis,spring,boot)