MySQL的Geometry数据处理之WKT方案

WKT全称是Well-Known Text。它是一种表达几何信息的字符串内容。

比如:点可以用WKT表示为POINT (3 3);线可以用WKT表示为LINESTRING (1 1, 2 2)。

Mysql数据库可以存储一些几何类型数据,比如点、线、多边形等。这在一些基于地理信息的服务上比较有用,比如在地图上的商店地理坐标(点),或者路径规划中的行进路线(线)等。

目前Mysql 8.版本,它也是支持几何类型数据结构。

一、Geometry使用

一般我们会使用 org.locationtech.jts的 Geometry类来表达几何信息。

引入依赖:

        <!--Geometry工具库依赖-->
        <dependency>
            <groupId>org.locationtech.jts</groupId>
            <artifactId>jts-core</artifactId>
            <version>1.19.0</version>
        </dependency>

1、Geometry使用

使用Geometry进行几何结构构建。

GeometryFactory geometryFactory = new GeometryFactory();
Geometry geometry = geometryFactory.createPoint(new Coordinate(3, 3));

点集合

GeometryFactory geometryFactory = new GeometryFactory();
LineString lineString = geometryFactory
        .createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) });

线

GeometryFactory geometryFactory = new GeometryFactory();
LineString lineString = geometryFactory
        .createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) });

线集合

GeometryFactory geometryFactory = new GeometryFactory();
MultiLineString multiLineString = geometryFactory.createMultiLineString(new LineString[] {
        geometryFactory
                .createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),
        geometryFactory
                .createLineString(new Coordinate[] { new Coordinate(3, 3), new Coordinate(4, 4) })
});

GeometryFactory geometryFactory = new GeometryFactory();
Polygon polygon = geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1),
 					new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1) });

面集合

GeometryFactory geometryFactory = new GeometryFactory();
MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(new Polygon[] {
        geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),
                new Coordinate(3, 3), new Coordinate(1, 1) }),
        geometryFactory.createPolygon(new Coordinate[] { new Coordinate(4, 4), new Coordinate(5, 5),
                new Coordinate(6, 6), new Coordinate(4, 4) })
});

几何信息集合

GeometryFactory geometryFactory = new GeometryFactory();
GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(new Geometry[] {
        geometryFactory.createPoint(new Coordinate(1, 1)),
        geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),
        geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),
                new Coordinate(3, 3), new Coordinate(1, 1) })
});

下面我们需要将这些结构保存到Mysql数据库中。

由于org.locationtech.jts.geom.Geometry和Mysql内部存储的Geometry不匹配,需要转换操作。

项目中使用 MyBatis-Plus,自定义字段类型处理器来实现MySQL的Geometry数据处理之WKT方案。

二、自定义类型处理器

项目中使用 MyBatis-Plus,自定义字段类型处理器来实现MySQL的Geometry数据处理之WKB方案。
MyBatis-Plus字段类型处理器:https://baomidou.com/guides/type-handler/

1、完整TypeHandler类

public class GeometryTypeWKTHandler extends BaseTypeHandler<Geometry> {
    private static GeometryFactory factory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), 4326);

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Geometry parameter, JdbcType jdbcType) throws SQLException {
        String str = serializeGeometry(parameter);
        ps.setString(i, str);
        ;
    }

    @Override
    public Geometry getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String str = rs.getString(columnName);
        try {
            return deserializeGeometry(str);
        } catch (ParseException e) {
            throw new SQLException(e);
        }
    }

    @Override
    public Geometry getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String str = rs.getString(columnIndex);
        try {
            return deserializeGeometry(str);
        } catch (ParseException e) {
            throw new SQLException(e);
        }
    }

    @Override
    public Geometry getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String str = cs.getString(columnIndex);
        try {
            return deserializeGeometry(str);
        } catch (ParseException e) {
            throw new SQLException(e);
        }
    }

    /**
     * 序列化
     *
     * @param geometry
     * @return
     */
    private static String serializeGeometry(Geometry geometry) {
        WKTWriter writer = new WKTWriter(2);
        return writer.write(geometry);
    }

    /**
     * 反序列化
     *
     * @param wkt
     * @return
     * @throws ParseException
     */
    private static Geometry deserializeGeometry(String wkt) throws ParseException {
        return new WKTReader(factory).read(wkt);
    }

}

WKTWriter会将org.locationtech.jts.geom.Geometry转换为String,然后交由SQL语句处理;

WKTReader会将SQL语句读取出来的String转换为org.locationtech.jts.geom.Geometry对象。

在这里插入图片描述

