`
manjingtou
  • 浏览: 121176 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate 支持 postgis函数

阅读更多


要想使用hibernate的空间数据操作,就要提到一个概念 java Topology Suite (字面上理解就是 空间拓扑的意思,简称JTS,
注意:过需要声明一点,本文中的JTS与进行java事务处理的JTS、JTA没有联系).

HIBERNATE中对空间数据作了支持(Hibernate Spatial),Hibernate Spatial是对处理空间数据的一个Hibernate扩展 ,

Hibernate Spatial 使用标准的方式处理地理信息数据 ,并且提供了一个可以跨数据库的处理的接口函数,

Hibernate Spatial 中包含了多种 OGC 简单的处理函数. 支持的数据库为: Oracle 10g/11g, Postgresql/Postgis, and MySQL.

要想使用 Hibernate Spatial  就要引入JTS, JTS 从根本上而言其实并不是很复杂,它主要是完成了java对几何对象、空间拓扑得核心操作算法。

下面通过简单配置来说明一下如何使用(我们使用的数据库是postgis):

数据库脚本:
sql:

CREATE TABLE events
(
  id bigint NOT NULL,
  event_date timestamp without time zone,
  title character varying(255),
  "location" geometry,
  CONSTRAINT events_pkey PRIMARY KEY (id)
)


1,引入 jts-1.8.jar, hibernate3.jar 等包 ,同时还要应用 hibernate-spatial-postgis-1.0-20070920.111959-1.jar 和
hibernate-spatial-1.0-20070920.111959-1.jar 包(如果不是postgre sql就要引用相应的数据库包)。


2,创建一个持久化类(po对象)

如下:

import java.util.Date;
import com.vividsolutions.jts.geom.Point;

public class Event {
    
private Long id;
    
private String title;
    
private Date date;
    
private Point location;

    
public Event() {}

    
public Long getId() {
        
return id;
    }


    
private void setId(Long id) {
        
this.id = id;
    }


    
public Date getDate() {
        
return date;
    }


    
public void setDate(Date date) {
        
this.date = date;
    }


    
public String getTitle() {
        
return title;
    }


    
public void setTitle(String title) {
        
this.title = title;
    }

    
    
public Point getLocation(){
    
return this.location;
    }

    
    
public void setLocation(Point location){
    
this.location = location;
    }

}

注意:上面的po对象中的location属性的类型。这个类型是空间数据类型。

3,创建相应的Mapping 文件


<hibernate-mapping>
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" 
column
="EVENT_DATE"/>
<property name="title"/>
<property name="location" 
type
="org.hibernatespatial.GeometryUserType" 
column
="location"/>
</class>
</hibernate-mapping>

注意:在上面的影射文件中,type="org.hibernatespatial.GeometryUserType" 这type类型声明很特别,我们知道在hibernate中要自定义影射类型,可以自定义类型UserType.在这个配置文件中定义的类型org.hibernatespatial.GeometryUserType就是hibernatespatial中定义支持空间数据库的类型。

4,配置hibernate 配置文件

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<hibernate-configuration>

    
<session-factory>

        
<!-- Database connection settings -->
        
<property name="connection.driver_class">org.postgresql.Driver</property>
        
<property name="connection.url">jdbc:postgresql://localhost:5432/test</property>
        
<property name="connection.username">postgres</property>
        
<property name="connection.password">test</property>

        
<!-- JDBC connection pool (use the built-in) -->
        
<property name="connection.pool_size">1</property>

        
<!-- SPATIAL SQL dialect -->
        
<property name="dialect">org.hibernatespatial.postgis.PostgisDialect</property>

        
<!-- Enable Hibernate's automatic session context management -->
        
<property name="current_session_context_class">thread</property>

        
<!-- Disable the second-level cache  -->
        
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        
<!-- Echo all executed SQL to stdout -->
        
<property name="show_sql">true</property>

        
<!-- Drop and re-create the database schema on startup -->
        
<property name="hbm2ddl.auto">create</property>

        
<mapping resource="Event.hbm.xml"/>

    
</session-factory>

</hibernate-configuration>

注意:在上面的配置文件中, <property name="dialect">org.hibernatespatial.postgis.PostgisDialect</property>
这句配置起到了重要的作用,这里声明了 hibernate 的方言。该方言声明了对postgis的一些支持。
并且大家也应该知道,在使用hibernate时候,如果需要自定义函数,要需要自定义方言。


5,第一个主类


import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernatespatial.criterion.SpatialRestrictions;
import org.postgis.Geometry;
import org.postgis.LineString;
import org.postgis.MultiLineString;
import org.postgis.MultiPolygon;
import org.postgis.PGgeometry;
import org.postgis.Polygon;

import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import com.vividsolutions.jts.geom.*;
import java.util.Date;
import java.util.List;

import util.HibernateUtil;

public class EventManager {

    
public int SRID = 4326;

    
public static void main(String[] args) {
        EventManager mgr 
= new EventManager();

        String testPiont 
= "2,3";
        mgr.createAndStoreEvent(
"My Event"new Date(), testPiont);
    

        HibernateUtil.getSessionFactory().close();
    }


    
private void createAndStoreEvent(String title, Date theDate, String wktPoint) {
        
        com.vividsolutions.jts.geom.Geometry geom 
= null;
        
try {
            geom 
= pointFromText(wktPoint);
        }
 catch (Exception e) {
            
throw new RuntimeException("Not a WKT string:" + wktPoint);
        }


        Session session 
= HibernateUtil.getSessionFactory().getCurrentSession();

        session.beginTransaction();

        Event theEvent 
= new Event();
        theEvent.setTitle(title);
        theEvent.setDate(theDate);
        theEvent.setLocation((Point) geom);
        session.save(theEvent);
        session.flush();
        session.getTransaction().commit();
        List l
= find("POLYGON((1 1,20 1,20 20, 1 20, 1 1))");
        
        System.out.println(l.size());
        
        List l1
= find1("POLYGON((1 1,20 1,20 20, 1 20, 1 1))");
        
        System.out.println(l1.size());
    }

    
    
private List find(String wktFilter){
        WKTReader fromText 
= new WKTReader();
        com.vividsolutions.jts.geom.Geometry filter 
= null;
        
try{
                filter 
= fromText.read(wktFilter);
                filter.setSRID(SRID);
        }
 catch(ParseException e){
                
throw new RuntimeException("Not a WKT String:" + wktFilter);
        }

        Session session 
= HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
分享到:
评论

相关推荐

    postgis函数

    postgis函数总结 postgis函数总结

    PostGIS空间函数简介

    1、转换函数 wkt和geom之间的相互转化 2、空间关系判断函数 常见的空间关系(Geometry Relationships)包括:Disjoint、Intersects、Touches、Crosses、Within、Contains、Overlaps、Relates。 3、空间操作函数 ...

    OGC+PostGIS函数.txt

    OGC+PostGIS函数.txt

    PostGIS中的常用函数.docx

    本文将详细介绍PostGIS中常用的函数,包括OGC标准函数管理函数、几何对象关系函数、几何对象处理函数以及几何对象存取函数。 #### 二、OGC标准函数管理函数 **1. 添加几何字段 (AddGeometryColumn)** 此函数用于...

    PostGIS-函数.docx

    PostGIS 是 PostgreSQL 数据库的一个扩展,它为地理空间数据提供了强大的支持。PostGIS 提供了丰富的函数库,用于处理和操作空间数据。在本文中,我们将深入探讨 PostGIS 中的一些核心空间函数,包括缓冲区、相交、...

    postgis jar包

    PostGIS是一种开源的空间数据库扩展,它为 PostgreSQL 数据库系统提供了强大的地理对象支持。这个"postgis jar包"指的是PostGIS的Java数据库连接器(JDBC)驱动程序,它允许Java应用程序通过JDBC接口与PostGIS数据库...

    PostGIS安装使用指导1

    PostGIS 提供了高效的空间数据查询功能,支持快速的空间数据处理和查询。 PostGIS 使用场景 ---------------- 1. 地理信息系统 PostGIS 可以应用于地理信息系统,提供空间数据处理和查询功能。 2. 空间数据分析 ...

    postgresql+postgis安装和空间数据的导入

    PostgreSQL是一个功能强大且开源的关系数据库管理系统,而PostGIS则是一个基于PostgreSQL的空间数据库扩展,提供了对空间数据的支持。在本文中,我们将介绍如何安装PostgreSQL和PostGIS,并将空间数据导入到PostGIS...

    cpp-常用的PostGIS的一些函数使用方法以及自定义函数

    常用的PostGIS的一些函数使用方法以及自定义函数,比如:pg连接oracle、pg连接sqlserver、导出csv、导入csv、查询XX米范围内数据、模糊查询、热力图聚合、生成扇形、生成栅格、生成泰森多边形、生成蜂巢图、裁剪...

    postgis25.zip

    PostGIS支持多种地理数据类型,如`POINT`、`LINESTRING`、`POLYGON`等,以及丰富的空间操作函数,例如计算两点之间的距离、判断几何对象的交集、合并几何对象等。这些功能使得PostGIS成为地理信息系统(GIS)和地图...

    PostGIS 3.0.1及官方文档

    PostGIS是一种开源扩展,用于PostgreSQL关系数据库管理系统,增加了对地理对象的支持,使其成为一个功能强大的空间数据库系统。本文将深入探讨PostGIS 3.0.1及其官方文档,包括其安装、配置、使用以及与其他软件的...

    postGIS 用户手册

    - 长事务支持(Long Transactions Support)描述了如何在PostGIS中使用长事务。 - 杂项函数(Miscellaneous Functions)包括了其他的PostGIS函数,如估算扩展等。 - 异常函数(Exceptional Functions)描述了一些...

    postgis-3.0.3.tar.gz

    PostGIS 3.0.3是这个扩展的特定版本,它提供了丰富的空间数据管理和分析功能,使得PostgreSQL能够支持地理信息系统(GIS)的应用场景。这个`.tar.gz`文件是源代码压缩包,通常在Linux环境下使用,用于编译安装...

    spring-gis:Spring Data JPA、Hibernate Spatial、Postgis

    PostGIS支持标准的地理空间数据类型和函数,允许存储、查询和分析地理信息。它能够处理复杂的几何对象,并提供丰富的空间运算,如距离计算、缓冲区生成、拓扑分析等。PostGIS广泛应用于地图服务、地理信息系统、...

    kartoza-docker-postgis,带postgis的postgresql13版本的docker镜像

    kartoza-docker-postgis,带postgis的postgresql13版本的docker镜像。 可直接通过docker导入镜像命令导入。 一个简单的 Docker 容器,用于运行 PostGIS 访问Docker Hub 的页面:...

    postgis中文说明书.pdf

    我们计划继续支持和发展PostGIS以便支持一系列重要的GIS功能,包括对OpenGIS的完全支持,高级拓扑构建 (coverages, surfaces, networks类型),方便用户浏览和编辑GIS数据的桌面用户界面工具以及基于web的访问工具。 ...

    Postgis-学习 入门 教程 教学 手册-Postgresql

    PostGIS简介、安装、新建空间数据库、简单SQL语句查询练习、几何数据操作和练习、空间关系操作与练习、空间链接与练习、投影数据与...还包括PostgreSQL for spatial的配置,验证,postgis函数简介等信息。 非常详细。

    postgis pgrouting 路径查询经验

    首先,PostGIS的核心在于其支持的空间数据类型和函数。它允许用户创建包含几何对象(如点、线、多边形)的表,并提供了一系列操作这些对象的函数,如计算距离、判断相交等。此外,PostGIS还支持地理坐标系和投影转换...

    postgis-2.2.0dev 手册中文版(伏念译)_postgis_

    3. **SQL 函数**:PostGIS 提供了一系列 SQL 函数,用于创建、查询、更新和分析空间数据。例如,`ST_GeomFromText()` 用于从文本字符串创建几何对象,`ST_Distance()` 计算两个几何对象之间的距离,`ST_Intersection...

Global site tag (gtag.js) - Google Analytics