显然,Hibernate 5支持地理类型。我搜索了很多,但几乎找不到与地理位置相关的东西。
我想做的是以下几点:
>
在数据库表中保存Long/Lat点,例如ST_GeomFromText('POINT(6.463471 52.484832)',4326)
执行队列检查Point是否在Long/Lat矩形中,如:
WHERE点
我正在使用PostgreSQL和PostGIS。
我只是找不到hibernate的哪种类型的列注释必须用于获取Long/Lat点,以及如何执行上述查询。
@Type(type="org.hibernate.spatial.GeometryType")
不是关于长/宽的问题
是否有与此相关的文档(注意:不是几何点)。
是的,Hibernate5支持空间。
您需要添加依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>5.2.17.Final</version><!-- In my case was this version, needs to match with your hibernate core version-->
</dependency>
然后,您需要根据您的PostgreSQL版本使用正确的方言。
名单如下:
org.hibernate.spatial.dialect.postgis.PostgisPG9Dialect
org.hibernate.spatial.dialect.postgis.PostgisPG82Dialect
org.hibernate.spatial.dialect.postgis.PostgisPG91Dialect
org.hibernate.spatial.dialect.postgis.PostgisPG92Dialect
org.hibernate.spatial.dialect.postgis.PostgisPG93Dialect
org.hibernate.spatial.dialect.postgis.PostgisPG94Dialect
org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect
设置正确的方言后,您可以在实体中使用Point或Polygon(不需要使用@Type)。它们是包裹里的com.vividsolutions.jts.geom
创建点:
GeometryFactory gf = new GeometryFactory();
Point point = gf.createPoint(new Coordinate(lat, lon));
我使用的是hibernate 5.4版。30
关于问题1,您不希望使用任何类型的注释将字段标记为点类型。在实体模型中将数据类型指定为点就足够了
@Entity
public class UserLocation {
//other fields
private Point location;
//constructors, getters & setters
只需确保从导入点
导入组织。定位技术。jts。geom。指向
为了将纬度和经度转换为点,我使用了一个实用函数
public class GeometryUtil {
public static final int SRID = 4326; //LatLng
private static WKTReader wktReader = new WKTReader();
private static Geometry wktToGeometry(String wellKnownText) {
Geometry geometry = null;
try {
geometry = wktReader.read(wellKnownText);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("###geometry :"+geometry);
return geometry;
}
public static Point parseLocation(double x,double y) {
Geometry geometry = GeometryUtil.wktToGeometry(String.format("POINT (%s %s)",x,y));
Point p =(Point)geometry;
p.setSRID(4326);
return p;
}
}
从纬度和经度创建一个点
MySQL
点p=几何量。地理位置(纬度、经度);
波斯特吉斯
点p=几何量。地理位置(经度、纬度);
类型将保持GeometryType仅使用十进制距离,通过下面提到的代码,您可以获得50到110米范围内的所有位置,因为我使用0.001,您可以根据您的要求使用。
GeometryFactory factory = new GeometryFactory(new PrecisionModel(), 4326);
factory.createPoint(new Coordinate(longitude,latitude));
Point comparisonPoint = factory.createPoint(new Coordinate(longitude,latitude));
predicates.add(SpatialPredicates.distanceWithin(cb, geom from db), comparisonPoint, 0.001));
distanceWithin()函数获取必须转换为geograph的距离,但hibernate Spatial不支持,因此可以通过另一种方式实现此目的,即根据需要提供十进制距离。下面提到了小数点的链接。
链接:https://en.wikipedia.org/wiki/Decimal_degrees
问题内容: 我使用Emacs 24.2。我已经安装并从MELPA执行,现在在REPL中而不是标志我有这个胡乱: 在低级Javascript模式下,REPL本身可以正常工作,只是符号已更改。如果输入未完成的表达式,它甚至会打印。该是字符的系统,不与复制-粘贴复制的,我加他们为你有一个想法。 在我的初始化文件中: 在终端呼叫中产生有效的REPL。 为什么提示会以这种方式表现?我该怎么做才能纠正这个问题
我想问一下使用PostGIS函数的几何和地理有什么区别。 执行以下查询时: 我拿到了327.88195438529度。 但是当我将几何转换为地理时,如以下查询: 我得到了333.810802282843度。 地理选角会给出更准确的结果吗?还是会做出不同的计算? 我的几何形状的 SRID=4326。 提前谢谢你。
问题内容: 我在SO上发现了其他几个有关JavaMail API和通过SMTP服务器发送邮件的问题,但是没有一个使用TLS安全性进行讨论。我正在尝试使用JavaMail通过我的工作SMTP邮件服务器向我发送状态更新,但是它需要TLS,而且我在网上找不到任何有关如何使用JavaMail访问需要TLS加密的SMTP服务器的示例。有人能帮忙吗? 问题答案: 实际上,我们的产品中确实有一些通知代码,如果有
我已经阅读了一些关于SaaS/PaaS/IaaS的信息,我在想: 如果我提供了一个SaaS应用程序,我的客户能否使用PaaS开发和部署他自己的应用程序,PaaS将使用一些API与我的SaaS应用程序交互?还是我对云服务的理解有误?
问题内容: 而不是执行: 在 类似’a%’ 或类似’b%’ 或类似’c%’的地方 从a中选择a,有没有办法执行类似此伪代码的功能? 在 a IN中 从b选择a (’a%’,’b%’,’c%’) __ 问题答案: 可能对于您的示例而言太具体了,但是您可以执行’[ac]%’这样的操作。除此之外,我不知道任何类似LIKE的IN语法
我需要结合两个反应性出版商的结果——Mono和Flux。我尝试使用和函数来实现这一点,但我无法满足两个特定条件: 结果包含的元素应与通量发射的元素一样多,但相应的Mono源只应调用一次(仅此条件可通过实现) 当通量为空时,链应在不等待单一元素的情况下完成 第一个条件的解决方案出现在结合单声道和通量条目中(粘贴在下面)。但是我无法在不阻塞链的情况下实现第二个条件——这是我想避免的。