1. 概述

在开发中,遇到了需要使用经纬度的场景,一开始我们简单的在数据库以Decimal(2,6)来存储,但后来遇到了需要计算各点的距离,因此考虑重构对经纬度的处理。

现在使用的方案为,前端给后端传double(六位精度够用了),后端转为jts包下的Point类,存入数据库时也是point数据类型。

2. jts

JTS Topology Suite(Java Topology Suite)是一个开源的Java软件库,它为欧几里得平面线性几何提供了一个对象模型以及一组基本的几何函数。

导入库的时候遇到一个小插曲,我把其maven依赖配置写进了dependencyManagement,死活下载不到对应的包,后来才注意到。dependencyManagement仅仅用于统一版本,仍然要在依赖配置下添加相关依赖。

3. 数据库point使用

1
2
3
4
INSERT INTO test VALUE (POINT(1.123456,2.123456));
INSERT INTO test VALUE (POINT(11.123456,12.123456));
INSERT INTO test VALUE (POINT(21.123456,22.123456));
SELECT * FROM test WHERE ST_X(point)=1.123456;

插入数据时如上,直接肉眼看point数据没有什么意义,只会显示一个编码。

我们的任务是检索距离近的,MySQL也提供了便捷的方法SELECT ST_X(point) FROM test ORDER BY ST_Distance_Sphere(point(1,2), point) limit 10;

当然这要求商家量不算特别大,目前通过添加索引的方式尽量提高检索能力。之后可能考虑使用ElasticSearch