地理信息的表示:地理信息通常是以经纬度来表示,如东径多少北纬多少;但在不同的坐标系和投影标准中,表示地理信息经纬度的单位是不同的。如:在地理坐标系中经纬度的单位是度,坐标表示为:(117.435974 33.609617);但在投影坐标系中不同的投影标准有不同的单位,如常用到的投影标准:
- 3857以米为单位
- 4326以度为单位。
实体类
@Data
@TableName("city")
public class CityEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
private String id;
/**
* 地名
*/
private String name;
/**
* 矢量数据
*/
private LineString geom;
}
首先指定geometry坐标系。使用工厂构造且指定4326坐标系
GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), 4326);
使用jts工具构造geometry对象
//构造线
LineString lineString = new LineString(
coordinateSequenceFactory.create(ArrayUtil.toArray(coordinates, Coordinate.class)), geometryFactory);
cityEntity.setGeom(lineString);
自定义TypeHandler
Mybatis提供了自定义类型转换器TypeHandler实现特殊对象与Sql字段的映射关系
把 gemo对象转化为LINESTRING (113.2830448 23.39680263, 113.2823098 23.39776287) 16进制数据存储
@Log4j2
public abstract class AbstractGeometryTypeHandler<T extends Geometry> extends BaseTypeHandler<T> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
PGobject pGobject = new PGobject();
// Geometry类数据调用toString方法存储-> 'LINESTRING (113.2830448 23.39680263, 113.2823098 23.39776287) '
pGobject.setValue(parameter.toString());
pGobject.setType("geometry");
ps.setObject(i, pGobject);
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
PGobject pGobject = (PGobject)rs.getObject(columnName);
return getGeometryByWKT(pGobject);
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
PGobject pGobject = (PGobject)rs.getObject(columnIndex);
return getGeometryByWKT(pGobject);
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
PGobject pGobject = (PGobject)cs.getObject(columnIndex);
return getGeometryByWKT(pGobject);
}
private T getGeometryByWKT(PGobject pGobject) {
if (pGobject == null) {
return null;
} else {
WKBReader reader = new WKBReader();
try {
//转化为16进制数据存储
return (T)reader.read(WKBReader.hexToBytes(pGobject.getValue()));
} catch (ParseException e) {
log.error(e);
return null;
}
}
}
}