MySQL POLYGON ←→ Jts Polygon with JOOQ (as WKT)
MySQL POLYGON ←→ Jts Polygon with JOOQ (as WKT)
我正在尝试在使用 jOOQ (3.9.x) 时在 MySQL POLYGON 类型和 Jts Polygon 之间进行无缝转换。理想情况下,我只想将数据库中的 WKT(众所周知的文本)解析为 Jts 类型。但是,生成的查询不起作用,我看到它们在转换为文本的函数周围有简单的引号,将其呈现为文本。这是我正在使用的转换器和绑定。我这样做对吗?我应该如何通过 ST_AsWKT 和 ST_GeomFromText 进行转换?
public class PolygonConverter implements Converter<Object, Polygon> {
/**
* Convert WK string into Polygon
*/
@Override
public Polygon from(Object databaseObject) {
if (databaseObject == null) {
return null;
}
String wkString = databaseObject.toString();
WKTReader reader = JtsSpatialContext.GEO.getWktShapeParser();
try {
Polygon poly = (Polygon)reader.parse(wkString);
return poly;
} catch (java.text.ParseException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Object to(Polygon userObject) {
if (userObject == null) {
return null;
}
return userObject.toString();
}
@Override
public Class<Object> fromType() {
return Object.class;
}
@Override
public Class<Polygon> toType() {
return Polygon.class;
}
}
绑定:
public class MySQLPolygonBinding implements Binding<Object, Polygon> {
@Override
public Converter<Object, Polygon> converter() {
return new PolygonConverter();
}
@Override
public void sql(BindingSQLContext<Polygon> ctx) throws SQLException {
ctx.render().visit(DSL.sql("ST_AsWKT(?)"));
}
@Override
public void register(BindingRegisterContext<Polygon> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
@Override
public void set(BindingSetStatementContext<Polygon> ctx) throws SQLException {
String resultStr = null;
Object obj = ctx.convert(converter()).value();
if (obj != null) {
resultStr = String.format("ST_GeomFromText('%s')", obj,toString() );
}
ctx.statement().setObject(ctx.index(), resultStr);
}
@Override
public void set(BindingSetSQLOutputContext<Polygon> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
@Override
public void get(BindingGetResultSetContext<Polygon> ctx) throws SQLException {
ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index()));
}
@Override
public void get(BindingGetStatementContext<Polygon> ctx) throws SQLException {
ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));
}
@Override
public void get(BindingGetSQLInputContext<Polygon> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
}
请注意,从 jOOQ 3.16 (see #982) 开始,jOOQ 支持开箱即用的各种流行的 GIS 实现。
据我了解,您希望自动发生两件事:
字符串绑定值应该用 ST_GeomFromText()
函数包装
这是“简单”的部分,您几乎做对了:
@Override
public void sql(BindingSQLContext<Polygon> ctx) throws SQLException {
ctx.render()
.sql("ST_GeomFromText(")
// This will use your converter to convert from a Polygon to "Object"
// prior to binding the variable
.visit(DSL.val(ctx.convert(converter()).value()))
.sql(")");
}
@Override
public void set(BindingSetStatementContext<Polygon> ctx) throws SQLException {
// No wrapping of the bind variable in functions can be done here!
ctx.statement().setString(ctx.index(), ctx.convert(converter()).value());
}
应使用 ST_AsWKT()
函数
设置多边形类型列的格式
您(可能)不必在绑定内部执行任何特定操作,因为您的绑定不会影响任何不涉及绑定变量的表达式(例如,普通的列表达式)。
相反,您可能需要调整您的转换器(绑定中的转换器),以便能够读取从 JDBC 驱动程序返回的任何类型并将其转换为 Polygon
我正在尝试在使用 jOOQ (3.9.x) 时在 MySQL POLYGON 类型和 Jts Polygon 之间进行无缝转换。理想情况下,我只想将数据库中的 WKT(众所周知的文本)解析为 Jts 类型。但是,生成的查询不起作用,我看到它们在转换为文本的函数周围有简单的引号,将其呈现为文本。这是我正在使用的转换器和绑定。我这样做对吗?我应该如何通过 ST_AsWKT 和 ST_GeomFromText 进行转换?
public class PolygonConverter implements Converter<Object, Polygon> {
/**
* Convert WK string into Polygon
*/
@Override
public Polygon from(Object databaseObject) {
if (databaseObject == null) {
return null;
}
String wkString = databaseObject.toString();
WKTReader reader = JtsSpatialContext.GEO.getWktShapeParser();
try {
Polygon poly = (Polygon)reader.parse(wkString);
return poly;
} catch (java.text.ParseException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Object to(Polygon userObject) {
if (userObject == null) {
return null;
}
return userObject.toString();
}
@Override
public Class<Object> fromType() {
return Object.class;
}
@Override
public Class<Polygon> toType() {
return Polygon.class;
}
}
绑定:
public class MySQLPolygonBinding implements Binding<Object, Polygon> {
@Override
public Converter<Object, Polygon> converter() {
return new PolygonConverter();
}
@Override
public void sql(BindingSQLContext<Polygon> ctx) throws SQLException {
ctx.render().visit(DSL.sql("ST_AsWKT(?)"));
}
@Override
public void register(BindingRegisterContext<Polygon> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
@Override
public void set(BindingSetStatementContext<Polygon> ctx) throws SQLException {
String resultStr = null;
Object obj = ctx.convert(converter()).value();
if (obj != null) {
resultStr = String.format("ST_GeomFromText('%s')", obj,toString() );
}
ctx.statement().setObject(ctx.index(), resultStr);
}
@Override
public void set(BindingSetSQLOutputContext<Polygon> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
@Override
public void get(BindingGetResultSetContext<Polygon> ctx) throws SQLException {
ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index()));
}
@Override
public void get(BindingGetStatementContext<Polygon> ctx) throws SQLException {
ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));
}
@Override
public void get(BindingGetSQLInputContext<Polygon> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
}
请注意,从 jOOQ 3.16 (see #982) 开始,jOOQ 支持开箱即用的各种流行的 GIS 实现。
据我了解,您希望自动发生两件事:
字符串绑定值应该用 ST_GeomFromText()
函数包装
这是“简单”的部分,您几乎做对了:
@Override
public void sql(BindingSQLContext<Polygon> ctx) throws SQLException {
ctx.render()
.sql("ST_GeomFromText(")
// This will use your converter to convert from a Polygon to "Object"
// prior to binding the variable
.visit(DSL.val(ctx.convert(converter()).value()))
.sql(")");
}
@Override
public void set(BindingSetStatementContext<Polygon> ctx) throws SQLException {
// No wrapping of the bind variable in functions can be done here!
ctx.statement().setString(ctx.index(), ctx.convert(converter()).value());
}
应使用 ST_AsWKT()
函数
设置多边形类型列的格式
您(可能)不必在绑定内部执行任何特定操作,因为您的绑定不会影响任何不涉及绑定变量的表达式(例如,普通的列表达式)。
相反,您可能需要调整您的转换器(绑定中的转换器),以便能够读取从 JDBC 驱动程序返回的任何类型并将其转换为 Polygon