有段时间为了追求效率,把用es相关的地理位置功能都去掉了,使用mysql已有的geometry的功能做地理位置,mybatis这块
@TableName(value = "t_event_info",autoResultMap = true)
如果使用复杂的数据结构,json,有两个方式
1、使用xml的是要 resultMap
2、没有使用xml的 必须配置autoResultMap=true
地理相关的函数https://dev.mysql.com/doc/refman/8.0/en/spatial-function-reference.html
姓名 | 描述 | 介绍 |
---|
GeomCollection() | 从几何构造几何集合 | |
---|
GeometryCollection() | 从几何构造几何集合 | |
---|
LineString() | 从点值构造 LineString | |
---|
MBRContains() | 一个几何的 MBR 是否包含另一个几何的 MBR | |
---|
MBRCoveredBy() | 一个 MBR 是否被另一个覆盖 | |
---|
MBRCovers() | 一个 MBR 是否覆盖另一个 | |
---|
MBRDisjoint() | 两个几何的 MBR 是否不相交 | |
---|
MBREquals() | 两个几何的 MBR 是否相等 | |
---|
MBRIntersects() | 两个几何的 MBR 是否相交 | |
---|
MBROverlaps() | 两个几何的 MBR 是否重叠 | |
---|
MBRTouches() | 两个几何的 MBR 是否接触 | |
---|
MBRWithin() | 一个几何的 MBR 是否在另一个几何的 MBR 内 | |
---|
MultiLineString() | 从 LineString 值构造 MultiLineString | |
---|
MultiPoint() | 从点值构造多点 | |
---|
MultiPolygon() | 从 Polygon 值构造 MultiPolygon | |
---|
Point() | 从坐标构造点 | |
---|
Polygon() | 从 LineString 参数构造多边形 | |
---|
ST_Area() | 返回多边形或多多边形区域 | |
---|
ST_AsBinary(), ST_AsWKB() | 从内部几何格式转换为 WKB | |
---|
ST_AsGeoJSON() | 从几何生成 GeoJSON 对象 | |
---|
ST_AsText(),ST_AsWKT() | 从内部几何格式转换为 WKT | |
---|
ST_Buffer() | 返回几何给定距离内的点的几何 | |
---|
ST_Buffer_Strategy() | 为 ST_Buffer() 生成策略选项 | |
---|
ST_Centroid() | 将质心作为一个点返回 | |
---|
ST_Collect() | 将空间值聚合到集合中 | 8.0.24 |
---|
ST_Contains() | 一个几何图形是否包含另一个几何图形 | |
---|
ST_ConvexHull() | 返回几何的凸包 | |
---|
ST_Crosses() | 一个几何图形是否与另一个几何图形相交 | |
---|
ST_Difference() | 两个几何形状的返回点集差异 | |
---|
ST_Dimension() | 几何尺寸 | |
---|
ST_Disjoint() | 一个几何图形是否与另一个几何图形脱节 | |
---|
ST_Distance() | 一个几何体与另一个几何体的距离 | |
---|
ST_Distance_Sphere() | 地球上两个几何图形之间的最小距离 | |
---|
ST_EndPoint() | 线串的终点 | |
---|
ST_Envelope() | 返回几何的 MBR | |
---|
ST_Equals() | 一个几何图形是否等于另一个几何图形 | |
---|
ST_ExteriorRing() | 返回 Polygon 的外环 | |
---|
ST_FrechetDistance() | 一个几何体与另一个几何体的离散 Fréchet 距离 | 8.0.23 |
---|
ST_GeoHash() | 产生一个geohash值 | |
---|
ST_GeomCollFromText(), ST_GeometryCollectionFromText(), ST_GeomCollFromTxt() | 从 WKT 返回几何集合 | |
---|
ST_GeomCollFromWKB(), ST_GeometryCollectionFromWKB() | 从 WKB 返回几何集合 | |
---|
ST_GeometryN() | 从几何集合中返回第 N 个几何 | |
---|
ST_GeometryType() | 返回几何类型的名称 | |
---|
ST_GeomFromGeoJSON() | 从 GeoJSON 对象生成几何 | |
---|
ST_GeomFromText(), ST_GeometryFromText() | 从 WKT 返回几何图形 | |
---|
ST_GeomFromWKB(),ST_GeometryFromWKB() | 从 WKB 返回几何图形 | |
---|
ST_HausdorffDistance() | 一个几何体与另一个几何体的离散豪斯多夫距离 | 8.0.23 |
---|
ST_InteriorRingN() | 返回 Polygon 的第 N 个内环 | |
---|
ST_Intersection() | 返回点集两个几何的交集 | |
---|
ST_Intersects() | 一个几何图形是否与另一个几何图形相交 | |
---|
ST_IsClosed() | 几何是否封闭且简单 | |
---|
ST_IsEmpty() | 几何是否为空 | |
---|
ST_IsSimple() | 几何是否简单 | |
---|
ST_IsValid() | 几何是否有效 | |
---|
ST_LatFromGeoHash() | 从 geohash 值返回纬度 | |
---|
ST_Latitude() | 返回Point的纬度 | 8.0.12 |
---|
ST_Length() | LineString 的返回长度 | |
---|
ST_LineFromText(),ST_LineStringFromText() | 从 WKT 构造 LineString | |
---|
ST_LineFromWKB(),ST_LineStringFromWKB() | 从 WKB 构造 LineString | |
---|
ST_LineInterpolatePoint() | 沿 LineString 的给定百分比的点 | 8.0.24 |
---|
ST_LineInterpolatePoints() | 沿 LineString 的给定百分比的点 | 8.0.24 |
---|
ST_LongFromGeoHash() | 从 geohash 值返回经度 | |
---|
ST_Longitude() | 返回Point的经度 | 8.0.12 |
---|
ST_MakeEnvelope() | 围绕两个点的矩形 | |
---|
ST_MLineFromText(), ST_MultiLineStringFromText() | 从 WKT 构造 MultiLineString | |
---|
ST_MLineFromWKB(),ST_MultiLineStringFromWKB() | 从 WKB 构造 MultiLineString | |
---|
ST_MPointFromText(),ST_MultiPointFromText() | 从 WKT 构造多点 | |
---|
ST_MPointFromWKB(),ST_MultiPointFromWKB() | 从 WKB 构造多点 | |
---|
ST_MPolyFromText(),ST_MultiPolygonFromText() | 从 WKT 构造 MultiPolygon | |
---|
ST_MPolyFromWKB(),ST_MultiPolygonFromWKB() | 从 WKB 构造 MultiPolygon | |
---|
ST_NumGeometries() | 返回几何集合中的几何数 | |
---|
ST_NumInteriorRing(),ST_NumInteriorRings() | 返回 Polygon 中的内环数 | |
---|
ST_NumPoints() | 返回 LineString 中的点数 | |
---|
ST_Overlaps() | 一个几何图形是否与另一个几何图形重叠 | |
---|
ST_PointAtDistance() | 沿 LineString 给定距离的点 | 8.0.24 |
---|
ST_PointFromGeoHash() | 将 geohash 值转换为 POINT 值 | |
---|
ST_PointFromText() | 从 WKT 构造点 | |
---|
ST_PointFromWKB() | 从 WKB 构造点 | |
---|
ST_PointN() | 从 LineString 返回第 N 个点 | |
---|
ST_PolyFromText(), ST_PolygonFromText() | 从 WKT 构造多边形 | |
---|
ST_PolyFromWKB(),ST_PolygonFromWKB() | 从 WKB 构造多边形 | |
---|
ST_Simplify() | 返回简化几何 | |
---|
ST_SRID() | 返回几何的空间参考系统 ID | |
---|
ST_StartPoint() | 线串的起点 | |
---|
ST_SwapXY() | 交换 X/Y 坐标的返回参数 | |
---|
ST_SymDifference() | 返回点设置两个几何的对称差 | |
---|
ST_Touches() | 一个几何图形是否接触另一个几何图形 | |
---|
ST_Transform() | 变换几何坐标 | 8.0.13 |
---|
ST_Union() | 返回点集两个几何的并集 | |
---|
ST_Validate() | 返回经过验证的几何图形 | |
---|
ST_Within() | 一个几何体是否在另一个几何体中 | |
---|
ST_X() | 返回Point的X坐标 | |
---|
ST_Y() | 返回Point的Y坐标 |
---|
geometry的类型
MySQL 具有对应于 OpenGIS 类的空间数据类型。
一些空间数据类型包含单个几何值:
-
GEOMETRY
-
POINT
-
LINESTRING
-
POLYGON
GEOMETRY
可以存储任何类型的几何值。其他单值类型(POINT
、 LINESTRING
和POLYGON
)将它们的值限制为特定的几何类型。
其他空间数据类型包含值的集合:
-
MULTIPOINT
-
MULTILINESTRING
-
MULTIPOLYGON
-
GEOMETRYCOLLECTION
GEOMETRYCOLLECTION
可以存储任何类型的对象的集合。其他集合类型(MULTIPOINT
、 MULTILINESTRING
和 MULTIPOLYGON
)将集合成员限制为具有特定几何类型的成员。
-
Well-Known Text (WKT) format 文本
-
Well-Known Binary (WKB) format 二进制
domain
@TableField(value = "main_geo",typeHandler = GeometryTypeHandler.class)
private String mainGeo;
handler
@Slf4j
@MappedTypes(value = {String.class})
public class GeometryTypeHandler extends BaseTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
WKTReader wktReader= SpringUtil.getBean(WKTReader.class);
try {
Geometry pointGeo = wktReader.read(o.toString());
WKBWriter wkbWriter= SpringUtil.getBean(WKBWriter.class);
byte[] writer = wkbWriter.write(pointGeo);
byte[] wkb=new byte[writer.length+4];
ByteOrderValues.putInt(4326, wkb, ByteOrderValues.LITTLE_ENDIAN);
System.arraycopy(writer,0,wkb,4,writer.length);
preparedStatement.setBytes(i, wkb);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取jts包对象的wkt文本,再转换成sqlserver的Geometry对象
* 调用ps的setBytes()方法,以二进制持久化该geometry对象
*/
@Override
public String getNullableResult(ResultSet resultSet, String s) {
try {
/**
* 从ResultSet中读取二进制转换为SqlServer的Geometry对象
* 使用jts的WKTReader将wkt文本转成jts的Geometryd对象
*/
WKBReader wkbReader= SpringUtil.getBean(WKBReader.class);
byte[] bytes = resultSet.getBytes(s);
byte[] bytesN = new byte[bytes.length-4];
System.arraycopy(bytes,4,bytesN,0,bytes.length-4);
Geometry geometry = wkbReader.read(bytesN);
return geometry.toText();
} catch (Exception e) {
log.error(e.getMessage());
}
return null;
}
@Override
public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
return null;
}
@Override
public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
工具类申明
@Component
@ComponentScan(value = {"cn.hutool.extra.spring"})
@Import(SpringUtil.class)
public class JTSBean {
private GeometryFactory geometryFactory;
public JTSBean() {
geometryFactory = new GeometryFactory(new PrecisionModel(), 4326);
}
@Bean
public WKBWriter wkbWriter() {
return new WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN);
}
@Bean
public WKBReader wkbReader() {
return new WKBReader(geometryFactory);
}
@Bean
public WKTReader wktReader() {
return new WKTReader(geometryFactory);
}
}
有两点注意,
1、整数 SRID (0) 的 4 个字节的值 必须与GeometryFactory声明的一致
2、WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN) 从低端写入 (不大确定)