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。
参考文章:
- Mysql的Geometry数据处理之WKT方案:https://blog.csdn.net/breaksoftware/article/details/139094495
– 求知若饥,虚心若愚。