java - MySQL POLYGON ←→ JTS Polygon with JOOQ (as WKT)

标签 java mysql gis jooq

我正在尝试在使用 jOOQ (3.9.x) 时在 MySQL POLYGON 类型和 Jts Polygon 之间进行无缝转换。理想情况下,我只想将数据库中的 WKT(众所周知的文本)解析为 Jts 类型。但是,生成的查询不起作用,我看到它们在转换为文本的函数周围有简单的引号,将其呈现为文本。这是我正在使用的转换器和绑定(bind)。我这样做对吗?我应该如何通过 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;
    }
}

绑定(bind):

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 实现。

据我了解,您希望自动发生两件事:

字符串绑定(bind)值应该用 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() 函数格式化

您(可能)不必在绑定(bind)内部执行任何特定操作,因为您的绑定(bind)不会影响任何不涉及绑定(bind)变量的表达式(例如,普通的列表达式)。

相反,您可能需要调整转换器(绑定(bind)内的转换器),以便能够读取从 JDBC 驱动程序返回的任何类型并将其转换为 Polygon

关于java - MySQL POLYGON ←→ JTS Polygon with JOOQ (as WKT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075098/

相关文章:

java - 在Android中,我应该为哪个Java版本编译代码,以及如何为Ant设置它?

java - 如何让 Android 服务保持 phonegap 用户界面的活力

Java - 查找第二大数字

MySQL 外键语法错误

mysql - 由于查询而导致性能下降?

r - 无法在 R : Error in CPL_geos_is_empty(st_geometry(x)) 中绘制 SF 线串

r - 在R中添加一列两个坐标的距离

javascript - 三JS : Simple City Performance Issue

java - 在 Java 中使用类的接口(interface)

mysql - 创建过程以验证要插入的数据