【问题标题】:Use PostGIS geography point with hibernate spatial 5 in spring boot在 Spring Boot 中使用带有休眠空间 5 的 PostGIS 地理点
【发布时间】:2019-02-18 05:59:01
【问题描述】:

显然 Hibernate 5 支持 geography 类型。我搜索了很多,但几乎没有找到与地理点相关的任何内容。

我想做的是:

  1. 在数据库表中保存经度/纬度点,例如ST_GeomFromText('POINT(6.463471 52.484832)', 4326)

  2. 执行队列以检查点是否在 Long/Lat 矩形中,例如:

    WHERE point && ST_MakeEnvelope (5.440433, 39.480434, 8.464680, 55.486190, 4326)

我正在使用 PostgreSQLPostGIS

我只是找不到我必须使用哪种类型的休眠列注释来获取长/纬度点,以及如何执行上述查询。

@Type(type="org.hibernate.spatial.GeometryType")

不是关于经度/纬度的观点

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

【问题讨论】:

    标签: java hibernate postgis


    【解决方案1】:

    我使用的是休眠版本 5.4.30

    关于您的问题 1, 您不想使用任何类型的注释将字段标记为点类型。在实体模型中将数据类型指定为 Point 就足够了

    @Entity
    public class UserLocation {
    
        //other fields   
        private Point location;
        
        //constructors, getters & setters
    

    请确保,您从以下位置导入点

    导入 org.locationtech.jts.geom.Point;

    为了将纬度和经度转换为点,我使用了一个实用函数

    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 = GeometryUtil.parseLocation(latitude,longitude);

    PostGIS

    点 p = GeometryUtil.parseLocation(longitude,latitude);

    【讨论】:

    • 谢谢你,你拯救了我的一天。但是,它应该在parseLocation签名中反转,双lng和双lat,否则使用时会有点乱。
    • 谢谢@woland,很高兴我的回答对您有所帮助,我已经为 MySQL 编写了代码。我还添加了 PostGIS 的代码,您能帮我检查一下吗?
    【解决方案2】:

    类型将保持几何类型,只需使用十进制的距离,通过下面提到的代码,您可以获得 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() 函数以距离为单位,您必须将其转换为地理,但休眠空间不支持,因此还有另一种方法可以通过根据您的要求提供十进制距离来实现这一点。下面提到了链接小数点。

    链接https://en.wikipedia.org/wiki/Decimal_degrees

    【讨论】:

      【解决方案3】:

      是的,Hibernate 5 支持 Spatial。

      需要添加依赖

      <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
      

      设置正确的方言后,您可以在实体中使用点或多边形(无需使用@Type)。它们包含在 com.vividsolutions.jts.geom

      包中

      创建一个点:

      GeometryFactory gf = new GeometryFactory();
      Point point = gf.createPoint(new Coordinate(lat, lon));
      

      【讨论】:

      • 顺便说一句,我是用 MySql 做的。
      • 这个答案错过了问题的重点:用户试图保持geography而不是geometry。地理可以使用 Hibernate Spatial 进行持久化,但应将几何的 SRID 设置为 4326 (WGS84)。
      猜你喜欢
      • 2012-06-26
      • 2016-01-19
      • 2012-12-24
      • 2016-01-12
      • 2021-03-25
      • 1970-01-01
      • 2020-11-02
      • 2020-09-30
      • 2021-08-07
      相关资源
      最近更新 更多