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官网学习或期待我下一步更新

相关推荐
JAVA面经实录9178 分钟前
Java多线程并发高频面试100题(完整版·含答案·背诵版)
java·开发语言·面试
XiYang-DING12 分钟前
【Java EE】TCP—流量控制和拥塞控制
java·tcp/ip·java-ee
BIG_PEI31 分钟前
检查并安装Redis
java
大貔貅喝啤酒33 分钟前
基于Windows下载安装Android Studio 3.3.2版本教程(2026详细图文版)
android·java·windows·android studio
奋斗的小方35 分钟前
Java基础篇09:项目实战
java·开发语言
海兰36 分钟前
【第21篇-续】graph-Stream-Node改造为适配openAI模型示例
java·人工智能·spring boot·spring·spring ai
vKd0Ff21L38 分钟前
如何在Dev-C++中设置TDM-GCC为默认编译器第九十一篇
java·jvm·c++
武子康40 分钟前
Java-221 RocketMQ 消息存储核心原理:CommitLog、ConsumerQueue、IndexFile 与消息过滤机制
java·大数据·分布式·消息队列·rabbitmq·rocketmq·java-rocketmq
北风toto1 小时前
为什么 IntelliJ IDEA Community 无法开发 Vue?——附解决方案
java·vue.js·intellij-idea
programhelp_1 小时前
Google 2026 New Grad SDE VO 三轮面试详解 | 含Behavioral、Coding、Design
java·服务器·数据库