我们使用jts-core (org.locationtech.jts:jts-core:jar:1.19.0)和hibernate-spatial (org.hibernate:hibernate-spatial:jar:5.6.10.Final:compile)从PostGis (14.3)数据库中检索具有测量尺寸的几何图形。
该查询如下所示:
Geometry geometry = (Geometry) entityManager
.createNativeQuery("SELECT st_locatebetween(geom, :p1, :p2) as geom FROM GEOMS WHERE id = :id")
.setParameter("id", id)
.setParameter("p1", p1)
.setParameter("p2", p2)
.unwrap(NativeQuery.class)
.addScalar("geom", new JTSGeometryType(INSTANCE_WKB_2))
.getSingleResult();这个查询可以很好地检索几何图形,并返回XYM坐标。然而,当我们试图用org.locationtech.jts.geom.Geometry#reverse逆转几何时,M坐标就会丢失.除了中间的坐标,所有的坐标都有一个NaN值作为m。
当使用org.locationtech.jts.geom.CoordinateXYM的数组进行简单的单元测试时,这种方法工作得很好。在调试查询时,它似乎使用的是返回不正确的反向数组的org.geolatte.geom.PackedPositionSequence。
我们做错什么了吗?还是这是个窃听器?
如果我们尝试使用org.geolatte.geom.Geometry直接这样做,我们似乎也会遇到同样的问题:
Geometry geometry = JTS.to(Wkt.fromWkt("LINESTRING M (1 1 1, 2 2 2, 3 3 3)"));
stream(geometry.getCoordinates()).forEach(System.out::println);
stream(geometry.reverse().getCoordinates()).forEach(System.out::println);给出以下输出:
(1.0, 1.0 m=1.0)
(2.0, 2.0 m=2.0)
(3.0, 3.0 m=3.0)
(3.0, 3.0 m=NaN)
(2.0, 2.0 m=2.0)
(1.0, 1.0 m=NaN)发布于 2022-11-22 20:48:49
这绝对是个窃听器。JTS的reverse()和org.geolatte.geom.PackedCoordinateSequence之间存在不匹配。CoordinateSequence没有返回M坐标的正确值.
我在geolatte项目中为此创建了问题。
同时,您可以将Z-坐标设置为0.0的XYZM几何用作解决方法。然后,失配消失,反向将正确工作。
https://stackoverflow.com/questions/74521593
复制相似问题