HibernateException:位置在2D中是共线的

时间:2016-01-19 19:04:22

标签: java hibernate spatial hibernate-5.x hibernate-spatial

我正在使用Hibernate Spatial verion 5.0.7.Final作为ORM。有时当我使用Geometry作为命名参数执行查询时,我得到以下异常:

org.hibernate.HibernateException: Positions are collinear in 2D

据我所知,有时我的几何图形共线,而NumericalMethods库中的Geolatte模块正在检查我的几何体isCounterClockwise是否会引发此异常。

我想知道为什么会这样做,但更重要的是,我可以做些什么来避免这个错误。

NumericalMethods.java下面的Hibernate代码只检查前三个坐标。在我的例子中,有时这三个第一坐标是共线的,但第四个坐标将使它成为有效的多边形。我想不出为什么它不会遍历其余坐标来判断它是否是逆时针方向。

完整的堆栈跟踪:

org.hibernate.HibernateException: Positions are collinear in 2D
at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.toNative(SDOGeometryValueBinder.java:71)
at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.bind(SDOGeometryValueBinder.java:52)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:257)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:252)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:52)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:627)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1944)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1897)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1875)
at org.hibernate.loader.Loader.doQuery(Loader.java:919)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2611)
at org.hibernate.loader.Loader.doList(Loader.java:2594)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)
at org.hibernate.loader.Loader.list(Loader.java:2418)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)

1 个答案:

答案 0 :(得分:1)

如评论所示,它看起来像是Hibernate中的一个错误。当尝试创建具有共线纬度的多边形时,hibernate空间正在抛出异常。它被注册为Jira票:

https://hibernate.atlassian.net/browse/HHH-10410

看起来罪魁祸首是Geolatte图书馆isCounterClockwise中的NumericalMethods.java函数。可能是自Hibernate 5的第一个版本以来发生的。

如果有人发现它有用,我会在代码下方粘贴以创建您自己的此库的自定义版本,以防止发生此错误。我还会提交一个拉取请求,以防他们考虑将它(或类似的东西)合并到他们的主人身上:

https://github.com/GeoLatte/geolatte-geom/pull/43

/**
 * Determines whether the specified {@code PositionSequence} is counter-clockwise.
 * <p/>
 * <p>Only the first three positions, are inspected to determine whether the sequence is counter-clockwise.
 * In case are less than three positions in the sequence, the method returns true.</p>
 *
 * @param positions a {@code PositionSequence}
 * @return true if the positions in the specified sequence are counter-clockwise, or if the sequence contains
 * less than three elements.
 */
public static boolean isCounterClockwise(PositionSequence<?> positions) {
    if (positions.size() < 3) return true;
    Position p0 = positions.getPositionN(0);
    Position p1 = positions.getPositionN(1);
    double det = 0;
    int positionsSize = positions.size();
    int i = 2;
    while(i < positionsSize && det == 0) {
        Position p2 = positions.getPositionN(i);
        det = deltaDeterminant(p0, p1, p2);
        i++;
    }
    if (det == 0) {
        throw new IllegalArgumentException("Positions are collinear in 2D");
    }
    return det > 0;
}

更新:拉取请求已合并为主要内容,因此最终会被释放。