当前位置: 首页 > 知识库问答 >
问题:

在spring boot中将PostGIS地理点与hibernate spatial 5结合使用

谢飞舟
2023-03-14

显然,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")
    

    不是关于长/宽的问题

    是否有与此相关的文档(注意:不是几何点)。


  • 共有3个答案

    佟高澹
    2023-03-14

    是的,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));
    
    龚奇逸
    2023-03-14

    我使用的是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=几何量。地理位置(经度、纬度);

    权承
    2023-03-14

    类型将保持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源只应调用一次(仅此条件可通过实现) 当通量为空时,链应在不等待单一元素的情况下完成 第一个条件的解决方案出现在结合单声道和通量条目中(粘贴在下面)。但是我无法在不阻塞链的情况下实现第二个条件——这是我想避免的。