MySQL的Geometry数据处理之WKT方案
字段映射:确保 WKT格式: 线与线环: 存储优化:使用适当的精度模型和空间引用系统(如
发布日期:2025-04-18 07:40:16
浏览次数:71
分类:精选文章
本文共 6512 字,大约阅读时间需要 21 分钟。
Mysql Geometry数据处理之WKT方案
WKT(Well-Known Text)简介
WKT(Well-Known Text)是一种表达几何信息的字符串格式,广泛应用于存储和处理空间几何数据。例如,点可以用POINT (3 3)表示,线可以用LINESTRING (1 1, 2 2)表示。
Geometry类的使用
在Mysql 8.0及以上版本,几何数据类型得到了支持。我们可以通过org.locationtech.jts库中的Geometry类来构建和操作几何数据。
引入依赖
在项目中引入必要的依赖:
org.locationtech.jts jts-core 1.19.0
Geometry对象的创建
GeometryFactory geometryFactory = new GeometryFactory();Geometry point = geometryFactory.createPoint(new Coordinate(3, 3));
示例
// 创建点GeometryFactory geometryFactory = new GeometryFactory();Geometry point = geometryFactory.createPoint(new Coordinate(3, 3));// 创建线GeometryFactory geometryFactory = new GeometryFactory();LineString lineString = geometryFactory.createLineString( new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2)});// 创建线集合LineString line1 = geometryFactory.createLineString(new Coordinate[]{new Coordinate(1, 1), new Coordinate(2, 2)});LineString line2 = geometryFactory.createLineString(new Coordinate[]{new Coordinate(3, 3), new Coordinate(4, 4)});MultiLineString multiLineString = geometryFactory.createMultiLineString(new LineString[]{line1, line2}); 自定义类型处理器
为了实现Mysql Geometry数据与WKT格式的转换,我们需要自定义一个BaseTypeHandler,用于处理Geometry对象。
public class GeometryTypeWKTHandler extends BaseTypeHandler{ private static final GeometryFactory factory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), 4326); @Override public void setNonNullParameter(PreparedStatement ps, int i, Geometry parameter, JdbcType jdbcType) throws SQLException { String wkt = serializeGeometry(parameter); ps.setString(i, wkt); } @Override public Geometry getNullableResult(ResultSet rs, String columnName) throws SQLException { String wkt = rs.getString(columnName); return deserializeGeometry(wkt); } @Override public Geometry getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String wkt = rs.getString(columnIndex); return deserializeGeometry(wkt); } @Override public Geometry getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String wkt = cs.getString(columnIndex); return deserializeGeometry(wkt); } private String serializeGeometry(Geometry geometry) { WKTWriter writer = new WKTWriter(2); return writer.write(geometry); } private Geometry deserializeGeometry(String wkt) throws ParseException { return new WKTReader(factory).read(wkt); }}
数据库表结构设计
创建存储WKT格式几何数据的表t_geo_wkt:
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类型', `geo` geometry NOT NULL COMMENT '几何数据', PRIMARY KEY (`id`), SPATIAL KEY `idx_geo` (`geo`) COMMENT '空间数据索引') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '几何数据WKT表';
DO类定义
定义一个GeoWktDO类来封装几何数据:
@Table(name = "t_geo_wkt")public class GeoWktDO implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @TableField("create_time") private LocalDateTime createTime; @TableField("update_time") private LocalDateTime updateTime; @TableField("del_flag") private String delFlag; @TableField("name") private String name; @TableField("geo_type") private String geoType; @TableField("geo") private Geometry geo;} Mapper XML配置
在Mapper XML中配置数据处理:
id, create_time, update_time, del_flag, name, geo_type, ST_AsText(geo) AS geo_wkt INSERT INTO t_geo_wkt(create_time, update_time, del_flag, name, geo_type, geo) VALUES (now(), now(), #{delFlag}, #{name}, #{geoType}, ST_GeomFromText(#{geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB})) INSERT INTO t_geo_wkt(id, create_time, update_time, del_flag, name, geo_type, geo) VALUES (#{id}, now(), now(), #{delFlag}, #{name}, #{geoType}, ST_GeomFromText(#{geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB})) INSERT INTO t_geo_wkt(id, create_time, update_time, del_flag, name, geo_type, geo) VALUES (#{id}, now(), now(), #{delFlag}, #{name}, #{geoType}, ST_GeomCollFromText(#{geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB})) UPDATE t_geo_wkt SET geo = ST_GeomFromText(#{geo, typeHandler=com.charge.ws.handler.jts.GeometryTypeWKTHandler, jdbcType=BLOB}), update_time = now() WHERE id = #{id}
Mapper接口定义
定义GeoWktMapper接口:
public interface GeoWktMapper extends BaseMapper{ List findAll(); GeoWktDO findById(@Param("id") Long id); int insertOne(@Param("geoWktDO") GeoWktDO geoWktDO); int insertList(@Param("geoWktDOList") List geoWktDOList); int insertGeometryCollection(@Param("geoWktDO") GeoWktDO geoWktDO); int updateOne(@Param("geoWktDO") GeoWktDO geoWktDO);}
单元测试示例
@Autowiredprivate GeoWktMapper geoWktMapper;@Testpublic void testFindAll() { List doList = geoWktMapper.findAll(); System.out.println(doList);}@Testpublic void testGetById() { GeoWktDO geoWktDO = geoWktMapper.findById(1L); System.out.println(geoWktDO);}@Testpublic 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);}// ... 其他测试用例 注意事项
@TableField("geo")注解正确配置。ST_GeomFromText用于将WKT转换为Mysql Geometry,ST_AsText用于反向操作。ST_GeomFromText不支持LINESTRING或LINEARING,需单独处理。PrecisionModel.FLOATING和CRS4326)。通过以上配置和实现,可以在Mysql数据库中高效存储和操作各种几何数据。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2026年05月29日 07时22分36秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP 实现N阶矩阵相乘
2023-02-28
php 延迟静态绑定static关键字
2023-02-28
Redis入门
2023-02-28
PHP 截取字符串乱码的解决方案
2023-02-28
php 接口类与抽象类的实际作用
2023-02-28
PHP 插入排序 -- 折半查找
2023-02-28
PHP 支持8种基本的数据类型
2023-02-28
php 放大镜,放大镜放大图片效果
2023-02-28
PHP 数据库连接池实现
2023-02-28
php 数组 区别,PHP中数组的区别
2023-02-28
PHP 数组怎么添加一个元素
2023-02-28
PHP 文件操作
2023-02-28
php 文字弹幕效果代码,HTML5文字弹幕效果
2023-02-28
php 时间日期函数,获取今天开始时间,结束时间
2023-02-28
php 标准规范
2023-02-28
PHP 浮点型精度运算相关问题
2023-02-28
php 浮点型计算精度问题
2023-02-28
php 特定时间段统计,jpgraph某个时间段的数据统计
2023-02-28
php 生成csv mac下乱码
2023-02-28
php 生成证书 签名及验签
2023-02-28