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

相关推荐
望眼欲穿的程序猿2 小时前
Ai8051U+DHT11温湿度!
java·开发语言
一只大马猴呀2 小时前
IntelliJ IDEA 中启动项目不显示端口号
java·ide·intellij-idea
Hx_Ma163 小时前
Map集合的5种遍历方式
java·前端·javascript
小手cool3 小时前
Java 列表中查找最小值和最大值最有效率的方法
java
惊讶的猫3 小时前
多线程同步问题及解决
java·开发语言·jvm
wfsm3 小时前
工厂模式创建动态代理实现类
java·开发语言
好好研究3 小时前
总结SSM设置欢迎页的方式
xml·java·后端·mvc
Hui Baby3 小时前
java -jar 启动原理
java·pycharm·jar
weixin_511255213 小时前
更新jar内资源和代码
java·jar