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

相关推荐
m0_587383001 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·2 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停3 小时前
自动化测试(java)
java·开发语言·selenium·自动化
唠点键盘之外的3 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
鬼手点金5 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck5 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
考虑考虑6 小时前
@JsonInclude注解使用
spring boot·后端·spring
Wang's Blog6 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog6 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网6 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python