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

相关推荐
rannn_1115 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
IKUN家族7 小时前
Spring IoC&DI
java·spring·rpc
山荷枝8 小时前
03-框架--Spring
java·后端·spring
ChaHae-In9 小时前
SpringBoot统一功能处理
java·spring boot·后端
coder!mq9 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding9 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
心平气和量大福大9 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
9523610 小时前
Spring-cloud配置中心
java·spring·spring cloud·微服务
ydd10010010 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言
真上帝的左手12 小时前
10. 软件设计&架构-Spring Security 7 整合CAS SSO 单点登录
java·spring·架构·sso