首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对XYM坐标使用Geometry.reverse()的错误结果

对XYM坐标使用Geometry.reverse()的错误结果
EN

Stack Overflow用户
提问于 2022-11-21 15:55:00
回答 1查看 46关注 0票数 2

我们使用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)数据库中检索具有测量尺寸的几何图形。

该查询如下所示:

代码语言:javascript
复制
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直接这样做,我们似乎也会遇到同样的问题:

代码语言:javascript
复制
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);

给出以下输出:

代码语言:javascript
复制
(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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-22 20:48:49

这绝对是个窃听器。JTS的reverse()org.geolatte.geom.PackedCoordinateSequence之间存在不匹配。CoordinateSequence没有返回M坐标的正确值.

我在geolatte项目中为此创建了问题

同时,您可以将Z-坐标设置为0.0的XYZM几何用作解决方法。然后,失配消失,反向将正确工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74521593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档