如何使用 PGpoint 使用 PostgreSQL 进行地理定位?

Posted

技术标签:

【中文标题】如何使用 PGpoint 使用 PostgreSQL 进行地理定位?【英文标题】:How to work with PGpoint for Geolocation using PostgreSQL? 【发布时间】:2019-05-02 02:08:56 【问题描述】:

我找到了很多建议在 Hibernate spatial data geolocation 中使用空间数据的答案,但我想知道这是否是最好的,因为我发现 PostgreSQL 与 PGpoint 一起用于 GeoLocation。我实现了,但它不起作用,因为不保存。

错误:列“位置”的类型是点,但表达式的类型是字符变化

我有同样的question,但没有人回答他。如果没有人知道这个问题,那么让我在下面添加其他问题。

作为建议,我想知道在 Spring Boot Context 上使用地理数据的最佳方式是什么

谢谢!祝你有美好的一天。

【问题讨论】:

一切都取决于您是否仅限于 Hibernate。我使用 DataNucleus,它支持 PostGIS 类型没有问题 【参考方案1】:

没有办法直接保存/更新/获取/ PGpoint对象, 然后您必须创建自己的用户类型以支持 PGpoint 才能转换它,在保存之前,UserType 是 Hibernate 的一个类,它允许创建自定义类型以便在转换之前将其转换以保存在数据库中。 以下是您需要实现的代码:

首先: 需要创建一个实现UserType的类

public class PGPointType implements UserType 
    @Override
    public int[] sqlTypes() 
        return new int[]
                
                        Types.VARCHAR
                ;
    

    @SuppressWarnings("rawtypes")
    @Override
    public Class<PGpoint> returnedClass() 
        return PGpoint.class;
    

    @Override
    public boolean equals(Object obj, Object obj1) 
        return ObjectUtils.equals(obj, obj1);
    

    @Override
    public int hashCode(Object obj) 
        return obj.hashCode();
    

    @Override
    public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws SQLException 
        if (names.length == 1) 
            if (resultSet.wasNull() || resultSet.getObject(names[0]) == null) 
                return null;
             else 
                return new PGpoint(resultSet.getObject(names[0]).toString());
            
        
        return null;
    


    @Override
    public void nullSafeSet(PreparedStatement statement, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws SQLException 
        if (value == null) 
            statement.setNull(index, Types.OTHER);
         else 
            statement.setObject(index, value, Types.OTHER);
        
    

    @Override
    public Object deepCopy(Object obj) 
        return obj;
    

    @Override
    public boolean isMutable() 
        return Boolean.FALSE;
    

    @Override
    public Serializable disassemble(Object obj) 
        return (Serializable) obj;
    

    @Override
    public Object assemble(Serializable serializable, Object obj) 
        return serializable;
    

    @Override
    public Object replace(Object obj, Object obj1, Object obj2) 
        return obj;
    


第二个: 需要在实体头上添加@TypeDef注解,添加一个名称和你创建它的PGPointType,在一些PGpoint类型的字段头上,添加@Type注解和您创建它的名称

  @TypeDef(name = "type", typeClass = PGPointType.class)
  @Entity
  public class Entity 

       @Type(type = "type")
       private PGpoint pgPoint;

       // Getters and setters 

      

亲切的问候。

【讨论】:

这个答案太棒了!我看了很多,目前它可以保存,更新和获取。谢谢!

以上是关于如何使用 PGpoint 使用 PostgreSQL 进行地理定位?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresq9.6主从部署

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

如何在 MySQL 中同时更新和选择

如何连接到 Pivotal HD(来自 Spark)?

如何在 Grafana-zabbix 仪表板中编写设置

Postgres 9.6 如何遍历数组并将每个数组值插入表中?