SpringBoot3使用PostGis+GeoTools整合MybatisPlus

一、环境搭建
1.1 docker安装PostGis(新建postgis.yaml)
java 复制代码
name: postgis

services:
  postgis:
    image: postgis/postgis:12-3.2
    container_name: postgis
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: gis_db
    ports:
      - "6432:5432"
    volumes:
      - postgis_data:/var/lib/postgis/data
      - pg_data2:/var/lib/postgresql/data

volumes:
  postgis_data:
  pg_data2:

1.2 执行docker yaml配置文件

java 复制代码
docker compose -f postgis.yaml up -d
1.3 创建数据库
java 复制代码
create extension 数据库名称;
1.4 进入创建好的数据库
java 复制代码
\c 数据库名称
1.5 启用PostGis扩展( 启用后会生成spatial_ref_sys表**)**
java 复制代码
# 启用扩展
CREATE EXTENSION postgis;
# 启用所有扩展
CREATE EXTENSION postgis_topology;
# 查看是否启用
SELECT PostGIS_Full_Version();
二、GeoTools介绍

文档地址:

复制代码
https://docs.geotools.org/latest/userguide/tutorial/quickstart/maven.html
三、搭建Springboot项目测试集成
3.1 maven配置
java 复制代码
// 用于GeoTools使用
    <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>

// 依赖包
        // MP依赖
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.15</version>
        </dependency>

        // PostGreSql依赖
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

        // GeoTools依赖
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>34.2</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>34.2</version>
        </dependency>
        <dependency>
            <groupId>net.postgis</groupId>
            <artifactId>postgis-jdbc</artifactId>
            <version>2.5.0</version>
        </dependency>
3.2 yml配置文件
java 复制代码
spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:6432/test_gis?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
    username: postgres
    password: postgres
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: auto
3.3 自定义字段插件
java 复制代码
package org.panda.geo.geodemo.handle;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgis.Geometry;
import org.postgis.PGgeometry;

@MappedTypes({String.class})
public class PgGeometryTypeHandler extends BaseTypeHandler<String> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        PGgeometry pGgeometry = new PGgeometry(parameter);
        Geometry geometry = pGgeometry.getGeometry();

        //4326坐标系的定义,统一投影坐标系
        geometry.setSrid(4326);
        ps.setObject(i, pGgeometry);
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String string = rs.getString(columnName);
        return getResult(string);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String string = rs.getString(columnIndex);
        return getResult(string);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String string = cs.getString(columnIndex);
        return getResult(string);
    }


    private String getResult(String string) throws SQLException {
        PGgeometry pGgeometry = new PGgeometry(string);
        String s = pGgeometry.toString();
        return s.replace("SRID=4326;", "");
    }
}
3.4 创建数据库
java 复制代码
create table biz_point_test(
	id int8 primary key,
	name varchar(100),
	geom geometry(Point,4326)
);
3.5 创建实体类
java 复制代码
package org.panda.geo.geodemo.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.panda.geo.geodemo.handle.PgGeometryTypeHandler;

@TableName(value ="biz_point_test",autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class PointTest {

    @TableId
    private Long id;

    private String name;

    @TableField(typeHandler = PgGeometryTypeHandler.class)
    private String geom;

    @TableField(exist=false)
    private String geomJson;
}
3.6 Mapper文件
java 复制代码
package org.panda.geo.geodemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.panda.geo.geodemo.domain.PointTest;

import java.util.List;

@Mapper
public interface TestMapper extends BaseMapper<PointTest> {

    @Select("select * from spatial_ref_sys")
    List<Object> selectTest();


    static final String FIND_GEOJSON_SQL="<script>"
            + "select *,st_asgeojson(geom) as geomJson from biz_point_test "
            + "where id = #{id} "
            + "<if test='null != name'>and p.name like concat('%', #{name}, '%')</if>"
            + "</script>";
    @Select(FIND_GEOJSON_SQL)
    PointTest findGeoJsonById(@Param("id")Long id, @Param("name")String name);

}
3.7 测试
java 复制代码
package org.panda.geo.geodemo;

import org.junit.jupiter.api.Test;
import org.panda.geo.geodemo.domain.PointTest;
import org.panda.geo.geodemo.mapper.TestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class GeoDemoApplicationTests {

    @Autowired
    private TestMapper testMapper;

    @Test
    void contextLoads() {

//        PointTest point = new PointTest();
//        point.setId(1559371184090423297L);
//        point.setName("中寨社区");
//        point.setName("中寨居委会");
//        point.setGeom("POINT(109.262605 27.200669)");
//        testMapper.insert(point);

//        testMapper.selectTest();
        PointTest geoJsonById = testMapper.findGeoJsonById(1559371184090423297L, null);
        System.out.println("查询数据如下");
        System.out.println(geoJsonById);
    }

}

完结,其他功能可自行在GeoTools官网学习或期待我下一步更新

相关推荐
姜源Jerry25 分钟前
【Trae】Trae IDE&SOLO浅尝
java·ide·ai
宇木灵35 分钟前
C语言基础-三、流程控制语句
java·c语言·前端
小杨互联网2 小时前
项目CyberScan Pro jar软件安全成分分析插件
java·jar·软件成分分析·jar安全分析
组合缺一2 小时前
Java 版 Claude Code CLI 来了!(国产开源项目)Solon Code CLI 发布
java·ai·开源·llm·solon·cli·claudecode
javaIsGood_3 小时前
Java基础面试题
java·开发语言
indexsunny3 小时前
互联网大厂Java求职面试实战:基于电商场景的技术问答及解析
java·spring boot·redis·kafka·security·microservices·面试指导
Forget_85504 小时前
RHEL——LVS模式
java·开发语言·lvs
渣瓦攻城狮4 小时前
互联网大厂Java面试:从数据库连接池到分布式缓存及微服务
java·redis·spring cloud·微服务·hikaricp·数据库连接池·分布式缓存
罗超驿4 小时前
13.1 万字长文,深入解析--抽象类和接口
java·开发语言
A懿轩A4 小时前
【Java 基础编程】Java 面向对象进阶:static/final、抽象类、接口、单例模式
java·开发语言·单例模式