使用 org.geolatte.geom 构造 LineString

Construct LineString using org.geolatte.geom

如何使用 org.hibernate:hibernate-spatial 库将以下 MySQL 表达式转换为相应的 org.geolatte.geom.LineString

LineString(Point(-1, start_timestamp), Point(1, end_timestamp));

DSL.linestring 需要 org.geolatte.geom.crs.CoordinateReferenceSystem,但我不确定在这种特殊情况下应该使用哪个。

到目前为止我尝试过的

C2D position1 = new C2D(-1, 1546301554.000000);
C2D position2 = new C2D(1, 1546301559.000000);

GeographicCoordinateReferenceSystem gcrs = CoordinateReferenceSystems.mkGeographic(UNKNOWN_Angular);

LineString<C2D> lineString = DSL.linestring(gcrs, position1, position2);

目标是使用 LineString 找到重叠的日期。我只使用 SQL 让它工作,但我有点不确定如何使用 geolatte 实现 LineString,主要是我应该使用哪个 CoordinateReferenceSystem。 LineString 将作为 Geometry 字段存储在数据库 table.

LineString将包含两个Point,其中y坐标将对应start_datetime和end_datetime。

更新: 也许这种方法更可取

C2D position1 = new C2D(-1, 1546301554 (EPOCH START TIMESTAMP));
C2D position2 = new C2D(1, 1546301559 (EPOCH END TIMESTAMP));

ProjectedCoordinateReferenceSystem test = CoordinateReferenceSystems.mkProjected(UNKNOWN_LINEAR);

LineString<C2D> lineString = DSL.linestring(test, position1, position2);

您实际上在这里使用的是 geolatte-geom 库,而不是 hibernate-spatial(尽管后者确实包括前者作为依赖项)。您的代码不起作用,因为您混合了两种方法(直接和通过 DSL),并且混合了笛卡尔坐标和地理坐标。此外,对于 angular(地理)坐标,经度的允许范围为 [-180, 180],纬度的允许范围为 [-90,+90]。所以我不确定你在哪个坐标系中工作。

最好的方法是:

import static org.geolatte.geom.builder.Dsl.*
GeographicCoordinateReferenceSystem gcrs = CoordinateReferenceSystems.mkGeographic(UNKNOWN_Angular);

Linestring<G2D> ls = linestring(gcrs, g(-1, 50.4), g(1, 50.4));

看看介绍图书馆的README