MySQL POLYGON ←→ Jts Polygon with JOOQ (as WKT)

Posted

技术标签:

【中文标题】MySQL POLYGON ←→ Jts Polygon with JOOQ (as WKT)【英文标题】: 【发布时间】:2017-10-19 21:10:08 【问题描述】:

我正在尝试在使用 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();
    

【问题讨论】:

您尝试生成的预期 SQL 字符串是什么? 类似INSERT INTO table_test (poly ) VALUES (ST_GeomFromText ( 'POLYGON (00,11,00)')); SELECT ST_AsWKT(table_test.poly) from poly WHERE ... 【参考方案1】:

请注意,从 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

【讨论】:

以上是关于MySQL POLYGON ←→ Jts Polygon with JOOQ (as WKT)的主要内容,如果未能解决你的问题,请参考以下文章

boost::polygon 布尔减法导致额外的行

推向量的向量

请问:MESH是啥东东,和POLYGON有啥区别和联系,和NURBS又是啥关系

模型 | Polygon建模及案例解析

MySQL:向函数 st_geometryfromtext 提供的 GIS 数据无效

年度最大DeFi黑客事件!Poly Network 被盗6亿事件全解析