三、使用自定义类型处理器

自定义类型处理器主要使用String类型作为媒介来和SQL语句联系。那么SQL语句是如何把String转成
Mysql的Geometry内部结构的呢?这就需要借助ST_GeomFromText和ST_AsText常用函数。

  • ST_GeomFromText则可以将WKT(字符串)格式的几何信息转换为Mysql内部的Geometry结构。比如:ST_GeomFromText(‘MULTIPOINT (1 1, 2 2, 3 3)’)
ST_GeomFromText('MULTIPOINT (1 1, 2 2, 3 3)')
  • ST_AsText则可以将Mysql内部的Geometry结构转换为WKT(字符串)格式的几何信息。

在这里插入图片描述
所以,在Mybatis的Mapper XML中,需要我们手动借助上面函数处理几何信息字段或者使用 Mybatis-plus的 Mapper接口方法操作。

创建表SQL语句:

CREATE TABLE `t_geo_wkt` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `del_flag` char(1) DEFAULT '0' COMMENT '删除标记,0未删除,1已删除',
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `geo_type` varchar(255) DEFAULT NULL COMMENT 'geo_type',
  `geo` geometry NOT NULL COMMENT 'geo几何数据-GCJ02',
  PRIMARY KEY (`id`),
  SPATIAL KEY `idx_geo` (`geo`) COMMENT '空间数据索引'
) ENGINE=InnoDB COMMENT='几何数据wkt表';

1、DO类

@Getter
@Setter
@TableName("t_geo_wkt")
public class GeoWktDO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 创建时间
     */
    @TableField("create_time")
    private LocalDateTime createTime;

    /**
     * 修改时间
     */
    @TableField("update_time")
    private LocalDateTime updateTime;

    /**
     * 删除标记,0未删除,1已删除
     */
    @TableField("del_flag")
    private String delFlag;

    /**
     * 名称
     */
    @TableField("name")
    private String name;

    /**
     * geo_type
     */
    @TableField("geo_type")
    private String geoType;

    @TableField("geo")
    private Geometry geo;

}

