JTS Topology Suite(JTS)拓扑套件是开源Java软件库,它提供平面几何的对象模型以及一组基本几何功能。并且JTS符合Open GIS联盟发布的SQL简单功能规范(Simple Features Specification for SQL)。所以JTS不仅可以和postgis的数据进行交互,并且还可以在java层提供空间数据关系的运算。
下面记一下 JTS中 关于对 Geometry 类型操作的TypeHandler类;使用JTS 直接引入jts-core jar就好。其中核心是org.locationtech.jts.geom.Geometry类,可以看到其结构与postgis的数据类型是基本一致的
![Geometry](https://img-blog.csdnimg.cn/1b9ce29ab6d34ced9f740cc5cc7c74aa.png#pic_center)
自定义TypeHandler如下:
public abstract class AbstractJtsGeometryTypeHandler<T extends Geometry> extends BaseTypeHandler<T> {
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setObject(i, new JtsGeometry(parameter));
}
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
JtsGeometry jtsGeometry = (JtsGeometry) rs.getObject(columnName);
if (jtsGeometry == null) {
return null;
}
return (T) jtsGeometry.getGeometry();
}
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
JtsGeometry jtsGeometry = (JtsGeometry) rs.getObject(columnIndex);
if (jtsGeometry == null) {
return null;
}
return (T) jtsGeometry.getGeometry();
}
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
JtsGeometry jtsGeometry = (JtsGeometry) cs.getObject(columnIndex);
if (jtsGeometry == null) {
return null;
}
return (T) jtsGeometry.getGeometry();
}
}
//下面是具体的各个类型
@MappedTypes(LinearRing.class)
public class JtsLinearRingTypeHandler extends AbstractJtsGeometryTypeHandler<LinearRing> {
}
@MappedTypes(LineString.class)
public class JtsLineStringTypeHandler extends AbstractJtsGeometryTypeHandler<LineString> {
}
@MappedTypes(MultiLineString.class)
public class JtsMultiLineStringTypeHandler extends AbstractJtsGeometryTypeHandler<MultiLineString> {
}
@MappedTypes(MultiPoint.class)
public class JtsMultiPointTypeHandler extends AbstractJtsGeometryTypeHandler<MultiPoint> {
}
@MappedTypes(MultiPolygon.class)
public class JtsMultiPolygonTypeHandler extends AbstractJtsGeometryTypeHandler<MultiPolygon> {
}
@MappedTypes(Point.class)
public class JtsPointTypeHandler extends AbstractJtsGeometryTypeHandler<Point> {
}
@MappedTypes(Polygon.class)
public class JtsPolygonTypeHandler extends AbstractJtsGeometryTypeHandler<Polygon> {
}
总结: 之前使用的是postgis下的Geometry类型,引入JTS后发现之前的TypeHandler不适用,特此记录一下JTS中Geometry数据类型的TypeHandler。