空间查询dsl - 几何表达式。查找范围包含给定 "Point" 的实体
Spatial querydsl - GeometryExpressions. Find entities that range contains given "Point"
使用的工具及其版本:
我正在使用:
- spring开机
2.2.6
- hibernate/hibernate-spatial
5.3.10
方言设置为:org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
- querydsl-空间
4.2.1
com.vividsolutions.jts 1.13
- jscience
4.3.1
问题描述:
我有一个代表医疗诊所的实体:
import com.vividsolutions.jts.geom.Polygon;
@Entity
public class Clinic {
@Column(name = "range", columnDefinition = "Polygon")
private Polygon range;
}
range
是之前根据诊所的gps-location
和radius
计算出来的圆。它表示该诊所的操作区域。这意味着它只治疗家庭住址在该圈内的患者。让我们假设上面的圆圈是正确的。
我的目标(问题):
我有一个带患者位置的 gps 点:45.7602322 4.8444941
。我想找到所有能够治疗该患者的诊所。这意味着,要找到其 range
字段包含 45.7602322 4.8444941
.
的所有诊所
我的解决方案(部分正确(我认为))
为了完成它,我创建了一个简单的 "Predicate"/"BooleanExpression":
GeometryExpressions.asGeometry(QClinic.clinic.range)
.contains(Wkt.fromWkt("Point(45.7602322 4.8444941)"))
它确实有效,因为我可以在控制台中看到正确的 sql 查询:
select (...) where
ST_Contains(clinic0_.range, ?)=1 limit ?
第一个绑定参数:POINT(45.7602322 4.8444941)
但是我有两个问题:
QClinic.clinic.range
在 intellij 中被标记为 "warning" 为:“Unchecked assignment: 'com.querydsl.spatial.jts.JTSPolygonPath' to 'com.querydsl.core.types.Expression<org.geolatte.geom.Geometry'
”。是的,在 QClinic
范围内是 com.querydsl.spatial.jts.JTSPolygonPath
- 在上面的行(创建表达式)中使用调试器和 intellij 的 "evaluate" 我可以看到有一条错误消息:“
unknown operation with operator CONTAINS and args [clinic.range, POINT(45.7602322 4.8444941)]
”
您可以忽略第二个警告。空间特定操作根本没有在用于操作的 toString 的序列化程序中注册。他们驻留在自己的模块中。
第一个警告表明您混淆了 Geolatte 和 JTS 表达式。从您的映射看来您打算使用 JTS。在这种情况下,您需要使用 com.querydsl.spatial.jts.JTSGeometryExpressions
而不是 com.querydsl.spatial.jts.GeometryExpressions
来消除该警告。
使用的工具及其版本:
我正在使用:
- spring开机
2.2.6
- hibernate/hibernate-spatial
5.3.10
方言设置为:org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
- querydsl-空间
4.2.1
com.vividsolutions.jts 1.13
- jscience
4.3.1
问题描述:
我有一个代表医疗诊所的实体:
import com.vividsolutions.jts.geom.Polygon;
@Entity
public class Clinic {
@Column(name = "range", columnDefinition = "Polygon")
private Polygon range;
}
range
是之前根据诊所的gps-location
和radius
计算出来的圆。它表示该诊所的操作区域。这意味着它只治疗家庭住址在该圈内的患者。让我们假设上面的圆圈是正确的。
我的目标(问题):
我有一个带患者位置的 gps 点:45.7602322 4.8444941
。我想找到所有能够治疗该患者的诊所。这意味着,要找到其 range
字段包含 45.7602322 4.8444941
.
我的解决方案(部分正确(我认为))
为了完成它,我创建了一个简单的 "Predicate"/"BooleanExpression":
GeometryExpressions.asGeometry(QClinic.clinic.range)
.contains(Wkt.fromWkt("Point(45.7602322 4.8444941)"))
它确实有效,因为我可以在控制台中看到正确的 sql 查询:
select (...) where
ST_Contains(clinic0_.range, ?)=1 limit ?
第一个绑定参数:POINT(45.7602322 4.8444941)
但是我有两个问题:
QClinic.clinic.range
在 intellij 中被标记为 "warning" 为:“Unchecked assignment: 'com.querydsl.spatial.jts.JTSPolygonPath' to 'com.querydsl.core.types.Expression<org.geolatte.geom.Geometry'
”。是的,在QClinic
范围内是com.querydsl.spatial.jts.JTSPolygonPath
- 在上面的行(创建表达式)中使用调试器和 intellij 的 "evaluate" 我可以看到有一条错误消息:“
unknown operation with operator CONTAINS and args [clinic.range, POINT(45.7602322 4.8444941)]
”
您可以忽略第二个警告。空间特定操作根本没有在用于操作的 toString 的序列化程序中注册。他们驻留在自己的模块中。
第一个警告表明您混淆了 Geolatte 和 JTS 表达式。从您的映射看来您打算使用 JTS。在这种情况下,您需要使用 com.querydsl.spatial.jts.JTSGeometryExpressions
而不是 com.querydsl.spatial.jts.GeometryExpressions
来消除该警告。