2、完整Mapper XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.charge.ws.core.mapper.GeoWktMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.charge.ws.core.entity.GeoWktDO">
        <id column="id" property="id"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="del_flag" property="delFlag"/>
        <result column="name" property="name"/>
        <result column="geo_type" property="geoType"/>
        <result column="geo" property="geo" typeHandler="com.charge.ws.handler.jts.GeometryTypeWKTHandler"
                jdbcType="BLOB"/>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id
        , create_time, update_time, del_flag, name, geo_type, ST_AsText(geo) AS geo
    </sql>

    <select id="findAll" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_geo_wkt
    </select>

    <select id="findById" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_geo_wkt
        WHERE id = #{id}
    </select>

    <insert id="insertOne">
        INSERT INTO t_geo_wkt(create_time, update_time, del_flag, name, geo_type, geo)
        VALUES (now(), now(), #{geoWktDO.delFlag}, #{geoWktDO.name}, #{geoWktDO.geoType},
                ST_GeomFromText(#{geoWktDO.geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB}))
    </insert>

    <insert id="insertList">
        INSERT INTO t_geo_wkt(id, create_time, update_time, del_flag, name, geo_type, geo) values
        <foreach item="item" collection="geoWktDOList" separator=",">
            (#{item.id}, now(), now(), #{item.delFlag}, #{item.name}, #{item.geoType},
            ST_GeomFromText(#{item.geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB}))
        </foreach>
    </insert>

    <insert id="insertGeometryCollection">
        insert into t_geo_wkt(id, create_time, update_time, del_flag, name, geo_type, geo)
        VALUES (#{geoWktDO.id}, now(), now(), #{geoWktDO.delFlag}, #{geoWktDO.name}, #{geoWktDO.geoType},
                ST_GeomCollFromText(#{geoWktDO.geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB}))
    </insert>

    <update id="updateOne">
        update t_geo_wkt
        set geo         = ST_GeomFromText(#{geoWktDO.geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB}),
            update_time = now()
        where id = #{geoWktDO.id}
    </update>


</mapper>

3、Mapper类

public interface GeoWktMapper extends BaseMapper<GeoWktDO> {

    List<GeoWktDO> findAll();

    GeoWktDO findById(@Param("id") Long id);

    int insertOne(@Param("geoWktDO") GeoWktDO geoWktDO);

    int insertList(@Param("geoWktDOList") List<GeoWktDO> geoWktDOList);

    int insertGeometryCollection(@Param("geoWktDO") GeoWktDO geoWktDO);

    int updateOne(@Param("geoWktDO") GeoWktDO geoWktDO);

}

四、示例测试

1、单元测试

    @Autowired
    private GeoWktMapper geoWktMapper;

    @Test
    public void testFindAll() {
        List<GeoWktDO> doList = geoWktMapper.findAll();
        System.out.println(doList);
    }

    @Test
    public void testGetById() {
        GeoWktDO geoWktDO = geoWktMapper.findById(1L);
        System.out.println(geoWktDO);
    }

    @Test
    public void testInsert1() {
        // 点
        GeometryFactory geometryFactory = new GeometryFactory();
        Geometry point = geometryFactory.createPoint(new Coordinate(108.939645, 34.343205));

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("点");
        saveDO.setGeoType("1");
        saveDO.setGeo(point);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert2() {
        // 点集合
        GeometryFactory geometryFactory = new GeometryFactory();
        LineString lineString = geometryFactory
                .createLineString(new Coordinate[]{new Coordinate(108.939645, 34.343205), new Coordinate(108.939647, 34.343207),
                        new Coordinate(1, 1)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("点集合");
        saveDO.setGeoType("2");
        saveDO.setGeo(lineString);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert3() {
        // 线
        GeometryFactory geometryFactory = new GeometryFactory();
        LineString lineString = geometryFactory
                .createLineString(new Coordinate[]{new Coordinate(108.939645, 34.343205), new Coordinate(108.939647, 34.343207),
                        new Coordinate(2, 2), new Coordinate(3, 3)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("线");
        saveDO.setGeoType("3");
        saveDO.setGeo(lineString);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert4() {
        // 线集合
        GeometryFactory geometryFactory = new GeometryFactory();
        MultiLineString multiLineString = geometryFactory.createMultiLineString(new LineString[]{
                geometryFactory
                        .createLineString(new Coordinate[]{new Coordinate(108.939645, 34.343205), new Coordinate(108.939647, 34.343207)}),
                geometryFactory
                        .createLineString(new Coordinate[]{new Coordinate(108.939648, 34.343208), new Coordinate(108.939649, 34.343209)})
        });

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("线集合");
        saveDO.setGeoType("4");
        saveDO.setGeo(multiLineString);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert5() {
        // 面
        GeometryFactory geometryFactory = new GeometryFactory();
        Polygon polygon = geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
                new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("面");
        saveDO.setGeoType("5");
        saveDO.setGeo(polygon);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert6() {
        // 面集合
        GeometryFactory geometryFactory = new GeometryFactory();
        MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(new Polygon[]{
                geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2),
                        new Coordinate(3, 3), new Coordinate(1, 1)}),
                geometryFactory.createPolygon(new Coordinate[]{new Coordinate(4, 4), new Coordinate(5, 5),
                        new Coordinate(6, 6), new Coordinate(4, 4)})
        });


        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("面集合");
        saveDO.setGeoType("6");
        saveDO.setGeo(multiPolygon);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert7() {
        // 几何信息集合
        GeometryFactory geometryFactory = new GeometryFactory();
        GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(new Geometry[]{
                geometryFactory.createPoint(new Coordinate(1, 1)),
                geometryFactory.createLineString(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2)}),
                geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2),
                        new Coordinate(3, 3), new Coordinate(1, 1)})
        });

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("几何信息集合");
        saveDO.setGeoType("7");
        saveDO.setGeo(geometryCollection);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert8() {
        // 面-点集合
        GeometryFactory geometryFactory = new GeometryFactory();
        MultiPoint multiPoint = geometryFactory.createMultiPointFromCoords(
                new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2), new Coordinate(3, 3)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("面-点集合");
        saveDO.setGeoType("8");
        saveDO.setGeo(multiPoint);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testInsert9() {
        // linearRing
        // geoWktMapper.insert(saveDO) 支持 LinearRing
        /**
         *  ==>  Preparing: INSERT INTO t_geo_wkt ( del_flag, name, geo_type, geo ) VALUES ( ?, ?, ?, ? )
         *  ==> Parameters: 0(String), linearRing(String), 8(String), [B@1cd853ee(byte[])
         *  <==    Updates: 1
         */
        GeometryFactory geometryFactory = new GeometryFactory();
        LinearRing linearRing = geometryFactory.createLinearRing(new Coordinate[] { new Coordinate(1, 1),
                new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1) });

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("linearRing");
        saveDO.setGeoType("8");
        saveDO.setGeo(linearRing);
        geoWktMapper.insert(saveDO);
    }

    @Test
    public void testUpdateById() {
        GeometryFactory geometryFactory = new GeometryFactory();
        Coordinate coordinate = new Coordinate(2, 2);
        Geometry point = geometryFactory.createPoint(coordinate);
        GeoWktDO updateDO = new GeoWktDO();
        updateDO.setId(1L);
        updateDO.setGeo(point);
        geoWktMapper.updateById(updateDO);
    }

    /**
     * geoWktMapper.insert(saveDO);都支持。
     * 自定义 xml,使用函数也支持。
     */
    @Test
    public void testInsertOne1() {
        // 点
        GeometryFactory geometryFactory = new GeometryFactory();
        Geometry point = geometryFactory.createPoint(new Coordinate(108.939645, 34.343205));

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("点-InsertOne");
        saveDO.setGeoType("1");
        saveDO.setGeo(point);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testInsertOne2() {
        // 点
        // 点集合
        GeometryFactory geometryFactory = new GeometryFactory();
        LineString lineString = geometryFactory
                .createLineString(new Coordinate[]{new Coordinate(108.939645, 34.343205), new Coordinate(108.939647, 34.343207),
                        new Coordinate(1, 1)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("点-InsertOne");
        saveDO.setGeoType("1");
        saveDO.setGeo(lineString);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testInsertOne3() {
        // 线
        GeometryFactory geometryFactory = new GeometryFactory();
        LineString lineString = geometryFactory
                .createLineString(new Coordinate[]{new Coordinate(108.939645, 34.343205), new Coordinate(108.939647, 34.343207),
                        new Coordinate(2, 2), new Coordinate(3, 3)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("线-InsertOne");
        saveDO.setGeoType("3");
        saveDO.setGeo(lineString);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testInsertOne4() {
        // 线集合
        GeometryFactory geometryFactory = new GeometryFactory();
        MultiLineString multiLineString = geometryFactory.createMultiLineString(new LineString[]{
                geometryFactory
                        .createLineString(new Coordinate[]{new Coordinate(108.939645, 34.343205), new Coordinate(108.939647, 34.343207)}),
                geometryFactory
                        .createLineString(new Coordinate[]{new Coordinate(108.939648, 34.343208), new Coordinate(108.939649, 34.343209)})
        });

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("线集合-InsertOne");
        saveDO.setGeoType("4");
        saveDO.setGeo(multiLineString);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testInsertOne5() {
        // 面
        GeometryFactory geometryFactory = new GeometryFactory();
        Polygon polygon = geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
                new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("面-InsertOne");
        saveDO.setGeoType("5");
        saveDO.setGeo(polygon);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testInsertOne6() {
        // 面集合
        GeometryFactory geometryFactory = new GeometryFactory();
        MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(new Polygon[]{
                geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2),
                        new Coordinate(3, 3), new Coordinate(1, 1)}),
                geometryFactory.createPolygon(new Coordinate[]{new Coordinate(4, 4), new Coordinate(5, 5),
                        new Coordinate(6, 6), new Coordinate(4, 4)})
        });


        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("面集合-InsertOne");
        saveDO.setGeoType("6");
        saveDO.setGeo(multiPolygon);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testInsertOne7() {
        // 几何信息集合
        GeometryFactory geometryFactory = new GeometryFactory();
        GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(new Geometry[]{
                geometryFactory.createPoint(new Coordinate(1, 1)),
                geometryFactory.createLineString(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2)}),
                geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2),
                        new Coordinate(3, 3), new Coordinate(1, 1)})
        });

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("几何信息集合-InsertOne");
        saveDO.setGeoType("7");
        saveDO.setGeo(geometryCollection);
        // 两个都可以
        geoWktMapper.insertOne(saveDO);
        //geoWktMapper.insertGeometryCollection(saveDO);
    }

    @Test
    public void testInsertOne8() {
        // 面-点集合
        GeometryFactory geometryFactory = new GeometryFactory();
        MultiPoint multiPoint = geometryFactory.createMultiPointFromCoords(
                new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2), new Coordinate(3, 3)});

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("面-点集合-InsertOne");
        saveDO.setGeoType("8");
        saveDO.setGeo(multiPoint);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testInsertOne9() {
        // linearRing
        // st_geomfromtext 不支持 LinearRing
        /**
         *  ==>  Preparing: INSERT INTO t_geo_wkt ( del_flag, name, geo_type, geo ) VALUES ( ?, ?, ?, ? )
         *  ==> Parameters: 0(String), linearRing(String), 8(String), [B@1cd853ee(byte[])
         *  <==    Updates: 1
         */
        GeometryFactory geometryFactory = new GeometryFactory();
        LinearRing linearRing = geometryFactory.createLinearRing(new Coordinate[] { new Coordinate(1, 1),
                new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1) });

        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setDelFlag(CommonConstants.DELETE_FLAG_NORMAL);
        saveDO.setName("linearRing");
        saveDO.setGeoType("8");
        saveDO.setGeo(linearRing);
        geoWktMapper.insertOne(saveDO);
    }

    @Test
    public void testUpdateOne() {
        GeometryFactory geometryFactory = new GeometryFactory();
        Coordinate coordinate = new Coordinate(22, 22);
        Geometry point = geometryFactory.createPoint(coordinate);
        GeoWktDO saveDO = new GeoWktDO();
        saveDO.setId(10L);
        saveDO.setGeo(point);
        geoWktMapper.updateOne(saveDO);
    }

    @Test
    public void testInsertList() {
        List<GeoWktDO> doList = new ArrayList<>();
        {
            GeoWktDO saveDO = new GeoWktDO();
            GeometryFactory geometryFactory = new GeometryFactory();
            Coordinate coordinate = new Coordinate(3, 3);
            Geometry point = geometryFactory.createPoint(coordinate);
            saveDO.setGeo(point);
            doList.add(saveDO);
        }

        {
            GeoWktDO saveDO = new GeoWktDO();
            GeometryFactory geometryFactory = new GeometryFactory();
            LineString lineString = geometryFactory
                    .createLineString(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2)});
            saveDO.setGeo(lineString);
            doList.add(saveDO);
        }

        {
            GeoWktDO saveDO = new GeoWktDO();
            GeometryFactory geometryFactory = new GeometryFactory();
            MultiLineString multiLineString = geometryFactory.createMultiLineString(new LineString[]{
                    geometryFactory
                            .createLineString(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2)}),
                    geometryFactory
                            .createLineString(new Coordinate[]{new Coordinate(3, 3), new Coordinate(4, 4)})
            });
            saveDO.setGeo(multiLineString);
            doList.add(saveDO);
        }

        {
            GeoWktDO saveDO = new GeoWktDO();
            GeometryFactory geometryFactory = new GeometryFactory();
            MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(new Polygon[]{
                    geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2),
                            new Coordinate(3, 3), new Coordinate(1, 1)}),
                    geometryFactory.createPolygon(new Coordinate[]{new Coordinate(4, 4), new Coordinate(5, 5),
                            new Coordinate(6, 6), new Coordinate(4, 4)})
            });
            saveDO.setGeo(multiPolygon);
            doList.add(saveDO);
        }

        // st_geomfromtext 不支持 LinearRing
         //{
         //    GeoWktDO saveDO = new GeoWktDO();
         //    GeometryFactory geometryFactory = new GeometryFactory();
         //    LinearRing linearRing = geometryFactory.createLinearRing(new Coordinate[] { new Coordinate(1, 1),
         //            new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1) });
         //    saveDO.setGeo(linearRing);
         //    doList.add(saveDO);
         //}

        {
            GeoWktDO saveDO = new GeoWktDO();
            GeometryFactory geometryFactory = new GeometryFactory();
            MultiPoint multiPoint = geometryFactory.createMultiPointFromCoords(
                    new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2), new Coordinate(3, 3)});
            saveDO.setGeo(multiPoint);
            doList.add(saveDO);
        }

        {
            GeoWktDO saveDO = new GeoWktDO();
            GeometryFactory geometryFactory = new GeometryFactory();
            Polygon polygon = geometryFactory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
                    new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1)});
            saveDO.setGeo(polygon);
            doList.add(saveDO);
        }

         {
             GeoWktDO saveDO = new GeoWktDO();
             GeometryFactory geometryFactory = new GeometryFactory();
             GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(new Geometry[] {
                     geometryFactory.createPoint(new Coordinate(1, 1)),
                     geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),
                     geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),
                             new Coordinate(3, 3), new Coordinate(1, 1) })
             });
             saveDO.setGeo(geometryCollection);
             doList.add(saveDO);
         }

        int count = geoWktMapper.insertList(doList);
        System.out.println(count);
    }

通过单元测试结论:

  • 使用 Mubatis-plus的 封装的 Mapper接口操作方法,都支持,注意:字段上必须指定 @TableField(“geo”)。推荐使用。
  • 使用 函数在 Mapper XML中操作方法,发现 st_geomfromtext 不支持 LinearRing。

在这里插入图片描述

参考文章:

– 求知若饥,虚心若愚。

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值